ダイアログボックスからテーブルを選択するときにJMPクエリビルダーのパス名の問題が発生するダイアログボックスを使用してプライマリテーブルとセカンダリテーブルを選択していますが、JMPクエリビルダーを実行すると、ファイルパス名を正しく置換できません。これを手動で解決しても、次回スクリプトがテーブルを参照する必要があるときに失敗します。
エラー: 名前が解決されていません: 'PRIMARYNAME' のアクセスまたは評価で PRIMARYNAME が見つかりません、PRIMARYNAME/*###*/
// Step 1: Get names of all open data tables
dtNames = {};
For(t = 1, t <= N Table(), t++,
Insert Into(dtNames, Data Table(t) << Get Name)
);
// Step 2: Dialog to select two tables
nw2 = New Window("Data Table Selector - Note both data tables must be open in this JMP session",
<
<MODAL>
"PRIMARYPATH", "SECONDARYNAME" => "SECONDARYPATH"]), QueryName(PRIMARYNAME || " join " || SECONDARYNAME), Select(__SELECTALLCOLUMNS__), From( Table(PRIMARYNAME, Alias("t1")), Table( SECONDARYNAME, Alias("t2"), Join( Type(Left Outer), LE(Column("TS", "t1"), Column("END TIME", "t2")) & GE(Column("TS", "t1"), Column("START TIME", "t2")) ) ) ) ) << Modify ); // Step 7: Substitute table names, paths, and all columns sqlExpr = Substitute(sqlExpr, "PRIMARYNAME", primaryTableName[1], "PRIMARYPATH", primaryPath, "SECONDARYNAME", secondaryTableName[1], "SECONDARYPATH", secondaryPath, Expr(__SELECTALLCOLUMNS__), Expr(selectExprList) ); // Debug: Show the final SQL Query code (optional, for troubleshooting) Write(Expr(sqlExpr)); // Step 8: Run the query Eval(sqlExpr);
</MODAL>
編集 (jthi): JSLフォーマットを追加
自動化とスクリプトRe: ダイアログボックスからテーブルを選択する際のJMPクエリビルダーのパス名の問題私は新しいSQLクエリの外でテーブル名+リンクの連想配列を構築し、それを評価します。
Names Default To Here(1);
t1name = "Big Class";
t1path = "$SAMPLE_DATA/Big Class.jmp";
t2path = "$SAMPLE_DATA/Big Class Families.jmp";
t2name = "Big Class Families";
aa = Associative Array();
aa[t1name] = t1path;
aa[t2name] = t2path;
sqlExpr = Expr(
New SQL Query(
Version(130),
Connection("JMP"),
JMP Tables(_aa_),
QueryName(_t1name_ || " join " || _t2name_),
Select,
From(
Table(_t1name_, Alias("t1")),
Table(
_t2name_,
Alias("t2"),
Join(Type(Left Outer), EQ(Column("name", "t1"), Column("name", "t2")))
)
)
) << Modify
);
q = Substitute(Name Expr(sqlExpr),
Expr(_aa_), aa,
Expr(_t1name_), t1name,
Expr(_t2name_), t2name,
Expr(_t1path_), t1path,
Expr(_t2path_), t2path,
);
Eval(q);
Re: ダイアログボックスからテーブルを選択する際のJMPクエリビルダーのパス名の問題ありがとうございます。その概念を活用して問題を解決しました。
他の人が使用する場合の最終コードは以下の通りです
<
// ステップ1: 開いているすべてのデータテーブルの名前を取得する
dtNames = {};
For( t = 1, t <= N テーブル(), t++,
挿入(dtNames、データテーブル(t) << 名前の取得)
);
// ステップ2: 2つのテーブルを選択するダイアログ
t1name = "";
t2name = "";
nw2 = 新しいウィンドウ( "データテーブルセレクタ - このJMPセッションでは両方のデータテーブルが開かれている必要があります",
< V リストボックス(
テキストボックス(「プライマリテーブルを選択(TS列を含むMES抽出テーブル):」)、
lb1 = リストボックス( dtNames, 幅( 600 ), nlines( 8 ), MaxItems( 1 ) ),
スペーサーボックス(サイズ(10, 10))、
テキストボックス(「セカンダリテーブルを選択(列に開始/終了時間を含むデータテーブル):」)
lb2 = リストボックス( dtNames, 幅( 600 ), nlines( 8 ), MaxItems( 1 ) ),
スペーサーボックス(サイズ(10, 10))、
H リストボックス(
ボタンボックス(「OK」、
t1sel = lb1 << 選択を取得;
t2sel = lb2 << 選択を取得;
N 個のアイテム( t1sel ) == 0 | N 個のアイテム( t2sel ) == 0 の場合、
新しいウィンドウ(「エラー」、< 停止();
);
t1name = t1sel[1];
t2name = t2sel[1];
もし( t1name == t2name,
新しいウィンドウ(「エラー」、< 停止();
);
)、
ボタンボックス(「キャンセル」、nw2 << ウィンドウを閉じる)
)
)
);
// t1nameとt2nameは選択されたテーブル名の文字列です
// 例: SQLクエリでの使用(両方のテーブルが開いていると仮定)
dtJoin = 新しいSQLクエリ(
バージョン(130)
接続("JMP")、
JMPテーブル(連想配列({t1name, データテーブル(t1name), t2name, データテーブル(t2name)})),
クエリ名( t1name || " join " || t2name )、
< から(
テーブル(t1name, エイリアス("t1")),
テーブル(
t2name、
エイリアス( "t2" )、
参加する(
タイプ(左外側)、
LE( 列( "TS", "t1") , 列( "終了時刻", "t2") ) &
GE( 列( "TS", "t1") , 列( "開始時刻", "t2") )
)
)
)
)<<実行;>