Ausgabedatentabelle zusammen mit Fehlermeldung einer Funktion (JMP13)Mein JSL-Funktionsskript unten zieht eine Datei aus einem Netzwerkordner und gibt sie in einer Datendatei zur Verwendung an anderer Stelle aus. Wie gebe ich die Fehlermeldung "Diese Grenzwertdatei existiert nicht! Dateinamen prüfen" zusammen mit der Datendatei. Ich bin auf JMP13.
Names Default To Here( 1 );
getLimitsFile = Function({LimFileName}, {dtspk},
dtspk = Try(
Open(
"\\gbshyt-ppor-334e\DBX\XPD\System\Limits\"||LimFileName||".txt",
columns(
New Column( "ParameterName", Character, "Nominal" ),
New Column( "ColumnLSL", Character, "Nominal" ),
New Column( "ColumnUSL", Character, "Nominal" ),
New Column( "ColumnUnits", Character, "Nominal" ),
New Column( "ColumnSymb", Character, "Nominal" ),
New Column( "ColumnComm", Character, "Nominal" )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 1 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
//,invisible)
),"This limit file does not exist! Check file name");
return(dtspk);
);Wie kann im Fehlerfall die weitere Ausführung des Codes gestoppt werden, in dem die Funktion verwendet wird, und wie kann dem Benutzer ein Dialogfeld mit der Fehlermeldung angezeigt werden?
SkripterstellungBetreff: Ausgabedatentabelle zusammen mit Fehlermeldung einer Funktion (JMP13)Danke @jthi , Ja, JMP 13 hat File Exists (). Ich werde es versuchen.
Ich habe meine Anfrage vorher nicht richtig formuliert. Wenn die Datei nicht existiert, möchte ich nur, dass die Funktion den Fehler in einem Dialogfeld ausgibt und die weitere Ausführung stoppt.
Wenn die Datei existiert, möchte ich nur die Datentabelle und die Nachrichtenausgabe. Wie erreicht man das?
Betreff: Ausgabedatentabelle zusammen mit Fehlermeldung einer Funktion (JMP13)Wenn JMP13 die Funktion File Exists() bereitstellt, können Sie sie mit der if-Anweisung verwenden. Dann ist es eine Entscheidung, was zurückgegeben wird / wie das Programm gestoppt wird. Sie können zum Beispiel Throw() oder Stop() verwenden
Names Default To Here(1);
getLimitsFile = Function({LimFileName}, {dtspk},
If(!File Exists("\\gbshyt-ppor-334e\DBX\XPD\System\Limits\"||LimFileName||".txt"),
Throw("This limit file does not exist! Check file name");
//or use return and throw outside function
);
//Open...
return(dtspk);
);
getLimitsFile("");
Show("continue...");
Bearbeiten:
Welche Datentabelle möchten Sie mit dem Fehler zurückgeben? Wenn Sie die Datei nicht öffnen können, gibt es keine zurückzugebende Datentabelle, es sei denn, Sie erstellen eine leere.
Betreff: Ausgabedatentabelle zusammen mit Fehlermeldung einer Funktion (JMP13)Ich habe noch kein Dialogfeld zum Hauptcode, der die Funktion verwendet.
Wenn ein Fehler auftritt, weil der Benutzer einen falschen Dateinamen übergeben hat, möchte ich, dass der Hauptcode dem Benutzer ein Dialogfeld mit dem Fehler anzeigt und jede weitere Ausführung des Hauptcodes stoppt. Wenn der Dateiname fehlerfrei ist, wird die Datei aus dem Netzwerkspeicherort gezogen und an eine Datentabelle übergeben, die im Hauptcode verfügbar sein muss. Ich hoffe, ich habe Ihre Fragen beantwortet @jthi .
Betreff: Ausgabedatentabelle zusammen mit Fehlermeldung einer Funktion (JMP13)Klar, das sollte reichen! Dies ist ein wenig anwendungsabhängig (und Programmierer/Skripter), wie Sie mit dem Fehler umgehen möchten.
Das folgende Beispiel hat zwei ziemlich einfache Möglichkeiten, wie Sie damit umgehen können. Wenn sich JMP13 ähnlich wie JMP16 verhält, sollten beide in Ordnung sein (natürlich hängt es auch von Ihrer Anwendung ab). Der Unterschied besteht darin, dass der erste einen Fehler innerhalb der Funktion auslöst, der zweite eine Zeichenfolge zurückgibt, wenn es ein Problem mit dem Dateipfad gibt und das Ergebnis außerhalb der Funktion behandelt wird.
Names Default To Here(1);
open_file_with_throw = function({file_path}, {default local},
If(!File Exists(file_path), //! inverts the File Exists result
Throw(Eval Insert("^file_path^ file doesn't exist, check file path"));
);
dt = Open(file_path);
return(dt); //return datatable reference
);
open_file_with_throw("testpath");
Show("Shouldn't be executed, due to throw");
//with working file path you will get reference to opened table returned
dt = open_file_with_throw("$SAMPLE_DATA/Big Class.jmp");
open_file_with_return = function({file_path}, {default local},
If(!File Exists(file_path), //! inverts the File Exists result
return(Eval Insert("^file_path^ file doesn't exist, check file path"));
);
dt = Open(file_path);
return(dt); //return datatable reference
);
// this wont error, so you will have to handle error yourself
// one thing I don't like about this solution, is that you will have two different types of returns
// from same function
result = open_file_with_return("testpath");
If(Type(result) == "String",
//Throw(result);
//or you can build the error with modal window and stop after it is closed
//@craige_hales post has quite good template for this type of modals here: https://community.jmp.com/t5/Uncharted/Modal-Dialogs/ba-p/436177
//below is very simple one
New window("Error", << modal,
text box(result)
);
stop();
);
Show("Shouldn't be executed, due to stop");
dt = open_file_with_throw("$SAMPLE_DATA/Big Class.jmp");
Betreff: Ausgabedatentabelle zusammen mit Fehlermeldung einer Funktion (JMP13)Danke @jthi . Wie man die fängt Wurf Nachricht in einem Dialogfeld? Unten scheint nicht zu funktionieren.
Names Default To Here(1);
open_file_with_throw = function({file_path}, {default local},
If(!File Exists(file_path), //! inverts the File Exists result
Throw(Eval Insert("^file_path^ file doesn't exist, check file path"));
);
dt = Open(file_path);
return(dt); //return datatable reference
);
result = open_file_with_throw("testpath");
Show(result);
If(Type(result) == "String",
New window("Error", << modal,
text box(result)
);
stop();
);
Betreff: Ausgabedatentabelle zusammen mit Fehlermeldung einer Funktion (JMP13)Verwenden Sie in diesem Fall Return() anstelle von Throw()
Betreff: Ausgabedatentabelle zusammen mit Fehlermeldung einer Funktion (JMP13)Ich bevorzuge den Wurf, weil er bei Bedarf gefangen werden kann und die JSL stoppt, wenn er nicht gefangen wird.
open_file_with_throw = Function( {file_path},
{default local},
If( !File Exists( file_path ), //! inverts the File Exists result
Throw( Eval Insert( "^file_path^ file doesn't exist, check file path" ) )
);
dt = Open( file_path );
Return( dt ); //return datatable reference
);
moreJSL = Function( {dt},
Show( N Rows( dt ) );
Close( dt, nosave );
);
errorHandler = Function( {msg}, Show( msg ) );
Write( "\!ncase 1:" );
Try(
dt = open_file_with_throw( "$sample_data/big class.jmp" ),
dt = Empty();
errorHandler( exception_msg );
);
If( !Is Empty( dt ),
moreJSL( dt )
);
Write( "\!ncase 2:" );
Try(
dt = open_file_with_throw( "testpath" ),
dt = Empty();
errorHandler( exception_msg );
);
If( !Is Empty( dt ),
moreJSL( dt )
);
// or even this, but the error handler may be handling exceptions from moreJSL() as well as open_file_with_throw()
Write( "\!ncase 3:" );
Try( moreJSL( open_file_with_throw( "$sample_data/big class.jmp" ) ), errorHandler( exception_msg ) );
Write( "\!ncase 4:" );
Try( moreJSL( open_file_with_throw( "testpath" ) ), errorHandler( exception_msg ) );