[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Nov 2008
    Beiträge
    38

    VARPG und dynamisches SQL

    Hallo zusammen!

    Wir sind gerade am Ausloten der SQL-Möglichkeiten mit VARPG,
    stoßen dabei aber leider an gewisse Grenzen.
    Ein konkretes Problem stellt das "FETCH" bei Verwendung von
    Cursor-Zugriffen dar.
    Die Angabe der HOST-Variablen muss ja in etwa so erfolgen:
    "FETCH MyCsr INTO :KUNDE", wobei "KUNDE" den zurückgelieferten
    Datentypen entsprechen muss (Feld oder Datenstruktur).
    Unser Problem ist, dass erst zur Laufzeit feststeht, welche
    Daten zurückgeliefert werden sollen. D.h. wir müssten
    das "FETCH"-Statement ebenfalls dynamisch aufbauen.
    Gibt es hier seitens VARPG irgendeine Möglichkeit,
    dies zu bewerkstelligen?
    Ev. durch Einsatz anderer DB-Anbindungen o.Ä?
    Danke für Tipps
    lg
    Chris

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Nunja, RPG und dynamisches SQL gestaltet sich halt schwierig.
    Sinn und Zweck von embedded SQL ist ja eigentlich, dass das Programm genau die Daten liest, die es benötigt.

    Für dynamische Cursor ist RPG (auch ILE und VARPG) weniger gut geeignet.

    Hierfür sind SQLDA-Strukturen, SQL-Feldtypen und Pointer erforderlich und würde hier den Rahmen sprengen.

    Ich würde mir da genauere Gedanken über die Funktion des Programmes machen.
    Quasi-dynmaische Where-Klauseln sind da eher unproblematisch:

    select ...
    where key1 between : From1 and : To1 and ...

    Wenn ein Selektionskriterium nicht gefüllt ist, füllt man halt FromX mit *loval und ToX mit *hival (o.ä.).
    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
    Nov 2008
    Beiträge
    38
    Der "Select" ist klar, das Problem sind bei uns ja
    dann eher die Host-Variablen, die einmal numerisch
    und das andere mal alphanumerisch sein können.
    (...und jedes einzelne Feld abzufragen ist wohl performance-technisch uninteressant.)
    OK, dann werden wir mal in die Richtung Pointer und dergl. weiterforschen...
    Danke für den Hinweis.
    Wir evaluieren auch die Möglichkeit z.B. ein C#-Programm
    als Datengateway dazwischenzulegen, ich wollte aber das
    mit VARPG Mögliche vorher zur Sicherheit abklären.

    lg
    Chris

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    So ganz verstehe ich das nicht.
    Wenn ein Programm für eine bestimmte Aufgabe konzipiert ist, benötigt es keinen dynamischen SQL sondern verarbeitet genau die Daten, die es benötigt.

    Gerade variable Feldtypen werden von RPG nicht unterstützt (andere Sprachen bieten den allgemeinen Typ Object/Variant).

    Worin soll also die Variablilität bestehen ?

    PS:
    Selbst Pointer helfen in RPG nicht weiter, da du die Daten zwar lesen aber nicht tatsächlich verarbeiten kannst.

    Um "variabel" zu arbeiten kannst du ggf. noch per "char(feld) as feld" alles in Alpha casten. Beim Select zwar unkritisch aber wie siehts dann beim Update/Insert aus ?
    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
    Mar 2002
    Beiträge
    5.365
    der Ansatz von embedded SQL ist es gerade den Prüfaufwand, soweit es geht in die Compiletime zu verlagern. Wenn man das nicht haben wil, benutzt man letztlich SQL Call level Interface und dafür ist die Unterstützung in RPG, egal welche Variante ungefähr gleich 0 (in Worten Null).

    D*B

    Zitat Zitat von caltmann Beitrag anzeigen
    Der "Select" ist klar, das Problem sind bei uns ja
    dann eher die Host-Variablen, die einmal numerisch
    und das andere mal alphanumerisch sein können.
    (...und jedes einzelne Feld abzufragen ist wohl performance-technisch uninteressant.)
    OK, dann werden wir mal in die Richtung Pointer und dergl. weiterforschen...
    Danke für den Hinweis.
    Wir evaluieren auch die Möglichkeit z.B. ein C#-Programm
    als Datengateway dazwischenzulegen, ich wollte aber das
    mit VARPG Mögliche vorher zur Sicherheit abklären.

    lg
    Chris
    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
    Nov 2008
    Beiträge
    38
    Ok, die Variabilität, besteht darin, dass ein und dasselbe Programm aus unterschiedlichsten Tabellen die Felder
    auslesen soll. D.h. nur ein "Leserprogramm" für sowohl Kundenstamm, als auch Auftragsdetails, als auch....
    Der jeweils durch das vorbereitete dynamische Select
    gefundene Satz soll dann, wenn man so will, als
    großer String zurückgeliefert werden.
    Um die Auswertung des Strings (von 1-6 Kundennummer, von 7-16 Kurzname,...) kümmern wir uns dann selbst.
    Aber so wie ich eure Antworten verstanden habe, führt wohl kein Weg an einem externen Programm vorbei.
    Danke euch!
    lg
    Chris

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    zumindest mich hast du hier völlig falsch verstanden, das halte ich nicht einmal für die zweitbeste Idee. Warum schmeißt ihr nicht gleich alle Daten auf einen großen sequentiellen Haufen, dann spart ihr euch doch viel Aufwand?!
    Ergänzung: oder ihr setzt alle Files auf level check no und verwendet record level access mit internen Beschreibungen und einer ellen langen Dateibeschreibung, falls der Compiler Einwände hat, kriegt man das mit einem OVRDBF zur Laufzeit weg.

    D*B

    Zitat Zitat von caltmann Beitrag anzeigen
    Ok, die Variabilität, besteht darin, dass ein und dasselbe Programm aus unterschiedlichsten Tabellen die Felder
    auslesen soll. D.h. nur ein "Leserprogramm" für sowohl Kundenstamm, als auch Auftragsdetails, als auch....
    Der jeweils durch das vorbereitete dynamische Select
    gefundene Satz soll dann, wenn man so will, als
    großer String zurückgeliefert werden.
    Um die Auswertung des Strings (von 1-6 Kundennummer, von 7-16 Kurzname,...) kümmern wir uns dann selbst.
    Aber so wie ich eure Antworten verstanden habe, führt wohl kein Weg an einem externen Programm vorbei.
    Danke euch!
    lg
    Chris
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Nov 2008
    Beiträge
    38
    Hhhmm.. da hab' ich wohl was falsch interpretiert.

    [...]
    >Warum schmeißt ihr nicht gleich alle Daten auf einen großen
    >sequentiellen Haufen, dann spart ihr euch doch viel
    >Aufwand?!
    [...]

    Genau das ist der Punkt:
    WIR geben den Aufbau der Tabelle nicht vor,
    können aber zur Laufzeit den Aufbau auslesen.
    D.h., wenn wir die Daten in einer "Wurst" bekommen,
    wüssten wir ab wo welches Feld beginnt.
    Nachdem SQL aber gewisse Prüfungen zur Laufzeit
    durchführt (Thema: Datentypen),
    geht das mittels embedded SQL
    so ja nicht. Oder gibt es ein "prepared" Fetch oder dergl.?
    Meine Erfahrung beschränken sich leider bisher auf das verwenden von SQL mittels "normalen" Zugriffen,
    wo alle Details bekannt sind (Aufbau und Host-Variablen).
    Derart "generisch" ist für mich auch Neuland, für diesen
    Fall aber nötig, auch wenn es heißt eine Ebene tiefer
    zu gehen, oder andere Programmiersprachen zu nutzen,
    sowie selbst zwischen Datentypen herumzukonvertieren.
    Nachdem ich mit VARPG in Verbindung mit SQL aber so
    gut wie keine Erfahrung habe, wollte ich das Feld einmal
    abstecken,
    bevor wir später draufkommen, dass es ohnehin auch
    mit Bordmitteln gegangen wäre.

    Danke +lg
    Chris

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Da stellt sich mir nun die Frage, wie die Daten nun tatsächlich vorliegen.
    Hast du hier ggf. mal ein Beispiel ?

    Normalerweise würde ich ein Import-Programm entwickeln, dass die vorliegenden Daten interpretiert und gezielt in entsprechende DB-Tabellen kopiert, so dass die Anwendung sich damit nicht mehr rumschlagen muss und mit normalen SQL's die Zugriffe durchführt.
    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
    Nov 2008
    Beiträge
    38
    Konkretes Beispiel habe ich leider keines, im Prinzip sind
    die Daten aber ganz "normale" SQL-Tabellen.
    Die Vorgabe ist aber, mit nur EINEM Programm, ALLE Tabellen
    auslesen zu können. D.h. dieses eine Lese-Programm wird - wenn man so will - von unterschiedlichsten Bildschirmen aufgerufen und soll dann den durch den Select Cursor
    gefundenen Satz als Datenwurst zurückliefern, unabhängig
    von der Anzahl der Felder, Datentypen und Aufbau.
    Es wird dann ein String mit maximaler Länge im Programm
    vorgesehen, um die Auswertung des Datenstrings kümmert
    sich dann ein anderes Programm.
    Kann gut sein, dass sich sowas mit SQL gar nicht realisieren läßt, das bin ich eben gerade am erforschen.
    Nachdem andere Entwicklungsumgebungen aber Datawindows/-Areas/-Grids o.Ä. unterstützen, lassen sich dann hier vielleicht
    so in einer Schleife die Spalten durch Konvertieren zusammen"stringen", damit der VARPG damit gefüttert werden kann.
    Also VARPG-GUI sendet "Select X from Y... " an das
    "Connector"-DLL, dies schickt dann die gewünschten Spalten
    in einer Wurst zurück, und das VARPG-GUI, welches den Aufbau ja kennt (aber eben erst zur Laufzeit, da es für unterschiedliche Tabellen verwendet wird), analysiert den
    String und stellt die Daten am Bildschirm dar.
    Mit OVRDBF, LVLCHK(NO) und einer Dummy-Datei geht das ohne SQL bereits sehr gut.
    Voraussetzung ist hier aber, dass der
    Satzformatname zum Kompilationszeitpunkt bekannt ist.
    Nachdem dies bei einzelnen Tabellen nicht vorausgesetzt
    werden kann, der Satzformatname aber nicht dynamisch
    sonder fix sein muss, war unser Ansatz, es über den SQL-Weg
    zu versuchen. Für andere Vorschläge sind wir natürlich
    gerne offen.

    Ich Hoffe es hilft zum besseren Verständnis.
    lg
    Chris

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Da muss ich dann doch Dieter zustimmen und halte das Konzept für generell falsch (wer immer auch so eine Anforderung stellt).
    VARPG ist dafür der absolut falsche Ansatz, da sich sowas tatsächlich nur mit CLI lösen läßt.
    Embedded dynamisches SQL arbeitet immer noch mit fest definierten Cursorn.
    Wenn also ein Cursor geöffnet ist, kann der selbe Name nicht nochmal verwendet werden, man muss den Cursor dann erst schließen um mit einem anderen Select neu Daten zu lesen.

    Um das ganze abzukürzen:
    Ein solches Konzept gehört in die Tonne gedrückt, da man alle Vorteile des SQL's (Join's, CTE's, u.v.m.) überhaupt nicht nutzen kann.
    Ausserdem produziert man nicht unerheblichen Overhead mit vollkommen unnötigen Konvertierungen.

    SQL's gehören genau dahin, wo sie gebraucht werden und nicht in irgendwelchen Call-Ebenen versteckt.
    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

Similar Threads

  1. Dynamisches SQL in einem CL erstellen
    By Sony in forum IBM i Hauptforum
    Antworten: 27
    Letzter Beitrag: 20-07-09, 21:48
  2. Embedded SQL in VARPG
    By Squall in forum NEWSboard Programmierung
    Antworten: 23
    Letzter Beitrag: 18-10-06, 12:01
  3. dynamisches SQL
    By redsky in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 06-12-05, 11:23
  4. Dynamisches SQL
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 15-11-05, 11:45
  5. Embedded SQL - Datenbankoptionen in VARPG
    By woki in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 13-04-04, 12:09

Berechtigungen

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