PDA

View Full Version : %eof für Subfile



haertl
12-01-05, 16:35
Hallo, ich möchte in freeformat RPG mit %eof(Subfilename) EOF abfragen.
Der Compiler spuckt mir folgende Fehlermeldung aus:

F*
FPCFAXPARB CF E WORKSTN
F SFILE(SUBF:POSIT)
F*


1681 DOU %EOF(SUBF) OR *IN03;
======> aaaa
*RNF0391 20 a 013500 Parameter SUBF ist für die integrierte Funktion %EOF
ungültig. %EOF wird ignoriert.
1682 READC SUBF;


Codiere ich das ganze in fixed Format mit Bezugszahlen, dann funktioniert es. Ich habe V5R2 auf der Maschine. Was muß ich ändern ? Danke für alle Antworten

B.Hauser
12-01-05, 16:46
Hallo, ich möchte in freeformat RPG mit %eof(Subfilename) EOF abfragen.
Der Compiler spuckt mir folgende Fehlermeldung aus:

F*
FPCFAXPARB CF E WORKSTN
F SFILE(SUBF:POSIT)
F*


1681 DOU %EOF(SUBF) OR *IN03;
======> aaaa
*RNF0391 20 a 013500 Parameter SUBF ist für die integrierte Funktion %EOF
ungültig. %EOF wird ignoriert.
1682 READC SUBF;


Codiere ich das ganze in fixed Format mit Bezugszahlen, dann funktioniert es. Ich habe V5R2 auf der Maschine. Was muß ich ändern ? Danke für alle Antworten

Hallo,

bei %EOF muss grundsätzlich der Datei-Name und nicht der Format-Name angegeben werden!

Du hast 2 Möglichkeiten:
1. Entweder kannst Du im DoU %EOF ohne Angabe eines Datei-Namens setzen, was m.E. eine heikle Angelegenheit ist.
Was heute klappt kann morgen durch eine Änderung zerschossen werden.
2. Du fragst %EOF direkt nach dem ReadC ab und verlässt dann die Schleife mit LEAVE. Dies ist die sauberere Lösung.

Ein %EOF mit Angabe einer Display-File habe ich zugegebenermaßen noch nicht probiert, dürfte jedoch nicht funktionnieren, da Display-Files i.d.R. mehr als 1 Format haben.

Birgitta

haertl
12-01-05, 17:20
0131.00 C*** *IN93 DOUEQ '1'
0132.00 C*** *IN03 OREQ '1' F3
0133.00 C*** *IN12 OREQ '1' F12
0134.00 /FREE
0135.00 DOU %EOF OR *IN03;
0136.00 READC SUBF;
0137.00 /END-FREE
0138.00 C*** READC SUBF 9393 ERR/EOF
0139.00 /FREE
0140.00 IF NOT %EOF;
0141.00 /END-FREE
0142.00 C*** *IN93 IFEQ '0'
0143.00 C*** EXSR DATVER DATEI VERARB
0144.00 C*** ENDIF
0145.00 C*** ENDDO
0146.00 /FREE
0147.00 EXSR DATVER;
0148.00 ENDIF;
0149.00 ENDDO;
0150.00 Hallo Birgitta, wenn ich im fixed Format codiere (siehe C***) dann funktioniert es.
Wenn ich die free Format Befehle (siehe oben) nutze, bekomme ich bei leerem Subfile einen Einheitenfehler, weil der READC SUBF trotz EOF keine '1' setzt. IF NOT %EOF wird dann ausgeführt obwohl End of File zutrifft. Enthält das Subfile Datensätze dann funktioniert es auch in free Format. Noch eine Idee ?

Fuerchau
12-01-05, 22:57
%EOF ist leider nur für Dateien realisiert !
Du kannst entweder mt "Monitor" abfangen oder Fix-Format verwenden.

(Auch IBM ist manchmal etwas nachlässig).

haertl
13-01-05, 08:55
Ich habe den Fehler. Wenn READC keinen DS lesen kann, weil
das Subfile leer ist, dann wird offensichtlich nicht %EOF ausgelöst,
sondern %ERROR. Mit folgendem Code gehts.



