View Full Version : Finden und Löschen
Hallo zusammen,
ich hab folgende Aufgabe, ich soll alle Werte, die einen Punkt beinhalten z. B. 770.35.008.000, ändern auf Werte ohne Punkt (77035008000), wobei die Punkte nicht immer an der selben Stelle stehen. Ich hab mir gedacht, ich schreib ein kleines RPG, mit SCAN und SUBST, wird es shon gehen, hab aber bald gemerkt, daß ich schon zu viel vergessen habe. Ich hab das dann mit MS ACCESS geändert. Aber ich würde gerne wissen, wie ich das in einem RGP lösen kann.
Vielen Dank
Thomas Gell
Hallo zusammen,
ich hab folgende Aufgabe, ich soll alle Werte, die einen Punkt beinhalten z. B. 770.35.008.000, ändern auf Werte ohne Punkt (77035008000), wobei die Punkte nicht immer an der selben Stelle stehen. Ich hab mir gedacht, ich schreib ein kleines RPG, mit SCAN und SUBST, wird es shon gehen, hab aber bald gemerkt, daß ich schon zu viel vergessen habe. Ich hab das dann mit MS ACCESS geändert. Aber ich würde gerne wissen, wie ich das in einem RGP lösen kann.
Vielen Dank
Thomas Gell
... wie wärs mit SQL?
update mytable set myfield = replace(myfield, '.', '')
D*B
andreaspr@aon.at
15-12-11, 08:14
Wenns um Sätze in einer Tabelle geht, ist SQL das schnellste.
In RPG musst du vor 7.1 in einer Schleife mit %SCAN die Position ermitteln und dann mit %REPLACE das Zeichen entfernen.
Ab 7.1 gibts die Funktion %SCANRPL.
... wie wärs mit SQL?
update mytable set myfield = replace(myfield, '.', '')
D*B
ich bin begeistert, vielen Dank!!!
Warum willst Du das unbedingt in RPG machen und nimmst nicht SQL?
update MySchema/MyTable
set MyCol = Replace(MyCol, '.', '')
Where ... ;
Den Replace-Befehl kann man auch in embedded SQL verwenden:
Exec SQL Set :MyCol = Replace(:MyCol, '.', '');
Und schließlich gibt es auch ab Release 7.1 auch die Built-In-Funktion %ScanRpl(), die die gleiche Funktionalität wie der SQL Replace hat.
/Free
MyCol = %ScanRpl('.': '': MyCol);
/End-Free
Birgitta
Hey,
im RPG hatte ich da mal was gebastelt, um aus einen Alpha-Feld alles zu löschen, was keine Zahl war. (Telefonnummern-Feld)
d
d DelNoNum PR 15
d 15
c If MyFld <> *Blanks
c Eval MyFld = DelNoNum( MyFld )
c EndIf
.....
p DelNoNum b
d PI 15
d String 15
d Index s 3 0
d Laenge s 3 0
d Zahlen c '0123456789'
c Eval Laenge = %Len( %Trim( String ) )
c For Index = 1 to Laenge
c If %Scan( %SubSt( String : Index : 1) :
c Zahlen )
c = *Zeros
c If Index = 1
c Eval String = %SubSt( String : 2 : 14 )
c Else
c Eval String = %SubSt( String :
c 1 :
c Index - 1 ) +
c %SubSt( String :
c Index + 1 :
c 15 - Index )
c EndIf
c Eval Laenge = %Len( %Trim( String ) )
c Eval Index = Index - 1
c EndIf
c EndFor
c
c Return String
p DelNoNum e
Zugegeben. Die VAriante im SQL ist natürlich eleganter.
Gruß
Ronald
DPOS S 10S 0 INZ
DFELD S 100A INZ('770.35.008.000')
D************************************************* *********************
C '.' SCAN FELD POS 7778
C *IN78 DOWEQ *ON
C EVAL FELD = %REPLACE('':FELD:POS:1)
C '.' SCAN FELD:POS POS 7778
C ENDDO
C SETON LR
not tested, aber als beispiel reicht es sicher:
dow %scan('.': %subst(f15:1:%len(%trimr(f15))) : 1 ) <> *zero;
f15 = %replace('':f15:%scan('.':f15):1);
// im ersten arg als ersatzzeichen NICHTS ''
dsplyf15;
enddo;
enjoy it
hinweis: ich hab versucht eine lösung zu finden, die ohne extra zu definierende zwischenfelder auskommt.
Nunja, wer's compliziert mag...
Ich finde die SQL-Lösung am Einfachsten, die funktioneirt auch mit anderen Ersatzwerten (incl. auch Verlängern).
Nunja, wer's compliziert mag...
Ich finde die SQL-Lösung am Einfachsten, die funktioneirt auch mit anderen Ersatzwerten (incl. auch Verlängern).
... es wundert mich ja, dass Du nicht darauf hinweist, dass die SQL Funktion REPLACE erst ab Release V5R3 verwendet werden kann ;)
Birgitta