[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Mar 2002
    Beiträge
    5.399
    ... 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.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  2. #2
    Registriert seit
    May 2014
    Beiträge
    5
    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

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.399
    Zitat Zitat von Scholli2000 Beitrag anzeigen
    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.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    May 2014
    Beiträge
    5
    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.

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.399
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    May 2014
    Beiträge
    5
    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

  1. FTP erstellt Datei auf fernem System - aber ohne Datenbankfelder
    By msost in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 21-01-14, 11:31
  2. IFS per FTP auf NAS, aber nur geänderte Objekte
    By programmer400 in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 11-12-13, 11:14
  3. RUNSQLSTM falsch aber Interaktiv OK
    By BerndF in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 10-04-03, 07:01
  4. Antworten: 3
    Letzter Beitrag: 29-10-01, 10:07
  5. Wie schreibt man ein C/CPP Programm
    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
  •