-
Dafür ist leider die Sprache (ILE)RPG vollkommen ungeeignet.
Der Feldname dient ja nur uns für die Addressierung des Speichers. Zur Laufzeit spielt letztlich der Name keine Rolle mehr.
Was du machen willst Bedarf am Ende Pointerarithmetik und %Subst().
Per API liest du dir die Feldstruktur der externen Tabelle ein und baust ein weiteres Array auf:
- Name = Name des Feldes
- Pointer = Verweis auf die Basis der externen Struktur + Position des Feldes aus dem API.
- Länge = Länger des Feldes.
Zusätzlich nun 2 Singelfelder:
dcl-s ptr pointer;
dcl-s Feld char(1000) based(ptr);
Hilfsfelder:
dcl-s index int(5);
dcl-s j int(5);
Wenn das Array nach Name sortiert hast, kannst du mit %lookupeq() schnell ein Element auslesen.
Nun kannst du durch dein vorher aufgebautes Array mit den 3000 Namen und Inhalten in einer Schleife folgendes tun:
for j=1 to 3000;
index = %lookupeq(name[j]:PtrArray);
ptr = PtrArray(index).Pointer;
%subst(Feld:1:PtrArray(index).Size) = Value[j];
endfor;
Allerdings ist eine Umwandlung in numerische Felder nur per select/when je Typ mittels %dec() durchführbar, weil die Argumente Stellne/Nachkomma von %dec nur Konstanten sein können.
-
Vielen Dank für eure Antworten.
Unsere reales Problem ist ein zu schreibendes Importprogramm, bei dem ein User aus sehr vielen Feldern auswählen kann, welche er importieren will.
Das Zusammenbauen einer Datenstruktur anhand der Feldpositionen hatte ich mir auch schon überlegt, fand es aber unschön und mein Kollege fragte nach einer "schöneren" Lösung vielleicht mit dynamischem SQL. Eine einfache Lösung scheint es da nicht zu geben.
Ich hätte mir die Lösung mit dem Zusammenbauen der Datenstuktur nicht mit Pointern gebaut. Aber das ist der bessere Weg, wenn ich so darüber nachdenke. Bei der Pointer-Lösung muss ich mir um die Datenformat (z.B. packed) keine großen Gedanken mehr machen, oder?
Ich versuche gerade, den Code von Baldur zu verstehen:
Was macht genau die folgende Anweisung?
ptr = PtrArray(index).Pointer;
Zeigt der ptr auf ein Element im Array?
Mit der Anweisung
%subst(Feld:1:PtrArray(index).Size) = Value[j];
wird die "Datenstruktur" an der passenden Stelle mit dem gewünschten Feldinhalt gefüllt, denke ich. Aber muss ich dazu den Feldinhalt, den ich ja nur als Alpha vorliegen habe, vorher noch in eine korrekte Bytefolge umwandeln? Ein String "Hugo" benötigt genau 4 Bytes, soweit klar. Aber die Zahl 1234 benötigt im gepackten Format ja 3 Bytes. Muss ich mir die 3 Bytes gepackt erst erzeugen oder macht das das Pointerkonstrukt automatisch?
ich wünsche erstmal einen schönen Feierabend!
-
Das Problem ist ja, dass du wieder nicht dynamisch based Felder auf die Struktur machen kannst.
RPG kann nur auf das Zielfeld zugreifen in dem du den Pointer verschiebst.
Du kannst ihn auch berechnen per
ptr = %addr(DSName) + FeldPosition;
Was Dezimalfelder angeht, so kannst du das nur einzeln lösen:
dcl-s Dec1_0 packed(1:0) based ptr;
dcl-s Dec2_0 packed(2:0) based ptr;
usw.
Dann im Code:
if packed;
select;
when Size = 1,0;
Dec1_0 = %dec(%trim(Valie(j):1:0);
when Size = 2,0;
Dec2_0 = %dec(%trim(Valie(j):1:0);
when Size = 11,2:
Dec11_2 = %dec(%trim(Valie(j):11:2);
endsl;
endif;
-
 Zitat von dschroeder
Ich hätte mir die Lösung mit dem Zusammenbauen der Datenstuktur nicht mit Pointern gebaut. Aber das ist der bessere Weg, wenn ich so darüber nachdenke. Bei der Pointer-Lösung muss ich mir um die Datenformat (z.B. packed) keine großen Gedanken mehr machen, oder?
[/COLOR]
... von was träumst Du eigentlich nachts? RPG ist eine Huddel-Proggrammiersprache und eine DS ist ein völlig unkontrollierter Datenhaufen, der mehr oder weniger zufällig im Speicher nebeneinander steht. Es war der feinsinnige Humor der Compiler-Entwickler das Struktur zu nennen.
D*B
PS: ich würde das ganze Gedöns mit if und else in eine procedure verschieben, der man Datentyp, Länge etc mitgibt und die das aufbereitet zurück gibt.
-
-
Also wenn dein JSON ungefähr so aussieht
[
{ "key" : "vorname" , "value" : "Mihael" },
{ "key" : "nachname" , "value" : "Schmidt" },
...
]
Dann musst du es nur umwandeln in eine Form von
{
"vorname" : "Mihael",
"nachname" : "Schmidt",
...
}
Funktioniert natürlich nur, wenn alle Schlüssel eindeutig sein. Sonst müsst man noch etwas mehr Logik reinbauen.
Wenn dann deine Datenstruktur die entsprechenden Unterfelder "vorname" und "nachname" hat, sollte es einfach mit einem data-into funktionieren.
Das Serviceprogramm noxDB kann das afaik seit Juli. https://github.com/sitemule/noxDB
Ein Beispiel zu data-into mit noxDB gibt es auch: https://github.com/sitemule/noxDB/bl...ata-into.rpgle
HTH
-
Hallo Mihael,
klingt interessant. Ich werde das mal an meinen Kollegen weitergeben.
Vielen Dank.
Similar Threads
-
By Aban13 in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 10-05-20, 08:28
-
By ora in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 22-06-19, 18:26
-
By Sebastian85 in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 05-07-17, 14:16
-
By MGJ79 in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 24-04-14, 11:00
-
By Harald.Wallukat in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 16-12-02, 21:37
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks