PDA

View Full Version : rpgle & binär



muadeep
24-11-09, 07:44
guten morgen "zusammen"

Hab mal wieder ein Problem welches ich mir nicht erklären kann!

DatA00007 & DatB00001 sind durch/mit SQL erstellte Dateien

Nach dem lesen (READE) der Datei DatA0007, erhalte ich einen Satz mit einem "binär"-Feld (Ma_ID), welches mit 9 0 B definiert ist!

lese ich nun mit diesem Feld (Ma_ID) die Datei DatB00001 (Schlüsselfeld ist auch ein "binär"-Feld 9 0 B), so werden die Statements mit %eof bzw. %found nicht durchgeführt!

wandle ich aber jetzt mein RPGLE-Pgm. mit CRTBNDRPG und dem Parameter ALWNULL(*NO) um, funktioniert das Programm !!!



FDatA00007IF E K Disk Prefix(Ma_)
FDatB00001IF E K Disk Prefix(Be_)

D MID S 9b 0

C Eval MID = 226

C MID SetLL DatA00007

C DoU %eof(DatA00007)

C MID ReadE(E) DatA00007
C If %eof(DatA00007)
C Leave
C EndIf

C If %found(DatA00007)

C Ma_ID SetLL DatB00001
C DoU %eof(DatB00001)
C Ma_ID ReadE(E) DatB00001
C If %eof(DatB00001)
C Leave
C EndIf
C If not %found(DatB00001)
C Leave
C EndIf

:

B.Hauser
24-11-09, 08:01
Du solltest das Schlüssel-Feld anstatt mit 9B 0 mit 10I 0 definieren. Binär-Felder werden vom Compiler in gepackte Felder konvertiert und können damit nicht den für Integer-Felder zulässigen kompletten Bereich abdecken.

Du solltest auch das Schlüsselwort EXTBININT(*YES), wodurch der komplette Integer-Bereich in der externen Datei verwendet werden kann, d.h. auch hier keine Konvertierung in gepackt erfolgt.

U.a. könnte es auch durch die Konvertierung in gepackt passieren, dass das Flag, das den NULL-Wert steuert entweder überklatscht oder nicht sauber gehandelt werden kann.

Birgitta

Fuerchau
24-11-09, 10:02
Ich vermute mal, dass du beim CREATE TABLE ... (MA_ID INTEGER NOT NULL) das NOT NULL vergessen hast.
Schlüsselfelder sollten nach Möglichkeit NULL nicht erlauben.
Dadurch ist die explizite Angabe von ALWNULL erforderlich.
Ansonsten musst du mittels %NULLIND dem Zugriff mitteilen, dass du auch einen von NULL abweichenden Schlüssel verwendest.
Die Definition von B9 0 oder I10 ist dabei unerheblich.

Wenn deine Felder alle ohne NOT NULL erstellt sind musst du auch beim Schreiben %NULLIND setzen, da du sonst beim Lesen nun mit ALWNULL(*NO) NULL-Inhalte nie bekommst sondern eine %ERROR-Meldung bekommst.

muadeep
24-11-09, 11:00
@B.Hauser
hat leider nicht funktioniert


H ExtBinInt(*yes)

D ID S 10i 0@Fuerchau
a) wie die Felder/Tabellen erstellt wurden, kann ich leider nicht sagen.
Es handelt sich hier um Datenbanken von einer externen Firma!

b) wieso auch beim schreiben, ich les doch nur?