PDA

View Full Version : CL Basics



sjuerges
27-10-09, 10:37
Guten Tag @ alle. Ich hoffe mir kann jemand helfen.

Ich versuche ein CL Progamm zu erstellen, das 4 normale CL befehle ausführt, mit 4 möglichen variablen.

Befehle: CPYTOIMPF FROMFILE(LIB/DBFILE) TOSTMF('/home/DBFILE.as400.csv') MBROPT(*REPLACE) STMFCODPAG(*STMF) RCDDLM(*CRLF) FLDDLM(';')

CPY OBJ('/home/DBFILE.as400.csv') TOOBJ('/home/DBFILE.pc.csv') FROMCCSID(37) TOCCSID(1208) DTAFMT(*TEXT)

CHGAUT OBJ('/home/DBFILE.as400.csv') USER(*PUBLIC) DTAAUT(*RWX) OBJAUT(*ALL)

CHGAUT OBJ('/home/DBFILE.pc.csv') USER(*PUBLIC) DTAAUT(*RWX) OBJAUT(*ALL)

Variablen:
- Quellebibliothek (z.B LIB)
- Quellfile (z.B DBFILE)
wenn möglich auch mehrere DBFILEs ?
- Zielpfad (z.B /home/)
- Zielccsid (z.B. 1208)

Bis jetzt habe ich mir eine Bibliothek erstellen, die PF QCLSRC erstellt, darin ein member CPYTOCSV

Dann habe ich versucht die befehle dort einzugeben und die variablen vorher mit DCL zu definieren und einfach im befehl auszutauschen.

Das hat aber nicht so ganz funktioniert.
Bin leider blutiger iSeries anfänger, komme aus der win / lin welt.

Ich hoffe, einer von den hier versammelten experten ist so freundlich, mich in die richtige Richtung zu schubsen.

Vielen Dank.

MfG Sebastian Jürges

Pikachu
27-10-09, 10:56
So könnte es gehen.
DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
DCL VAR(&DBFILE) TYPE(*CHAR) LEN(10)
DCL VAR(&PFAD) TYPE(*CHAR) LEN(1024)
DCL VAR(&STMF1) TYPE(*CHAR) LEN(1024)
DCL VAR(&STMF2) TYPE(*CHAR) LEN(1024)
DCL VAR(&TOCCSID) TYPE(*DEC) LEN(5)

CHGVAR VAR(&PFAD) VALUE('/home/')
CHGVAR VAR(&LIB) VALUE(QWERTZ)
CHGVAR VAR(&DBFILE) VALUE(DATEI)
CHGVAR VAR(&TOCCSID) VALUE(1208)

CHGVAR VAR(&STMF1) VALUE(&PFAD *TCAT &DBFILE *TCAT '.as400.csv')
CHGVAR VAR(&STMF2) VALUE(&PFAD *TCAT &DBFILE *TCAT '.pc.csv')

CPYTOIMPF FROMFILE(&LIB/&DBFILE) TOSTMF(&STMF1) +
MBROPT(*REPLACE) STMFCODPAG(*STMF) +
RCDDLM(*CRLF) FLDDLM(';')

CPY OBJ(&STMF1) TOOBJ(&STMF2) FROMCCSID(37) +
TOCCSID(&TOCCSID) DTAFMT(*TEXT)

CHGAUT OBJ(&STMF1) USER(*PUBLIC) DTAAUT(*RWX) OBJAUT(*ALL)
CHGAUT OBJ(&STMF2) USER(*PUBLIC) DTAAUT(*RWX) OBJAUT(*ALL)

sjuerges
27-10-09, 11:38
Vielen Dank ! :)

Funktioniert für eine Datei einwandfrei :)

2 kleine Fragen:
1) Der erste CHGVAR Block, überschreibt der nicht eventuell eingegebene aufrufparameter ?

