PDA

View Full Version : externe DS als Parameter übergeben



psd-400
07-10-04, 07:11
Guten Tag zusammen.

Ich stehe vor der Herausforderung, dass ich 1 RPG-Programm, das z. Zt. einfach per CALL aufgerufen wird nun als SBMJOB laufen lassen will (soll). Normalerweise ist das nicht schwer, doch leider ist hier für mich ein neues, mir unbekanntes Problem aufgetreten.

In der Parameterliste ist eine extern beschriebene DS. Das ist ja auch noch (fast) handelbar, jedoch hat diese DS Felder mit der Definition VARLEN.

Anbei der komprimierte, derzeitige Quellcode

DS für Parameter

D §iDSADR E DS EXTNAME(DATEI)









c *ENTRY PLIST

c PARM §iMNR 8 0

c PARM §iLNR 7 0

c PARM §iBEKU 2

c PARM §iBSTNR

c PARM §iDSADR











c call callpgm

c PARM §iMNR

c PARM §iLNR

c PARM §iBEKU

c PARM §iEMAIL

c PARM §iBSTNR

c PARM §iDSADR





Meine Experimente waren bis dato nicht sonderlich erfolgreich. Ein CL, in dem ich die Datei als DCLF und RCVF als Dummy benutzt habe, um die Felder und die Längen im Zugriff zu haben ist ebenso fehlgeschlagen, wie ein dirketer SBMJOB-Aufruf aus dem RPG über QCMD.

Ich bin für Hinweise und Tipps dankbar.

Schönen Tag und Gruß Malte Dols

BenderD
07-10-04, 08:23
Hallo,

Datenstrukturen sind intern schnöde alfa, die Länge sieht man mit DSPFD, oder in der Umwandlungsliste eines RPG Programmes. Bei den Varlen Feldern steht binary die Länge in den ersten zwei Stellen. Zur Aufbereitung schreibt man sich am einfachsten ein kleines RPG, oder transferiert das CL Programm gleich ganz nach RPG.

mfg

Dieter Bender


Guten Tag zusammen.

Ich stehe vor der Herausforderung, dass ich 1 RPG-Programm, das z. Zt. einfach per CALL aufgerufen wird nun als SBMJOB laufen lassen will (soll). Normalerweise ist das nicht schwer, doch leider ist hier für mich ein neues, mir unbekanntes Problem aufgetreten.

In der Parameterliste ist eine extern beschriebene DS. Das ist ja auch noch (fast) handelbar, jedoch hat diese DS Felder mit der Definition VARLEN.

Anbei der komprimierte, derzeitige Quellcode

DS für Parameter

D §iDSADR E DS EXTNAME(DATEI)

?







c *ENTRY PLIST

c PARM §iMNR 8 0

c PARM §iLNR 7 0

c PARM §iBEKU 2

c PARM §iBSTNR

c PARM §iDSADR







?



c call callpgm

c PARM §iMNR

c PARM §iLNR

c PARM §iBEKU

c PARM §iEMAIL

c PARM §iBSTNR

c PARM §iDSADR





Meine Experimente waren bis dato nicht sonderlich erfolgreich. Ein CL, in dem ich die Datei als DCLF und RCVF als Dummy benutzt habe, um die Felder und die Längen im Zugriff zu haben ist ebenso fehlgeschlagen, wie ein dirketer SBMJOB-Aufruf aus dem RPG über QCMD.

Ich bin für Hinweise und Tipps dankbar.

Schönen Tag und Gruß Malte Dols

psd-400
07-10-04, 08:30
Hallo Dieter.

Das eine DS einfach nur intern alpha ist habe ich auch gedacht, aber da sich in der DS auch gepackte numerishce Felder befinden, kommt auf der anderen Seite bei Übergabe des SBMJOB irgendwie nur Schrott an, der nicht weiter verarbeitet werden kann.

Daher werde ich noch weiter experimentieren.

Trotzdem Danke.

Gruß Malte

BenderD
07-10-04, 08:49
Hallo Malte,

wenn Schrott ankommt, dann wird auch Schrott übergeben und mit experimentieren wird das nix. Da müsstest Du zumindest mal posten, wie du den Schrott erzeugst, sprich die Datenstruktur mit Werten belegst.

mfg

Dieter Bender


Hallo Dieter.

Das eine DS einfach nur intern alpha ist habe ich auch gedacht, aber da sich in der DS auch gepackte numerishce Felder befinden, kommt auf der anderen Seite bei Übergabe des SBMJOB irgendwie nur Schrott an, der nicht weiter verarbeitet werden kann.

Daher werde ich noch weiter experimentieren.

Trotzdem Danke.

Gruß Malte

