Führen Sie Abfragen im Hintergrund aus, warten Sie, bis sie abgeschlossen sind, und verweisen Sie im verbleibenden JSL-Skript daraufProblem
Sie möchten eine Abfrage im Hintergrund ausführen, damit die Benutzeroberfläche nicht einfriert, oder Sie möchten mehrere Abfragen gleichzeitig ausführen und dann die Ergebnisse kombinieren. Manchmal ist es schwierig, alle benötigten Funktionen in das 'on run complete'-Skript der Hintergrundabfragen zu packen.
Lösung
Jede Abfrage speichert Ergebnisse in einem neuen Namensraum, auf den alle Skripte zugreifen können (Abfragen und das ursprüngliche Skript).Das ursprüngliche Skript sucht weiterhin nach Ergebnissen, bevor es fortfährt.
//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 );Sie möchten Abfragen im Hintergrund ausführen, müssen aber mit den Ergebnissen interagieren.Mit dieser Methode können mehrere Hintergrundabfragen abgeschlossen werden, bevor mit den Ergebnissen interagiert wird.
DienstprogrammeBetreff: Führen Sie Abfragen im Hintergrund aus, warten Sie, bis sie abgeschlossen sind, und verweisen Sie im verbleibenden JSL-Skript daraufZunächst einmal vielen Dank für dieses Skript. Verwendung von Namespaces, Skripting von SQL-Abfragen, Testen, ob sie fertig sind, Bereitstellung von Status-Feedback, Verwaltung der Ergebnisse; Dieses Skript packt eine Menge Unterricht in ein paar Zeilen JSL.Dem Großteil kann ich folgen, aber Ich habe nicht viel Erfahrung beim Definieren und Verwenden von Namespaces, daher habe ich eine Frage:
In der zweiten Zeile des Skripts ns ist definiert als :
ns = new namespace( "queries" );
Dann scheint es ns wird in den Run Background()-Anweisungen neu definiert:
sql_query2 << Run Background( OnRunComplete(
ns = namespace( "queries" );
ns:dt2 = queryResult;
ns:query2isdone = 1;
) );
Ist der Namespace in sql_query1 & 2 derselbe Namespace wie der am Anfang des Skripts definierte, scheint es so, als müsste er es sein, oder es ist ein Namespace, der aufgrund der Anweisung lokal für die Abfrage ist Namen standardmäßig hier(1) Aussage am Anfang? Warum tut ns müssen innerhalb der Run Background()-Anweisung definiert werden?
Nochmals vielen Dank für ein einfaches, klares, schönes Stück Code.
Betreff: Führen Sie Abfragen im Hintergrund aus, warten Sie, bis sie abgeschlossen sind, und verweisen Sie im verbleibenden JSL-Skript daraufTrotzdem ein nettes Stück Code, auf das man an einer engen Stelle verweisen kann. 
Betreff: Führen Sie Abfragen im Hintergrund aus, warten Sie, bis sie abgeschlossen sind, und verweisen Sie im verbleibenden JSL-Skript daraufHi @Byron_JMP ,
Ich stimme zu, wenn das Ziel darin besteht, den Status von Abfragen zu überprüfen, die interaktiv ausgeführt werden, dann sollte ein Benutzer nicht weiter als bis zum Abfrage-Generator suchen.Dieses Statusfenster sollte die Teile der Arbeit mit Abfragen demonstrieren, die Benutzer bei einfachen Websuchen nur schwer finden konnten, wie z. B. das Referenzieren von Ergebnissen in einem Skript nach dessen Abschluss. Um ehrlich zu sein, erinnere ich mich, dass es mir schwer fiel, ein Minimalbeispiel zu finden.Ich bin mir sicher, dass es da draußen einen besseren Anwendungsfall gibt ...
Betreff: Führen Sie Abfragen im Hintergrund aus, warten Sie, bis sie abgeschlossen sind, und verweisen Sie im verbleibenden JSL-Skript daraufdas klingt nach einer wirklich faszinierenden Projektidee.
Ich wollte nur darauf hinweisen, dass es im Abfragegenerator eine Fortschrittsregisterkarte gibt, auf der ich sehen kann, wie viele Abfragen ausgeführt werden und wie weit sie fortgeschritten sind. Vielleicht wäre dies eine Möglichkeit, die Query Builder-Plattform zu skripten, um diese Informationen anzuzeigen, anstatt zu versuchen, sie von Grund auf neu zu erhalten?