PDA

View Full Version : Sonderzeichen umsetzen in RPG/IV



dinie
31-07-07, 08:17
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

malzusrex
31-07-07, 08:32
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

dinie
31-07-07, 09:05
Vielen Dank Roland, ich werde deine ILE versuchen in RPG/IV code umzuschreiben.
Gruß, Dinie.

Fuerchau
31-07-07, 09:07
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

dinie
31-07-07, 09:50
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.

cbe
31-07-07, 10:29
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";)

Fuerchau
31-07-07, 14:04
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.

Fuerchau
22-06-11, 10:02
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.