Esegui le query in background, attendi che vengano completate e fai riferimento ad esse nello script JSL rimanenteProblema
Si desidera eseguire una query in background in modo che l'interfaccia utente non si blocchi oppure eseguire più query contemporaneamente e quindi combinare i risultati. A volte è difficile inserire tutte le funzionalità necessarie nello script "in esecuzione completa" delle query in background.
Soluzione
Ogni query salva i risultati in un nuovo spazio dei nomi a cui possono accedere tutti gli script (query e script originale).Lo script originale continua a controllare i risultati prima di procedere.
//Example script which runs queries in the background and references their results
//once finished.
names default to here(1);
// Namespace to share data between background query and this script
ns = new namespace( "queries" );
// Flags which the background query will set to 1 when the background query is complete
ns:query1isdone = 0;
ns:query2isdone = 0;
// Open a window to display results
win = New window("Query Status", show menu(0), show toolbars(0),
text box("Status of queries:"),
tb = tablebox( string col box( "Query" , { "Query 1", "Query 2" } ),
string col box( "Status", { "Not Started", "Not Started" } ) ),
tbStatus = text box("Starting queries.")
);
wait(0); //make sure window shows up
// Define and start background queries
// First Query
sql_query1 = New SQL Query(
Connection( "ODBC:DSN=Test Source;DATABASE=Test Database;" ),
QueryName( "Query" ),
Select( vars ),
From( table ),
Where( condition )
);
sql_query1 << Run Background( OnRunComplete(
ns = namespace( "queries" );
ns:dt1 = queryResult;
ns:query1isdone = 1;
) );
// Second Query
sql_query2 = New SQL Query(
Connection( "ODBC:DSN=Test Source;DATABASE=Test Database;" ),
QueryName( "Query" ),
Select( vars ),
From( table ),
Where( condition )
);
sql_query2 << Run Background( OnRunComplete(
ns = namespace( "queries" );
ns:dt2 = queryResult;
ns:query2isdone = 1;
) );
// Every second check if the query is done (timeout after 10 seconds)
i=0;
allqueriesdone = 0;
starttime = tick seconds();
while( ( i < 10 ) & allqueriesdone == 0 ,
i++;
wait(1);
if( ns:query1isdone == 1,
tb << delete row( 1 );
tb << insert row( 1, {"Query 1", "Complete"} );,
tb << delete row( 1 );
tb << insert row( 1, {"Query 1", "Still Running"} );
);
if( ns:query2isdone == 1,
tb << delete row( 2 );
tb << insert row( 2, {"Query 2", "Complete"} );,
tb << delete row( 2 );
tb << insert row( 2, {"Query 2", "Still Running"} );
);
if( (ns:query1isdone == 1 ) & (ns:query2isdone == 1 ), allqueriesdone = 1 ); //indicate that everything finished
tbStatus << Set Text( "Queries are running, " || format(tick seconds() - starttime, "Fixed Dec", 12, 1) || " seconds elapsed." );
win << bring window to front;
);
// Show an error if any queries didn't finish
if( allqueriesdone == 0,
tbStatus << Set Text("Error, a query didn't finish and is still running!"),
tbStatus << Set Text("Queries finished after " || format(tick seconds() - starttime, "Fixed Dec", 12, 1) || " seconds.");
//win << Close Window; //could close window here
);
// Now reference the data tables
show( ns:dt1 );
show( ns:dt2 );Si desidera eseguire query in background ma è necessario interagire con i risultati.Questo metodo consente di completare più query in background prima di interagire con i risultati.
UtilitàRe: eseguire query in background, attendere il completamento e fare riferimento ad esse nello script JSL rimanenteInnanzitutto, grazie per questo script. Uso di spazi dei nomi, scripting di query SQL, verifica se sono state completate, fornire feedback sullo stato, gestire i risultati; questo script racchiude molto insegnamento in poche righe di JSL.Posso seguirne la maggior parte, ma Non ho molta esperienza nella definizione e nell'utilizzo di spazi dei nomi, quindi ho una domanda:
Nella seconda riga della sceneggiatura, ns è definito come :
ns = new namespace( "queries" );
Allora sembra ns viene ridefinito nelle istruzioni Run Background():
sql_query2 << Run Background( OnRunComplete(
ns = namespace( "queries" );
ns:dt2 = queryResult;
ns:query2isdone = 1;
) );
Lo spazio dei nomi all'interno di sql_query1 e 2 è lo stesso spazio dei nomi di quello definito all'inizio dello script, sembra che dovrebbe essere, oppure è uno spazio dei nomi locale all'istruzione della query a causa del Nomi predefiniti qui(1) affermazione all'inizio? Perché lo fa ns è necessario definire all'interno dell'istruzione Run Background()?
Grazie ancora per un pezzo di codice semplice, chiaro e bello.
Re: eseguire query in background, attendere il completamento e fare riferimento ad esse nello script JSL rimanentecomunque, un bel po' di codice a cui fare riferimento in un punto ristretto. 
Re: eseguire query in background, attendere il completamento e fare riferimento ad esse nello script JSL rimanenteCiao @Byron_JMP ,
Sono d'accordo se l'obiettivo è controllare lo stato delle query eseguite in modo interattivo, quindi un utente non dovrebbe guardare oltre il Query Builder.Questa finestra di stato aveva lo scopo di dimostrare le parti del lavoro con le query che gli utenti hanno avuto difficoltà a trovare con semplici ricerche sul Web, come il riferimento ai risultati in uno script dopo il completamento. Ad essere onesto, ricordo di aver avuto difficoltà a trovare un esempio minimo.Sono sicuro che esiste un caso d'uso migliore là fuori...
Re: eseguire query in background, attendere il completamento e fare riferimento ad esse nello script JSL rimanentesembra un'idea progettuale davvero intrigante.
Volevo solo notare che in Query Builder c'è una scheda di avanzamento in cui posso vedere quante query sono in esecuzione e il loro avanzamento. Forse questo sarebbe un modo per creare uno script della piattaforma Query builder per visualizzare queste informazioni piuttosto che cercare di ottenerle da zero?