Sélectionnez les lignes qui correspondent à n'importe quelle valeur dans une listeJ'avais un problème avec un script plus compliqué et j'ai écrit un script de test simple pour essayer de résoudre le problème, mais je n'arrive pas à comprendre ce qui ne va pas. C'est probablement évident, mais je l'observe depuis trop longtemps pour le remarquer. Je crée un tableau avec :Disposition Type, :NC Code et :NC Qty. Le script original prend en compte la saisie de l'utilisateur pour créer la liste des codes, mais ici j'ai prédéfini la liste. Je souhaite créer une colonne pour chaque code répertorié dans la liste des codes qui copie la valeur dans :NC Qty si :NC Code correspond au code de la liste. Il reconnaît les codes[c] pour nommer la colonne, mais pas dans la formule de la colonne. J'ai également essayé d'utiliser Contains au lieu de == dans la formule, mais cela ne semble pas faire de différence.
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 )));
);Re : Sélectionner les lignes qui correspondent à n'importe quelle valeur dans une listeLe problème est le même que dans le premier cas.les codes[c] ne seront pas interprétés dans la formule. Vous devez remplacer la valeur réelle des codes[c] dans la formule.
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]
)
)
);Re : Sélectionner les lignes qui correspondent à n'importe quelle valeur dans une listeJ'ai pu utiliser la solution proposée pour résoudre ma question initiale et cela m'a semblé logique. Cependant, j'ai ensuite réalisé que j'avais une autre partie du même grand script qui faisait une chose très similaire pour créer des colonnes basées sur une valeur variable d'une liste. Ce que je ne comprends pas, c'est pourquoi l'un fonctionne et l'autre non. Voici l'autre section du script. Dans cette partie, j'ai un coût associé au code NC qui est censé être appliqué uniquement pour les types d'élimination SCRAP-R et SCRAP-DNR. Ce coût est répertorié dans la colonne Coût total.
For(c=1, c<=NItems(codes), c++,
CF<<NEW column=""></NEW>Re : Sélectionner les lignes qui correspondent à n'importe quelle valeur dans une listeMerci beaucoup de m'avoir aidé à comprendre ! L’une ou l’autre de ces options serait idéale pour corriger mon script !
Re : Sélectionner les lignes qui correspondent à n'importe quelle valeur dans une listeCelui-ci est un peu délicat.Lorsque vous utilisez des variables dans une formule, vous devez les initialiser dans la formule.Mais je l'ai fait sans utiliser de formules.
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];
);
);
);
Re : Sélectionner les lignes qui correspondent à n'importe quelle valeur dans une listeLe problème est que votre valeur de "c" change et n'est pas statique dans la définition de la formule.Par conséquent, vous devez forcer le code à avoir une valeur statique de "codes[c]" dans la formule.Vous trouverez ci-dessous une façon de procéder :
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]
)
)
);