Anmelden

View Full Version : Replace im CL



Joe
15-05-15, 14:22
Hallo Forum

Ich übergebe Bibliotheksnamen an ein CL zur Sicherung auf NAS.
Da einige Bibliotheken einen Punkt im Namen haben, soll dieser durch Unterstrich '_' ersetzt werden, um nach der Sicherung in SAVF anschliessend per FTP zu übertragen.
Call aus DSPOBJD:

CALL PGM(PGM) PARM(&ODOBNM &ODOBNM &TYPE &TAGTXT)

&LIB = 'YLBFIB.V3'
&SAVF = 'YLBFIB.V3'

PGM PARM(&LIB &SAVF &TYPE &TAGTXT)
DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
DCL VAR(&SAVF) TYPE(*CHAR) LEN(10)
DCL VAR(&TYPE) TYPE(*CHAR) LEN(4)
DCL VAR(&TAGTXT) TYPE(*CHAR) LEN(10)
DCL VAR(&STELLE) TYPE(*DEC) LEN(2 0)
REPLACE:
CHGVAR VAR(&STELLE) VALUE(&STELLE + 1)
IF COND(&STELLE *LE 10) THEN(DO)
IF COND(%SST(&SAVF &STELLE 1) *EQ '.') THEN(DO)
CHGVAR VAR(%SST(&SAVF &STELLE 1)) VALUE('_')
ENDDO
GOTO REPLACE
ENDDO
&SAVF wird korrekt geändert, jedoch steht der geänderte Name anschliessend (nicht immer) auch in &LIB.
&LIB = 'YLBFIB_V3'
&SAVF = 'YLBFIB_V3'

Gibt es dafür eine Erklärung?

Gruß Joe

Fuerchau
15-05-15, 15:35
Wenn &LIB und &SAVF auf den selben Speicher verweisen.
Wenn das CLP aufgerufen wird müssen für solche Zwecke unterschiedliche Felder übergeben werden.

Joe
15-05-15, 16:04
Wenn &LIB und &SAVF auf den selben Speicher verweisen.
Wenn das CLP aufgerufen wird müssen für solche Zwecke unterschiedliche Felder übergeben werden.

Hallo und Danke für Anwort.

Also weil in &LIB und &SAVF (obwohl 2 Parameter) das gleiche Feld &ODOBNM übergeben wird, wird der gleiche Speicherbereich angesprochen. Habe ich das so richtig verstanden ?
Gruß Joe

Pikachu
15-05-15, 16:30
Der Speicher von übergebenen bzw. empfangenen Variablen befindet sich im aufrufenden Programm. Und der von den beiden Variablen &LIB und &SAVF ist in diesem Fall der Speicher von &ODOBNM. Es wird jeweils nur ein Zeiger auf diesen Speicherbereich übergeben. Deshalb schlägt eine Änderung der Variable &SAVF direkt auf die Variable &LIB durch und umgekehrt. Siehe hier. (http://www-01.ibm.com/support/knowledgecenter/ssw_i5_54/rbam6/ucall.htm?lang=de)

Am besten du übergibst und empfängst &SAVF nicht mehr als Parameter, sondern machst stattdessen im aufgerufenen Programm ein CHGVAR VAR(&SAVF) VALUE(&LIB).

Fuerchau
17-05-15, 17:08
Warum soll ich dann den Inhalt auf sich selbst kopieren?
Wenn eine Replace-"Funktion" (in CLP geht das ja nicht) benötigt wird, braucht man auch 2 Variablen.
Nun kann man in CLP die Adressen nicht vergleichen, in RPGLE könnte man mit %ADDR() dieses tun und ein Fehlermeldung ausgeben (ESC-Nachricht).

Joe
18-05-15, 07:20
Hallo.
Der Grund für die 2 identischen Parameter:
In meinem Beispiel habe ich einen Teil des rufendes CPL angegeben. Der läuft automatisch ab und übergibt beide Parameter identisch. Es gibt andere Programmteile, in denen der Name der SAVF individuell und abweichend von &LIB mitgegeben wird.

Jetzt kopiere ich im gerufenen Programm den Parameter &LIB in ein Hilfsfeld und damit läuft es.

Vielen Dank noch einmal für die Unterstützung.
Joe