Toolmaker Produkt-Dokumentation
Beispielprogramm in RPG
Inhaltsübersicht
In der Bibliothek DIRACC, die auf dem System i installiert ist, befindet sich die Quelldatei QRPGLESRC. Darin ist das ILE RPG Beispielprogramm EXAMPLED01 enthalten.
Wird ein RPG-III oder Cobol Beispiel benötigt, kontaktieren Sie bitte die Toolmaker Hotline.
Als Gegenstück gibt es eine Access Datenbank im Verzeichnis C:\Programme\Toolmaker\directaccess4i, mit der das RPG Beispiel getestet werden kann.
Die Access Datenbank heißt directaccess4i TestD.mdb und läuft unter Access 2000 oder höher.
Als erstes werden im RPG Beispiel die Parameter für directaccess4i vorbelegt:
0031 – Beispielprogramm EXAMPLED01 - Übergabeparameter
Dann haben wir einige Felder intern vorbelegt, mit der wir die Access Datenbank füllen, ändern, löschen und abfragen.
In Ihren Programmen werden diese Felder natürlich aus Ihren Datenbankdateien oder von Bildschirmmasken kommen.
0032 – Beispielprogramm EXAMPLED01 - Felder
INSERT
Danach wird der SQL Befehl mittels EVAL Befehl zusammengebaut.
Um diesen Befehl dynamisch zusammenzubauen
insert into kunden values(004711, 'Testkundenname', 'Straße des Kunden', 'Musterhausen', 123456.00)§$
werden folgende Anweisungen ausgeführt:
Als erstes den INSERT INTO und den Tabellennamen (Dateinamen)
c eval ctsqlcmd = 'insert into '
c + %trim(##tabelle)
c + ' values('
dann wird das erste Feld (die Kundennummer) hinzugefügt.
Da die Kundennummer in der Access Datenbank ein numerisches Feld ist, werden keine Anführungszeichen bei dem Wert benötigt.
Nichtsdestotrotz müssen wir den numerischen Inhalt in ein Alpha Feld speichern, damit wir die Zeichenfolge mittels EVAL Befehl verknüpfen können:
c eval ctsqlcmd = %trim(ctsqlcmd) +
c %trim(##kdnra)
Danach wird der Zeichenfolge ein Komma hinzugefügt
c eval ctsqlcmd = %trim(ctsqlcmd)
c + ','
Das Feld Kundenname ist ein Alphafeld in der Access Datenbank. Deshalb muss der Wert in Anführungszeichen gestellt werden. Davor kommt noch eine Leerstelle.
Das Problem ist, dass RPG mehrere Anführungszeichen benötigt, damit im Inhalt ein Anführungszeichen verwendet wird.
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ''' +
c %trim(##kdname) + ''''
Und wieder ein Komma
c eval ctsqlcmd = %trim(ctsqlcmd)
c + ','
Die Strasse und der Ort werden genauso angefügt
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ''' +
c %trim(##kdstr) + ''''
c eval ctsqlcmd = %trim(ctsqlcmd)
c + ','
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ''' +
c %trim(##kdort) + ''''
c eval ctsqlcmd = %trim(ctsqlcmd)
c + ','
Zu guter Letzt kommt noch der Umsatz. Dieser ist aufgrund der Nachkommastellen vorher mit dem Editcode C umzusetzen:
c evalr ##kdumsatza = %editc(##kdumsatz : 'P')
Anschließend wird noch die runde Klammer geschlossen und die Endezeichen §$ gesetzt.
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ' +
c %trim(##kdumsatza) + ')§$'
Nachdem der SQL Befehl dynamisch zusammengebaut wurde, wird directaccess4i aufgerufen. Wir haben den CALL in die Subroutine CALLCT gestellt.
Nach dem INSERT des Kunden 4711 fügen wir noch den Kunden 4712 auf die gleiche Art und Weise der Access Datenbank hinzu.
Wenn sie bei einem Alphafeld eine Leerstelle in den SQL Befehl INSERT einfügen müssen, können Sie das wie folgt tun:
c eval ctsqlcmd = %trim(ctsqlcmd) +
c ' '' '''
UPDATE
Nun möchten wir beim Kunden 4711 die Strasse ändern:
c eval ##kdstr = 'Straße des Kunden Nr. 19'
Der benötigte SQL Befehl sieht so aus:
update kunden set Strasse = 'Straße des Kunden Nr. 19' where Kundennummer = 004711§$
Als erstes wieder den eigentlichen Befehl UPDATE mit dem Dateinamen und der Instruktion set angeben:
c eval ctsqlcmd = 'update '
c + %trim(##tabelle)
c + ' set'
Nun legen wir die Feldnamen fest, die geändert werden sollen
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ' +
c 'Strasse ='
Und ergänzen den neuen Wert
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ''' +
c %trim(##kdstr) + ''''
Damit der richtige Datensatz geändert wird, kommt die WHERE Bedingung hinzu
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ' +
c 'where Kundennummer ='
und nun noch den Inhalt der Kundennummer
c eval ##kdnr = 4711
c move ##kdnr ##kdnra
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ' +
c %trim(##kdnra)
Wie beim INSERT muss auch hier das numerische Feld in ein Alphafeld gestellt werden, damit es mittels EVAL verkettet werden kann.
Dann noch DIRACC4I per CALL aufrufen (wieder über die Subroutine CALLCT) und schon wird der Datensatz aktualisiert.
DELETE
Als nächstes werden wir den oben hinzugefügten Kunden 4712 wieder löschen.
Hier der SQL Befehl:
delete from kunden where Kundennummer = 004712§$
Dazu wird der Befehl DELETE geschrieben und die Datei hinzugefügt
c eval ctsqlcmd = 'delete from '
c + %trim(##tabelle)
Dann geben wir an, welchen Datensatz wir löschen wollen – in dem Fall über die Kundennummer:
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ' +
c 'where Kundennummer ='
Und der Wert – die eigentliche Kundennummer
c eval ##kdnr = 4712
c move ##kdnr ##kdnra
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ' +
c %trim(##kdnra)
SELECT
Last but not least wollen wir alle Datensätze aus der Access Datenbank lesen, deren Umsatz größer 0 ist.
SQL Befehl:
select * from kunden where Umsatz > 0§$
Bauen wir ihn auf:
c eval ctsqlcmd = 'select * from '
c + %trim(##tabelle)
c eval ctsqlcmd = %trim(ctsqlcmd) + ' ' +
c 'where Umsatz > 0'
Wenn Sie mittels directaccess4i einen Select ausführen, werden die Daten direkt in die Data Queue CTRECV geschrieben.
Diese Data Queue können Sie entweder direkt auslesen oder directaccess4i mit dem Parameter CTDTAQ2PF veranlassen den Inhalt in eine physische Datei (CTRCV) zu schreiben, die Sie dann verarbeiten können.
Mittels unseres optionalen Tools directaccess4i SQL Generator, bekommen Sie die Daten auch wahlweise in eine extern beschriebene Datenstruktur bzw. in eine extern beschrieben Datei, so dass die Daten in einzelnen Feldern stehen.
Im Beispielprogramm finden Sie noch die Schleife, mit der Sie die DTAQ direkt verarbeiten können, was wesentlich schneller ist, als der Weg über eine physische Datei.
Wir erstellen eine DO UNTIL Schleife, bis END in der DTAQ steht (directaccess4i schreibt END, wenn der letzte Satz aus der externen Datenbank gelesen wurde). Dies entspricht dem EOF beim Lesen einer Datei:
c dou ##endekz='END'
Nun rufen wir das Receive Data Queue API auf und übergeben den Namen der DTAQ, die Bibliothek, die Länge der DTAQ und den Namen der Variabeln an, in die der Inhalt der DTAQ gespeichert werden soll.
Zu guter Letzt noch den Wert für den Timeout. Wenn dieser auf -1 steht, wartet das Programm so lange, bis ein Eintrag in der DTAQ auftaucht.
C CALL 'QRCVDTAQ' 77
C parm 'CTRECV ' QNAM10
C parm '*LIBL' QLIB 10
C PARM 32216 QLEN 5 0
C PARM ##rcvdtaq
C PARM -1 QWAIT5 0
Nach dem wir aus der DTAQ gelesen haben, schreiben wir den Inhalt linksbündig in das Feld ##ENDEKZ, welches für die Schleifensteuerung benutzt wird.
Zusätzlich schreiben wir den Inhalt linksbündig in ##SHOWDATA, um die ersten 58 Zeichen mittles DSPLY Befehl am Bildschirm anzuzeigen.
c movel ##rcvdtaq ##endekz
c movel ##rcvdtaq ##showdata
In Ihren Programmen werden Sie natürlich an dieser Stelle die Daten anders verarbeiten…
c ##showdata dsply
c movel *blanks ##rcvdtaq
c movel *blanks ##showdata
c enddo
Das Ergebnis in der Datei CTRCV sieht dann wie folgt aus:
Physische Teildatei anzeigen
Datei . . . . . : CTRCV Bibliothek . . . : SOCKET
Teildatei . . . : CTRCV Satz . . . . . . : 1
Steuerung . . . : Spalte . . . . . : 1
Suchen . . . . . :
*.......1........2........3........4........5........6........7........8..
0050| 123| Phalanx-Solutions| Hauptstraße| Sulzheim| 1234,56|
0050| 345| edv... beratung litters| Sebastian-Münster-Strasse| Worms| 7890,12|
0050| 567| Muster GmbH| Musterstrasse| Demohausen| 345,67|
END
****** DATENENDE ******
Derzeit verwenden wir die PIPE, also den senkrechten Strich als Trennzeichen. Sie können im directaccess4i Gateway Programm das Trennzeichen aber jederzeit ändern.
In der QRPGLESRC finden Sie unter EXAMPLE02 ein kleines Beispiel, wie Sie diese Komma separierte Datei in Ihren RPG Programmen direkt verarbeiten können.