DOU %EOF OR %ERROR OR *IN03;
READC(E) SUBF;
IF NOT %EOF AND NOT %ERROR;
EXSR DATVER;
ENDIF;
ENDDO;

Fuerchau
13-01-05, 09:34
Aha, wieder was gelernt !

Aber dass du auf eine leere Subfile mit READC losgehst ist auch nicht unbedingt korrekt. Merke dir die Anzahl Sätze die du geschrieben hast doch in einem Hidden-Feld im Control-Format. Das wäre eine korrekte Programmierung ;)

ERTH
18-01-05, 16:13
Hallo Haertl,

%eof in Zusammenhang mit Subfile funktioniert definitiv (siehe auch Referenzhandbuch!)

Auszug aus einen (funktionierenden) Programm:
readc SUB01S
if %eof
eval MsgQId = 'MSG6010'
exsr $SendMsg
endif
dow not %eof
...

Beachte: wenn in deinem UP DATVER Dateioperationen verwendet werden, ändert sich natürlich %eof entsprechend!

Gruss ERTH

Unregistriert
18-01-05, 19:57
n'Abend Haertl,


0131.00 C*** *IN93 DOUEQ '1'
0132.00 C*** *IN03 OREQ '1' F3
0133.00 C*** *IN12 OREQ '1' F12
0134.00 /FREE
0135.00 DOU %EOF OR *IN03;
0136.00 READC SUBF;
0137.00 /END-FREE
0138.00 C*** READC SUBF 9393 ERR/EOF
0139.00 /FREE
0140.00 IF NOT %EOF;
0141.00 /END-FREE
0142.00 C*** *IN93 IFEQ '0'
0143.00 C*** EXSR DATVER DATEI VERARB
0144.00 C*** ENDIF
0145.00 C*** ENDDO
0146.00 /FREE
0147.00 EXSR DATVER;
0148.00 ENDIF;
0149.00 ENDDO;
0150.00 Hallo Birgitta, wenn ich im fixed Format codiere (siehe C***) dann funktioniert es.
Wenn ich die free Format Befehle (siehe oben) nutze, bekomme ich bei leerem Subfile einen Einheitenfehler, weil der READC SUBF trotz EOF keine '1' setzt. IF NOT %EOF wird dann ausgeführt obwohl End of File zutrifft. Enthält das Subfile Datensätze dann funktioniert es auch in free Format. Noch eine Idee ?


%eof kann mit readc benutzt werden. ich glaube, dass es nicht mit %eof(bsname) funktioniert, aber nur %eof tun's!
der codeschnipsel lässt befürchten, dass du zuviel funktionalität in die schleife gepackt hast. es wundert mich nicht, wenn das programm nicht so, wie gewünscht funktioniert (sorry, aber *in03 in der schleife lässt mich schlimmes ahnen!).

mein ansatz:

wenn subfile gefüllt (sfldsp = *on)!!!
machwas = *ON

dow machwas

readc subformat
if %eof
leave
endif
jetzt kannst du gefahrlos alles machen

enddo

die funktionen %eof, %error, %found, ... liefern (wenn nicht spezifiziert) den Wert der letzten %eof-fähigen, usw. operation! das wird wohl iregendwo im DATVER passieren.

%error in deiner ergänzung fängt nur den fehler leere subdatei ab und hat nur deshalb mit readc etwas zu tun.



Bogomil

Fuerchau
19-01-05, 10:14
Wenn du auf eine leere Subfile einen READC löst, wird NIE %eof ausgelöst sondern immer %error, das gilt auch beim konventionellen READC mit Bezugszahlen. Hier ist es sogar so, dass eine RPG-Fehlermeldung ausgegeben wird, wenn die 2. Bezugszahl beim READC nicht angegeben ist.
Besser ist es aber tatsächlich immer, sich zu merken ob die Subfile Daten enthält. Mögliche Fehler sollte man VORHER abfragen und nicht erst eintreten lassen.

Ich könnte ja schließlich auch eine Null-Division mit Monitor abfangen anstatt vorher den Divisor abzufragen.

B.Hauser
19-01-05, 10:21
Es gibt übrigens auch einen Abbruch (schon in RPGIII!) wenn man mit einem CHAIN versucht den 1. Satz aus einer leeren Subfile einzulesen.