PDA

View Full Version : CEEDOD im Hauptprogramm



Seiten : [1] 2

XMan
20-08-13, 14:21
Hallo Gemeinde,

habe folgendes Problem:
Ich möchte gerne ein Programm mit 3 Parametern aufrufen (1000A, 5,0, 1A).
Der erste Parameter kann vom aufrufenden Programm kürzer übergeben werden (z.B. nur 50 Stellen).

Nun habe ich versucht mit Hilfe des API´s CEEDOD mir die Länge ermitteln zu lassen.
Leider geht das nicht weil ich hier imme den Fehler "Fehlender Operationsdeskriptor" bekomme.

Definiert habe ich das ganze wie folgt:

Programm:
d MD0910 PR extpgm('MD0910')
d pi_Text 1000A const options(*varsize)
d pi_TextLen 5 0 const
d po_RtnCode 1A

d MD0910 PI opdesc
d pi_Text 1000a const options(*varsize)
d pi_TextLen 5 0 const
d po_RtnCode 1a

CEEDOD:
DCEEDOD pr
D PosNbr 10i 0 Const
D DescTyp 10i 0
D DataTyp 10i 0
D DescInf1 10i 0
D DescInf2 10i 0
D DataLen 10i 0
D FeedBck 12a Options(*Omit)

// API CEEDOD
d eDescTyp s 10i 0 inz
d eDataTyp s 10i 0 inz
d eDescInf1 s 10i 0 inz
d eDescInf2 s 10i 0 inz
d eDataLen s 10i 0 inz

Aufruf dann in FREE
CEEDOD(1:eDescTyp:eDataTyp: eDescInf1:eDescInf2:eDataLen:*Omit);

Lt. IBM kann man bei Angabe von EXTPGM('MD0910') kein OPDESC angeben.

Wie kann ich hier das lösen?
Bzw. was ist hier falsch?

Danke!

Fuerchau
20-08-13, 14:27
"opdesc" funktioniert nur bei Prozeduren.
Definiere die Felder doch einfach als "varying".
Durch das "const" erzeugt der Compiler sowieso eine Kopie deiner Variablen vor dem Call.

XMan
20-08-13, 14:33
Danke für die Info!

Aber das Problem ist das bei Varying (bzw. generell) wenn ein kürzerer Parameter übergeben wird der Rest des Parameters nur "Müll" enthält (wobei der Müll ja vom System benötigt wird).

Alternativ kann ich nur vom aufrufenden Programm mir die Länge des Parameters als eigenen Parameter mitgeben lassen damit ich dann die richtige Zeichenlänge "herausschneide". Oder?

Thx

Fuerchau
20-08-13, 14:39
Falsch!
Wenn du das externe Programm immer nur aus ILERPG mittels Prototyp aufrufst, legt der Compiler eben eine entsprechend große Kopie an, es gibt dann keinen Müll.
Durch "varying" wird eine 2-byte-Längeninformation vorangestellt, die du einfach mit %len() abfragen kannst.
%len() liefert die Länge des Inhaltes bei varying (bzw. DDS-varlen) Feldern, %size() die tatsächliche definierte Größe.
Bei fixed Variablen liefert %len() und %size() die selbe Information.

Beim Aufruf von CLP definierst du eben eine 1002-Byte-Variable und stellst die Länge per %bin(&Ziel 1 2) voran.

XMan
20-08-13, 14:46
Ah, OK Danke!

Wieder etwas gelernt ;-)

Werde ich ausprobieren.

Danke!!

mk
20-08-13, 14:49
Ah, OK Danke!

Wieder etwas gelernt ;-)

Werde ich ausprobieren.

Danke!!
Hi,

zum Beispiel kann man so die Länge feststellen:

/free
values = %char(%len(%size(In_Group))) ;

/end-free
Gruss
Michael

mk
20-08-13, 14:51
Ah, OK Danke!

Wieder etwas gelernt ;-)

Werde ich ausprobieren.

Danke!!
Hi,

zum Beispiel kann man so die Länge feststellen:

/free
values = %char(%len(%size(In_Group))) ;

/end-free
Wobei
%len die Feldgröße 1000 angibt
%size die tatsächliche Länge des Inhalts
Gruss
Michael

Anton Gombkötö
21-08-13, 14:42
mk, mal davon abgesehen, dass die Antwort eine relative Themenverfehlung ist, was tut denn Dein Code Deiner Meinung nach genau und wann sollte man das brauchen können???

Denn wenn "In_Group" 1000 Bytes lang ist, und es steht zum Beispiel "Ich sollte den Dingen die Zeit schenken, die sie verdienen." in dieser Variable, liefert Dein Code das Ergebnis "4".

mk
21-08-13, 15:01
Hi,

sorry, ich schäme mich.

Hatte das einfach so runtergetippt.

Um die Länge eines Feldes festzustellen kann man aber folgendes
verwenden.

values = %char(%len(%trim( In_Group)))

Gruß
Michael

Fuerchau
21-08-13, 15:09
Wofür dann noch die Umwandlung in CHAR :)?

Zu beachten ist, dass %trim() auch Leerzeichen am Anfang entfernt!