PDA

View Full Version : RPG-400



UFi
25-06-10, 17:58
Jetzt holt's mich ein.
Ich versuche im RPG400 eine Datei mit SQL zu verarbeiten, scheitere aber bereits an der Umwandlung des Programms.
Problem sind a) die Länge der Feldnamen und b) die Art der Felder.

Die Feldnamen könnte ich im RPG ja umbenennen, aber die Felder mit der variablen Länge oder der Art DATE/TIME/TIMESTAMP werden ignoriert.

Die brauch ich natürlich. Kann jemand helfen?

Fuerchau
25-06-10, 18:21
Du kannst alles mit SQL erledigen.
Allerdings kannst du für diese Felder nicht auf externe DS referieren sondern musst die Felder als Char-Felder in ausreichender Größe definieren (Datum 10 bei ISO, Timestamp 22).
SQL übernimmt für dich die Konvertierung.

Anders siehts etwas mit variablen Feldern aus.
Diese musst du ausreichend groß anlegen.
Beim Select wird das Feld eben mit Leerzeichen aufgefüllt.

Beim Insert/Update solltest du dann die SQL-Funktion trim(: MyField) verwenden, wenn die Länge nicht als Maximum gesetzt werden soll.

Null-Flags werden als Variablen vom Typ "B 1 2" definiert.

B.Hauser
27-06-10, 09:57
Hallo,

Wenn Du mit SQL arbeitest, solltest Du sowieso nur die Felder verwenden, die Du tatsächlich brauchst. Damit könnten sich schon die unbrauchbaren Datentypen erledigt haben.

Was die langen Feldnamen angeht, so musst Du lediglich für die Ausgabe kurze, maximal 6 stellige Host-Variablen definieren. Diese Host-Variablen müssen auch dann in den die Datentypen, die RPGIII verarbeiten kann definiert sein. Felder mit variabler Länge werden korrekt in Host-Variablen mit fixer Länge übertragen, Integer-Felder werden korrekt in gepackt oder gezont numerische Felder übernommen. Bei Fließkomma, könnte es bei der Übernahme evtl. zu Rundungsdifferenzen kommen, sofern nicht genügend Nachkommastellen definiert wurden.

Bei Datum und Zeit ist es schon schwieriger. Hier kommt es darauf an, wie Du die Ausgabe-Felder benötigst, d.h. alpha (mit oder ohne Tennzeichen) oder numerisch. Mit SQL müssen die Felder in das gewünschte Format gecastet werden:

Beispiel:
1. Datum im Format 'JJJJ-MM-TT', Zeit im Format 'HH.MM.SS', Zeitmarke im Format 'JJJJ-MM-TT-HH.MM.SS.MSMSMS:

Select Char(MyDate, ISO), Char(MyTime, ISO),
Char(MyTimestamp) ...
2. Datum im Format 'JJJJMMTT', Zeit im Format HHMMSS, Zeitmarke im Format JJJJMMTTHHMMSSMSMSMS, Zeitmarke im Format JJJJMMTTHHMMSS:

select Replace(char(MyDate, ISO), '-', ''),
Replace(Char(MyTime, ISO), '.', ''),
Replace(Replace(Char(MyTimestamp), '-', ''), '.', ''),
Left(Replace(Replace(Char(MyTimestamp), '-', '') ...
3. Numerisches Datum im Format JJJJMMTT, Zeit im Format HHMMSS, Zeitmarke im Format JJJJMMTTHHMMSS

select Cast(Replace(char(current_Date, ISO), '-', '') as Dec(8, 0)),
Cast(Replace(Char(Current_Time, ISO), '.', '') as Dec(6, 0)),
Cast(Left(Replace(Replace(Char(Current_Timestamp), '-', ''),
'.', ''), 14) as Dec(14, 0))

Birgitta