Alle,
Ich habe ein Skript, das Daten aus verschiedenen Datenbanken weltweit abruft. Dieses Skript ist geplant und automatisiert. Das heißt, es führt seine Aufgabe aus, speichert alle Tabellen, schließt JMP und der Vorgang ist dann abgeschlossen.
Gelegentlich reagieren jedoch ein oder zwei Datenbanken nicht. Beispielsweise ist der LDAP-Server ausgefallen und akzeptiert mein Passwort nicht, oder es finden Wartungsarbeiten an der Datenbank statt.
In diesem Fall erhalte ich ein Popup-Fenster wie dieses:

Selbst wenn ich anwesend bin, wenn dies passiert, und auf „Abbrechen“ klicke, wird das Skript beendet, ohne abgeschlossen zu werden.
Ich habe eine Funktion, die Daten aus der Datenbank abruft, in einem try/catch-Block gekapselt. Das scheint aber nicht zu helfen, wenn ich manuell auf „Abbrechen“ klicke. Viel wichtiger ist jedoch: Wie kann ich das Skript in diesem Fall unbeaufsichtigt ausführen? Wie kann ich ihm sagen: „Wenn du keine Verbindung zu einer der Datenbanken herstellen kannst, lass es einfach laufen, rufe die Daten aus den anderen Datenbanken ab und verarbeite die vorhandenen.“ Wie kann ich verhindern, dass das gesamte Skript abbricht, nur weil eine der Datenbanken nicht reagiert? Wie kann ich das Popup-Fenster ausblenden und den Fehler als fehlgeschlagen betrachten, zum catch-Block springen und das Skript fortsetzen?
Hier ist der Teil des Skripts, der dafür verantwortlich ist:
DBPaths = [
"Server1" => "ODBC:DSN=...PORT=5432;",
"Server2" => "ODBC:DSN=...PORT=5432;",
"Server3" => "ODBC:DSN=...PORT=5432;",
"Server4" => "ODBC:DSN=...PORT=5432;",
"Server5" => "ODBC:DSN=...PORT=5432;"];
myQuery = Function( {serverDBPath, server},
New SQL Query(
Version( 130 ),
Connection( serverDBPath ),
QueryName( server ),
Select( ... ),
From( ... ),
Where( ... ),
PostQueryScript( ... )
) << Run Foreground()
);
myDTs = {};
For Each( {{server, DBPath}, index}, DBPaths,
Show( server, DBPath, index );
Try( myDTs[index] = myQuery( DBPath, server ), writeToLog( server || " Query error... Using: " || DBPath ||" Error message: "||exception_msg[1] ) );
);
Danke,
M.
Ich frage mich, ob es helfen würde, die Abfragen im Hintergrund auszuführen? Ich verwende oft eine Methode wie die unten stehende, mit einer Überprüfung, ob die zurückgegebenen Daten gültig sind:
Führe Abfragen im Hintergrund aus, warte auf deren Abschluss und referenziere sie im verbleibenden JSL-Skript.