2) Wie würde ein LOOP funktionieren, der mehrere vorher definierte DBFILE's durchläuft ? In Pseudecode so ungefähr:

ANZAHLDBFILES=5
<code style="white-space: nowrap;"><code>DBFILE1=</code></code>DATEI1
DBFILE2=DATEI2
DBFILE3...

LOOP FOR DBFILE1 to DBFILEn
CPYTOIMPF usw...
ENDLOOP


Ich habe es getestet mit
<code style="white-space: nowrap;"><code>
DCL VAR(&DBFILE1) TYPE(*CHAR) LEN(10)
</code></code><code style="white-space: nowrap;"><code>DCL VAR(&DBFILE2) TYPE(*CHAR) LEN(10)

</code></code><code style="white-space: nowrap;"><code>LOOP1: DOFOR VAR(&DBFILE) FROM(1) TO(5)
[schnipp]
ENDDO

</code></code>Wollte nich so wie ich das will.

*edit: +Frage bzgl. Dateilöschung*

Wenn ich die erste der beiden ausgabedateien, also DBFILE.as400.csv nach dem CPY löschen will, funktioniert das mit
DLTF /home/DBLFILE.AS400.csv ?

Pikachu
27-10-09, 13:47
Mit dem DOFOR hab ich bis jetzt noch nichts gemacht. Aber du könntest dieses Programm von einem anderen mehrmals aufrufen lassen, jedes Mal mit anderen Werten. Die CHGVARs mußt du natürlich entfernen wenn die Werte beim Aufruf übergeben werden. Eine Verbindung zu einer Datenstromdatei kann mit den Befehlen DEL, ERASE oder RMVLNK aufgehoben werden.

sjuerges
27-10-09, 13:54
Ich hab mal folgendes fabriziert:



DCL VAR(&PFAD) TYPE(*CHAR) LEN(1024) VALUE('/home/')
DCL VAR(&TOCCSID) TYPE(*DEC) LEN(5) VALUE(1208)

DCL VAR(&LIB1) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE1) TYPE(*CHAR) LEN(10) VALUE(ARSTAP)

DCL VAR(&LIB2) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE2) TYPE(*CHAR) LEN(10) VALUE(ARSTKP)

DCL VAR(&LIB3) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE3) TYPE(*CHAR) LEN(10) VALUE(FBSPOP)

DCL VAR(&LIB4) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE4) TYPE(*CHAR) LEN(10) VALUE(KDSTAP)

DCL VAR(&LIB5) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE5) TYPE(*CHAR) LEN(10) VALUE(KGSTAP)

DCL VAR(&LIB6) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE6) TYPE(*CHAR) LEN(10) VALUE(KOSTAP)

DCL VAR(&LIB7) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE7) TYPE(*CHAR) LEN(10) VALUE(KUKONP)

DCL VAR(&LIB8) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE8) TYPE(*CHAR) LEN(10) VALUE(LISTAP)

DCL VAR(&LIB9) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE9) TYPE(*CHAR) LEN(10) VALUE(PRSTAP)

DCL VAR(&LIB10) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE10) TYPE(*CHAR) LEN(10) VALUE(RASTAP)

DCL VAR(&LIB11) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE11) TYPE(*CHAR) LEN(10) VALUE(SOSTAP)

DCL VAR(&LIB12) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE12) TYPE(*CHAR) LEN(10) VALUE(TRSTAP)

DCL VAR(&LIB13) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE13) TYPE(*CHAR) LEN(10) VALUE(TSSTAP)

DCL VAR(&LIB14) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE14) TYPE(*CHAR) LEN(10) VALUE(TTPOSP)

DCL VAR(&LIB15) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE15) TYPE(*CHAR) LEN(10) VALUE(TTSTAP)

DCL VAR(&LIB16) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE16) TYPE(*CHAR) LEN(10) VALUE(VPSTAP)

DCL VAR(&LIB17) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE17) TYPE(*CHAR) LEN(10) VALUE(VSSTAP)

