PDA

View Full Version : Fehlermeldung unterdrücken (COBOL)



KingofKning
25-01-17, 10:33
Hallo *all,
ich schreibe hier fröhlich eine Preisdatei nach dem Motto der erste gewinnt. Sprich wenn ich für einen Artikel einen Preis haben notiere ich den, wenn ich später für diesen Artikel nochmals einen Preis finde interessiert mich das nicht.

Die Logik ist also immer Lesen aus Datei1 -> Schreiben in Datei2

wenn der Artikel jetzt doppelt ist bekomme ich eine Fehlermeldung im Joblog. Ich könnte natürlich vorher ein Read auf die Datei machen und bei nicht Erfolg schreiben.

Gibt es eine Alternative dazu den Fehler im Joblog zu unterdrücken?


NACHR-ID ART BEW DATUM ZEIT VON PGM BIBLIOTHEK INST AN PGM BIBLIOTHEK INST
CPF5026 Hinweis 30 25.01.17 01:16:47,713425 QDBSIGEX QSYS 0224 DBANK RPTRADE 0A25
Nachricht . . . : Keine doppelten Schlüssel für Teildatei DAT007 zulässig.
Ursache . . . . : Eine Ausgabe- oder Fortschreibungsoperation bei Teildatei
DAT007 konnte wegen eines doppelten Schlüssels in Teildatei DAT007 in Datei
DAT007 in Bibliothek RPTRADE nicht durchgeführt werden. Fehlerbeseitigung:
Anhand der vorher aufgeführten Nachricht CPF5009 feststellen, welcher Satz


GG 4875

Fuerchau
25-01-17, 10:43
Nein, die gibt es nicht. Auf Grund der Meldung wird ja " invalid key " ausgelöst.
Würdest du die Meldung unterdrücken, wäre die Fehlerabfrage nicht mehr möglich.
Im RPG ist das i.Ü. identisch.

camouflage
25-01-17, 11:24
Bau einen Monitor darum.
:-)

Fuerchau
25-01-17, 11:58
Den gibts in COBOL nicht.
Bespiel Write COBOL:

WRITE RECORD
INVALID KEY mach was
END-WRITE

Write ILERPG

WRITE(E) RECORD;
if %error();
mach was
endif;

In beiden Fällen wird die Nachricht ins Joblog geschrieben.
In COBOL wird INVALID KEY ausgeführt, in ILERPG wird der %error()-Status gesetzt.
Selbst in ILERPG verschwindet dann die Nachricht nicht.

Um die Nachricht explizit zu entfernen benötigst du einen RCVMSG (oder das API dazu, ggf. QMHRCVM).

Das Hauptproblem in solchen Fällen ist ins besonders bei Masseninserts und häufigen Konflikten, dass das Joblog sehr groß wird (und je nach Einstellung vor einem WRAP erst mal gedruckt wird) und auch die Performance nicht unerheblich beeinflusst wird.

Aber selbst ein Prüflesen kann zu doppelten Schlüsseln führen, könnte allerdings die Anzahl der Konflikte reduzieren.

nico1964
25-01-17, 14:35
Naja so ganz direkt glaube ich das nicht. Ich kann auch in COBOL eine File-Status nach dem Write abfragen:

COBOL select

SELECT VIB1 ASSIGN TO DATABASE-LEAVIB1
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS EXTERNALLY-DESCRIBED-KEY
FILE STATUS IS WS-STATUS.

write Statement


WRITE-VIB1-IND.
INITIALIZE WS-FILE-NAME
PERFORM FILL-KEY-VIB1 THRU FILL-KEY-VIB1-EX
MOVE 1 TO WRK-FOUND.
WRITE VIB1-SATZ
INVALID KEY MOVE ZEROES TO WRK-FOUND.
STRING CONST-DATEI-VIB1 DELIMITED BY SIZE
CONST-TRENN-ZEICHEN DELIMITED BY SIZE
INTO WS-FILE-NAME
END-STRING
PERFORM STD-FILSTAT THRU STD-FILSTAT-EX.
WRITE-VIB1-IND-EX.
EXIT.

STD-FILSTAT.
IF WS-STATUS NOT < '30'

mache irgendwas


END-IF.
STD-FILSTAT-EX.

Funktioniert bei uns seit 1990

EXIT.

Fuerchau
25-01-17, 14:41
Das hat mit der MSG nichts zu tun.
Invalid Key wird bei Fehler ausgelöst, über den Filestatus kann ich den Grund näher bestimmen.