Problemi con il nome del percorso del generatore di query JMP durante la selezione delle tabelle tramite una finestra di dialogoSto utilizzando una finestra di dialogo per selezionare le tabelle primarie e secondarie, ma quando viene eseguito il generatore di query JMP, non riesce a sostituire correttamente i nomi dei percorsi dei file, anche se risolvo manualmente il problema la prossima volta che lo script deve fare riferimento alle tabelle, si blocca
Errore: Nome non risolto: PRIMARYNAME nell'accesso o nella valutazione di '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>
Modifica (jthi): aggiunta formattazione JSL
Automazione e scriptingRe: Problemi con il nome del percorso del generatore di query JMP durante la selezione delle tabelle tramite una finestra di dialogoVorrei creare il nome della tabella + l'array associativo del collegamento all'esterno della nuova query SQL e valutarlo
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: Problemi con il nome del percorso del generatore di query JMP durante la selezione delle tabelle tramite una finestra di dialogoGrazie, ho utilizzato quel concetto e ho risolto il problema.
Di seguito il codice finale nel caso in cui venga utilizzato da qualcun altro
<
// Passaggio 1: ottenere i nomi di tutte le tabelle di dati aperti
dtNames = {};
Per( t = 1, t <= N Tabella(), t++,
Inserisci in (dtNames, Tabella dati (t) << Ottieni nome)
);
// Passaggio 2: finestra di dialogo per selezionare due tabelle
t1name = "";
t2name = "";
nw2 = Nuova finestra( "Selettore tabella dati - Nota che entrambe le tabelle dati devono essere aperte in questa sessione JMP",
< V Casella di elenco(
Casella di testo ("Seleziona tabella primaria (tabella di estrazione MES con colonna TS):"),
lb1 = Casella di riepilogo (dtNames, larghezza (600), nlinee (8), MaxItems (1) ),
Scatola distanziatrice (dimensione (10, 10)),
Casella di testo ("Seleziona tabella secondaria (tabella dati con ORA DI INIZIO/FINE nelle colonne):"),
lb2 = Casella di riepilogo (dtNames, larghezza (600), nlinee (8), MaxItems (1) ),
Scatola distanziatrice (dimensione (10, 10)),
Casella di riepilogo H(
Casella dei pulsanti ("OK",
t1sel = lb1 << Ottieni selezionato;
t2sel = lb2 << Ottieni selezionato;
Se( N elementi( t1sel ) == 0 | N elementi( t2sel ) == 0,
Nuova finestra( "Errore", < Fermare();
);
t1name = t1sel[1];
t2name = t2sel[1];
Se( t1name == t2name,
Nuova finestra( "Errore", < Fermare();
);
),
Casella dei pulsanti ("Annulla", nw2 << Chiudi finestra)
)
)
);
// Ora t1name e t2name sono stringhe con i nomi delle tabelle selezionate
// Esempio: utilizzo nella query SQL (supponendo che entrambe le tabelle siano aperte)
dtJoin = Nuova query SQL(
Versione(130),
Connessione("JMP"),
Tabelle JMP (Array associativo ({t1name, Tabella dati (t1name), t2name, Tabella dati (t2name)} ) ),
QueryName(t1name || " join " || t2name ),
< Da(
Tabella( t1name, Alias( "t1" ) ),
Tavolo(
t2name,
Alias( "t2" ),
Giuntura(
Tipo (esterno sinistro),
LE(Colonna( "TS", "t1" ), Colonna( "ORA DI FINE", "t2" ) ) &
GE(Colonna( "TS", "t1" ), Colonna( "ORA DI INIZIO", "t2" ) )
)
)
)
) << Esegui;>