Subdateibeispiel

Dies ist ein Beispiel eines Serviceprogramms, das die IBM i-Webkomponente "Tabelle" als Subdatei verwendet. Wenn die JSP-Seite mit der IBM i-Webkomponente "Tabelle" zum ersten Mal geladen wird, wird die Prozedur INIT aufgerufen, um den Bereich zu erstellen und mit Sätzen aus der Datei COURSES zu füllen (durch Aufruf der Prozedur FillSFL). Für die Verarbeitung des ausgewählten Satzes wird eine Webinteraktion definiert, die die Prozedur GetDetail aufruft. Diese Prozedur bestimmt mit Hilfe der API QdtsReadcSF, welcher Satz ausgewählt wurde. In dieser Prozedur wird ein Parameter mit dem Namen Forward und mit einem Wert definiert, der anzeigt, ob ein Satz ausgewählt wurde oder nicht. Dieser Parameter wird im Assistenten für Webinteraktion als Ablaufsteuerungsparameter definiert. Der Interaktionslaufzeitcode bestimmt mit diesem Wert, welche Seite am Ende dieser Interaktion angezeigt werden soll. Wurde kein Satz ausgewählt, wird eine Fehlerseite angezeigt. Wurde ein Satz ausgewählt, werden die Werte aus dem ausgewählten Satz auf einer Detailseite angezeigt.
      *--------------------------------------------------------------*
      * Tabelle CLASSES verwalten                                    *
      *  Dieses Serviceprogramm wird von der IBM i-Webkomponente     *
      *  "Tabelle" aufgerufen, um die Subdatei mit allen Sätzen in   *
      *  der Datei zu füllen. Wenn die Seite mit der IBM i-Webkompo- *
      *  nente "Tabelle" geladen wird, wird dieses Serviceprogramm   *
      *  aufgerufen, bevor die Seite angezeigt wird.                                               *
      * Kompilieranweisungen:                                        *
      *   - Mit CRTRPGMOD als RPG-Modul erstellen                    *
      *   - Mit Befehl CRTSRVPGM als Serviceprogramm                 *
      *     erstellen. Es muss an Serviceprogramm QDTSSFL            *
      *     gebunden werden, das die eigentlichen                    *
      *     Subdateioperationen ausführt.                            *
      *                                                              *
      *--------------------------------------------------------------*
     Hnomain
      *
      * Klassentabelle
     FCourses   IF   E           k Disk    usropn
      *
      * Programmvariablen definieren
     DFMT              S             10A
     Drc               S              4  0
     Dspc              S             10A
     DisLoggedIn       S               N   Inz(*ON)
      *
      * Subdateisatz definieren
      * Der Subfile-VCT muss folgende Spalten in dieser Reihenfolge enthalten
      * Außerdem sicherstellen, dass Typ/Länge der Subdateispalte den Feldern entsprechen
     DRecord           DS
     D SFLName                             like(name)
     D SFLRoom                             like(room)
     D SFLText                             like(text)
      *
      *  Diese Struktur wird an die Detailseite zurückgegeben
     DInfo             DS
     D ClassName                           like(name)
     D ClassRoom                           like(room)
     D ClassText                           like(text)
      *
     DGetDetail        PR                  ExtProc('GetDetail')
     D sfl                           10
     D flow                          20
     D i                                   Like(info)
      *
     DCHECKLOG         PR                  ExtProc('ATTEND')
     D forward                       20
      *
     DFillSFL          PR
      *
      /Copy WEBTOOLS/QRPGLESRC,SUBFILEPR
      *
      *------------------------------------------------------------*
      * Beenden - Aufgerufen, wenn die Subdateiseite entladen wird *
      *------------------------------------------------------------*
     PTERM             B                   export
     D TERM            PI
      *
     C                   Close     *ALL
     C                   Return
      *
     PTERM             E
      *---------------------------------------------------------------*
      * INIT - Subdatei initialisieren                                *
      *  Diese Prozedur wird von Subdatei-VCT aufgerufen, bevor die   *
      *  Seite tatsächlich angezeigt wird.                                      *
      *  Diese Prozedur initialisiert die Subdatei, löscht ihren      *
      *  Inhalt und füllt sie dann mit allen Einträgen in der         *
      *  Bestandsdatenbank.                                           *
      *---------------------------------------------------------------*
     PINIT             B                   export
     DINIT             PI
     D spcl                          10
      *
     C                   Eval      spc = spcl
     C                   Eval      rc = initSF(spcl):
     C                             %Addr(Fmt):
     C                                           %Size(Record))
     C                   Eval      rc = clearSF(spcl)
     C                   CallP     FillSFL
     C                   Return
     PINIT             E
      *
      *--------------------------------------------------------------*
      *                                                              *
      * FillSFL                                                      *
      * Diese Prozedur füllt den Subdatei-VCT, indem alle Sätze      *
      * in der Datei gelesen werden.                                         *
      * Die Prozedur appendSF wird zum Einfügen der Sätze in die     *
      * Subdatei aufgerufen.                                         *
      *                                                              *
      * Die Subdatei muss bereits durch die Prozedur INIT            *
      * initialisiert und ihr Inhalt gelöscht worden sein.           *
      *                                                              *
      *--------------------------------------------------------------*
     PFillSFL          B
      *
     C                   Open      Courses                              99
     C     *LOVAL        Setll     Courses
     C                   Read      Courses
      *
      * Alle Sätze lesen und dem Subdatei-VCT hinzufügen
     C                   DoW       NOT %EOF
     C                   Eval      SFLName = Name
     C                   Eval      SFLRoom = room
     C                   Eval      SFLText = text
     C                   Eval      rc = appendSF(spc:
     C                                        %Addr(Record):
     C                                           %Size(Record))
     C                   Read      Courses
     C                   EndDo
      *
     C                   Close     Courses
      *
     PFillSFL          E
      *---------------------------------------------------------------*
      * GetDetail                                                     *
      * Gibt Detailinformationen zu einem aus der Subdatei            *
      * ausgewählten Eintrag aus. Das Definieren der Variable 'flow'  *
      * legt fest, welche JSP bei der Rückkehr angezeigt wird.        *
      *---------------------------------------------------------------*
     PGetDetail        B                   export
     D GetDetail       pi
     D sfll                          10
     D flow                          20
     D s                                   like(info)
      *
      * Den ausgewählten Satz lesen
     C                   Eval      rc=readcSF(sfll:
     C                                        %Addr(Record):
     C                                        %Size(Record):
     C                                        1)
      * Inhalt der Rückgabestruktur löschen
     C                   Clear                   Info
     C                   Eval      s = info
      *
      * War ein ausgewählter Satz in der Subdatei, diesen abrufen
     C                   If        rc > 0
     C                   Open      Courses
     C     ClassName     Chain     Courses                            99
     C                   Eval      s = info
     C                   Close     Courses
     C                   Eval      flow = 'OK'
      *
      * Kein Satz ausgewählt
     C            Else
     C                   Eval      flow = 'NOTOK'
     C                   EndIf
      *
     PGetDetail        E
      *
      * Ende
      *---------------------------------------------------------------*
      * Prüfung angemeldet                                            *
      *---------------------------------------------------------------*
     PCHECKLOG         B                   export
     D CHECKLOG        pi
     D forward                       20
      *
     C                   If        isLoggedIn
     C                   Eval      forward = 'LOGOK'
      *
     C            Else
     C                   Eval      forward = 'NOTLOG'
     C                   EndIf
      *
     PCHECKLOG         E
      *
      * Ende

Feedback