Fuerchau
07-10-04, 09:23
Das Problem bei Datenstrukturen besteht in der Länge des Parameters, der beim CALL-CMD in Hochkomma übergeben werden muss !
Bei gepackten Inhalten und der Längeninformation der VARLEN-Felder besteht die Gefahr, dass der Hexwert des Hochkomma vorkommen kann und der CALL ggf. fehlschlägt.
Wenn die Struktur 1024 Byte nicht übersteigt, kann man sie vor dem SBMJOB in die LDA schreiben und im Batch die LDA wieder auslesen, da die LDA immer mit kopiert (submitted) wird.
Ist die Struktur länger, empfiehlt sich eine Datei als Übergabe, in der man einen eindeutigen Schlüssel mit den Parametern einträgt und ein Vorprogramm mit diesem Schlüsselwert als Parameter submitted, dieses Vorprogramm liest und löscht dann diesen Satz und ruft das eigentliche Programm auf.

psd-400
07-10-04, 10:39
Hallo zusammen,

anbei nun die Quellecodes.

Hier ist der Quellcode für das aufrufende PGM

H OPTION(*SRCSTMT)
H DEBUG(*YES)
fmitadress if e k disk
D dsadr e ds extname(mitadress)
d qcmdexc pr extpgm('QCMDEXC')
d cmd 800A options(*varsize) const
d cmdlen 15p 5 const
c #keymia klist
c kfld miadrlnrad
c eval miadrlnrad = 1
c #keymia chain mitadress
/free
qcmdexc ('SBMJOB CMD(CALL PGM(T4R2) PARM(DSADR))' : %size
('SBMJOB CMD(CALL PGM(T4R2) PARM(DSADR))'));
c eval *inlr = *on

und aus dem DEBUGGER die Auflösung der DSADR

EVAL DSADR
MIADRLNRAD OF DSADR = 0000001.
MIADRANKEY OF DSADR = '01'
MIADRNAME1 OF DSADR = 'Testname 1'
MIADRNAME2 OF DSADR = 'Testname 2'
MIADRNAME3 OF DSADR = 'Testname 3'
MIADRFANAM OF DSADR = 'Test Familienname'
MIADRVNAME OF DSADR = ' '
MIADRSTRAS OF DSADR = 'Teststrasse '
MIADRSTRNK OF DSADR = 000000.
MIADRSTREK OF DSADR = 00000.
MIADRHNRVO OF DSADR = 0059.
MIADRHNRZV OF DSADR = ' '
MIADRHNRBI OF DSADR = 0000.
MIADRHNRZB OF DSADR = ' '
MIADRPOSTF OF DSADR = '11 40 '
MIADRLKZ_S OF DSADR = 'DE '
MIADRLKZ_P OF DSADR = 'DE '
MIADRPLZ_S OF DSADR = '68526 '
MIADRPLZ_P OF DSADR = '68520 '
MIADRORTST OF DSADR = ' '
MIADRORT_S OF DSADR = ' '
MIADROKZ_S OF DSADR = 33714000.
MIADRORT_P OF DSADR = ' '
MIADROKZ_P OF DSADR = 33714000.
MIADRTEL OF DSADR = '0123456789012 '
MIADRFAX OF DSADR = '0123456789012 '
MIADREMAIL OF DSADR ' '
MIADRBLD OF DSADR = 08.
MIADRLVD OF DSADR = 0008.
MIADRGWAA OF DSADR = 0826.
MIADRHZA OF DSADR = 0062.
MIADRAMG OF DSADR = 0722.
MIADRADAT OF DSADR = '30.11.2000'
MIADRAUSR OF DSADR = 'UEBERNAHME'
MIADRAEDAT OF DSADR = '27.02.2004'
MIADRAEUSR OF DSADR = 'BRINRAL0 '
MIADRREDAT OF DSADR = '01.01.0001'
MIADRREUSR OF DSADR = ' '
MIADRLDAT OF DSADR = '01.01.0001'
MIADRLUSR OF DSADR = ' '
MIADRSKZ OF DSADR = ' '


und nun der Quellecode für das empfangende PGM

H OPTION(*SRCSTMT)
H DEBUG(*YES)
D dsadr e ds extname(mitadress)
c *entry plist
c parm dsadr
c dump
c eval *inlr = *on


und der Auszug des Dumps

