PDA

View Full Version : SBMJOB und Parameterübergabe



Seiten : 1 [2] 3

camouflage
31-10-12, 12:58
Lösung:
dclf &var *char 200
chgvar &var 'abc'
call pgm parm(&var)



Hi Robi,
Du meinst wohl eher:
dcl &var *char 200


Persönlich würde ich dem noch einen value(' ') anfügen.


Wenn die Felder sauber definiert (Länge) und auch initialisiert sind, braucht es nicht solche Klimmzüge.


Allerdings frage ich mich ob svit dieses Programm zu Testzwecken auf der Commandlinie direkt aufruft - und wenn da der Parameter zu kurz ist, ist dieser Effekt anschaulich nachzuvollziehen.

BenderD
31-10-12, 13:21
Wenn die Felder sauber definiert (Länge) und auch initialisiert sind, braucht es nicht solche Klimmzüge.


Allerdings frage ich mich ob svit dieses Programm zu Testzwecken auf der Commandlinie direkt aufruft - und wenn da der Parameter zu kurz ist, ist dieser Effekt anschaulich nachzuvollziehen.

... genau das ist der Fall von denkste!
Ursache des Problems ist, dass die AS400 immer einen Call by reference macht, sprich: Adressen übergibt und keine Werte. Beim interaktiven Aufruf werden Literale übergeben, die keine auswertbare Adresse haben, beim SBMJOB stimmen die Adressräume vom Aufrufer und dem Aufgerufenen Job nicht überein - in beiden Fällen wird deshalb zur Laufzeit ein Übergabebereich erstellt, mit genau den Eigenschaften, wie beim command call beschrieben. Mit einem eigenen Command cann man das toppen, da dort jeder einzelne Parameter beschrieben wird.

D*B

camouflage
31-10-12, 14:21
@Dieter
Hast mich gleich nachdenklich gemacht, da diese Problematik nicht mehr so present ist. War wohl nur ein netter Versuch von mîr.

Offensichtlich bleiben wirklich nur Commands als sauberste Lösung übrig, wenn die Parameterstruktur zu komplex ist.

Mehr diesem Thema unter diesem Link:

Get the SBMJOB Command's CMD Parameter to Cooperate (http://www.iprodeveloper.com/article/rpg-programming/sbmjob-commands-cmd-parameter-cooperate-699450)

Fuerchau
31-10-12, 19:28
Das Problem ist doch der eingebettete Call im SBMJOB.
Also müssen die Daten in der benötigten Länge übergeben werden.
Allerdings kann man tatsächlich beliebige Daten übergeben da der Empfänger da nicht bekannt ist.
Wenn ich also 201 Bytes mit dem "!" am Ende übergebe und der Empfänger nur 200 Bytes definiert, kommt er an das "!" gar nicht dran und es muss nicht entfernt werden.
Aber wie Dieter schon sagt, sauber ist das nicht.

BenderD
01-11-12, 06:39
... natürlich kann ich das auch alles in 32er Happen zerhacken, oder vorher die Blanks escapen und nachher wieder erzeugen, oder rechts trimmen und als varchar schicken und wieder auffüllen und zig andere bitfummlerische Tricks. Problem ist dabei nur, daß bei fehlerhafter Bedienung einer solchen Wackelschnittstelle sehr seltsame Fehler an völlig anderer Stelle auftauchen können; zudem setzt man hierbei auch auf undokumentiertem Verhalten auf, wenn der Compiler dann morgen mehr prüft als heute, kriegt man das Gegurke möglicherweise nicht einmal mehr gewandelt. Letzteres ist vor nicht allzulanger Zeit bei der trickreichen Übergabe einstelliger Parameter und CALLPRC passiert!!!

D*B

Fuerchau
01-11-12, 11:30
Ochnö, für variable Übergabe (ist ja schließlich by reference) nütze ich das Durchreichen von Char(1) sehr häufig.
Ist ja gemein, wenn dass plötzlich vom Compiler abgelehnt wird, ist ja schließlich CLLE und keine HLL.

In RPGLE kann ich die PRC ja selber deklarieren, was da auch schon klappte ist "* value", also als Pointer by Value.
Das ist zwar Huddel, der Compiler frisst es aber.

svit
02-11-12, 07:52
mit Command funktioniert. Danke.

das heisst:
für SBMJOB(Call.... Parm(abc)) wird eine Kopie im Speicher erstellt und die Leerstellen nicht erkannt.
Ich nutze als Parameter eine
Ext.Ds->
Feld1(100A),
Feld2(200A),
Feld3(200A)
alle Felder sind nur bis zur Hälfte Gefüllt der Rest ist mit HEX'00' gefüllt.
Folgendes unklar:
die DS wird doch als ein String(500A) gesehen. Ich wurde verstehen wenn nur die Letzten Leerstellen von dem Feld3 mit HEX'00' gefüllt oder?

Fuerchau
02-11-12, 08:12
Es würde reichen, das letzte Byte zu füllen.
Das CMD funktioniert deshalb, weil über die Parameterdefinition zu kurze Werte dann mit Blanks automatisch gefüllt werden.

Wie bereits oben schon mal gesagt wäre der korrekte Call eben so:

CALL MYPGM PARM('langer inhalt _____')

Wichtig ist ja, dass der Parameter in korrekter Länge übergeben wird und das schafft man nur mittels Hochkomma (zu beachten ist ggf. die Hochkommaverdoppelung).

Der Unterschied zwischen dem CALL-CMD und einem CALL im CLP ist der, dass der Compiler den CALL direkt in einen Programmaufruf ändert und somit die Variablen by reference übergeben werden.

BenderD
02-11-12, 08:25
... wie sieht denn dein command aus? wenn die Definition des Commands die Schnittstelle richtig abbildet, wird da garnix mit HEX '00' oder anderen weisen Frauen gefüllt...

D*B


mit Command funktioniert. Danke.

das heisst:
für SBMJOB(Call.... Parm(abc)) wird eine Kopie im Speicher erstellt und die Leerstellen nicht erkannt.
Ich nutze als Parameter eine
Ext.Ds->
Feld1(100A),
Feld2(200A),
Feld3(200A)
alle Felder sind nur bis zur Hälfte Gefüllt der Rest ist mit HEX'00' gefüllt.
Folgendes unklar:
die DS wird doch als ein String(500A) gesehen. Ich wurde verstehen wenn nur die Letzten Leerstellen von dem Feld3 mit HEX'00' gefüllt oder?

svit
02-11-12, 09:22
D*B:
Command funktioniert. und es werden Keine Hex wert übergeben.
die Beschreibung bezog sich auf SBM und Call.

Fuerchau:
ich habe eine RPG Programm welches die DS füllt und anschliesend das CL aufruft. das CL macht SBMjob mit DS als parameter.

Mir geht es jetzt nur die Problematik zu verstehen.
Was läuft im Speicher ab.