[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Nov 2015
    Beiträge
    80

    Einzelne Sätze aus PF löschen

    Hallo zusammen,

    ich habe einen Spoolfile den ich eins zu eins in eine Physische Datei einlesen. Anschließende lese ich mittels RCVF in einem CL die einzelne Sätze und Prüfe gewisse stellen.

    Mit welchem Befehl kann ich die einzelnen Sätze löschen (falls mein Kriterium zutrifft)?

    Danke und Grüße

  2. #2
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Welches Release hast Du denn?

    In den aktuellen ist es wohl möglich mittels CL Sätze zu löschen so wenn sie denn einen Schlüssel haben. Müßte ich aber nochmals nachlesen.

    GG

  3. #3
    Registriert seit
    Nov 2015
    Beiträge
    80
    Hallo,

    Release Stand ist V7R1M0

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Da eine PF als "relative" Tabelle über ihre Satznummer ansprechbar ist, kann man den Delete auch auf die Satznummer durchführen.
    In CLP geht das wohl eher nicht, aber was spricht gegen ein kleines RPG/LE?
    Der DELETE ohne Angaben nimmt den gerade gelesenen Satz, ein Delete mit einer Satz-Nr. als "Schlüsselfeld" löscht den Satz, also nicht anders wie mit keyed PF's.
    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

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Der DELETE ohne Angaben nimmt den gerade gelesenen Satz,
    Das würde ich lieber nicht probieren! Delete Ohne Angabe löscht die komplette Datei, d.h. ALLE Datensätze!

    Wenn über Cursor der aktuelle Satz gelöscht werden soll, muss beim Delete auf alle Fälle WHERE CURRENT OF angegeben werden.

    Im CLLE (CLP is OPM und veraltet!) kann auch über RUNSQL ein Delete ausgeführt werden, die relative Satz-Nr. oder der eindeutige Schlüssel sollte jedoch auch dabei angegeben werden, um den richtigen Satz zu löschen.

    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

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ich sprach nicht von einem SQLRPGLE sondern nur von einem simplen RPGLE.
    Hier definiert der Delete schon immer nur einen speziellen Satz.

    Bei SQL hast du natürlich recht, aber warum soll ich bei so trivialen Anforderungen immer gleich SQL nehmen.
    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
    Dec 2004
    Beiträge
    203
    Hi,
    hier mal ein etwas "verrückter" und anderer Vorschlag :-)
    Man braucht : 2 Physische Dateien 132 Länge, aufgeteilt ins 132 Felder (ein Byte). Wenn das Vergleichsfeld mehr Byte hat dann entsprechend anpassen.
    Ein CL :-)
    1. Cpysplf in die 1. Physische Datei.
    2. cpyf mit %ne 1. Bedingung in die 2. Physische Datei
    3. cpyf mit %ne 2. Bedingung von 2. physischer Datei in die 1. Physische Datei
    4. cpyf mit %ne 3. Bedingung von 1. physischer Datei in die 2. Physische Datei
    5. cpyf mit %ne 4. Bedingung von 2. physischer Datei in die 1. Physische Datei
    Same procedure so lange Bedingungen vorhanden sind.

    Wenn alle Bedingungen abgearbeitet sind dann ein letzer cpyf in eine Ergebniss Datei welche
    auch wieder 132 Byte hat ...

    Übrig bleibt dann irdgendwann das Ergebniss. :-)

    Und falls es irgendwann zu einem cypf mit 0 Datensätzen kommt dann per monmsg abfangen, die andere Datei löschen ...

    Gruß,
    Ralf

  8. #8
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Laut Doku geht mit dem aktuellen Release einiges:

    Code:
    /* If no record has matching key, write a new record      */
    IF  COND(&NUM_BYTES *EQ 0) THEN(DO)
      CHGVAR  VAR(&DATA) VALUE(&DATAIN)
      CHGVAR  VAR(&MOREDATA) VALUE('          ')
      CALLPRC  PRC('_Rwrite') +
               PARM((&RFILE *BYVAL) (&RECORD) (&RECORDSIZE *BYVAL)) +
               RTNVAL(&FEEDBACK)
     ENDDO
    /* Record was read successfully, update the existing record  */
     ELSE (DO)
      CHGVAR  VAR(&DATA) VALUE(&DATAIN)
      CALLPRC  PRC('_Rupdate') +
               PARM((&RFILE *BYVAL) (&RECORD) (&RECORDSIZE *BYVAL)) +
               RTNVAL(&FEEDBACK)
     ENDDO
    Vermutlich daher auch löschen, habe es mir aber nicht genauer angesehen

    GG

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wofür die 132 Felder?
    Hier wurde ja nach dem Delete gefragt.
    Mit 2 PF's habe ich es auch schon gemacht.
    Dies kann man natürlich auch tun.
    Dazu eine numerische Variable definieren und beim RCVF die Sätze zählen.
    Somit hat man gleich die relative Satznummer.

    Dann je gültiger Bedingung macht man einen CPYF ... FROMRCD(&MyRcdNr) NBRRCDS(1).
    Wenn ungültig, lässt man den CPYF einfach weg.

    Für das RPG/LE-Delete kann man sich auch ein Kommando schreiben, dass auf jeder beliebigen PF einen Satz per Satz-Nummer löscht. Hierzu definiert man sich im RPG eine interne PF, überschreibt diese mit LVLCHK(*NO) und macht nur einen "SATZNR DELET MYFILE" und beendet das Programm mit *LR=*ON.
    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

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wahrscheinlich wird es noch ein paar weitere Lösungen geben.
    Du kannst auch (wie Birgitta ja vorgschalgen hat) einfache einen SQL stricken:

    chgvar &MYSQL ('DELETE MYTABLE A WHERE RRN(A) = ' *CAT &MYRRN)

    RUNSQL &SQL(&MYSQL)
    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
    Dec 2004
    Beiträge
    203
    Hi,

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Wofür die 132 Felder?
    Hier wurde ja nach dem Delete gefragt.
    Mit 2 PF's habe ich es auch schon gemacht.
    Dies kann man natürlich auch tun.
    Dazu eine numerische Variable definieren und beim RCVF die Sätze zählen.
    Somit hat man gleich die relative Satznummer.

    Dann je gültiger Bedingung macht man einen CPYF ... FROMRCD(&MyRcdNr) NBRRCDS(1).
    Wenn ungültig, lässt man den CPYF einfach weg.

    Für das RPG/LE-Delete kann man sich auch ein Kommando schreiben, dass auf jeder beliebigen PF einen Satz per Satz-Nummer löscht. Hierzu definiert man sich im RPG eine interne PF, überschreibt diese mit LVLCHK(*NO) und macht nur einen "SATZNR DELET MYFILE" und beendet das Programm mit *LR=*ON.
    Naja der Fragende hat ja auch nach der Möglichkeit gefragt aufgrund von gewissen Inhalten an gewissen Stellen entsprechend zu reagieren. Deshalb die 132 einzelnen Felder. Wobei hier naturlemant geguckt werden muss ob die Bedingung sich auf Spaltenbreit 1 oder groesser bezieht und die Datenstruktur dann entsprechend angepasst werden müßte.

    Die Lösung war auch eher dahingehend angesiedelt mit den in CL zur Verfügung stehendem Befehlssatz das Problem auch zu lösen ... und wie immer gitl "Alle Wege führen irgendwann überallt hin :-"

    Gruß aus Flensburg
    Ralf

  12. #12
    Registriert seit
    Nov 2015
    Beiträge
    80
    Hallo nochmal,

    vielen Dank für die zahlreichen Lösungsvorschläge.
    Einfachste Lösung erschien mir dann doch ein kleines RPG zu schreiben. Läuft auch.

    Grüße :-)

Similar Threads

  1. SQL Sätze löschen, wenn nicht in Datei vorhanden
    By programmer400 in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 06-06-16, 20:45
  2. SQL und Reihenfolge der angezeigten Sätze
    By KingofKning in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 30-12-14, 19:53
  3. Gelöschte Sätze in PF
    By Peet in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 29-10-14, 08:05
  4. doppelte Sätze in PF finden und löschen
    By Schnichels in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 23-11-01, 12:54
  5. gelöschte Sätze
    By Wirnitzer in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 07-08-01, 19:59

Berechtigungen

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