<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />今日は変なやつがいるよ……。
私はいくつかの JSL スクリプトを使用しています...それぞれに複数の Open Database() 呼び出しがあり、何らかの理由で Open Database が失敗した場合... この問題に関するログ ファイルのエントリを常に見てきました...次に、どこかで見つけた log_execute_sql.jsl からコードを借用し、基本的にログ フィールドの最後の 10 行を読み取り、エラーが発生した場合にユーザーにダイアログを表示します。
これらの各スクリプトには、関連付けられた UI があります。
今日、新しいスクリプトで作業を開始しましたが、Open Database() エラーをログに書き込むのではなく、JMP ALERT ダイアログ ボックスをスローしているようです。これはある意味良いことですが、十分にフレンドリーではありません...そして、関数を使用してエラーをチェックしたいと思います...
これらをログに記録するかどうかを制御する方法はありますか? 私が継承したこの新しいスクリプトで確認できる唯一の違いは、UI が表示されるまで DB 呼び出しを行わないことです。 新しいウィンドウがレンダリングされて定義/設定される前に Open Database() 呼び出しを行うと、エラーがログに記録されます。 面白い!!どうすればそれらすべてをログに書き込むことができますか??
これは JMP9 と JMP12 の両方で発生します...
最近私たちが取り組んでいる他のいくつかのアドイン スクリプトではこれらのことは見られないので、これは少し奇妙です…
この特定のスクリプトに関しては… DB 呼び出し (Open Database()) については何も変わっていませんが、UI がまだ表示されていない場合は、エラーがログ ファイルに記録されます。
UI が表示され、ユーザーがそれを操作している場合、突然これらのエラーがログに記録されず、対話形式で表示されます。
もちろん、他のすべてのスクリプトのようにログからエラーをトラップできなかったため、さらなるエラーが発生します...
テストとして、UI が表示される前に DB 呼び出しを追加しました (new Window() 経由)。
そして確かに、エラーはログに記録されるので、それをトラップすることができます…。
// データベース接続をテストし、エラーがある場合は報告します。
// 奇妙なことに、このスクリプトではすべての DB エラーがログ ファイルに書き込まれないため、少なくとも正常に接続できることを確認しましょう。
dbTestQuery = "デュアルから SYSDATE を選択";
if (バージョン < 11,
dtTest = データベースを開く(
"DSN="||DSN_NAME||"",
dbTestQuery
);
, /// それ以外の場合は、ここで Invisible ディレクティブを使用できます
dtTest = データベースを開く(
"DSN="||DSN_NAME||"",
dbTestQuery、
Invisible // この DataTable は表示されませんが、ウィンドウ リストには表示されます
);
);
_DBError=checkLogForODBCErrors("dbConnectTest");
print("dbTest DBError=" || char( DBエラー)) ;
// すでにテーブルからデータを取得しているため、データ ソースを閉じます
close(dtTest, "nosave");
print("クローズされた DB 接続 : dbTest");
その後、より意味のあるエラー メッセージをユーザーに表示し、DB 呼び出しの後にこれを使用して、エラーが発生したかどうかを確認できます。
/*
DB 呼び出し後の JMP ログファイルでエラーを確認する
*/
checkLogForODBCErrors = 関数(,
// さて、これで準備完了です。
// クリアログ();
// ログ ウィンドウで ODBC エラーを確認します。
ログ内容 = ログを取得(-10); // ログから最後の 20 行を取得します
見つかったエラー = 0;
// [ODBC ドライバー マネージャー] エラーを探します
// または
// [VerticaDSII] エラーを探します
// または
// 「LDAP 認証」を探します
for (i = 1, i <= nitems(_log_contents), i++,
if (contains(_log_contents , "[Microsoft][ODBC Driver Manager]"), // これらのエラーを探しています
見つかったエラー = 1;
extraErrorMessageText="ODBC データソース構成を確認し、DSN に名前が付けられていることを確認してください。" || DSN_NAME || 「。」 ||
「ユーザー名とパスワードが正しいことも確認してください。接続テストは成功しました。」;
壊す();
、 // それ以外
if (contains(_log_contents , "[Vertica][VerticaDSII]"), // これらのエラーを探しています
見つかったエラー = 1;
extraErrorMessageText="データ ソース名を使用してデータベースに接続する際に問題が発生したようです" || DSN_NAME || "。";
壊す();
、 // それ以外
if (contains(_log_contents , "LDAP 認証"), // これらのエラーを探しています
見つかったエラー = 1;
extraErrorMessageText="DSN の ODBC データソース構成を確認してください: " || DSN_NAME || 「。」 ||
"そして、ユーザー名とパスワードが正しいことを確認してください。";
壊す();
、
if (contains(_log_contents , "FATAL "), // これらのエラーを探しています
見つかったエラー = 1;
extraErrorMessageText="DSN の ODBC データソース構成を確認してください: " || DSN_NAME || 「。」 ||
"そして、ユーザー名とパスワードが正しいことを確認してください。";
壊す();
);
);
);
);
);
if (_found_error,
// それから
// 有用な情報をログに出力します
print("アドイン: " || アドイン名);
print("DSN: " || DSN_NAME);
print("_Caller: " || _Caller);
_nw = 新しいウィンドウ("MFG360: DB エラー", << モーダル,
textbox("「 || _Caller || "で次のエラーが発生しました: "),
テキストボックス("")、
テキストボックス(_log_contents )、
テキストボックス("")、
テキストボックス(extraErrorMessageText)、
テキストボックス("")、
textbox("リクエストがあれば、JMP ログ ウィンドウの内容をテクニカル サポートに電子メールで送信してください。" ||
「ログ ウィンドウを表示するには、[表示] > [ログ] をクリックし、次に [ウィンドウ] > [ログ] をクリックします。」)
);
);
見つかったエラー; // 1 (True) または 0 (False) を返します ....
);
私が理解していることに基づいて、他のスクリプトの 1 つでテストを実行したところです…そして、同じ動作が見られます…。
UI が起動して実行された後の DB 呼び出しでは、インタラクティブな JMP アラートが表示されるようですが、ログ ファイルには何も記録されません。
この種のエラー処理は中断されます…そして、返された DataTable をチェックするために検証テストをさらに追加する必要があると思います….??
よりユーザーフレンドリーなエラーダイアログを提供できるように、これらのエラーを強制的にログに記録する方法がない限りは…
おい、クロック、
これは、テクニカル サポートの問題をオープンする価値があるかもしれません (電子メールでsupport@sas.com )。
一般に、スクリプトによって生成されたエラーは JMP ログに記録され、JMP UI との対話によって生成されたエラーはアラートとして表示されますが、スクリプトと UI の両方が関係する灰色の領域が存在します。したがって、UI が表示されるかどうかによって違いが見られるのは驚くべきことではありません。
使用している JMP のバージョンに関する情報と、表示される警告ダイアログ ボックスのスクリーン ショットを追加していただけると助かります。また、添付できる (またはテクニカル サポートに送信できる) 問題を再現するスクリプトがあれば、それも素晴らしいことです。
ありがとう、
エリック