<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와 상호 작용하는 경우.. 갑자기 이러한 오류가 로그에 기록되지 않고 대신 대화식으로 표시됩니다.
다른 모든 스크립트에서처럼 로그에서 오류를 포착할 수 없기 때문에 추가 오류가 발생하는 것은 무엇입니까?
테스트하면서 UI가 나타나기 전에 (new Window()를 통해) DB 호출을 추가했습니다.
그리고 물론, 오류는 로그로 이동하고 이를 트랩할 수 있습니다…
// 데이터베이스 연결을 테스트하고 오류가 있으면 보고합니다....
// 이상하게도 이 스크립트는 모든 DB 오류를 로그 파일에 기록하지 않으므로 최소한 연결할 수 있는지 확인하겠습니다..
dbTestQuery = "듀얼에서 SYSDATE를 선택하세요";
if (버전 < 11,
dtTest = 데이터베이스 열기(
"DSN="||DSN_NAME||"",
db테스트쿼리
);
, /// 그렇지 않으면 여기서 Invisible 지시문을 사용할 수 있습니다.
dtTest = 데이터베이스 열기(
"DSN="||DSN_NAME||"",
DB테스트쿼리,
Invisible // 이 DataTable은 보이지 않지만 창 목록에는 표시됩니다.
);
);
_DBError=checkLogForODBCErrors("dbConnectTest");
print("db테스트 DBError=" || 문자( 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 드라이버 관리자]"), // 이러한 오류를 찾고 있습니다.
설립하다 오류 = 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("추가 기능: " || addinName);
print("DSN: " || DSN_NAME);
print("_Caller: " || _Caller);
_nw = new window("MFG360: DB 오류", << modal,
textbox("" || _Caller || "에서 다음 오류가 발생했습니다: "),
텍스트박스(""),
텍스트박스(_log_contents ),
텍스트박스(""),
텍스트 상자(extraErrorMessageText),
텍스트박스(""),
textbox("요청하는 경우 JMP 로그 창의 내용을 기술 지원팀에 이메일로 보내주세요." ||
" 로그 창을 보려면 보기 > 로그를 클릭한 다음 창 > 로그를 클릭하세요.")
);
);
설립하다 오류; // 1(True) 또는 0(False)을 반환합니다. ....
);
방금 제가 알아낸 내용을 바탕으로 다른 스크립트 중 하나에 대해 테스트를 수행했는데… 동일한 동작이 나타났습니다…
UI가 실행된 후 모든 DB 호출은 대화형 JMP 경고를 표시하는 것처럼 보이지만 로그 파일에는 아무것도 기록되지 않습니다..??
이런 종류의 오류 처리가 중단됩니다….. 그리고 반환된 DataTable을 확인하기 위해 더 많은 유효성 검사 테스트를 추가해야 할 것 같습니다….??
보다 사용자 친화적인 오류 대화 상자를 제공할 수 있도록 이러한 오류를 강제로 로그에 기록하는 방법이 없다면…
안녕, 클락,
다음 주소로 기술 지원 문제를 제기하는 것이 좋습니다. (이메일 주소: support@sas.com ).
일반적으로 스크립트에 의해 생성된 오류는 JMP 로그로 이동하고, JMP UI와의 상호 작용에 의해 생성된 오류는 경고로 표시되지만 스크립트와 UI가 모두 관련된 부분에는 회색 영역이 존재합니다.따라서 UI 표시 여부에 따라 차이가 나타나는 것은 놀라운 일이 아닙니다.
사용 중인 JMP 버전에 대한 정보와 나타나는 경고 대화 상자의 스크린샷을 추가해 주시면 도움이 될 것입니다.그리고 문제를 재현하는 스크립트를 첨부하거나 기술 지원팀에 보낼 수 있다면 그것도 좋을 것입니다.
감사해요,
에릭