[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    May 2004
    Beiträge
    444

    Nur bestimmte Felder bei WRITE in PF schreiben

    Hallo zusammen,

    ich habe folgendes Problem.
    Ich habe mehrere Dateien in die ich schreibe oder update.
    Alle Dateien sind unter COMMIT
    Bei der einen Datei habe ich jetzt das Problem das ich nur 4 Felder von 10 füllen soll und da ich ja aber beim RPG-Write immer alle Felder angebe, werden die Default-Werte der Felder (Datei ist über SQL erstellt) nicht gezogen.

    Jetzt habe ich halt 2 Lösungswege die ich bisher noch nicht hatte.

    1. Ich schreibe nur die 4 Felder wenn es da eine Möglichkeit gibt wie bei update %fields, denn write %fields geht ja nicht.

    2. Ich mache einen INSERT INTO (also SQL im RPG) da weiß ich aber nicht ob der COMMIT und gegebenenfalls der ROLBK auch den Satz mit SQL wieder zurück nimmt.

    Kann mir da jemand was dazu sagen ?

    Viele Grüße Harald

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Für Commit-Steuerung ist die Art native oder SQL nicht relevant.
    Native gibts die Option der F-Bestimmung (oder DCL-F) für Commit, bei SQL bestimmt es Set Option.
    Wenn dies gewährleistet ist, kannst du beliebig mischen.

    Für deinen partiellen Insert gibt es noch eine einfache Kontrolle:

    exec sql select * into : MyDs from final table (insert into MyTable (F1.....) values(: F1.....));

    D.h., du kannst nach dem Insert die Daten direkt ohne Schlüssel wieder auslesen um sie weiter zu verwenden. Dabei werden Defaults ebenso zurückgegeben wie Identity-Spalten, Timestamps oder Functions. Ggf. musst du noch ein NullFlag-Array beim Into angeben.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    May 2004
    Beiträge
    444
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Für Commit-Steuerung ist die Art native oder SQL nicht relevant.
    Native gibts die Option der F-Bestimmung (oder DCL-F) für Commit, bei SQL bestimmt es Set Option.
    Wenn dies gewährleistet ist, kannst du beliebig mischen.

    Für deinen partiellen Insert gibt es noch eine einfache Kontrolle:

    exec sql select * into : MyDs from final table (insert into MyTable (F1.....) values(: F1.....));

    D.h., du kannst nach dem Insert die Daten direkt ohne Schlüssel wieder auslesen um sie weiter zu verwenden. Dabei werden Defaults ebenso zurückgegeben wie Identity-Spalten, Timestamps oder Functions. Ggf. musst du noch ein NullFlag-Array beim Into angeben.
    Beim oberen Teil heißt dass, ich kann im RPG einen ROLBK machen und sowohl die im RPG mit WRITE geschriebenen Sätze als auch der Satz der mit SQL-INSERT eingefügt wurde, werden wieder zurück genommen

    Was den unteren Teil betrifft entzieht sich mir hier das Verständnis auf meine Frage. Wie ich einen INSERT mit nur ein paar Feldern mache, das weiß ich, wichtig wäre es für mich gewesen, zu wissen, ob es auch ohne SQL eine Möglichkeit im RPG gibt einen WRITE zu machen und dabei nur bestimmte Felder anzugeben, eben wie bei UPDATE %fields.

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Zitat Zitat von harkne Beitrag anzeigen
    Wichtig wäre es für mich gewesen, zu wissen, ob es auch ohne SQL eine Möglichkeit im RPG gibt einen WRITE zu machen und dabei nur bestimmte Felder anzugeben, eben wie bei UPDATE %fields.
    Du kannst eine logische Datei (oder besser einen SQL Index) mit Feld-Auswahl anlegen und dann den RPG Write in diese logische Datei/Index machen. Für die übrigen Felder sollten dann die Default-Werte gezogen werden.
    ... ich würde trotzdem SQL vorziehen

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    May 2004
    Beiträge
    444
    Vielen Dank für die Antworten, ich habe jetzt den INSERT über SQL gemacht. Vorher SET COMMIT = *CHG und Commit und Rolbk funktionieren

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Zum Verständnis des "Select * from final table (insert ...)":
    Dieser Select liest das Ergebnis, dass durch den Insert erstellt wird.
    Dadurch erhältst du eben auch alle Defaults und ggf. durch Trigger geänderte Werte.
    Dies macht auch Sinn um z.B. vom System vergebene Identity-Werte auszulesen.
    Die SQL-Funktion "IDENTITY_VAL_LOCAL()" ist potentiell unsicher, da durch Prozeduren (Trigger, Default-Functions) ebenso Identities gesetzt werden können und du somit nur die letzte Identity bekommst, die aber nicht von deinem Insert stammen muss.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Apr 2005
    Beiträge
    385
    Datenstruktur über die Datei legen, Renamen, DS initialisieren, füllen und diese dann In die Dateifelder schieben, oder aber eine weitere DS über die Tabelle legen und die 1- DS in die andere DS moveln...

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    @ExAzubi:
    In diesem Fall streiche da eher das "Ex" aus deinem Namen;-).

    Wenn die Datei durch die F-Bestimmung komplett alle Felder beinhaltet, wird sie von RPG auch automtisch komplett verarbeitet.
    Hintergrund:
    Die F-Bestimmung verwendet intern einen File-Control-Block (FCB), der einen Satzpuffer über die gesamte Länge enthält.
    Auf diesen Satzpuffer verweist eine interne DS mit allen Feldern, die der Compiler kennt.
    Solange du nur I- und O-Bestimmungen hast, sind in RPG nur die verwendeten Felder verfügbar.
    Wenn du eine "E DS" erstellst (bzw. eine Compiler-Option), dann eben alle Felder dieser DS.
    Beim READ/CHAIN wird aus dem Satzpuffer in die Felder übertragen, beim Update nur die verwendeten oder in ILE die angegebenen Felder.
    Ist die Datei zum Anfügen geöffnet, werden beim Write wieder alle Felder verwendet. Hierbei werden keinerleid Defaults aus SQL/DDS gezogen!

    Defaults der DDS sind nur für DSPF's gültig, Defaults aus SQL werden da ignoriert.

    In SQL gibt es noch eine Schicht vor der DB-Schicht (also dem FCB), so dass beim Insert nicht erwähnte Felder mit ihrem Default in den Puffer geschrieben werden können bevor er in die Tabelle geschrieben wird.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Apr 2005
    Beiträge
    385
    @Fuerchau
    Das tut weh ;-)

    Soweit ich weiß geht das aber nur, wenn die Datei IF A oder UF A in den F-Karten definiert ist. Sobald eine Datei als O definiert ist, ist die INPUT DS nicht vorhanden und somit werden die Felder auch nicht initialisiert, wenn die Datei geöffnet wird?!?!? Aber ich kann ich auch irren...

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ich sagte ja I-Bestimmungen und O-Bestimmungen.
    Diese werden auf Grund der F-Bestimmungen und Feldverwendungen automatisch generiert.
    Daher gibts ja auch beim Append (Write) ohne Initialisierung bei späteren Reads die Laufzeitfehler über die man sich dann wundert.

    Ausnahme nun Fully-Free, denn da muss ich ja mit DS'n arbeiten.
    Versuche da mal eine DS zu verwenden, die nicht der Datei entspricht, da die DS mit *LIKEREC definiert werden muss sonst ist sie ja nicht verwendungsfähig.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  11. #11
    Registriert seit
    Jan 2001
    Beiträge
    832
    Hallo,

    es gibt da auch noch den EXCEPT

    Aber den wollen wir natürlich nicht mehr :-)

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Den EXCEPT kannte ich nur für intern beschriebene Dateien (PF's mit genau 1 Feld) bzw. die SPECIAL-File.
    Aber da die Ausgabe ja nur auf einem Feld passiert stellt sich da das Problem ja nicht.

    EXCEPT kann ja heute mit formatierbaren DS/EVAL abgelöst werden.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Zugriff auf bestimmte Daten begrenzen
    By derMuller in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 15-01-20, 17:02
  2. CSV Import nur bestimmte Spalten
    By Domeus in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 23-01-19, 12:13
  3. SQL - Zeichen an bestimmte Stelle schreiben
    By programmer400 in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 20-07-18, 07:40
  4. DTAQ MAXLEN und KEY bei KeyedDataQueueEntry.write
    By alex.kretschmer in forum NEWSboard Java
    Antworten: 4
    Letzter Beitrag: 14-04-16, 12:05
  5. Update (rewrite und/oder write) wird nicht aktiv
    By woy in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 26-03-15, 09:49

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •