<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");
然后我可以向用户呈现更有意义的错误消息,并在数据库调用之后使用它来验证我们是否有错误......
/*
DB 调用后检查 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 版本的信息以及出现的警报对话框的屏幕截图,那将会很有帮助。如果您有一个脚本可以重现您可以附加(或发送给技术支持)的问题,那就太好了。
谢谢,
埃里克