-
... was hier passiert ist, ist doch exemplarisch:
das Ausgangsproblem ist relativ überschaubar:
- es gibt ein XML, das ins Programm eingelesen werden soll
- es gibt eine Datei, in die Informationen aus diesem XML reingeschrieben werden soll
Statt die naheliegende einfache Lösung zu wählen eine Struktur zum einlesen zu definieren, einlesen, benötigte Werte übertragen, schreiben, wird erheblich Gehirnschmalz verbraten, um ein paar Zeilen elementaren Code einzusparen.
Dafür kauft man dann nicht unerheblich Probleme ein:
- enge Kopplung zwischen dem XML und der Datei (wenn sich am XML was ändert, muss die Datei oder Logik geändert werden)
- Verzicht auf alle Prüfungen des Compilers (per Pointer kriegt man alles aufeinander genagelt)
- wesentlich verschlechterte Lesbarkeit des Programms.
Meine Empfehlung:
- immer an Lesbarkeit orientieren
- einfach ist meist auch gut
- nicht immer alles ausreizen, was man so alles kann
D*B
PS: Die runtime hat sich hier auch nicht mit Ruhm bekleckert, wenn ein write abschmiert, hat da auch nix in der Datei drinzustehen.
Weitere Empfehlung:
Commit einsetzen, da wäre dann wenigstens ein automatischer Rollback hinterhergekommen.
-
Vielen Dank, Bender, für deine Antwort!
Programme lesbar zu halten, ist auch mein Anliegen. Schon allein deswegen, damit ich selber sie nach ein paar Wochen noch verstehe.
Hier geht es darum, dass ich ein XML-Dokument mit 114 möglicherweise interessanten Elementen in eine Datei schreiben möchte. Alle 114 Felder einzeln behandeln will ich nicht. Dies ist nämlich meines Erachtens ebenfalls eine Quelle für Fehler. (Die sich allerdings entschärfen lässt, indem man sich den Code generieren ließe; ich mache so was gerne - bitte nicht schlagen! - per Word-Serienbrief oder in Excel ... 114 Zeilen mit =" if "&A1&" <> *blank;"&zeichen(10)&" eval dsDATA."&A1&" = "&A1&";"&zeichen(10)&" endif;" oder sowas.)
Wie wäre dein Vorschlag? Eine Datenstruktur mit den Felddefinitionen brauche ich doch in jedem Fall. Die Kopplung zwischen XML und Datei ist wohl auch unerlässlich. Hier geht es um Werte zu bestimmten Objekten, zu denen wir Aktualisierungen erhalten. Später hole ich mir per "select feldname from I3DGXARC order by aentmst desc fetch first row only" den jeweils aktuellsten Wert. Mit prepared SQL ist das eine praktische Sache, die tatsächlich hilft, den Code lesbar zu halten.
In Programmen, die das Archiv lesen, wird dann eine Prozedur verwendet, die ich in einem SRVPGM um das SQL herum gebastelt habe. Das sieht dann so aus:
chrNeuName = getAktWert(objekt:'NAME');
Durch den Pointer habe ich eine zweite Datenstruktur eingespart. Die Definition per Likerec macht deutlich, dass Satzformat und Datenstruktur übereinstimmen. Für mich schien das eine lesbare, vergleichsweise leicht verständliche Lösung zu sein.
Was meinst du konkret mit "... die naheliegende einfache Lösung ... eine Struktur zum einlesen zu definieren, einlesen, benötigte Werte übertragen, schreiben"? Ich neige manchmal leider dazu, das Einfache zu übersehen und viel zu kompliziert zu denken.
Struktur zum Einlesen - habe ich
Einlesen - mache ich (XML-Into)
Schreiben - mache ich -- neuerdings sogar ohne Abbruch :-)
Vor allem das "benötigte Werte übertragen" macht mich neugierig; denn genau dieser Punkt hat mir Kopfzerbrechen bereitet und zu meiner Lösung geführt. Eval-corr macht es ja nicht unbedingt um Größenordnungen einfacher. Und das Schreiben -- wohin, wenn nicht in eine Datei, deren Aufbau sich am XML orientiert?
Beste Grüße
Markus
-
 Zitat von Scholli2000
