PDA

View Full Version : SCAN von rechts



Seiten : [1] 2

KM
11-06-04, 10:23
Hallo,

kennt jemand einen Befehl oder eine elegante Lösung wie ich in einem Textfeld das erste Vorkommen eines bestimmten Zeichens von rechts ermitteln kann. Der CHECKR gibt ja leider nur die Position des ersten Zeichens, das nicht dem Vergleichswert entspricht. Und der SCAN funktioniert nur von links.

Gruß,
KM

mk
11-06-04, 11:00
Hallo KM,

Du könntest den %Subst mit einer Schleife benutzen

%subst(feld:30-index:1)

Wenn die Feldlänge 30 Stellen ist erhälst Du von rechts
nach links jede Stelle .

Gruss Michael

KM
11-06-04, 11:09
Hallo Michael,

genauso habe ich es momentan auch gelöst. Ich dachte nur es gäbe vielleicht einen passenden Befehl oder eine Funktion dafür, so dass ich mir die Schleife sparen könnte.

Trotzdem vielen Dank,

KM

Fuerchau
11-06-04, 12:00
Um eine Schleife kommst du allerdings nicht herum, aber wie wäre es trotzdem %scan zu nutzen ?

d fPos s 5p 0
d nPos s 5p 0
d mField s 30
d mScan s 10

/free
fPos = *zero;
for nPos = 1 to %size(mField);
nPos = %scan(mScan:mField:nPos);
if nPos > *zero;
fPos = nPos;
iter;
endif;
leave;
endfor;
if fPos > *zero;
// gefunden
endif;
/end-free

KM
11-06-04, 12:31
Ja gut, das würde sicher auch funktionieren. Aber ich wollte jetzt nicht zu sehr auf dem SCAN herumreiten, sondern nur eine einfache Möglichkeit finden ein Zeichen von rechts zu finden.

Danke,
KM

thomas.wachler
24-06-04, 12:36
Dieses und ähnliche Probleme habe ich mit ILE/C gelöst:
1. ein ILE/C-Modul erstellen
2. daraus ein Serviceprogramm machen
3. Prototyp-Datei erstellen
4. in RPG oder sonst wo anwenden
Fertig.
Diese Objekte stelle ich dir gerne zur Verfügung. Bitte Mail an: thomas.wachler-thomsen@experian.de
Gruß
Thomas

Hier die Quellenbeispiele:
/*------------------------------------------------------------------------------
Zeichenkette von rechts beginnend absuchen
Als Ergebnis wird die Position zurückgegeben
----------------------------------------------------------------------------*/
unsigned int SCANR(char search[ ], char source[ ], unsigned int slen)
{
unsigned int i;

for (i=slen-1; i>0; i--)
{
if (source[i] == search[0]) return i+1;
}
return 0;
}


* Zeichenkette von rechts beginnend absuchen
* Als Ergebnis wird die Position zurückgegeben
DScanR Pr 10U 0
D search * Value Options(*String) char *
D source * Value Options(*String) char *
D lensrc 10U 0 Value
D r S 10U 0
D search S 1A
D string S 50A
** looking for End-Of-Record-Character
C Eval search= ';'
C Eval string= 'text1;text2;text3'
C Eval r= ScanR(search: string: %len(string))
C Dsply r
C Return

Fuerchau
24-06-04, 16:29
Deine C-Routine kannst du ersatzlos streichen und durch %scanr() ersetzen (die es übrigens schon länger gibt).

Und wenn schon C, dann schau dir strrchr() an !!

KM
24-06-04, 16:35
Also laut RPG-Reference Handbuch gibt es kein %SCANR(). Wo soll das denn existieren ??? Das halte ich noch für ein Gerücht.

Ich bin gerade schon dabei eine Routine mit strrchr() zu schreiben. Damit wird sich das Problem erledigen.

Fuerchau
24-06-04, 16:46
Tschuldige: %checkr() habe ich verwechselt.

Fuerchau
25-06-04, 12:08
Ich wußt doch, dass es da noch was gab:

C XYZ:LEN SCAN DST:STR EARR

Besonders ist hier das Ergebnisfeld zu beachten. Wenn dieses ein ARRAY ist (dim(nn)) werden ALLE Vorkommen des Suchstrings ermittelt und die jeweilige Position ins Array gelegt. Die restlichen Arrayfelder werden auf *zero gesetzt.

Nimmt man nun noch LOKUP, kann man das letzte Element mittels "%lokup(*zero:Array) - 1) ermitteln.