选择与列表中任何值匹配的行我遇到了一个更复杂的脚本问题,并编写了一个简单的测试脚本来尝试解决该问题,但无法找出问题所在。 这可能是显而易见的,但我已经观察了太长时间而没有注意到。 我创建一个包含:处置类型、:NC 代码和:NC 数量的表。 原始脚本需要用户输入来创建代码列表,但在这里我预定义了该列表。 我想为代码列表中列出的每个代码创建一个列,如果 :NC Code 与列表中的代码匹配,则复制 :NC Qty 中的值。 它识别用于命名列的代码[c],但不识别列公式中的代码。 我还尝试在公式中使用 Contains 而不是 ==,但这似乎没有什么区别。
New Table( "NC Qty Col Test",
Add Rows( 5 ),
New Column( "Disposition Type",
Character,
"Nominal",
Set Values(
{"SCRAP-R", "SCRAP-DNR", "DEVIATE-MATERIAL", "DEVIATE-PROCESS",
"DEVIATE-PRODUCT"}
)
),
New Column( "NC Code",
Character,
"Nominal",
Set Values( {"007", "014", "020", "007", "008"} )
),
New Column( "NC Qty",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3, 4, 5] )
)
);
codes = {"007", "014"};
For(c=1, c<=NItems(codes), c++,
New Column("Code " || codes[c] || " NC Qty", Numeric, Continuous, Formula(If(:NC Code==codes[c], :NC Qty, 0 )));
);回复:选择与列表中的任何值匹配的行该问题与第一种情况相同。代码[c]不会在公式中被解释。 您必须将代码[c]的实际值代入公式中。
For( c = 1, c <= N Items( codes ), c++,
Eval(
Substitute(
Expr(
CF << New Column( "Code " || codes[c] || " Cost",
Numeric,
Continuous,
Format( Currency ),
Formula(
If(
And( :NC Code == __code__, :Disposition Type == "SCRAP-R" ),
:NC Qty with Zeros * :Total Cost,
And( :NC Code == __code__, :Disposition Type == "SCRAP-DNR" ),
:NC Qty with Zeros * :Total Cost,
And( :NC Code == __code__, :Disposition Type == "REWORK" ), 0,
And( :NC Code == __code__, :Disposition Type == "DEVIATE-MATERIAL" ), 0,
And( :NC Code == __code__, :Disposition Type == "DEVIATE-PROCESS" ), 0,
And( :NC Code == __code__, :Disposition Type == "DEVIATE-PRODUCT" ), 0,
0
)
)
)
),
Expr( __code__ ), codes[c]
)
)
);回复:选择与列表中的任何值匹配的行我能够使用建议的解决方案来解决我原来的问题,而且它似乎很有意义。 然而,后来我意识到我还有同一个大脚本的另一部分,它执行非常相似的操作来根据列表中的变量值创建列。 我不明白的是为什么一个有效而另一个无效。 这是脚本的另一部分。 在这一部分中,我有一个与 NC 代码相关的成本,该成本仅适用于 SCRAP-R 和 SCRAP-DNR 的处置类型。 此成本列在“总成本”列中。
For(c=1, c<=NItems(codes), c++,
CF<<NEW column=""></NEW>回复:选择与列表中的任何值匹配的行非常感谢你帮我弄清楚! 这些选项中的任何一个都可以很好地修复我的脚本!
回复:选择与列表中的任何值匹配的行这个有点棘手。当您在公式中使用变量时,您必须在公式内初始化它们。但我没有使用公式就做到了。
dt = New Table( "NC Qty Col Test", Add Rows( 5 ),
New Column( "Disposition Type", Character, "Nominal",
Set Values(
{"SCRAP-R", "SCRAP-DNR", "DEVIATE-MATERIAL", "DEVIATE-PROCESS",
"DEVIATE-PRODUCT"}
)
),
New Column( "NC Code", Character, "Nominal",
Set Values( {"007", "014", "020", "007", "008"} )
),
New Column( "NC Qty", Numeric, "Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3, 4, 5] )
)
);
codes = {"007", "014"};
For(c = 1, c <= NItems(codes), c++,
dt << New Column("Code " || codes[c] || " NC Qty", numeric, "Continuous")
);
for (k = 1, k <= nitems(codes), k++,
r = dt << get rows where(:NC Code == codes[k]);
colname = "Code " || codes[k] || " NC Qty";
if (nrows(r) > 0,
for (i = 1, i <= nrows(r), i++,
one_row = r[i];
column(dt, colname)[one_row] = column(dt, "NC Qty")[one_row];
);
);
);
回复:选择与列表中的任何值匹配的行问题是“c”的值发生变化,并且在公式定义中不是静态的。因此,您需要强制代码在公式中具有静态值“codes[c]”。下面是一种方法:
New Table( "NC Qty Col Test",
Add Rows( 5 ),
New Column( "Disposition Type",
Character,
"Nominal",
Set Values( {"SCRAP-R", "SCRAP-DNR", "DEVIATE-MATERIAL", "DEVIATE-PROCESS", "DEVIATE-PRODUCT"} )
),
New Column( "NC Code", Character, "Nominal", Set Values( {"007", "014", "020", "007", "008"} ) ),
New Column( "NC Qty", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 2, 3, 4, 5] ) )
);
codes = {"007", "014"};
For( c = 1, c <= N Items( codes ), c++,
Eval(
Substitute(
Expr(
New Column( "Code " || codes[c] || " NC Qty", Numeric, Continuous, Formula( If( :NC Code == __code__, :NC Qty, 0 ) ) )
),
Expr( __code__ ), codes[c]
)
)
);