Anmelden

View Full Version : clear auf Datumsfeld mit DFT in DDS



oulbrich
26-10-17, 11:06
Hallo zusammen,

ich habe Feld in DDS mit DFT(01.01.1999) definiert.
Wenn ich dieses Feld z.B. mit CLEAR oder RESTET im RPG anspreche wir das Feld der Datei mit 01.01.0001 belegt.
Schreibe ich einen Satz z.B. mit DFU in die Datei wird das DFT Datum aus der Dateibeschreibung in das Feld übertragen.

Gibt es in RPG einen Befehl um den DFT Wert in das Dateifeld zu übertragen?

Fuerchau
26-10-17, 11:41
Nur, wenn du in der INZSR-Routine das Feld mit einem Wert initialisierst.
Clear = Löschen auf Runtime-Default (*zero, *Blank, 1.1.0001).
Reset = Reinit mit dem Wert aus der INZSR.

Also:

begsr *INZSR;
Eval MyDate = %date('01.01.1999');
endsr;

oulbrich
26-10-17, 11:45
Hallo Fuerchau,
besten Dank für die schnelle Antwort.
Wofür ist denn dann das Schlüsselwort DFT in der DDS Beschreibung?

B.Hauser
26-10-17, 13:14
RPG erstellt intern I/O-Anweisungen, die alle Spalten aus den angegebenen Dateien beinhalten.
Sofern Felder nicht explizit gesetzt werden, steht in diesen I/O-Anweisungen der Default-Wert des Datentypen.

Wird der Satz geschrieben, so wird dieser Default-Wert übernommen, da das Feld ja übergeben wurde.

Wenn Du dagegen den Datensatz z.B. mit SQL schreibst und die Felder, die Du benötigst explizit angibst, wird für die fehlenden Felder der jeweilige Default-Wert aus dem DDS bzw. SQL (bei SQL beschriebenen Tabellen) übernommen.
Wenn Du zum Schreiben eine logische Datei, in der das Datums-Feld fehlt verwenden würdest, würde ebenfalls der Default-Wert aus dem DDS ziehen.

Birgitta

oulbrich
26-10-17, 13:39
@Birgitta: Danke für die Info.

Fuerchau
26-10-17, 13:56
Das DFT gab es schon bevor es SQL auf der AS/400 gab.
Nur in diesem Fall wurde es ausschließlich von DSPF's interpretiert.
D.h., wenn man in der DSPF auf eine PF referiert und dort ein paar Schlüsselwörter wie DFT, COLOR, hinterlegt, wurden diese automatisch zur Compilezeit übernommen und bei der Anzeige am Terminal wurden diese Attribute dann verwendet.

Pikachu
03-11-17, 09:11
Vielleicht über eine externe Datenstuktur mit INZ(*EXTDFT) (https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/rzasd/dinz.htm)?

Fuerchau
03-11-17, 09:18
Dies ist so wie mit allen INZ-Anweisungen. Diese initialisieren die Felder per MI-Definition als Template zur Compilezeit.
Beim Fehlen einer *INZSR-Routine löscht RESET genauso wie CLEAR auf den Typ-Grundzustand.
Hat das Programm eine *INZSR, kann auch leer sein, dann baut der Compiler beim Auftauchen einer RESET-Anweisung für diese Struktur/das Feld eine Kopie, die in der *INZSR gespeichert wird und somit für RESET verfügbar ist.

Pikachu
03-11-17, 09: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
03-11-17, 10:47
OK, das ist mir auch noch neu.