View Full Version : Sourcen aus IFS übernehmen und compilieren
Hallo zusammen,
ich habe folgende Problematik:
Ein Kunde erhält von einem externen Dienstleister Sourcedateien in einem Zipfile.
Dieses Zipfile soll nun im IFS eingestellt werden und dann per Programm
a. alle Dateien (Sourcen) entpacken
b. die Sourcen (Copystrecken .cpy und Programme .cblle) ins OS400 übernehmen
c. die Programmobjekte dann compilieren
Solange ich immer genau weiß welche Sourcen kommen ist das kein Problem, ich möchte das Programm aber variabel halten.
Ich hatte gehofft, dass
qsh cmd(ls *.cpy > Dateiname)
und danach
qsh cmd(ls *.cblle >> Dateiname)
den gewünschten Erfolg bringen, dass ich beim Auslesen der Ausgabedatei erst die Copystrecken und dann die Programme erwische, leider scheint >> aber nicht zu funktionieren.
Hat evtl. wer eine Idee oder eine bessere Lösung parat?
Gruß
Michael
andreaspr@aon.at
08-05-13, 07:02
Hallo,
1. Warum funktioniert der Befehl in der QSH nicht?
Wird das File nicht erstellt?
Wird der Inhalt überschrieben?
Bei mir funktioniert es genau so wie du es beschrieben hast.
2. Du könntest den Befehl auch wie folgt ausführen lassen:
qsh cmd('ls *.cpy > Dateiname; ls *.cblle >> Dateiname;')
3. Man könnte auch in RPG den Inhalt eines Verzeichnisses einlesen. (readdir)
http://www.scottklement.com/rpg/ifs_ebook/ifs_ebook.pdf
Aber das nur so als Info nebenbei.
lg Andreas
Da die Shell (QSH) Ausdrücke interpretiert und diese dann als Argumente an ein Kommando übergibt kannst du auch "ls *.cpy *.cblle" ausführen.
Ansonsten sollte ">>" funktionieren. Mach das mal im Dialog und prüfe die Fehlermeldung.
andreaspr@aon.at
08-05-13, 07:40
Da die Shell (QSH) Ausdrücke interpretiert und diese dann als Argumente an ein Kommando übergibt kannst du auch "ls *.cpy *.cblle" ausführen.
Dies liefert jedoch eine Liste sortiert nach namen und nicht nach Typ.
Es sollen ja zuerst alle .cpy und dann .cblle aufgelistet werden.
1. Warum funktioniert der Befehl in der QSH nicht?
Wird das File nicht erstellt?
Wird der Inhalt überschrieben?
Bei mir funktioniert es genau so wie du es beschrieben hast.
Vll. vorab zur Erklärung:
Ich habe vorher eine Datei im OS400 mit einer Satzlänge von 256 Byte erstellt.
Der Inhalt wird bei ls > Dateiname überschrieben
bei ls >> Dateiname soll angeblich das Ergebnis angehängt werden. Der Befehl wird, sofern ich ihn direkt eingebe auch ohne Fehler ausgeführt, Daten werden aber keine geschrieben.
Ich habe auch noch den CL-Befehl
ADDENVVAR + ENVVAR(QIBM_QSH_CMD_OUTPUT)...
mit den Werten FILE=... und FILEAPPEND=... ausprobiert.
Hier bekomme ich zwar das Ergebnis, jedoch wird die Ausgabe dann nicht satzweise angehängt sondern direkt hinter die letzte Datei aus dem 1. ls. Und dies lässt sich dann mit dem RCVF auch nicht direkt verarbeiten.
2. Du könntest den Befehl auch wie folgt ausführen lassen:
qsh cmd('ls *.cpy > Dateiname; ls *.cblle >> Dateiname;')Das habe ich so auch gemacht, hatte es nur zur Verdeutlichung auseinander gezogen.
3. Man könnte auch in RPG den Inhalt eines Verzeichnisses einlesen. (readdir)
http://www.scottklement.com/rpg/ifs_ebook/ifs_ebook.pdf
Aber das nur so als Info nebenbei.Muss offen gestehen, dass ich bisher relativ wenig mit dem IFS und schon gar nicht innerhalb von RPG (wir proggen hauptsächlich COBOL) zu tun hatte. Da ich aber letztes Jahr bereits ein wenig mit dem ls zu tun hatte, war dies für mich die naheliegenste Lösung.
Aber schon einmal vielen Dank für die Infos
P.S. Vielleicht hat ja zusätzlich noch jemand eine schlanke Lösung, wie ich im CL ohne große Umwege den Dateinamen (Name und Endung) auseinander nehmen kann.
Dann fehlt ein CRLF am Ende des 1. ls.
Du kannst auch einfach ein "echo >>Datei" vor dem "ls" ausführen für ein zusätzliches CRLF.
So,
das Problem liegt in der direkten Ausgabe ins OS/400.
Gebe ich den ls ins IFS aus, klappt es auch ohne den echo-Befehl.
Mache ich die Ausgabe ins OS/400 erhalte ich zumindest nach ADDENVVAR und dem ls ein X'25', der Echo-Befehl fügt lediglich ein weiteres X'25' an bevor die Ausgabe des 2. ls dahinter ausgegeben wird.
Ich werde nun einfach die Datei aus dem IFS importieren und dann verarbeiten. Sind zwar ein paar Schritte mehr als gewünscht, aber der Erfolg zählt gerade mehr.
Wenn es jetzt noch einen simplen Weg gäbe den Dateinamen "aufzuspalten" wäre es perfekt.
Im RPGLE gibts ja die Funktion %scan() um nach dem Punkt zu suchen.
Im CLP muss man leider das API QCLSCAN bemühen.
Man kann aber auch eine kleine Schleife und %sst() programmieren.
Habe die Ausgabe nun erstmal in eine Textdatei ins IFS umgeleitet und siehe da, alles gut.
Der Tipp mit QCLSCAN hat auch hervorragend geklappt, Programm funktioniert jetzt.
Vielen Dank für die Unterstützung