<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich habe heute etwas Seltsames.....
Ich habe mit mehreren JSL-Skripten gearbeitet ... jedes von ihnen hat mehrere Open Database()-Aufrufe ... und wenn die Open Database aus irgendeinem Grund fehlschlägt ... Ich habe in der Protokolldatei immer Einträge zu diesem Problem gesehen ...Ich habe mir dann Code von log_execute_sql.jsl ausgeliehen, den ich irgendwo gefunden habe ... und im Grunde die letzten 10 Zeilen des Protokollfelds gelesen und Dialoge für Benutzer angezeigt, wenn ein Fehler aufgetreten ist ...
Jedem dieser Skripte ist eine Benutzeroberfläche zugeordnet.
Heute habe ich angefangen, mit einem neuen Skript zu arbeiten, und es scheint nicht die Open Database()-Fehler in das Protokoll zu schreiben, sondern vielmehr JMP-ALERT-Dialogfelder aufzurufen ... was irgendwie nett ist, aber nicht ganz freundlich genug ... und ich möchte meine Funktion verwenden, um nach Fehlern zu suchen ...
Gibt es eine Möglichkeit zu kontrollieren, ob diese in das Protokoll aufgenommen werden oder nicht??? Der einzige Unterschied, den ich in diesem neuen Skript sehen kann, das ich geerbt habe, besteht darin, dass es keine DB-Aufrufe durchführt, bis die Benutzeroberfläche angezeigt wird ... Wenn ich einen Open Database()-Aufruf durchführe, BEVOR das neue Fenster gerendert und definiert/ausgefüllt wird, steht der Fehler im Protokoll ... Interessant!! Wie kann ich dafür sorgen, dass ALLE in das Protokoll geschrieben werden??
Ich sehe das sowohl in JMP9 als auch in JMP12 ...
Es ist etwas seltsam, weil ich diese Dinge in mehreren anderen Add-in-Skripten, mit denen wir in letzter Zeit gearbeitet haben, nicht sehe ...
In Bezug auf dieses spezielle Skript ... Ich kann nichts anderes zu den DB-Aufrufen (Open Database()) finden, aber wenn sich die Benutzeroberfläche noch nicht angezeigt hat, wird der Fehler in die Protokolldatei verschoben ...
Wenn die Benutzeroberfläche angezeigt wird und der Benutzer damit interagiert, werden diese Fehler plötzlich nicht mehr im Protokoll gespeichert, sondern interaktiv angezeigt.
Was natürlich zu weiteren Fehlern führt, da wir den Fehler nicht wie bei all unseren anderen Skripten aus dem Protokoll abfangen konnten …
Beim Testen habe ich einen DB-Aufruf hinzugefügt, bevor die Benutzeroberfläche angezeigt wurde (über new Window()).
Und natürlich wird der Fehler im Protokoll gespeichert, und ich kann ihn abfangen …
// Testen Sie die Datenbankverbindung und melden Sie, wenn ein Fehler vorliegt....
// Seltsamerweise schreibt dieses Skript nicht ALLE DB-Fehler in die Protokolldatei, also stellen wir zumindest sicher, dass wir eine Verbindung herstellen können.
dbTestQuery = "wähle SYSDATE aus Dual aus";
wenn (Version < 11,
dtTest = Datenbank öffnen(
"DSN="||DSN_NAME||"",
dbTestQuery
);
, /// Ansonsten können wir hier die Invisible-Direktive verwenden
dtTest = Datenbank öffnen(
"DSN="||DSN_NAME||"",
dbTestQuery,
Unsichtbar // Diese Datentabelle ist nicht sichtbar, wird aber in der Fensterliste angezeigt
);
);
_DBError=checkLogForODBCErrors("dbConnectTest");
print("dbTest DBError=" || char( DBError)) ;
// Datenquelle schließen, da wir bereits Daten aus der Tabelle abgerufen haben
close(dtTest, "nosave");
print("Geschlossene DB-Verbindung: dbTest");
Dann kann ich dem Benutzer eine aussagekräftigere Fehlermeldung präsentieren UND diese nach dem DB-Aufruf verwenden, um zu überprüfen, ob ein Fehler aufgetreten ist oder nicht ...
/*
Überprüfen Sie die JMP-Protokolldatei nach DB-Aufrufen auf Fehler
*/
checkLogForODBCErrors = Funktion(,
// OK, jetzt kann es losgehen.
// Protokoll löschen();
// Überprüfen Sie das Protokollfenster auf ODBC-Fehler
Protokoll Inhalt = log(-10) abrufen; // Die letzten 20 Zeilen aus dem Protokoll abrufen
gefunden Fehler = 0;
// Nach [ODBC Driver Manager]-Fehlern suchen
// oder
// Nach [VerticaDSII]-Fehlern suchen
// oder
// Suchen Sie nach „LDAP-Authentifizierung“
für (i = 1, i <= nitems(_log_contents), i++,
if (contains(_log_contents , „[Microsoft][ODBC Driver Manager]“), // Auf der Suche nach diesen Fehlern
gefunden Fehler = 1;
extraErrorMessageText="Bitte überprüfen Sie Ihre ODBC-Datenquellenkonfiguration und stellen Sie sicher, dass Sie Ihren DSN benannt haben=" || DSN_NAME || "." ||
„Überprüfen Sie außerdem, ob Ihr Benutzername und Ihr Passwort korrekt sind. Die Verbindungstests werden erfolgreich durchgeführt.“;
brechen();
, // anders
if (contains(_log_contents , "[Vertica][VerticaDSII]"), // Auf der Suche nach diesen Fehlern
gefunden Fehler = 1;
extraErrorMessageText="Es scheint ein Problem beim Herstellen der Verbindung zur Datenbank über den Datenquellennamen zu geben=" || DSN_NAME || „.“;
brechen();
, // ANDERS
if (contains(_log_contents , „LDAP-Authentifizierung“), // Suche nach diesen Fehlern
gefunden Fehler = 1;
extraErrorMessageText="Bitte überprüfen Sie Ihre ODBC-Datenquellenkonfiguration für DSN: " || DSN_NAME || "." ||
„Und überprüfen Sie, ob Ihr Benutzername und Ihr Passwort korrekt sind.“;
brechen();
,
if (contains(_log_contents , „FATAL“), // Auf der Suche nach diesen Fehlern
gefunden Fehler = 1;
extraErrorMessageText="Bitte überprüfen Sie Ihre ODBC-Datenquellenkonfiguration für DSN: " || DSN_NAME || "." ||
„Und überprüfen Sie, ob Ihr Benutzername und Ihr Passwort korrekt sind.“;
brechen();
);
);
);
);
);
if (_found_error,
// Dann
// Einige nützliche Informationen in das Protokoll drucken
print("Addin: " || addinName);
print("DSN: " || DSN_NAME);
print("_Caller: " || _Caller);
_nw = neues Fenster("MFG360: DB-Fehler", << modal,
textbox("Der folgende Fehler ist in " || _Caller || " aufgetreten: "),
Textfeld(""),
textbox(_log_contents ),
Textfeld(""),
Textbox(extraErrorMessageText),
Textfeld(""),
textbox("Bei Bedarf senden Sie bitte den Inhalt des JMP-Protokollfensters per E-Mail an den technischen Support." ||
„Um das Protokollfenster anzuzeigen, klicken Sie auf „Ansicht“ > „Protokoll“ und dann auf „Fenster“ > „Protokoll“.“)
);
);
gefunden Fehler; // Rückgabe 1 (True) oder 0 (False) ....
);
Ich habe gerade einen Test mit einem unserer anderen Skripte durchgeführt, basierend auf dem, was ich herausgefunden habe … und ich sehe das gleiche Verhalten ….
Alle DB-Aufrufe, NACHDEM die Benutzeroberfläche in Betrieb ist, scheinen interaktive JMP-Warnungen anzuzeigen, aber es wird nichts in die Protokolldatei geschrieben.??
Dadurch wird meine Fehlerbehandlung unterbrochen … und ich muss vermutlich weitere Validierungstests hinzufügen, um die zurückgegebene DataTable zu überprüfen …??
Es sei denn, es gibt eine Möglichkeit, die Eintragung dieser Fehler in das Protokoll zu erzwingen, damit ich benutzerfreundlichere Fehlerdialoge bereitstellen kann …
Hey, klockk,
Es könnte sich lohnen, ein Problem mit dem technischen Support unter (E-Mail an) zu eröffnen support@sas.com ).
Im Allgemeinen werden von Skripts generierte Fehler in das JMP-Protokoll aufgenommen, und Fehler, die durch Interaktion mit der JMP-Benutzeroberfläche generiert werden, werden als Warnungen angezeigt. Es gibt jedoch Grauzonen, wenn sowohl ein Skript als auch eine Benutzeroberfläche beteiligt sind.Daher ist es nicht verwunderlich, dass Sie einen Unterschied feststellen, je nachdem, ob eine Benutzeroberfläche angezeigt wird oder nicht.
Wenn Sie Informationen über die von Ihnen verwendete JMP-Version und einen Screenshot des angezeigten Warndialogfelds hinzufügen könnten, wäre das hilfreich.Und wenn Sie ein Skript haben, das das Problem reproduziert und das Sie anhängen (oder an den technischen Support senden) könnten, wäre das auch großartig.
Danke,
Eric