Anmelden

View Full Version : Finden und Löschen



Seiten : [1] 2

tmg
15-12-11, 07:35
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

BenderD
15-12-11, 08:10
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.

tmg
15-12-11, 08:14
... wie wärs mit SQL?

update mytable set myfield = replace(myfield, '.', '')

D*B

ich bin begeistert, vielen Dank!!!

B.Hauser
15-12-11, 08:16
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

malzusrex
15-12-11, 08:21
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

Pikachu
15-12-11, 08:40
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

friewi00
15-12-11, 15:31
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.

Fuerchau
15-12-11, 18:22
Nunja, wer's compliziert mag...
Ich finde die SQL-Lösung am Einfachsten, die funktioneirt auch mit anderen Ersatzwerten (incl. auch Verlängern).

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