JMP Query Builderを使用して4つのテーブルを結合するスクリプトがあります。スクリプトの要約例を以下に示します。これは固定数の列で機能しますが、dt1は任意の数の列を持つことができ、それらすべてを組み込む必要があります。残りの3つのテーブルには含める特定の列があり、他のすべての列を削除する必要があります。
Names Default to Here( 1 );
dt1 = Open( "C:\...\dt1.jmp", invisible );
dt2 = Open( "C:\...\dt2.jmp", invisible );
name1 = dt1 << Get Name;
name2 = dt2 << Get Name;
list1 = dt1 << Get Column Names( String );
list2 = dt2 << Get Column Names( String );
New SQL Query(
Query name( "dt3" ),
Connection( "JMP" ),
Select(
Column( list1[1], "t1" ),
Column( list1[2], "t1" ),
Column( list1[3], "t1" ),
Column( list2[2], "t2" ),
),
From(
Table( name1, Alias( "t1" ) ),
Table( name2, Alias( "t2" ),
Join(
Type( Inner ),
GE(
Column( list1[1], "t1" ), Column( list2[1], "t2" )
)
)
)
)
) << Run;
FORループの結果、「 'For'のアクセスまたは評価の構文エラー」が発生します。
Select(
For( i = 1, i <= N Items( list1 ), i++,
Column( list1[i], "t1" ) ),
Column( list2[2], "t2" ),
),EVAL(EVAL EXPR(EXPR()))でさまざまな部分をラップしようとしましたが、サイコロはありません。
考え?
同様の問題を解決するためのスリッカーメソッドがわからない場合に使用するブルートフォースメソッドを次に示します。 コードは、実行する必要のあるJSLを正確にビルドし、実行するだけです。
Names Default to Here( 1 );
dt1 = Open( "C:\...\dt1.jmp", invisible );
dt2 = Open( "C:\...\dt2.jmp", invisible );
name1 = dt1 << Get Name;
name2 = dt2 << Get Name;
list1 = dt1 << Get Column Names( String );
list2 = dt2 << Get Column Names( String );
theExpr = "
New SQL Query(
Query name( \!"dt3\!" ),
Connection( \!"JMP\!" ),
Select("
For( i = 1, i <= N Items( list1 ), i++,
theExpr = theExpr || "Column(" || list1[i] || ", \!"t1\!" ),";
);
theExpr = theExpr || "Column( list2[2], \!"t2\!" )
),
From(
Table( name1, Alias( \!"t1\!" ) ),
Table( name2, Alias( \!"t2\!" ),
Join(
Type( Inner ),
GE(
Column( " || list1[1] || ", \!"t1\!" ), Column( " || list2[1] || ", \!"t2\!" )
)
)
)
)
) << Run;";
eval(parse(theExpr));