PDA

View Full Version : Subfile - Versuch, einen doppelten Satz in Datei zu schreiben ( RNX1021 )



ncc1701e
06-06-17, 14:22
Servus,

ich muss nach langer Zeit wider ein Programm schreiben welches eine Subfile enthält....
Nun laufe ich aber auf ein Problem und habe keine Ahnung warum das Problem auftritt.

Wäre super wenn mir hier einer Input liefern kann was schief läuft, damit ich mit dem Programm weiterkomme.

Folgende Prozeduren dürften von interesse sein:


dcl-s rrn zoned(4) inz(1);


dcl-proc Main;
dcl-pi Main;
auftragsnummer like(auftragsnummer_t) const;
end-pi;
dcl-ds Header likeds(Header_t);
dcl-ds Geraete likeds(Geraete_t) dim(99);


clear Header;
clear Geraete;


GetHeaderData(auftragsnummer:Header);
SetHeader(Header);
dow (key <> F12);
InitSubfile();
GetGeraeteData(Header.lgnrNummer:Header.nutzeinhei t:Geraete);
SetSubFile(Geraete);
exfmt geraeteCtl;
if (key = ENTER);
dou %eof;
readc geraetesfl;
if (not %eof);
if (io_auswahl = 'X' or io_auswahl = 'x');
WriteDatabase(Header:o_laufendeNummer:
o_geraetenummer:o_seriennummer:h_gId:h_messstellen Id);
endif;
endif;
enddo;
endif;
enddo;
end-proc;




dcl-proc InitSubfile;
reset rrn;
Subfile.wipe = *on;
Subfile.display = *off;
Subfile.end = *off;
write GERAETECTL;
Subfile.wipe = *off;
Subfile.display = *on;
Subfile.end = *on;
end-proc;




dcl-proc SetSubFile;
dcl-pi SetSubFile;
Geraete likeds(Geraete_t) dim(99);
end-pi;


dow (Geraete(rrn).geraeteNummer <> '');
io_auswahl = '';
o_geraetetyp = Geraete(rrn).geraeteTyp;
o_seriennummer = Geraete(rrn).serienNummer;
o_laufendenummer = Geraete(rrn).laufendeNummer;
o_raum = Geraete(rrn).raum;
o_geraetenummer = Geraete(rrn).geraeteNummer;
h_gid = Geraete(rrn).geraeteId;
h_messstellenid = Geraete(rrn).messstellenId;
write geraetesfl;
rrn += 1;
enddo;
end-proc;


In der letzten Prozedur bekomme ich beim write den Fehler geworfen. Das passiert immer wenn er die Subfile neu bauen soll, aber ich initialisiere die Subfile davor ja in der Main Prozedur neu, so klappt es ja auch beim ersten Aufbau, warum also nicht beim zweiten?

Bin für jede Hilfe dankbar.

Fuerchau
06-06-17, 14:28
Die Satznummer für die Subfile startet mit 1!
Der "reset rrn" setzt aber 0, es sei denn, du machst einen Init von rrn mit 1 in einer *INZSR-Routine.
Also den "rrn+=1" vor dem write ausführen.

Und natürlich musst du per Bezugszahl einen SFLCLR ansteuern.

Erklärung:
reset = Init der Variablen mit dem Wert, der in einer *INZSR gesetzt wurde, ansonsten wie clear.

Pikachu
06-06-17, 15:32
Ein INZ-Wert genügt dem RESET aber auch...


The RESET operation is used to restore a variable to the value held at the end of the *INIT phase. This value is called the reset value. If there is no *INZSR subroutine, the reset value is the same as the initial value (either the value specified by the INZ{(initial value)}, or the default value). If there is a *INZSR subroutine, the reset value is the value the variable holds when the *INZSR subroutine has completed. - (Quelle (https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/rzasd/zzreset.htm))

Fuerchau
06-06-17, 15:38
Ich denke der SFLCLR fehlt, da ja der Fehler ab dem 2. Laden auftritt.

ncc1701e
07-06-17, 19:35
Danke euch allen, Problem ist gefunden. Wie Fuerchau sagte lag es am SFLCLR, ich weiß nicht wie aber irgendwie ist die Deklaration von SFLCLR aus meiner Subfile verschwunden.....wieder hinzugefügt klappt nun alles wie es soll.

Kein Plan wie es verschwunden ist, vorhanden war es definitiv mal, da ich ja bereits das Overlay per DS erstellt habe und dazu brauchte ich die vergebene Bezugszahl.

Aber bin nun auch schlauer als davor ;) . Dachte nämlich das SFLCLR bereits für den ersten Aufbau wichtig ist, dem ist ja anscheinend nicht so, den sonst hätte das PGM garnicht funktioniert.

Und gut zu wissen das es doch mit reset + inz() klappt, hatte das auch so im Kopf und daher auch so geschrieben, mit der *inzsr wäre das blöd gewesen, da ich keine Subroutinen nutze.

Nochmals Danke und allen einen schönen Abend

Fuerchau
08-06-17, 07:56
Noch zum Hintergrund:
Nach dem Open existiert keine Subfile, deshalb ist ein SFLCLR auch nicht erforderlich.
Eine DSPF unterstützt (ob das immer noch so ist habe ich nicht probiert) max. 12 aktive Subfiles.
Per SFLDLT wird die Subfile tatsächlich aus dem Speicher entfernt, so dass man durchaus mehr als 12 SFL's haben kann. Allerdings ist dann ggf. konzeptionell was falsch.
Un dann gibt es noch SFLINZ. Mit diesem Schlüsselwort werden SFLSIZ leere Sätze in die Subfile geschrieben (z.B. für eine Erfassungsmaske).