DCL VAR(&LIB18) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE18) TYPE(*CHAR) LEN(10) VALUE(VSSTPP)

DCL VAR(&LIB19) TYPE(*CHAR) LEN(10) VALUE(DBLDTA)
DCL VAR(&DBFILE19) TYPE(*CHAR) LEN(10) VALUE(VTSTAP)

DCL VAR(&LIB20) TYPE(*CHAR) LEN(10) VALUE(DBLDKD)
DCL VAR(&DBFILE20) TYPE(*CHAR) LEN(10) VALUE(XDINFPU)

DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
DCL VAR(&DBFILE) TYPE(*CHAR) LEN(10)
DCL VAR(&STMF1) TYPE(*CHAR) LEN(1024)
DCL VAR(&STMF2) TYPE(*CHAR) LEN(1024)
DCL VAR(&LOOP) TYPE(*INT) LEN(2) VALUE(0)

DOFOR VAR(&LOOP) FROM(1) TO(20)

CHGVAR VAR(&LIB) VALUE(&LIB *TCAT &LOOP)
CHGVAR VAR(&DBFILE) VALUE(&DBFILE *TCAT &LOOP)

CHGVAR VAR(&STMF1) VALUE(&PFAD *TCAT &DBFILE *TCAT '.as400.csv')
CHGVAR VAR(&STMF2) VALUE(&PFAD *TCAT &DBFILE *TCAT '.pc.csv')

CPYTOIMPF FROMFILE(&LIB/&DBFILE) TOSTMF(&STMF1) +
MBROPT(*REPLACE) STMFCODPAG(*STMF) +
RCDDLM(*CRLF) FLDDLM(';')

CPY OBJ(&STMF1) TOOBJ(&STMF2) FROMCCSID(37) +
TOCCSID(&TOCCSID) DTAFMT(*TEXT)

CHGAUT OBJ(&STMF1) USER(*PUBLIC) DTAAUT(*RWX) OBJAUT(*ALL)
CHGAUT OBJ(&STMF2) USER(*PUBLIC) DTAAUT(*RWX) OBJAUT(*ALL)

ENDDO
Will leider nicht so ganz kompilieren:


7200- CHGVAR VAR(&LIB) VALUE(&LIB *TCAT &LOOP)
* CPD0712 30 Art von Operand für Operator ungültig.
* CPD0711 30 Art der Ausdrucksoperanden unterschiedlich.
7300- CHGVAR VAR(&DBFILE) VALUE(&DBFILE *TCAT &LOOP)
* CPD0712 30 Art von Operand für Operator ungültig.
* CPD0711 30 Art der Ausdrucksoperanden unterschiedlich.

Pikachu
27-10-09, 14:09
Über dynamisch erzeugte Variablennamen kann man soweit ich weiß in CL nicht auf Variablen zugreifen.

Aber pack das eigentliche Kopierprogramm doch in ein eigenes Programm (Programm CPYTOCSV2) und mach ein paar CALLs anstelle des DOFORs:

CALL PGM(CPYTOCSV2) PARM(&LIB1 &DBFILE1)
CALL PGM(CPYTOCSV2) PARM(&LIB2 &DBFILE2)
CALL PGM(CPYTOCSV2) PARM(&LIB3 &DBFILE3)
CALL PGM(CPYTOCSV2) PARM(&LIB4 &DBFILE4)
CALL PGM(CPYTOCSV2) PARM(&LIB5 &DBFILE5)
...

KingofKning
27-10-09, 14:18
Lib ist char,
und Loop ist int.

Das geht nicht. Mußt du vorher umwandeln.

GG

sjuerges
27-10-09, 14:48
Jep. So machichs. Danke für deine Hilfe.

Problem gelöst. Zwar nicht so elegant wie ich mir das erhofft hatte, aber meh.

Beggars cant be choosers :)

MfG
SJürges