cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
Choose Language Hide Translation Bar
View Original Published Thread

リスト内の任意の値に一致する行を選択します

rfeick
Level IV

より複雑なスクリプトで問題が発生し、問題を解決するために簡単なテスト スクリプトを作成しましたが、何が問題なのかわかりません。 おそらくそれは明白ですが、あまりにも長い間見ていたので気づきませんでした。 :Disposition Type、:NC Code、:NC Qty のテーブルを作成します。 元のスクリプトはユーザー入力を受け取ってコードのリストを作成しますが、ここではリストを事前定義しました。 コードリストにリストされているコードごとに列を作成し、: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 )));
);

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

2 ACCEPTED SOLUTIONS

Accepted Solutions
txnelson
Super User

Re: リスト内の任意の値に一致する行を選択する

問題は、「c」の値が変化し、数式定義内で静的ではないことです。したがって、コードの数式に「codes[c]」という静的な値を強制的に含める必要があります。以下はそのための 1 つの方法です。

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]
  )
 )
);
pmroz
Super User

Re: リスト内の任意の値に一致する行を選択する

これは少し難しいです。数式で変数を使用する場合は、数式内で変数を初期化する必要があります。しかし、私は数式を使わずにそれを行いました。

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];
  );
 );
);
5 REPLIES 5
txnelson
Super User

Re: リスト内の任意の値に一致する行を選択する

問題は、「c」の値が変化し、数式定義内で静的ではないことです。したがって、コードの数式に「codes[c]」という静的な値を強制的に含める必要があります。以下はそのための 1 つの方法です。

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]
  )
 )
);

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

pmroz
Super User

Re: リスト内の任意の値に一致する行を選択する

これは少し難しいです。数式で変数を使用する場合は、数式内で変数を初期化する必要があります。しかし、私は数式を使わずにそれを行いました。

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];
  );
 );
);

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

rfeick
Level IV

Re: リスト内の任意の値に一致する行を選択する

理解するのを手伝ってくれて本当にありがとう! これらのオプションのいずれも、スクリプトを修正するのに最適です。

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

rfeick
Level IV

Re: リスト内の任意の値に一致する行を選択する

提案された解決策を使用して元の質問を解決することができ、それは理にかなっているように思えました。 しかし、同じ大きなスクリプトの別の部分で、リストの変数値に基づいて列を作成するという非常によく似た処理を実行していることに気付きました。 私が理解できないのは、なぜ一方が機能し、もう一方が機能しないのかということです。 スクリプトの他のセクションは次のとおりです。 この部分には、SCRAP-R および SCRAP-DNR の処理タイプにのみ適用されると想定されている NC コードに関連付けられたコストがあります。 このコストは「合計コスト」列にリストされます。

 

For(c=1, c<=NItems(codes), c++,
    CF<

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。

txnelson
Super User

Re: リスト内の任意の値に一致する行を選択する

問題は最初のケースと同じです。code[c] は式では解釈されません。 code[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]
  )
 )
);

この投稿のオリジナルは 、English (US) で書かれており、ユーザビリティ向上のため自動翻訳機能を使用して表示しています。コメントを投稿すると、オリジナルの言語(English (US))やご指定の言語 でも表示されます。