NAME ATTRIBUTE WERT
_QRNL_PRMCPY_DSADR POINTER SPP:D648846EF8001646
_QRNL_PSTR_DSADR POINTER SPP:D648846EF8001646
DSADR DS
MIADRADAT DATE(10) ' ' '40404040404040404040'X
MIADRAEDAT DATE(10) ' ' '40404040404040404040'X
MIADRAEUSR CHAR(10) ' ' '40404040404040404040'X
MIADRAMG ZONED(4,0) . '40404040'X
MIADRANKEY CHAR(2) 'R ' 'D940'X
MIADRAUSR CHAR(10) ' ' '40404040404040404040'X
MIADRBLD ZONED(2,0) . '4040'X
MIADREMAIL CHAR(50) VARYING ' '
VALUE IN HEX '4040404040404040404040404040404040404040404040404 0404040404040404040404040404040'X
41 '404040404040404040404040'X
MIADRFANAM CHAR(32) VARYING ' PARM(DSADR) '
VALUE IN HEX 'F25D40D7C1D9D44DC4E2C1C4D95D404040404040404040404 0404040404040404040'X
MIADRFAX CHAR(22) VARYING ' '
VALUE IN HEX '404040404040404040404040404040404040404040404040' X
MIADRGWAA ZONED(4,0) . '40404040'X
MIADRHNRBI ZONED(4,0) . '40404040'X
MIADRHNRVO ZONED(4,0) . '40404040'X
MIADRHNRZB CHAR(4) ' ' '40404040'X
MIADRHNRZV CHAR(4) ' ' '40404040'X
MIADRHZA ZONED(4,0) . '40404040'X
MIADRLDAT DATE(10) ' ' '40404040404040404040'X
MIADRLKZ_P CHAR(3) ' ' '404040'X
MIADRLKZ_S CHAR(3) ' ' '404040'X
MIADRLNRAD PACKED(7,0) ]4Ú2]1]. 'C4E2C1C4'X
MIADRLUSR CHAR(10) ' ' '40404040404040404040'X
MIADRLVD ZONED(4,0) . '40404040'X
MIADRNAME1 CHAR(32) VARYING ' o '
VALUE IN HEX '4040404040404040404040404040404040404040404040404 0404000019600000000'X
MIADRNAME2 CHAR(32) VARYING ''
VALUE IN HEX '000004E3F4D9F2860000000004D7C1D9D480000001000D000 1960000000005C4E2C1'X
MIADRNAME3 CHAR(32) VARYING 'DR» CALL PGM(T4R2)'
VALUE IN HEX 'E2C1C4D98B00000000004040404040404040001AC3C1D3D34 0D7C7D44DE3F4D9F25D'X


Den Rest spare ich mir, da auch in diesen Felder keine besonderen Werte stehen.

Was mache ich falsch?

Wenn ich einen direkten CALL absetze, kommt im aufgerufenen PGM das richtige an. Das habe ich durch andere kleine TestPgms abgecheckt.

Gruß Malte Dols

BenderD
07-10-04, 10:48
@Baldur:

von der LDA Klamotte halte ich eher nix. Der sauberste OS400 Weg für dieses Problem ist die Definition eines eigenen Command Objektes. Wenn ich mich noch richtig an meine CL Zeiten erinnere, kommt man unter Benutzung des Parameters RQSDATA des SBMJOB ebenfalls zum Ziel.

Dieter


Das Problem bei Datenstrukturen besteht in der Länge des Parameters, der beim CALL-CMD in Hochkomma übergeben werden muss !
Bei gepackten Inhalten und der Längeninformation der VARLEN-Felder besteht die Gefahr, dass der Hexwert des Hochkomma vorkommen kann und der CALL ggf. fehlschlägt.
Wenn die Struktur 1024 Byte nicht übersteigt, kann man sie vor dem SBMJOB in die LDA schreiben und im Batch die LDA wieder auslesen, da die LDA immer mit kopiert (submitted) wird.
Ist die Struktur länger, empfiehlt sich eine Datei als Übergabe, in der man einen eindeutigen Schlüssel mit den Parametern einträgt und ein Vorprogramm mit diesem Schlüsselwert als Parameter submitted, dieses Vorprogramm liest und löscht dann diesen Satz und ruft das eigentliche Programm auf.

BenderD
07-10-04, 10:55
Hallo Malte,

du übergibst schnöderweise das Literal DSADR an das Programm.
Du musst den String zusammen basteln.

Dieter Bender



qcmdexc ('SBMJOB CMD(CALL PGM(T4R2) PARM(DSADR))' : %size
('SBMJOB CMD(CALL PGM(T4R2) PARM(DSADR))'));
Dols

psd-400
07-10-04, 12:06
Nochmals Hallo zusammen.

Ich habe die Idee von Baldur aufgegriffen und das ganze über eine DTAARA abgewickelt. Und was soll ich sagen(schreiben) ES KLAPPERT!!

Danke für die Ideen und die Hilfestellungen.

Schönes Wochenende dann mal schon im Voraus

Gruß Malte.