Tengo un script que une cuatro tablas con el generador de consultas JMP. Un ejemplo condensado de la secuencia de comandos está a continuación. Esto funciona con un número fijo de columnas, sin embargo, dt1 puede tener cualquier número de columnas y necesito incorporarlas todas. Las tres tablas restantes tienen columnas específicas para su inclusión, todas las demás columnas deben descartarse.
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;
Los bucles FOR dan como resultado "Error de sintaxis en el acceso o evaluación de 'For'".
Select(
For( i = 1, i <= N Items( list1 ), i++,
Column( list1[i], "t1" ) ),
Column( list2[2], "t2" ),
),He intentado envolver varias partes en EVAL (EVAL EXPR (EXPR ())), pero sin dados.
Pensamientos?
Aquí está el método de fuerza bruta que uso, cuando no puedo encontrar un método más ingenioso para resolver problemas similares. El código simplemente construye exactamente el JSL que necesita ejecutar, y luego lo ejecuta
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));