Ejecute consultas en segundo plano, espere a que se completen y haga referencia a ellas en el script JSL restanteProblema
Desea ejecutar una consulta en segundo plano para que la interfaz de usuario no se bloquee, o desea ejecutar varias consultas al mismo tiempo y luego combinar los resultados. A veces es difícil poner toda la funcionalidad que necesita en el script 'en ejecución completa' de las consultas en segundo plano.
Solución
Cada consulta guarda los resultados en un nuevo espacio de nombres al que pueden acceder todos los scripts (consultas y el script original).La secuencia de comandos original sigue comprobando los resultados antes de continuar.
//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 );Desea ejecutar consultas en segundo plano pero necesita interactuar con los resultados.Este método permite que se completen varias consultas en segundo plano antes de interactuar con los resultados.
UtilidadesRe: Ejecute consultas en segundo plano, espere a que se completen y haga referencia a ellas en el script JSL restantePrimero, gracias por este script. Uso de espacios de nombres, secuencias de comandos de consultas SQL, probar si están hechas, proporcionar retroalimentación de estado, gestionar los resultados; este script contiene mucha enseñanza en unas pocas líneas de JSL.Puedo seguir la mayor parte, pero No tengo mucha experiencia en la definición y el uso de espacios de nombres, así que tengo una pregunta:
En la segunda línea del guión, ns es definido como :
ns = new namespace( "queries" );
Entonces parece ns se redefine en las sentencias Run Background():
sql_query2 << Run Background( OnRunComplete(
ns = namespace( "queries" );
ns:dt2 = queryResult;
ns:query2isdone = 1;
) );
¿Es el espacio de nombres dentro de sql_query1 & 2 el mismo espacio de nombres que el definido al comienzo del script, parece que tendría que serlo, o es un espacio de nombres que es local a la declaración de consulta debido a la Nombres predeterminados aquí (1) declaración al principio? Por que ns debe definirse dentro de la instrucción Run Background()?
Gracias de nuevo por un código simple, claro y hermoso.
Re: Ejecute consultas en segundo plano, espere a que se completen y haga referencia a ellas en el script JSL restanteaún así, un buen código para hacer referencia en un aprieto. : )
Re: Ejecute consultas en segundo plano, espere a que se completen y haga referencia a ellas en el script JSL restanteHola @Byron_JMP ,
Acepto que si el objetivo es comprobar el estado de las consultas que se ejecutan de forma interactiva, el usuario no debe buscar más allá del Generador de consultas.Esta ventana de estado estaba destinada a demostrar las partes del trabajo con consultas que los usuarios tenían problemas para encontrar con búsquedas web simples, como hacer referencia a los resultados en una secuencia de comandos después de que se completó. Para ser honesto, recuerdo haber tenido dificultades para encontrar un ejemplo mínimo.Estoy seguro de que hay un mejor caso de uso por ahí...
Re: Ejecute consultas en segundo plano, espere a que se completen y haga referencia a ellas en el script JSL restanteesto suena como una idea de proyecto realmente intrigante.
Solo quería señalar que en Query Builder, hay una pestaña de progreso donde puedo ver cuántas consultas se están ejecutando y su progreso. ¿Quizás esta sería una forma de programar la plataforma de creación de consultas para mostrar esta información en lugar de intentar obtenerla desde cero?