Durch den Pointer habe ich eine zweite Datenstruktur eingespart.
Vor allem das "benötigte Werte übertragen" macht mich neugierig; denn genau dieser Punkt hat mir Kopfzerbrechen bereitet und zu meiner Lösung geführt. Eval-corr macht es ja nicht unbedingt um Größenordnungen einfacher.
... wieso eingespart? kriegts Du die vom Gehalt abgezogen?
Werte übertragen ist ne ganz stumpfe Angelegenheit.
dateiRec.feld = xmlRec.feld;
dateiRec.nocheineFeld = xmlRec.nocheinFeld;
...
das könnte man auch auslagern als:
dateiRec = mapXmlRec(xmlRec);
Was man hier gegenüber der Pointer Mimik gewinnt ist, dass man pro Feld Verträglichkeit vom Compiler geprüft kriegt, vieles schon zur Compilezeit, statt zur Ausführungszeit.
D*B
PS: das mit dem "generieren" per Word und Excel ist als reine Notwehr legitim, vernünftigere Editoren als dieses RDI Gesums können da vieles von sich aus.
-
Okay, die Einsparung war wohl Blödsinn, zumal ich ja nur den Speicherplatz einspare und die Programmlogik nicht schlanker wird, weil ich die Datenstruktur als Variable trotzdem benötige.
Mein Gedanke war, dass das Programm übersichtlicher bleibt, wenn ich eben nicht alle Felder von einer Seite auf die andere schiebe. Aber du hast natürlich recht, dass das unvorhersehbare Folgen haben kann, wenn einmal versehentlich Unterschiede vorhanden sind -- wie oben geschehen.
Deinen Vorschlag mapXmlRec finde ich insofern attraktiv, als ich damit weitergehende Prüfungen einbauen kann, falls diese einmal notwendig werden.
Kurz gesagt: Du hast mich überzeugt.
Besten Dank nochmals!
Markus
P.S: Abschließend würde mich noch brennend interessieren welche "vernünftigeren Editoren als dieses RDI Gesums" du mir empfehlen würdest. Ich bin mit RDI/LPEX halbwegs zufrieden -- bis auf die sehr schlechte Funktion zum Vergleichen von zwei Quellen, wofür ich immer noch Code/400 benutze. Ein eingebauter Code-Generator wäre auch was Feines -- hab nie daran gedacht, dass es sowas geben könnte.
-
... was Editoren angeht, bin ich ein wenig verwöhnt von Java, wo selbst ein noCost Produkt wie Eclipse im Bereich Source (setter/getter try/catch etc. generieren) und vor allem im Bereich Refactoring (rename von Komponenten automatisch durchgängig, Methoden ausglieder/verschieben etc.) Dinge anbietet, von dem man bei einem teuren RDI nur träumen kann. Das sieht von weitem wie Eclipse aus, kann aber von den wirklich wichtigen Dingen nix.
Sorry, leider gibt es da wohl nix vergleichbares für RPG und Co.
Dieter Bender
-
Nun ja, der RDi kann immerhin einem IF automatisch ein ENDIF hinzufügen. ;-)
Gruß und nochmals danke!
Markus
(Das oben genannte Feature ist allerdings das erste, was ich nach einer Neuinstallation des RDi deaktiviere.)
Similar Threads
-
By msost in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 21-01-14, 11:31
-
By programmer400 in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 11-12-13, 11:14
-
By BerndF in forum IBM i Hauptforum
Antworten: 10
Letzter Beitrag: 10-04-03, 07:01
-
By VauH in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 29-10-01, 10:07
-
By Arbi in forum NEWSboard Server Software
Antworten: 3
Letzter Beitrag: 22-09-01, 10:28
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