[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2010
    Beiträge
    83

    strqm: SQL-Anweisung mit Parameter

    Hallo,
    V5R4

    Tabelle mvtel1p:
    username(Char15)
    pcstation(Char7)

    username pcstation
    RGE xx1
    VCH xx2

    SELECT
    -- Spalten
    USERNAME,pcstation
    -- Tabellen
    FROM trumpfh/mvtel1p
    -- Zeilenauswahl
    WHERE USERNAME = &VAR1

    Wenn ich für &VAR1 den Wert RGE in Hochkomma übergeben, erhalte den Fehler:

    call trumpfh/testmartin parm('RGE')
    Spalte RGE nicht in angegebenen Tabellen.
    Befehl RUN für Objekt QUERY mit SQLCODE -206 fehlgeschlagen.
    Befehl RUN QUERY aufgrund eines Fehlers beendet.
    Befehl STRQMQRY fehlgeschlagen.
    Funktionsprüfung. QWM2701 nicht überwacht durch TESTMARTIN bei Anweisung
    901, Instruktion X'0017'.

    Was mache ich falsch?

    Vielen Dank.

    Gruss
    Tobias

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Zeichenketten benötigen ein Hochkomma das du mit übergeben musst, also

    DCL &HPARM *CHAR 10
    CHGVAR &HPARM ('''' *CAT &PARM *CAT '''')

    STRQMQRY ...
    SETVAR((RGE &HPARM))
    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 2010
    Beiträge
    83
    Hallo,
    die Spaltennamen heißen username und pcstation...

    Der Parameter &VAR hat den Wert: 'RGE'
    Beim Debugger bleibt dieser bei Fehler QWM2701 stehen (siehe Joblog oben) und behauptet die Spalte RGE wäre nicht in den angegebenen Tabellen - häh, wie bitte. RGE ist doch der Wert und Spalte ist username. Irgendwie bin ich total verwirrt???
    Meine Tabelle mvtel1p sieht so aus:

    USERNAME PCSTATION
    RGE xx1
    VCH xx2
    ...

    select username, pcstation
    from mvtel1p
    where username = &VAR1

    Habe ich vielleicht einen Denkfehler?

    Danke.

    Gruss
    Tobias

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Nur nochmal um sicher zugehen:

    Ist der Wert der eingehenden Variablen &VAR in Hochkommata eingebettet oder nicht?

    Wie Baldur schon sagt, bei alphanumerischen Parametern, müssen die Werte in Hochkommata eingebettet werden!
    Ohne einschließende Hochkommata geht das SQL Statement schief!

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Jan 2010
    Beiträge
    83
    Guten Morgen zusammen,

    ja, wie oben beschrieben ist der Wert in Hochkomma eingebettet. Mich verwirrt die Fehlermeldung, daß der eigentliche Wert hier 'RGE' als Spalte angegeben wird, obwohl es die Spalte USERNAME ist.

    Gruss
    Tobias

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Kann es sein, dass Du versuchst Dein QMQuery mit CALL auszuführen?

    QMQueries müssen mit dem Befehl STRQMQRY ausgeführt werden.
    Die Variablen werden in der Option SETVAR in der Form VariableName &Variable übergeben werden.

    Der Inhalt der Variablen muss bei alphanumerischen Feldern oder Datumsvariablen mit Hochkommata umgeben werden.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Dein Denkfehler ist, dass du die Variable &VAR in deinem CLP in Hochkomma setzt.
    Es muss jedoch der Inhalt der Variable an QMQRY in Hochkomma übergeben werden.

    Dein SQL sieht nach der Ersetzung eben so aus, da die Hochkommata fehlen:

    select username, pcstation
    from mvtel1p
    where username = RGB

    SETVAR unterstützt auch Berechnungen:

    SETVAR((VAR ('''' *CAT &MYCLVAR *CAT '''')))
    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
    Jan 2010
    Beiträge
    83
    ...könnte der Select auch so aussehen?

    select username, pcstation
    from mvtel1p
    where username = char('&VAR')

    Birgitta:
    In VS2010 über ADO stosse ich ein CL an:

    Dim VAR1 AsString
    VAR1 = "'" & txt_eingabe.Text & "'"
    '************************************************* ************
    'Daten holen
    '************************************************* ************
    Dim cnn As ADODB.Connection
    Dim con_str AsString
    Dim CallCmd AsNew ADODB.Command
    Dim cmd AsString
    cnn = New ADODB.Connection
    cmd = "CALL TRUMPFH.TESTMARTIN(" & VAR1 & ")"
    ...

    das CL sieht folgendermaßen aus:

    PGM PARM(&VAR1)
    DCL VAR(&VAR1) TYPE(*CHAR) LEN(15)

    STRQMQRY QMQRY(TRUMPFH/MARTIN_4) OUTPUT(*PRINT) +
    ALWQRYDFN(*YES) SETVAR((VAR1 &VAR1))
    MONMSG MSGID(CPF0000)
    ENDPGM: ENDPGM

    Die Qry MARTIN_4 hat obigen Select

    Gruss
    Tobias

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    das CL muss so aussehen:
    Code:
    PGM PARM(&VAR1)
    DCL VAR(&VAR1) TYPE(*CHAR) LEN(15)
    DCL VAR(&VAR2) Type(*CHAR) LEN(17)
    
    CHGVAR VAR(&VAR2) VALUE('''' *CAT &VAR1 *CAT '''');
    
    STRQMQRY QMQRY(TRUMPFH/MARTIN_4) OUTPUT(*PRINT) +
    ALWQRYDFN(*YES) SETVAR((VAR1 &VAR2))
    MONMSG MSGID(CPF0000)
    ENDPGM: ENDPGM
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Die Hochkomma in VB sind ja erforderlich, damit die Syntax des CALL-CMD's korrekt ist.
    Diese werden allerdings bei der Übergabe an dein CLP wieder entfernt!

    Du kannst ja auch die Hochkommata bereits in dem VB mit angeben:

    VAR1 = "'''" & txt_eingabe.Text & "'''"

    Dann brauchst du dein CLP nicht zu ändern.
    Ggf. musst du allerdings noch
    Replace(txt_eingabe.Text, "'", "''")
    einbauen, falls dein Text Hochkomma enthalten kann.

    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

  11. #11
    Registriert seit
    Jan 2010
    Beiträge
    83
    ...bin jetzt leider im Haus unterwegs - ich werde das umgehend so umsetzen wie von Euch beschrieben und melde mich wieder.

    Gruss
    Tobias

  12. #12
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    Hallo allerseits,

    QMQRYs werden bei uns viel benutzt - umso mehr finde ich die vielen Hochkomma lästig - so richtig lesen kann man das nicht und sich merken, wieviele man braucht, ist auch nicht so toll.
    Bei Dezimalwerten ist es wieder anders.
    Und die Variablen dürfen auch nur 55 Zeichen lang sein.

    Wir haben daher das Thema in ein Unterprogramm verschoben, habe ich hier mal eingefügt, vielleicht könnt Ihr das ja gebrauchen.

    Code:
    ------------- CL -------------
    DCL        VAR(&PROJ) TYPE(*CHAR) LEN(8) 
    DCL        VAR(&DAT) TYPE(*DEC) LEN(8 0) 
    DCL        VAR(&QMPROJ) TYPE(*CHAR) LEN(55) 
    DCL        VAR(&QMDAT) TYPE(*CHAR) LEN(8)   
    DCL        VAR(&IN) TYPE(*CHAR) LEN(2000)   
    DCL        VAR(&OUT) TYPE(*CHAR) LEN(2000)  
    ...
    CHGVAR     VAR(&IN) VALUE(&PROJ !< '%') 
    CALL       PGM(TRMSTR1) PARM(&IN &OUT)  
    CHGVAR     VAR(&QMPROJ) VALUE(&OUT)     
     
    CHGVAR     VAR(&QMDAT) VALUE(&DAT)
    STRQMQRY   QMQRY(&QMQRY) OUTPUT(&OUTPUT) +
      SETVAR((PROJ &QMPROJ) (DAT &QMDAT)) 
    ------------- QMQRY -------------
    select ... from ... where
      lpo33>&DAT  and  pjz06 like &PROJ 
    ------------- TRMSTR1 -------------
     *                                                                  
    D in              S              1A   DIM(2000)                     
    D out             S              1A   DIM(2000)                     
     *                                                                  
     *******************************************************************
     *                                                                  
    C     *entry        plist                                           
    C                   parm                    $in            2000     
    C                   parm                    $out           2000     
     *                                                                  
     *                                                                  
    C                   movea     $in           in                      
    C     ' '           checkr    $in           inLen             5 0   
    C                   movea     *blanks       out                     
    C                   move      ''''          out(1)                  
     *                                                                  
    C                   z-add     2             j                 5 0   
    C     $in           cabeq     *blank        leerString              
     *                                                                  
    C     1             do        inLen         i                 5 0   
     *                                                                  
    C                   move      in(i)         out(j)                  
    C     in(i)         ifeq      ''''                                  
    C                   add       1             j                       
    C                   move      in(i)         out(j)                  
    C                   endif                                           
    C                   add       1             j                       
     *                                                                  
    C                   enddo                                           
     *                                                                  
    C     leerString    tag                                             
    C                   move      ''''          out(j)                  
    C                   movea     out           $out                    
     *                                                                  
     *                                                                  
    C                   seton                                        LR 
    C                   return                                          
     *
    Gruß, Christian

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. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  3. Hilfestellung bei AS/400 SQL Anweisung
    By Luisfree in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 19-01-05, 17:42
  4. Hilfestellung bei AS/400 SQL Anweisung
    By Luisfree in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 12-10-04, 09:42
  5. Optimierung SQL Anweisung
    By Cassius in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 05-03-02, 19:28

Berechtigungen

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