参照ファイル以前の日付に従ってテーブルを更新しますこんにちは、みんな、
dtA がオリジナル ファイル、dtB が参照ファイルである 2 つのテーブルがあります。 私がやりたかったのは、参照ファイル以下の日付に従って dtA を更新することです。
例えば、
テーブル dtA
| 日付 | モデル | 数量 |
| 2023/06/24 | あ | 23 |
| 2023/06/30 | あ | 25 |
| 2023/07/01 | あ | 34 |
| 2023/07/05 | あ | 50 |
テーブル dtB
| 日付 | モデル | 参照 |
| 2023/06/01 | あ | 100 |
| 2023/07/01 | あ | 150 |
dtA を更新すると、テーブルは次のようになります。
| 日付 | モデル | 数量 | 参照 |
| 2023/06/24 | あ | 23 | 100 |
| 2023/06/30 | あ | 25 | 100 |
| 2023/07/01 | あ | 34 | 150 |
| 2023/07/05 | あ | 50 | |
これは可能でしょうか? 助けてください
自動化とスクリプト作成Re: 参照ファイル以前の日付に従ってテーブルを更新するこれが機能するスクリプトです。テーブルのベットが非常に大きい場合、あまり効率的ではありません。
2 つのデータテーブルを指定すると、スクリプトは更新を提供します

テーブルには更新値がなかった行 4 に更新値があることに注意してください。私があなたの要件を誤解していない限り、最後の行には選択基準を満たす参照テーブルの値があります。
Names Default To Here( 1 );
New Table( "Original",
Add Rows( 4 ),
New Column( "Date",
Format( "m/d/y", 10 ),
Input Format( "m/d/y" ),
Set Values( [3770409600, 3770928000, 3771014400, 3771360000] )
),
New Column( "Model", Character( 16 ), Set Values( {"A", "A", "A", "A"} ) ),
New Column( "Qty", Set Values( [23, 25, 34, 50] ) )
);
New Table( "Reference",
Add Rows( 2 ),
New Column( "Date",
Numeric,
"Continuous",
Format( "m/d/y", 10 ),
Input Format( "m/d/y" ),
Set Values( [3768422400, 3771014400] )
),
New Column( "Model", Character( 16 ), Set Values( {"A", "A"} ) ),
New Column( "Ref", Set Values( [100, 150] ) )
);
// This is the code that does the actual update
dtA = Data Table( "Original" );
dtB = Data Table( "Reference" );
dtA << New Column( "Ref" );
For Each( {row}, Index( 1, N Rows( dtA ) ),
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)]
);Re: 参照ファイル以前の日付に従ってテーブルを更新するこれを行う方法はいくつかありますが、JMP は (少なくともまだ) このような結合を直接提供していません。
まず、元のテーブル (空になります) に Ref を作成できます (JMP は連結時に欠落している列を追加するため、この手順はおそらく不要です)

テーブルを連結する

グループと時間ごとに並べ替えます。 Ref 列のすべての値を選択し、右クリックして [欠落を埋める] を選択します。

QTY が欠落している行をすべて選択し、それらを削除します


このコミュニティへの参加を実行できるアドイン (およびスクリプト) もいくつかあります。 JMP内でSQLを使用することもできます
Re: 参照ファイル以前の日付に従ってテーブルを更新するこんにちは、txnelson、次のようなエラーが表示されます。

Re: 参照ファイル以前の日付に従ってテーブルを更新するおそらく、16 よりも古い JMP バージョンを実行していると思われます (For Each は JMP16 で追加されました)。 かなり簡単に変更して For ループに変更できます。
Re: 参照ファイル以前の日付に従ってテーブルを更新するサポートしていないバージョンの JMP を使用していると思われます
For Each()
したがって、For Each セクションを次のように変更すると、
For(row=1, row<= N Rows( dtA ), row++,
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)]
);
それは機能するはずです。
Re: 参照ファイル以前の日付に従ってテーブルを更新するスクリプトは現在正常に動作していますが、最後に質問があります。テーブルは毎日更新されるため、更新を特定の日付に制限する方法はありますか? 例えば、
テーブル dtA
| 日付 | モデル | 数量 |
| 2023/06/24 | あ | 23 |
| 2023/06/30 | あ | 25 |
| 2023/07/01 | あ | 34 |
| 2023/07/05 | あ | 50 |
| 2023/07/10 | あ | 65 |
| 2023/07/27 | あ | 68 |
テーブル dtB
| 日付 | モデル | 参照 |
| 2023/06/01 | あ | 100 |
| 2023/07/01 | あ | 150 |
| 2023 年 7 月 20 日 | あ | 300 |
| 2023/08/01 | あ | 250 |
dtA を更新すると、テーブルは次のようになります。
| 日付 | モデル | 数量 | 参照 |
| 2023/06/24 | あ | 23 | 100 |
| 2023/06/30 | あ | 25 | 100 |
| 2023/07/01 | あ | 34 | 150 |
| 2023/07/05 | あ | 50 | 300 |
| 2023/07/10 | あ | 65 | 300 |
| 2023/07/27 | あ | 65 | 250 |
スクリプトを使用してみましたが、過去の日付の Ref 値が最新の 250 で上書きされます。 こんな感じです
| 日付 | モデル | 数量 | 参照 |
| 2023/06/24 | あ | 23 | 250 |
| 2023/06/30 | あ | 25 | 250 |
| 2023/07/01 | あ | 34 | 250 |
| 2023/07/05 | あ | 50 | 250 |
| 2023/07/10 | あ | 65 | 250 |
| 2023/07/27 | あ | 65 | 250 |
Re: 参照ファイル以前の日付に従ってテーブルを更新するスクリプトに関するヘルプに関するディスカッション コミュニティの目的は、オンデマンドのスクリプト生成ソースではありません。これは、個人が開発中のスクリプトに関する問題を解決し、独自のスクリプトを強化する能力を高めるのに役立ちます。
時間をかけてスクリプト ガイドを読んでいない場合は、読むことを強くお勧めします。スクリプト言語の詳細が表示されます。そこから、JSL は実質的に何でも扱える完全なスクリプト言語であることがわかります。ただし、現在の質問に関しては、条件付きの「IF()」ステートメントを簡単に配置して、いつ更新を実行するか、いつ実行しないかを定義できます。以下はそのような図です
For( row = 1, row <= N Rows( dtA ), row++,
If( dtb:Date == Today(),
If( dtA:date[row] <= Col Max( dtB:date ),
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)],
dtA:Ref[row] = .
)
)
);