View Full Version : IFS Datei erstellen - Zeilen hinzufügen und löschen
BerndDworrak
01-07-08, 13:54
Hallo,
ich möchte gerne aus einem RPG Programm heraus in einer Textdatei im IFS neue Sätze (Zeilen) hinzufügen und auch die Möglichkeit haben Zeilen zu löschen. Hat jemand schon mal mit dem gleichen Problem zu tun gehabt und welche Lösung gab es dafür?
Vielen Dank
Bernd
IFS-Dateien sind sogenannte Streams, kennen also keine Zeilen !
Lösung:
Kopiere per CPYTOIMPF/CPYFRMSTMF in eine PF, verarbeite diese und kopiere per CPYFRMIMPF/CPYTOSTMF wieder zurück.
Anders machen das Editoren auch nicht.
Alternativ gibts noch die C-API's für IFS-Objekte.
Hier liest du die Datei gesamt ein (genug Speicher vorausgesetzt), splittest nach Zeilenende, bearbeitest die Daten und gibst die Datei per C-API komplett wieder aus.
BerndDworrak
01-07-08, 14:09
Hallo,
ist ja superschnell die Antwort.
Also CPYTOIMPF/CPYFRMIMPF etc. kenne ich schon.
Hier geht es darum, daß in einer Workstationsitzung Daten eingescannt werden und zusätzliche Informationen aus den Datenbank abgerufen werden. Diese müsen für die weitere Verarbeitung durch einen PC in einen freigegebenen Verzeichnis im IFS gespeichert werden.
Die Daten müssen aber nach Beendigung der Sitzung und Neustart der Sitzung wieder verändert werden können (Hinzufügen von Streams! - Hoffe das war jetzt richtig ;-)). Mit CPYTOIMPF komme ich also nicht weiter. Wier geht das denn mit den APIs??
Danke noch einmal
Bernd
Natürlich kommst du damit weiter.
Mit CPYFRMIMPF eben wieder in eine PF zurückkopieren, bearbeiten und wieder mit CPYTOIMPF ins IFS.
C-API's können nur mit ILERPG verwendet werden.
Allerdings ist es dann gleich besser ein C-Programm zu schreiben ;)
CPYTOIMPF kann nur Daten anhängen MBROPT(*ADD).
BerndDworrak
01-07-08, 14:56
OK.
Ich vergaß zu erwähnen, daß die Daten vom PC für die BDE benötigt werden.
Bei einer interaktiven Lösung ständig hin- und her zu kopieren finde ich daher nicht so gut. Mit RPG meinte ich natürlich ILERPG. Meine Kenntnisse in C sind allerdings beschränkt. Hast Du denn irgendwelche Hinweise, Links wo ich mir die API programmierung mal ansehen kann?
Gruß
Bernd
Schau mal beim Dieter Bender vorbei
Bender-DV (http://www.bender-dv.de/)
unter freeware findest du was.
Schreiben in Streamfiles
Gruß Ronald
Aber auch in diesen Beispielen sieht man sehr schön, dass nur komplett gelesen und wieder geschrieben wird.
Um Daten gezielt zu ändern muss man positionieren (ich glaube mit seek()) und dann schreiben.
Allerdings kann man nur bestehende Daten überschreiben, nichts löschen oder einfügen, nur eben anhängen.
Du kannstdas ganze auch so sehen, als ob du eine große Programmvariable hast (e.g. D MyVar 10000) in der du auch Inhalte löschen oder Einfügen willst.
Hierfür gibts sogar das neue Builtin %replace(), der auch zusammenschieben und einfügen kann.
Aber, wie gesagt, im Speicher nicht im IFS-Objekt.
RobertMack
01-07-08, 15:18
Working with the IFS in RPG IV (http://www.scottklement.com/rpg/ifs_ebook/)
BerndDworrak
03-07-08, 11:08
OK.
Ich habe mir mal die Funktionen angesehen und den Code geschrieben (nur die für die IFS Dateien relevanten Zeilen). Kann sich jemand, der sich damit auskennt den Code einmal ansehen und mir mitteilen, warum die Datei immerwieder überschrieben wird und ein anhängen von Streams nicht funktioniert? Wäre wirklich dankbar. Ich kann übrigens keine Datei hochladen!?
Bernd
* +--------------------------------------------------------------+
* | |
* | Erstellt ...: 01.07.2008 |
* | |
* | Geändert ...: |
* | Grund ......: |
* +--------------------------------------------------------------+
* | BDE Scannen der Teile und schreiben in IFS |
* +--------------------------------------------------------------+
*
**-- Control Specs: ----------------------------------------------**
H Option( *SrcStmt ) DftActGrp( *No ) BndDir( 'QC2LE' )
**
** Dateien (Workstation, Printer etc.) ...
**
**
**-- Globale Variablen -------------------------------------------**
D FILE_o S * ist Cursor
D String S 512A ist String
D rc S 10I 0 ist Ganzzahl
D Idx S 5U 0 ist Ganzzahl o. Vorz
*
**-- Globale Konstanten ------------------------------------------**
D FileName C '/MetallPro/scans001.log' Datei in IFS
D LF C x'25' Hex(25) = Linefeed
*
**-- IFS Streamfile Funktionen ----------------------------------**
Dopen Pr * ExtProc( '_C_IFS_fopen' ) Prozedur 1
D * Value Options( *String )
D * Value Options( *String )
**
Dfgets Pr * ExtProc( '_C_IFS_fgets' ) Prozedur 2
D * Value
D 10i 0 Value
**
Dfputs Pr 10i 0 ExtProc( '_C_IFS_fputs' ) Prozedur 3
D * Value Options( *String )
D * Value
**
Dclose Pr 10i 0 ExtProc( '_C_IFS_fclose' ) Prozedur 4
D * Value
**
* +--------------------------------------------------------------+
* | |
* | Main |
* | |
* +--------------------------------------------------------------+
**
**...
** ... Code für interaktive Verarbeitung
** ...
**-- Open Files, Konvertierung zu Job Codepage:
**
C Eval FILE_o = open( %TrimR( FileName ) Öffnen
C : 'w, codepage=273'
C )
**
C If FILE_o <> *Null
** izeile ist Scancode
C Eval rc = fputs( izeile +
C %Char( Idx ) +
C LF
C : FILE_o Schreibe Zeile
C )
**
C Eval rc = close( FILE_o )
C EndIf Schliessen
**
**...
** ... weiterer Code
** ...
**-- Ende der Verarbeitung
C Eval *InLr = *On
C Return
Du musst dir den Open mit den Parametern aus dem C-Handbuch mal genauer ansehen.
Mit "w" wird geöffnet und zurückgesetzt, Länge also wieder auf 0.
Siehe hier:
Mode Description
r Open a text file for reading. The file must exist.
w Create a text file for writing. If the given file exists, its contents are
destroyed unless it is a logical file.
a Open a text file in append mode for writing at the end of the file. The
fopen() function creates the file if it does not exist and is not a logical file.
r+ Open a text file for both reading and writing. The file must exist.
w+ Create a text file for both reading and writing. If the given file exists, its
contents are cleared unless it is a logical file.
a+ Open a text file in append mode for reading or updating at the end of the
file. The fopen() function creates the file if it does not exist.
rb Open a binary file for reading. The file must exist.
wb Create an empty binary file for writing. If the file exists, its contents are
cleared unless it is a logical file.
ab Open a binary file in append mode for writing at the end of the file. The
fopen function creates the file if it does not exist.
r+b or rb+
Open a binary file for both reading and writing. The file must exist.
w+b or wb+
Create an empty binary file for both reading and writing. If the file exists,
its contents will be cleared unless it is a logical file.
a+b or ab+
Open a binary file in append mode for writing at the end of the file. The
fopen() function creates the file if it does not exist.
Ich denke du musst "a" verwenden, was allerdings nicht funktioniert, wenn die Datei neu ist.
Wenn alse der Open(..., "a, ...") fehlschlägt, dann mit Open(..., "w, ...") wiederholen.