[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Nov 2002
    Beiträge
    19

    und wieder mal variable Feldnamen

    Hallo zusammen,

    ich habe das folgende Problem:

    Ich habe in einer Datenbankdatei SQL-Statements abgelegt, die ich zur Laufzeit in einem RPG-Programm ausführen möchte.
    Wie ich das mit dynamischem SQL hinbekomme (Prepare, Declare Cursor, Open, Fetch) ist mir schon klar.

    Nun möchte ich das ganze aber so dynamisch haben, dass in den Statements in meiner Datei auch (Host-)Variablen enthalten sein können...

    Beispiel:
    In meiner Datei steht "SELECT SaName From SATEP01 Where SaNr = :SaNr"

    Mit Hostvariablen kann man aber im dynamischen SQL nicht arbeiten... das hab ich mittlerweile herausgefunden.

    Wie kann ich das dann am besten lösen ?

    Ich dachte zunächst mal daran, die Hostvariablen als Plartzhalter zu definieren (meinetwegen von ~ eingeschossen).
    Beispiel: "SELECT SaName From SATEP01 Where SaNr = ~SaNr~"

    Das ganze könnte ich mir dann ja zerstückeln und erhalte u.a. auch einen Feldnamen, dessen Inhalt ich benötige.
    Wie komme ich dann aber an den richtigen Feldinhalt, um mir das SQL-Statement wieder richtig zusammensetzen zu können (Feldnamen sind ja variabel) ???

    Bitte um Hilfe. So langsam krieg ich hier nämlich graue Haare.

    Grüße,
    Olli

  2. #2
    Registriert seit
    Apr 2004
    Beiträge
    105
    Das bekommst du mit execute immediate hin:

    Code:
    /free
      varFeldName = 'SaNr';
      varFeldWert = SaNr;
      varSQLStatement = 'SELECT SaName From SATEP01 Where ' + varFeldName + ' = ' + varFeldWert;
    /end-free
    
    c/exec sql                        
    c+ Execute immediate :varSQLStatement
    C/end-exec
    bei Deklaration von Cursor:
    Code:
    /free
      varFeldName = 'SaNr';
      varFeldWert = SaNr;
      varSQLStatement = 'SELECT SaName From SATEP01 Where ' + varFeldName + ' = ' + varFeldWert;
    /end-free
    
    C/exec sql                       
    C+ prepare s1 FROM :varSQLStatement
    c/end-exec                       
                                     
                                     
    C/exec sql                       
    C+ declare c01 cursor for s1     
    c/end-exec

  3. #3
    Registriert seit
    Nov 2002
    Beiträge
    19
    Zitat Zitat von woki Beitrag anzeigen
    Das bekommst du mit execute immediate hin:

    Code:
    /free
      varFeldName = 'SaNr';
      varFeldWert = SaNr;
      varSQLStatement = 'SELECT SaName From SATEP01 Where ' + varFeldName + ' = ' + varFeldWert;
    /end-free
    
    c/exec sql                        
    c+ Execute immediate :varSQLStatement
    C/end-exec
    so weit war ich am Anfang auch

    Aber bei genauem Betrachten bringt mich das nicht weiter, denn ich weiss ja nicht, welches Feld ich benötige... das ganze ist ja variabel...
    In meinem Beispiel ist die Hostvariable jetzt SaNr... kann aber auch ein ganz anderes Feld sein, was abgefragt werden soll...

    Ich formuliere meine Frage mal ganz konkret:
    Wie komme ich an den Inhalt eines Feldes, dessen Name in einer Programmvariable steht ???

  4. #4
    Registriert seit
    Apr 2004
    Beiträge
    105
    Zitat Zitat von VAHLE Beitrag anzeigen
    Ich formuliere meine Frage mal ganz konkret:
    Wie komme ich an den Inhalt eines Feldes, dessen Name in einer Programmvariable steht ???
    damit :

    Code:
    d sqlStatement    s           1024    inz('') 
    d myPgmVar        s            128
    
     /free                                          
      myPgmVar = 'MyFeld1';                           
      sqlStatement = 'select ' + %trim(myPgmVar) + ' ' +    
                     'from myLib/MyFile ';   
    
     /end-free   
                                       
    C/exec sql                           
    C+ prepare s1 FROM :sqlStatement     
    c/end-exec                           
                                                                              
    C/exec sql                           
    C+ declare c01 cursor for s1         
    c/end-exec                           
    
    etc...
    oder verstehe ich deine Frage immer noch nicht? Hast du ein konkretes Bespiel?

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.300
    SO dynmaisch geht das ja nun auch wieder nicht.
    Du musst dir da schon mal was einfallen lassen.
    Z.B.:
    VarPos = %scan(':':MySql);
    if VarPos > *zero;
    select;
    when %subst(MySQL:VarPos:6) = 'MyVar1';
    MySQL = %replace(MySQL:':MyVar1':'''' + MyVar1 + '''');
    when %subst(MySQL:VarPos:6) = 'MyVar2';
    MySQL = %replace(MySQL:':MyVar2':%char(MyVar2));
    endsl;
    endif;
    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

  6. #6
    Registriert seit
    Nov 2002
    Beiträge
    19
    Zitat Zitat von woki Beitrag anzeigen
    damit :

    Code:
    d sqlStatement    s           1024    inz('') 
    d myPgmVar        s            128
    
     /free                                          
      myPgmVar = 'MyFeld1';                           
      sqlStatement = 'select ' + %trim(myPgmVar) + ' ' +    
                     'from myLib/MyFile ';   
    
     /end-free   
                                       
    C/exec sql                           
    C+ prepare s1 FROM :sqlStatement     
    c/end-exec                           
                                         
                                         
    C/exec sql                           
    C+ declare c01 cursor for s1         
    c/end-exec                           
                                         
    c/exec sql                           
    c+ open c01                          
    c/end-exec    
    
    etc...
    Danke. Bringt mich aber auch nicht weiter...

    Denn ich möchte in der Where-Bedingung den Vergleichswert variabel haben...
    Wenn ich das im RPG "hart" codieren würde, dann mache ich das ja über den Vergleich mit einer Hostvariablen.
    Bsp.: "... Where Feld1 = :PgmFeld"

    Aber eben diese Hostvariablen kann man im dynamischen SQL ja nicht verwenden...
    Ich kenne also in dem Fall nur den Feldnamen. In meinem Beispiel "PgmFeld"... Und da hapert es momentan bei mir, wie ich an den Inhalt eines Feldes komme, dessen Name in einem Programmfeld steht...

  7. #7
    Registriert seit
    Nov 2002
    Beiträge
    19
    Zitat Zitat von Fuerchau Beitrag anzeigen
    SO dynmaisch geht das ja nun auch wieder nicht.
    Du musst dir da schon mal was einfallen lassen.
    Z.B.:
    VarPos = %scan(':':MySql);
    if VarPos > *zero;
    select;
    when %subst(MySQL:VarPos:6) = 'MyVar1';
    MySQL = %replace(MySQL:':MyVar1':'''' + MyVar1 + '''');
    when %subst(MySQL:VarPos:6) = 'MyVar2';
    MySQL = %replace(MySQL:':MyVar2':%char(MyVar2));
    endsl;
    endif;
    Dann müsste ich im RPG aber auch alle möglichen Feldnamen abfangen...
    Genau das möchte ich ja nicht. Ich möchte das so dynamisch, wie möglich gestalten.

    Gibt es keine Möglichkeit, im RPG mit variablen Feldnamen zu arbeiten ?

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.294
    nur ein paar Anmerkungen:
    - dynamic SQL kann sehr wohl mit Hostvariablen, der prepareString enthält dann ? als Platzhalter, dei beim execute übergeben werden
    - diese Variablen müssen, wie alle Namen zur Compiletime bekannt sein (wo sollen sie auch zur Laufzeit herkommen)
    - gehen tut letztlich sogut wie alles, aber ob das Design was taugt, das ist in diesem Fall für mich noch eine nicht beantwortete Frage.

    D*B
    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
    Nov 2002
    Beiträge
    19
    Die Platzhalter (?) waren mir auch bekannt, aber das löst mein Problem leider auch nicht.

    Vergesst bitte einmal diese spezielle Aufgabenstellung hier.
    Ist es überhaupt irgendwie möglich, an den Inhalt eines Feldes zu kommen, dessen Name selbst Inhalt eines Programmfeldes ist ?


    (php kann ja z.B. auch mit variablen Feldnamen umgehen (z.B. var1=@FeldName - glaube ich)

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.294
    wie ich bereits sagte, geht viel und auch dieses, ich habe allerdings keinen Bock mich auf Diskussionen einzulassen, nach dem Muster: das war mir bekannt, hilft mir aber auch nicht weiter...

    Zitat Zitat von VAHLE Beitrag anzeigen
    Die Platzhalter (?) waren mir auch bekannt, aber das löst mein Problem leider auch nicht.

    Vergesst bitte einmal diese spezielle Aufgabenstellung hier.
    Ist es überhaupt irgendwie möglich, an den Inhalt eines Feldes zu kommen, dessen Name selbst Inhalt eines Programmfeldes ist ?


    (php kann ja z.B. auch mit variablen Feldnamen umgehen (z.B. var1=@FeldName - glaube ich)
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.300
    PHP ist auch eine interpretative Sprache im Gegensatz zu RPG.
    RPG wird kompiliert, PHP eben nicht.
    Zur Laufzeit sind keine Variablennamen mehr bekannt sondern ausschließlich Adressen.
    Variablennamen dienen nur uns Programmierern zum besseren Verständnis und einfacheren programmieren.

    Du kannst natürlich auch eine Struktur (DS 10000 oder mehr) anlegen und alle Inhalte per Adresse %subst(MyDS:MyPos:MyLen) ansprechen.
    Dann brauchst du dem Anwender nur noch die Adressen mitteilen und dann bist du entsprechend variabel.
    Namen brauchst du dann nicht mehr.

    Überlege noch mal dein Design oder verwende eine andere Programmiersprache.
    Wie wärs mit REXX ?
    Da kannst du schön mit variablen Namen und der Interpret-Anweisung arbeiten.

    PS:
    Das ist natürlich nicht ganz ernst gemeint.
    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
    Nov 2002
    Beiträge
    19
    @Bender:

    Entschuldigung, aber ich bin mir keiner Schuld bewusst, dass ich mich hier irgendwie im Ton vergriffen haben könnte...

    Ich hab mir heute den ganzen Morgen lang den Kopf über dieses Problem zerbrochen und bin bereits an allen hier genannten Lösungsansätzen gescheitert.

    Warum Du Dich jetzt persönlich angegriffen fühlst, kann ich irgendwie nicht ganz nachvollziehen.

Similar Threads

  1. Variable Feldnamen
    By Liebhoff in forum IBM i Hauptforum
    Antworten: 20
    Letzter Beitrag: 11-03-08, 09:47
  2. "Environment variable not found"
    By Kampi4 in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 09-10-06, 10:19
  3. Variable Zahlenkonvertieren
    By Xanas in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 28-08-06, 12:21
  4. cl declare variable
    By TARASIK in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-08-06, 10:09
  5. String mit HexInhalt muss als Hex-Wert in Variable
    By cheffe1008 in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 16-05-06, 07:45

Berechtigungen

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