View Full Version : Fremdsprachen einführen
... das mit dem View Layer, haben wir mal in einem BI Umfeld so gemacht. Ausgangslage waren:
- an die zehn Seperat Installationen der (fast) gleichen Software, für jede Auslandsgesellschaft eine.
- die komplette operative Software war klassisch mit Singlebyte, jeweils passende Codierung pro Installation
- die CCSIDs der Tabellen war teilweise falsch, funktioniert hat das nur nach dem MIMO Prinzip (sprich die Fehlcodierung der Eingabe war invers zur Fehlumsetzung bei der Ausgabe)
- im Datawarehaus sollten nun diese (auf den ersten Blick) inkompatiblen Bestände zusammengeführt werden.
- im Ladeprozess haben wir alles mit einem Mandantenkey (der letztlich auch die Codierung erkennen ließ) erweitert zusammengekippt
Dann haben wir im View Layer die Textfelder nach Unicode gecasted (technisch braucht es da Zwischencasts nach 65535, damit einem die automatischen Umsetzungen nicht dazwischen fuhrwerken)
Final war uns das dann für einige Tabellen zu langsam. Da haben wir dann zusätzliche Unicode Felder angehängt, die von Triggern gepflegt wurden.
Im View Layer haben wir dann Tabellen für alte Welt (single Byte korrekte CCSID) dargestellt und für neue Welt Unicode.
Da es sich um etliche Tabellen und Felder handelte, haben wir für alle erforderlichen SQL Skripte (create view, create trigger) 3 (oder waren es 4?) Generatoren geschrieben.
In der Summe nicht aufwandsfrei, aber signifikant weniger als Umstellung der vorhandenen Anwendung auf Unicode und wichtiger: Keinerlei Risiken für die vorhandene Anwendung (mit ihrem unbekannten Anteil an Varianten)
D*B
Rainer Ross
15-09-17, 10:39
Ich habe einen Webservice zum Klicken gebaut, der Daten in Tschechisch, Russisch und Chinesisch als Webservice ausgibt. Als Frontend kann man jedes beliebige Webframework benutzen www.myhofi.com/muscgip/mymustst.pgm (http://www.myhofi.com/muscgip/mymustst.pgm)
Die Datei ist wie folgt aufgebaut:
create or replace table mylib.myfile (
id int generated always as identity (start with 1 increment by 1),
artist1 char(50) ccsid 1208,
artist2 graphic(50) ccsid 1200,
artist3 graphic(50) ccsid 13488,
primary key(id)
)
Mit wenigen JavaScript Statements ist es z.B. mit www.webix.com (http://www.webix.com) möglich, eine Weboberfläche für einen Webservice zu bauen
www.myhofi.com/devhtm/Websrv04.html
(http://www.myhofi.com/devhtm/Websrv01.html)
//--------------------------------------------------------------------------//
// Main //
//--------------------------------------------------------------------------//
webix.ready(function(){
webix.ui({
view: "datatable",
id: "myTable",
autoConfig: true
});
webix.extend($$("myTable"), webix.ProgressBar);
readData("myTable");
});
//--------------------------------------------------------------------------//
// Read Data //
//--------------------------------------------------------------------------//
function readData(tableId) {
$$(tableId).showProgress({hide:true});
webix.ajax().post("/myapp/websrv01.pgm", {id:0},
function(text, data) {
$$(tableId).clearAll();
$$(tableId).parse(data.json().items);
$$(tableId).setPage(0);
$$(tableId).hideProgress();
}
);
}
Den Sourcecode für die Webservices findet ihr hier https://github.com/rainerross/websrvutl
Viele Grüße
Rainer
dschroeder
15-09-17, 11:37
Auch an dich vielen Dank, Rainer. Noch mal eine vielleicht naive Frage: Wir haben bisher ja alle Felder in unseren Tabellen im SBCS (Also Single Byte Character Set) definiert. Gibt es einen "globalen Schalter", mit dem man alles (also alle Felder in allen Tabellen) auf Unicode umstellen könnte? Das System müsste dann, vereinfacht gesagt, ja nur alle Speicherplätze verdoppeln.
Also ja und nein:
Wenn du alle Dateien mit DDS erstellt hast und diese grundsätzlich mit einer REFF definierst, musst du nur die REFF anpassen.
Hast du keine REFF must du die Felder anpassen. Anschließend alle Dateien mit CHGPF umsetzen. Die Daten bleiben dabei erhalten.
In SQL gibt es das leider so nicht. Hier gibts es nur einen "Create or Replace", wobei dann eben alle Daten weg sind. Du musst dann halt Sripte erstellen, die statt dessen einen "Alter Table ... Alter Column set data-type ..." generieren.
dschroeder
15-09-17, 12:01
OK, habe ich verstanden. Letztlich müssen also die Felder in den Tabellen auf graphic oder ähnlichem stehen. Wenn wir Unicode wollen, müssten wir (in einer SQL-Tabellendefinition) also "graphic(xx) ccsid 13488" stehen haben.
Wenn wir das hätten, könnten unsere RPG-Programme dann damit einfach so arbeiten, wenn alle Zugriffe auf diese Felder mittels embedded SQL laufen? Müsste man die Hostvariablen im RPG dann auch mit dem Datentyp graph deklarieren?
andreaspr@aon.at
15-09-17, 12:06
In SQL gibt es das leider so nicht. Hier gibts es nur einen "Create or Replace", wobei dann eben alle Daten weg sind. Du musst dann halt Sripte erstellen, die statt dessen einen "Alter Table ... Alter Column set data-type ..." generieren.
Einfach ein ... Create or Replace Table ... die Attribute von VARCHAR auf NVARCHAR ändern und DB macht den Rest für dich.
Rainer Ross
15-09-17, 12:07
"Create or Replace", wobei dann eben alle Daten weg sind
für einen Kunden habe ich kürzlich eine Datei auf UTF8 umgestellt, das hat mit folgenden Schritten gut funktioniert
1) alte Datei
create or replace table mylib.myfile (
Id integer not null default,
Language char(02) not null default,
Message char(256) not null default,
CreateDate timestamp not null default
);
2) für das Feld Message CCSID 1208 eingefügt
create or replace table mylib.myfile (
Id integer not null default,
Language char(02) not null default,
Message char(256) not null default CCSID 1208,
CreateDate timestamp not null default
);
3) mit Runsqlstm oder im ACS die SQL-Prozedur aufgerufen. Die Daten sind danach alle vorhanden und auf die neue CCSID 1208 umgestellt
4) Tschechische Daten mit Insert eingefügt
Bei Fragen könnt ihr gerne Kontakt mit mir aufnehmen
Herzliche Grüße
Rainer
Um ggf. keine Fehler zu erhalten sollte dies gemacht werden.
Wie Dieter schon sagte:
Wenn es ein Umsetzungsproblem UCS2 => SBCS gibt, setzt SQL ein Warningsflag in der Anzeiger-Variablen (NULL-Flag = -2). Arbeitest du ohne NULL-Anzeiger gibts einen negativen SQL-Code.
Jetzt kannst du dir ja selber ausrechnen, was beim Lesen und Update dann so alles passieren kann.
Wobei bei einer Where-Klausel ggf. keine Daten gefunden werden, da die Umsetzung beim Lesen zu Ersatzzeichen geführt hat.
Auch hier sollte man dann mit externen Template-DS der Tabellen arbeiten (Copy, Include) und alle abgeleiteten per LIKE definieren.
andreaspr@aon.at
15-09-17, 12:09
Müsste man die Hostvariablen im RPG dann auch mit dem Datentyp graph deklarieren?
Genau, du kannst aber auch ganz einfach eine extern beschriebene DS definieren. Dann brauchst du dir da keine Gedanken zu machen wie das genau definiert werden muss.
Nur wenn du die Unicode-Daten mit Chars kombinieren willst (EVAL oder IF) dann musst du halt Konvertierungen vornehmen (so wie in dem Beispiel was ich anfangs gepostet habe):
dschroeder
15-09-17, 12:15
Wenn ich Unicode haben möchte: Wie soll ich mein Feld in der Datenbanktabelle deklarieren (graphic oder nvar oder ...).
Und wie ist dann der entsprechende Datentyp im RPG?