PDA

View Full Version : Befehle als Prototypen einrichen



AndreasH
16-04-03, 09:41
Hallo zusammen,
ich möchte für einige oft aus RPGLE benutze Befehle Prototypen einrichten.
Im ersten Ansatz hab ich die Programme für die Befehlsausführung als EXTPGM() eingtragen. Bei IBM Befehlen habe ich da aber meine Bedenken, was den zukünftigen Wartungsaufwand angeht, da doch des öfteren Parameter hinzukommen.
Frage: Kann ich irgendwie das CMD direkt in den Prototypen eintragen?

B.Hauser
16-04-03, 09:55
Hallo Andreas,

mir ist nicht ganz klar, was Du erreichen möchtest.
Willst Du die ausführende Programme direkt aus RPG aufrufen oder den Command über QCMDEXC absetzen?
Oder versuchst Du Prototypen für APIs zu definieren.

Gib mal ein Beispiel.

Birgitta

AndreasH
16-04-03, 11:10
Hallo Birgitta,
nehmen wir als beispiel OVRDBF
Im Moment haben wir das Programm QCMDEXC als Prototypen as400cmd definiert.
Der Aufruf wäre also für den Ovrdbf

callp AS400CMD('OVRDBF FILE(' +
%TRIM(LIBNAME) + '/' +
%TRIM(FILENAME) + ') TOFILE('+
%TRIM(TOFILE) ')'
:512)

Bei solch einfachen Befehlen sicher noch übersichtlich.
AS400CMD('CVTSPL +
FROMFILE(' + %TRIM(SPLF) + ') -
TOSTMF(' + %TRIM(#USR) + '_' +
+ %TRIM(SPLF)
+ '.PDF) -
TODIR(' + %TRIM(DIR) + ') -
JOB(' + JOBNR + '/' +
%TRIM(JOBUSR) + '/' +
%TRIM(JOBNAME) + ') -
SPLNBR(' + %TRIM(W#SPLNRA) + ') -
TOFMT(*PDF) -
STMFOPT(*REPLACE) -
STMFCODPAG(*PCASCII)':512)
ist da dann schon etwas mehr getippe.
hier wäre mir ein Prototyp
callp cvtsplstmf(
splf :pc_file :Dir:JobNr:JobUsr:JobName:SplNr:'*PDF':'*REPLACE': '*PCASCII') wesentlich lieber. mir ist schon klar, dass da bei dem Beispiel noch diverse *OMITs für ausgelassene Paramter reinmüssten. Sollte nur ein Bild geben, was ich mir vorstelle.
Die Frage ist jetzt, gibt es statt EXTPGM('CPPvonCMD') (das Befehlsausführungspgm eines Commands) mit allen seinen Parametern, die sich jedes Release ändern können, eine elegante Art, den Befehl direkt als Prototypen zu definiern? EXTCMD('OVRDBF') wäre ja schick, aber das Keyword gibts ja leider nicht :-)


[Dieser Beitrag wurde von AndreasH am 16. April 2003 editiert.]

B.Hauser
16-04-03, 14:39
Hallo Andreas,

eine Universal-Lösung kann ich dir nicht bieten, aber vielleicht einen Vorschlag.

Schreibe ein Programm, in dem die wichtigsten Parameter übergeben werden müssen.
Die restlichen lässt Du entweder weg, oder definierst sie mit Options(*NoPass)oder Options(*NoPass: *Omit).
In deinem Programm baust Du dann den Befehl zusammen aus den übergebenen Parameter und Default-Werten zusammen und rufst ihn über QCMDEXC auf.

Ich habe etwas Ähnliches mit unseren Send Message Befehlen gemacht.
Der einzige Unterschied ist, dass ich keinen CL-Befehl über QCMDEXC absetze, sondern ein API aufrufe.

Wenn ich z.B. eine Escape Message schicken möchte, brauche ich nur SndEscMsg('MSG1234') aufzurufen.
Die anderen für das API benötigten Parameter werden in dem Programm mit Unterlassungs-Werten versorgt.
Werden variable Message-Texte oder eine andere als unsere Standard-Message-File benötigt, werden die entsprechenden Parameter übergeben.

Dadurch werden die APIs mit ihren komplexen Parameter-Strukturen nur an einer Stelle aufgerufen und müssen (falls sich etwas ändern sollte) auch nur an einer Stelle geändert werden.

Birgitta

Fuerchau
23-04-03, 15:48
Ausserdem muss man sich mal die Struktur von Parametern der Kommandos ansehen. (Im CL-Handbuch beschrieben, Felder, Listen, Elemente, mit/Ohne Attribut oder Längeninfo usw. usw.).
Selbst nicht ausgewählte Schlüsselworte werden mit ihrem Defaultwert an das ausführende Programm übergeben. Dazu gibt es auch noch versteckte Schlüsselworte, die man gar nicht herausbekommt.

Übrigens kann man die Berechtigung von CMD- und PGM-Objekt trennen.
Während das CMD-Objeckt bei *PUBLIC *USE aufweist, gilt für das Programm *PUBLIC *EXCLUDE !
Damit ist ein Direktaufruf eines CMD's in den meisten Fällen sowieso nicht möglich.

AndreasH
23-04-03, 16:44
Ich danke euch,
Ich werde wohl die von Birgitta vorgeschlagen Lösung für die häufigen Befehle benutzen.
Vielleicht "schenkt" uns IBM ja mal das Schlüsselwort EXTCMD()

Fuerchau
23-04-03, 18:19
Ich bezweifle das, da es ja CL gibt und die Möglichkeiten eines Kommandos sehr vielfältig sind.

Übrigens, ein CLP kann auch ein CLLE sein und ist somit auch als Prozedur aufrufbar.