PDA

View Full Version : Einzelne Sätze aus PF löschen



Seiten : [1] 2

_MG_
20-06-16, 10:30
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

KingofKning
20-06-16, 10:31
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

_MG_
20-06-16, 10:49
Hallo,

Release Stand ist V7R1M0

Fuerchau
20-06-16, 10:49
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.

B.Hauser
20-06-16, 11:05
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

Fuerchau
20-06-16, 11:23
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.

TheDevil
20-06-16, 11:26
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

KingofKning
20-06-16, 11:42
Laut Doku geht mit dem aktuellen Release einiges:



/* 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

Fuerchau
20-06-16, 11:43
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.

Fuerchau
20-06-16, 11:47
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)