全て、
世界中の様々なデータベースからデータを取得するスクリプトがあります。このスクリプトはスケジュール設定されており、自動化されています。つまり、スクリプトは必要な処理を実行し、すべてのテーブルを保存し、JMPを閉じれば、タスクは完了します。
しかし、時折、1つか2つのデータベースが応答しなくなることがあります。LDAPサーバーがダウンしていてパスワードを受け付けなかったり、データベースのメンテナンスが行われていたりするなどの理由です。
この場合、次のようなポップアップウィンドウが表示されます。

たとえ私がその場にいて「キャンセル」をクリックしても、スクリプトは完了せずに終了してしまう。
データ取得関数をtry/catchブロックで囲んでいますが、手動で「キャンセル」ボタンをクリックしても効果がないようです。しかし、もっと重要なのは、この場合、スクリプトを監視なしで実行するにはどうすればよいかということです。データベースの1つに接続できない場合は、それを無視して残りのデータベースからデータを取得し、取得したデータを処理するように指示するにはどうすればよいのでしょうか。データベースの1つが応答しないという理由だけでスクリプト全体を停止させないようにするにはどうすればよいのでしょうか。ポップアップウィンドウを非表示にして、tryが失敗したとみなし、catchブロックに移動してスクリプトを続行するにはどうすればよいのでしょうか。
この原因となっているスクリプトの一部を以下に示します。
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] ) );
);
ありがとう、
M.
クエリをバックグラウンドで実行すれば改善されるでしょうか?私はよく、返されたデータが有効かどうかをチェックする以下のような方法を使っています。
クエリをバックグラウンドで実行し、完了するまで待機し、残りのJSLスクリプトでそれらを参照します。