View Full Version : Sonderzeichen umsetzen in RPG/IV
Hallo, ich möchtte bevor ich Daten rausgebe alle Sonderzeichen ersetzen. D.h. "ü" soll "ue" und "ä" soll "ae" werden.
Ich kenne XLATE, stelle aber fest das ich damit nur 1 zu 1 Zeichen übersetzen kann. Weiß jemanden wie ich og Umsetzung in RPG hinbekomme?
Gruß, Dinie
Ich hatte dafür mal ein kleines Proggie gemacht.
Vielleicht hilft es Dir ja als Gedankenstütze.
*
* Programm dient zur Umwandlung von Texten
*
* Übergabe Parameter
* text 255 den zu konvertierenten Text
* art 2 Art der Umwandlung
* 'KG' = klein --> GROß
* 'GK' = GROß --> Klein
* '1G' = erster Buchstabe GROß rest klein
* '2G' = 1 Buchstabe aller Wörter groß rest klein
* 'ÖO' = ö,Ö,ü,Ü,ä,Ä --> oe,OE,ue,UE,ae,AE
* 'OÖ' = oe,OE,ue,UE,ae,AE --> ö,Ö,ü,Ü,ä,Ä
*
* ret_code 1 Fehlerzeiger ist 'F' wenn art nicht gültig
*
*
d sds
d parmanz *parms
d job 244 253
d user 254 263
d
d
d art s 2 Umwandluns-Kz
d ret_code s 1 Fehlerzeiger
d text s 255
d pos s 3 0 Position im String
d Laenge s 3 0 Länge des String
d Buchstabe s 1
d Such_was s n
d
d False c *Off
d True c *On
d ds
d xtext 255 Umsetzungstxt
d erstes_zei 1 overlay(xtext:1)
d
d low c const('abcdefghijklmnopqrstuvwxyz')
d upp c const('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
d
c Select
c When art = 'KG'
c Exsr klein_gross
c When art = 'GK'
c Exsr gross_klein
c When art = '1G'
c Exsr erster_gross
c When art = '2G'
c Exsr erster_gross1
c When art = 'ÖO'
c Exsr umlaut_1
c When art = 'OÖ'
c Exsr umlaut_2
c Other
c If parmanz = 3
c Eval ret_code = 'F'
c Endif
c Endsl
c
c Eval text = xtext
c Eval *inlr = *on
*
*
****************** klein_gross *******************************************
*
*
c klein_gross Begsr
c*
c low:upp xlate xtext xtext
c*
c Endsr
*
*
****************** gross_klein *******************************************
*
*
c gross_klein Begsr
c*
c upp:low xlate xtext xtext
c*
c Endsr
*
*
****************** erster_gross ******************************************
*
*
c erster_gross Begsr
c*
c upp:low xlate xtext xtext
c low:upp xlate erstes_zei erstes_zei
c*
c Endsr
*
*
****************** erster_gross1************************************* *****
* alle 1. Buchstaben pro Wort groß
*
c erster_gross1 Begsr
c*
c upp:low xlate xtext xtext
c low:upp xlate erstes_zei erstes_zei
c Eval Pos = 1
c Eval Laenge = %Len( %Trim( xtext ) )
c Eval Such_Was = True
c Dow Such_was
c
c Eval Pos = %Scan(' ' : xtext : pos)
c If Pos > *Zeros and Pos < Laenge
c Eval pos = pos +1
c Eval Buchstabe = %SubSt( xtext : pos : 1)
c low:upp xlate Buchstabe Buchstabe
c Eval xtext = %Replace( Buchstabe : xtext : pos :1)
c Else
c Eval Such_Was = False
c EndIf
c EndDo
c*
c Endsr
*
*
****************** umlaut_1 **********************************************
*
*
c umlaut_1 Begsr
c*
c Eval pos = %scan('ö':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('oe':xtext:pos:1)
c Eval pos = %scan('ö':xtext)
c Enddo
c Eval pos = %scan('Ö':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('OE':xtext:pos:1)
c Eval pos = %scan('Ö':xtext)
c Enddo
c Eval pos = %scan('ü':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('ue':xtext:pos:1)
c Eval pos = %scan('ü':xtext)
c Enddo
c Eval pos = %scan('Ü':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('UE':xtext:pos:1)
c Eval pos = %scan('Ü':xtext)
c Enddo
c Eval pos = %scan('ä':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('ae':xtext:pos:1)
c Eval pos = %scan('ä':xtext)
c Enddo
c Eval pos = %scan('Ä':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('AE':xtext:pos:1)
c Eval pos = %scan('Ä':xtext)
c Enddo
c*
c Endsr
*
*
****************** umlaut_2 **********************************************
*
*
c umlaut_2 Begsr
c*
c Eval pos = %scan('oe':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('ö':xtext:pos:1)
c Eval pos = %scan('oe':xtext)
c Enddo
c Eval pos = %scan('OE':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('Ö':xtext:pos:1)
c Eval pos = %scan('OE':xtext)
c Enddo
c Eval pos = %scan('ue':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('ü':xtext:pos:1)
c Eval pos = %scan('ue':xtext)
c Enddo
c Eval pos = %scan('UE':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('Ü':xtext:pos:1)
c Eval pos = %scan('UE':xtext)
c Enddo
c Eval pos = %scan('ae':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('ä':xtext:pos:1)
c Eval pos = %scan('ae':xtext)
c Enddo
c Eval pos = %scan('AE':xtext)
c Dow pos > *zeros
c Eval xtext = %replace('Ä':xtext:pos:1)
c Eval pos = %scan('AE':xtext)
c Enddo
c*
c Endsr
*
*
****************** *inzsr ************************************************
*
*
c *inzsr Begsr
c*
c *entry Plist
c Parm text
c Parm art
c Parm ret_code
c
c
c Eval xtext = text
c*
c Endsr
Gruß Ronald
Vielen Dank Roland, ich werde deine ILE versuchen in RPG/IV code umzuschreiben.
Gruß, Dinie.
Wie wäre es mit ein wenig SQL ?
c/exec sql
c+ set :myvar = replace(:myvar, 'Ö', 'Oe')
c/end-exec
Dies ist für jede Kombination zu wiederholen. Man kann es auch verallgemeinern:
c eval myfrom = 'Ö';
c eval myto = 'Oe';
c/exec sql
c+ set :myvar = replace(:myvar, trim(:myfrom), trim(:myto))
c/end-exec
Fuerchau: der Idee mit dem SQL gefällt mir hervoragend! Ich habe es bereits ausprobiert, funktioniert top.
Danke euch für die schnelle Hilfe,
Dinie.
klasse Idee!
Das Problem hatte ich auch erst vor kurzen und habe es "konventionell" programmiert. Hier SQL zu nehmen ist viel eleganter - genial!
Gruß
Christian
"Wer nur einen Hammer hat, für den ist jedes Problem ein Nagel";)
Nicht nur das, sondern SQL verwendet auch die aktuelle Job-CCSID, wenn die umzusetzenden Zeichen auch vorher aus einer Datei gelesen werden.
Kodierst du hart ein 'Ö' in der Quelle, funktioniert das nur mit der CCSID zum Compile-Zeitpunkt.
Änderst du später z.B. Job- oder File-CCSID wird dein 'Ö' nicht mehr gefunden !
camouflage
22-06-11, 09:13
Nur zuf Info unter V7R1
/free
string =%ScanRpl('ö' : 'oe' : string);
/end-free
geht natürlich auch zum Sonderzeichen eliminieren.
Bzgl. der CCSID bei Konstanten gilt weiterhin oben gesagtes.
Rufts du dein Programm nicht mit der selben CCSID deiner Programmquelle bzw. der Job-CCSID zum Erstellzeitpunkt auf, wird ein ganz anderes Zeichen ersetzt !
camouflage
22-06-11, 10:57
Hallo Fürchau
Ist schon klar, es ging mir nur um die neue BIF, bzw. deren Funktionalität.