[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2008
    Beiträge
    70

    Externe Datenstruktur basierend auf Bildschirmformat

    Hallo *all,

    ich definiere in einem RPG-Programm in der D-Karte eine Externe Datenstruktur basierend auf einem Bildschirmformat.
    Code:
    D  W30          E DS                  EXTNAME(TPK01W:TPK01W30)   
    D                                     QUALIFIED
    Welche Möglichkeit gibt es dies Datenstruktur mit den Bildschirminhalten zu versorgen, ohne jedes Feld separat anzusprechen.

    Eventuell so in der Art:
    EVAL W30 = TPK01W30


    Ziel soll sein, den alten Bildschirminhalt mit dem neuen Inhalt zu vergleichen. Bisher haben wir hierfür Hilfsfelder definiert.
    Vielen Dank für eure Tipps und Hilfen.

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    In den F-Bestimmungen kannst du die Formate der DSPF ebenso "qualified" definieren.
    Der Code ist dann allerdings etwas aufwendiger, erleichtert aber das Leben:

    Code:
    * file1 has formats HDR, INFO, ERR.
    * file2 has format INFO.
    * The QUALIFIED keyword is used for both files, making it
    * unnecessary to rename one of the "INFO" formats.
    * Note that the record format names are not qualified when
    * specified in keywords of the File specification.
    Ffile1 if e disk qualified
    F ignore(hdr)
    F rename(err:errorRec)
    Ffile2 o e disk qualified
    * The record formats must be qualified on all specifications other
    * than the File specification for the file.
    D ds1 ds likerec(file1.info : *input)
    D errDs ds likerec(file1.errorRec : *input)
    D ds2 ds likerec(file2.info : *output)
    /free
    read file1.info ds1;
    eval-corr ds2 = ds1;
    write file2.info ds2;
    read file1.errorRec errDs;
    Figure 116. Example of the QUALIFIED keyword
    der Nachteil ist sicherlich, dass man bei allen Read/Write/Exfmt sowohl den Datei.Format-Namen als auch die DS angeben muss.
    Zusätzlich bedarf es eines "eval-corr" für die Übertragung zwischen den DS.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jan 2003
    Beiträge
    746
    Zitat Zitat von Gutmann Beitrag anzeigen
    Ziel soll sein, den alten Bildschirminhalt mit dem neuen Inhalt zu vergleichen.
    D W30 E DS EXTNAME(TPK01W:TPK01W30) INZ
    D X30 E DS EXTNAME(TPK01W:TPK01W30) PREFIX(X:1)

    X30 = W30;
    Exfmt ...
    If W30 <> X30;
    ...

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    @Robert
    So einfach geht das leider nicht, da das Ein-/Ausgabeformat einer DSPF ja abweichend ist.
    Per LIKEREC und QUALIFIED kannst du jedoch für beides eine eigene DS definieren.
    Für den Vergleich benötigst du dann halt eine 2. DS.
    Nach einem READ kannst du die beiden Input-DS vergleichen und dann sichern.
    Ebenso kannst du per EVAL-CORR schon mal die Eingabe-DS in die Ausgabe-DS übertragen.
    Die COBOL-Fraktion arbeitet schon sehr lange nach diesem Verfahren.
    Der vertretbare Aufwand, kein EXFMT mehr verwenden zu können wird durch den Vorteil klarerer Strukturen mehr als aufgewogen.
    Zumal das häufige Definieren von Hilfsfeldern großenteils entfällt. Schließlich hat man ja die Eingabefelder schon mal 2-fach (Input-DS und Output-DS) und spart sich das "merken" in Hilfsvariablen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    Vielleicht kann ich auch noch etwas zum Thema beitragen. Ab einem bestimmten Release bzw TR (ich weiß aber nicht mehr genau welches), muss man die Bildschirm-Datenstrukturen nicht mehr in input und output unterscheiden, man kann einfach das Schlüsselwort *all verwenden.

    Hier ein Beispiel mit einem DSPF, das ein normales Format (fmt1) und eine SFL (sfl1) hat:

    Code:
    // Bildschirm
    dcl-f bvn9ue1d WORKSTN handler('PROFOUNDUI(HANDLER)') alias qualified
                           sfile(sfl1:f1.s1_satznr);                              
    
    
    // Qualifizierte Datenstrukturen für Bildschirm-Handling:
    dcl-ds f1 likerec(bvn9ue1d.fmt1:*all);       // Alle Felder des normalen Formates
    dcl-ds s1 likerec(bvn9ue1d.sfl1:*all);       // Alle Felder von sfl1
    
    //Zugriff auf "normales" Format:
    exfmt bvn9ue1d.fmt1 f1;
    
    //Zugriff auf Subfile:
    chain satznr bvn9ue1d.sfl1 s1;
    PS: Wir sind auf 7.1 TR 11

    Dieter

  6. #6
    Registriert seit
    Sep 2008
    Beiträge
    70
    Hallo,

    danke für die schnelle Hilfe.

    Konnte es soweit mit einem Testprogramm nachbauen und läuft.
    Auch das mit einer einzigen Datenstruktur für Ein- und Ausgabe klappt soweit.

    Einziges Problem, wobei ich das schon rausgefunden habe, im Bildschirmfile müssen den definierten F-Tasten auch Antwortbezugszahlen zugewiesen werden (zumindest hat es sich im Debug so dargestellt).
    Wobei dann heißt es in den Abfragen eben nicht mehr:
    Code:
    if *inke = '1'
    sondern:
    Code:
    if ds1.in05 = '1'
    Nochmal vielen Dank für eure Hilfe

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Das wundert mich dann aber doch.
    Aber was solls, für die Tasten (und anderes) kann man die INFDS einer DSPF verwenden.
    Dort wird die gedrückte Taste mit einem Hexcode (für F1-F24, Pageup/down/Home/Dup/Pos1) abgelegt.
    Wenn man sich dafür dann Konstanten einfallen lässt, dann kann man das auch wieder ohne BZ's erledigen.

    Nur so als Tipp:
    Indikatoren sollten besser mit *ON oder *OFF abgefragt/gesetzt werden. Das ist sprechender.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Nur so als Tipp:
    Indikatoren sollten besser mit *ON oder *OFF abgefragt/gesetzt werden. Das ist sprechender.
    ... sprechend wäre true und false, was RPG nicht kennt - kann man aber über Definition von Konstanten nachbessern.

    D*B

    der bei unerwartetem *OFF immer meint, er müsste die Birne austauschen...
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Nun ja, keine mir bekannte Sprache beherrscht die Syntax "Bool is true", es heißt immer "Bool = true" bzw. "Bool == true".
    Wobei man hier z.B. in Microsoft C++ noch unterscheiden muss:
    true = 1
    TRUE = 1
    VARIANT_TRUE = -1 <= Dies ist bei COM-Schnittstellen wichtig.

    Einzig die VB-Abfrage "if bool then" liefert immer die korrekte Antwort, "if bool = True then" liefert nur bei "-1" die korrekte Antwort.
    Da kann ich mit den Unschönheiten von *OFF/*ON schon leben.

    Noch eine Inkonsistenz:
    "MOVEA '1111' *IN,1" setzt die IN01-IN04 auf *ON.
    "%subarr(*in:1:4) = *ON;" macht das ebenso.
    Allerdings ist "%subarr(*in:1:4) = '1111';" nicht erlaubt, da der Compiler nun die Zeichenkette als CHAR abweist.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Dec 2014
    Beiträge
    310
    Ich muss da jetzt aus Neugierde doch nachfragen:

    Was ist der eigentliche GRUND, dass die Bildschirmfelder verglichen werden sollen?
    Wenn das nur den Sinn hat um zu erkennen, dass vom User in einem Feld Daten erfasst/geändert wurden, geht das ja auch ohne jeglichen Datenstrukturen etc..

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Nun ja, so ganz geht das leider nicht.
    Die DSPF-Möglichkeiten sind da doch eher eingeschränkt.
    Das MDT-Flag (CHANGE, BLANK) teilt mir nur mit, dass in dem Feld was eingegeben wurde.
    Wenn es aber der vorherige Wert war wird die BZ trotzdem gesetzt.
    Mit Qualified habe ich da halt einfacher die Möglichkeit mir in einer 2. DS die vorherigen Eingaben zu merken. Früher musste ich Hilfsfelder oder DS definieren und jedes Feld einzeln übertragen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Registriert seit
    Dec 2014
    Beiträge
    310
    Genau wegen dem CHANGE Schlüsselwort habe ich nachgefragt.
    Dass bei Eingabe der "gleichen" Daten die BZ auch eingeschaltet wird, ist klar - das reicht in den allermeisten Fällen ja auch.

    Na passt - wollte nur erfragen, ob es da noch weitere Hintergründe gibt.

Similar Threads

  1. Bildschirmformat als Format oder Window darstellen
    By harkne in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 05-08-14, 22:47
  2. Antworten: 7
    Letzter Beitrag: 24-04-14, 11:00
  3. Sql und Datenstruktur
    By tarkusch in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 24-01-14, 17:51
  4. STRDBG und Datenstruktur
    By XMan in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 08-01-14, 19:51
  5. Externe eMails auf der AS/400 empfangen
    By Klaus Rotering in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 26-01-01, 09:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •