<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 警報對話框.. 這有點不錯,但不夠友好...我想用我的函數來檢查錯誤.....
有沒有某種方法來控制這些是否進入日誌??? 我在繼承的這個新腳本中看到的唯一區別是,在 UI 出現之後,它不會進行任何資料庫呼叫... 如果我在呈現並定義/填充新視窗之前進行 Open Database() 呼叫..錯誤在日誌中... 有趣的!!我怎麼才能讓它把它們全部寫入日誌..?
完美的! 謝謝! 效果非常好...正是我正在尋找的......
如果您開啟批次交互,它將強制將對話框記錄到日誌(在大多數情況下)。請確保不要將其留在上面,因為它可能會造成很多混亂。我只想做類似的事情
腳本腳本腳本腳本;
批量交互(1);
資料庫調用;
批次互動(0);
更多腳本腳本腳本
我在 JMP9 和 JMP12 中都看到了這一點...
這有點奇怪,因為我在我們最近使用的其他幾個插件腳本中沒有看到這些東西...
關於這個特定的腳本...... 我找不到關於資料庫呼叫(打開資料庫())的任何不同之處,但如果使用者介面尚未出現,錯誤將寫入日誌檔案...
如果呈現 UI,且使用者正在與其互動。突然間,這些錯誤不會記錄到日誌中,而是以互動方式顯示。
這當然會導致進一步的錯誤,因為我們無法像處理所有其他腳本一樣從日誌中捕獲錯誤...
在我測試時,我在 UI 出現之前添加了一個資料庫呼叫(透過 new Window())
當然,足夠了,錯誤會記錄到日誌中,我可以捕獲它......
// 測試資料庫連線並回報是否有錯誤...
// 奇怪的是,這個腳本不會將所有資料庫錯誤寫入日誌文件,所以我們至少要確保可以正常連接..
dbTestQuery = "從雙中選擇 SYSDATE";
如果(版本 < 11,
dtTest = 開啟資料庫(
"DSN="||DSN_NAME||"",
資料庫測試查詢
);
, /// 否則我們可以在這裡使用 Invisible 指令
dtTest = 開啟資料庫(
"DSN="||DSN_NAME||"",
資料庫測試查詢,
Invisible // 此資料表將不可見,但會顯示在視窗清單中
);
);
_DBError=checkLogForODBCErrors("dbConnectTest");
print("資料庫測試DBError=“|| 字元(資料庫錯誤));
// 關閉資料來源,因為我們已經從表中檢索了數據
關閉(dtTest,“nosave”);
print("關閉資料庫連線:dbTest");
然後我可以向用戶呈現更有意義的錯誤訊息,並在資料庫呼叫之後使用它來驗證我們是否有錯誤...
/*
資料庫呼叫後檢查 JMP 日誌檔案中是否有錯誤
*/
checkLogForODBCErrors = 函數(,
// 好的,我們現在就可以開始了。
// 清除日誌();
// 檢查日誌視窗中的 ODBC 錯誤
紀錄內容=取得日誌(-10); // 從日誌中取得最後 20 行
成立錯誤=0;
// 尋找 [ODBC 驅動程式管理員] 錯誤
// 或者
// 尋找 [VerticaDSII] 錯誤
// 或者
// 尋找“LDAP 身份驗證”
對於 (i = 1, i <= nitems(_log_contents), i++,
如果(包含(_log_contents , "[Microsoft][ODBC 驅動程式管理員]"), // 尋找這些錯誤
成立錯誤=1;
extraErrorMessageText="請檢查您的 ODBC 資料來源配置並確保您已命名 DSN=" || DSN_NAME || “。” ||
「同時驗證您的使用者名稱和密碼是否正確。並且連線測試成功」;
休息();
, // 別的
如果(包含(_log_contents , "[Vertica][VerticaDSII]"), // 找出這些錯誤
成立錯誤=1;
extraErrorMessageText="使用資料來源名稱連接到資料庫時似乎出現問題=" || DSN_NAME || 「。」;
休息();
, // 別的
如果(包含(_log_contents , "LDAP 驗證"), // 找出這些錯誤
成立錯誤=1;
extraErrorMessageText="請檢查 DSN 的 ODBC 資料來源設定:" || DSN_NAME || “。” ||
「並驗證您的使用者名稱和密碼是否正確。」;
休息();
,
如果(包含(_log_contents , "FATAL "), // 找出這些錯誤
成立錯誤=1;
extraErrorMessageText="請檢查 DSN 的 ODBC 資料來源設定:" || DSN_NAME || “。” ||
「並驗證您的使用者名稱和密碼是否正確。」;
休息();
);
);
);
);
);
如果(_發現_錯誤,
// 然後
// 列印一些有用的信息到Log
print("插件: " || addinName);
列印(“DSN:” || DSN_NAME);
print("_Caller: " || _Caller);
_nw = 新視窗("MFG360: 資料庫錯誤", << 模態,
textbox("" || _Caller || "中發生以下錯誤: "),
文字方塊(””),
文字方塊(_log_內容),
文字方塊(””),
文字框(額外的ErrorMessageText),
文字方塊(””),
textbox(“如果需要,請將 JMP 日誌視窗的內容透過電子郵件發送給技術支援。” ||
“要查看日誌窗口,請按一下“視圖”>“日誌”,然後按一下“視窗”>“日誌”。”)
);
);
成立錯誤; // 回傳 1(真)或 0(假)....
);
我剛剛根據我的計算結果對我們的其他腳本進行了測試……我確實看到了相同的行為……。
UI 啟動並運行後的任何資料庫呼叫似乎都會呈現互動式 JMP 警報,但日誌檔案中不會有任何內容..?
這種破壞了我的錯誤處理......並且我必須添加更多驗證測試來檢查我猜返回的數據表......?
除非有辦法強制這些錯誤進入日誌,這樣我就可以提供更多用戶友好的錯誤對話框...
嘿,克洛克,
這可能值得在(發送電子郵件至support@sas.com )。
一般來說,腳本產生的錯誤會記錄到 JMP 日誌中,與 JMP UI 互動產生的錯誤會顯示為警報,但腳本和 UI 都涉及的地方存在灰色區域。因此,您看到 UI 是否顯示的差異並不令人震驚。
如果您可以添加有關您正在使用的 JMP 版本的資訊以及出現的警報對話框的螢幕截圖,那將會很有幫助。如果您有一個腳本可以重現您可以附加(或發送給技術支援)的問題,那就太好了。
謝謝,
艾瑞克