[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Sep 2003
    Beiträge
    221

    SQLCOD, die zweite

    Guten Morgen,

    nachdem mir Birgitta gestern den Tipp gegeben hat, kenne ich den Fehler. Jedoch habe ich keine Ahnung was ich falsch mache. Hier nun mein Problem:

    Ich habe einen Selektionsbildschirm und dahinter eine Subfile. Die Subfile wird mit embedded SQL gefüllt. Der SQL-String wird im Programm variabel zusammengebaut. Wenn ich im Auswahlformat nichts angebe, werden alle Daten aus der Tabelle gelesen. Soll ja auch so sein :-)

    Wenn ich aber eine Filterfunktion auswähle, z. B. (F1JAHR)Jahr = '2004', bekomme ich den SQL-Fehler 312 (Variable &1 nicht definiert oder nicht verwendbar) beim "PREPARE S1 FROM :SQLSTA".
    Die Variable SQLSTA hat zu diesem Zeitpunkt den Wert:
    'SELECT FELD1, FELD2, FELD3 from TABELLE_1 WHERE FELD1=:F1JAHR'

    Kann mir jemand sagen, warum dieser Fehler kommt. Das Feld F1JAHR ist im DSPF definiert und hat auch einen gültigen Wert.

    Gruß

    Peter
    Peter Kinne
    EDV-Beratung
    www.kinne.de

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.307
    Hallo Peter,

    könnte an einer Namenskollision liegen, alle Variablennamen, die mit SQL anfangen sind "reserviert" von SQL, bennen das Teil mal um in PKSQLSTA; ansonsten ist es noch wichtig wo und wie das deklariert ist, der SQL PreCompiler ist aus dem RPG-Neolithikum und kann keine lokalen Variablen und qualified und solch neumodischen Schnick-Schnack.

    mfg

    Dieter Bender

    Zitat Zitat von peter.kinne
    Guten Morgen,

    nachdem mir Birgitta gestern den Tipp gegeben hat, kenne ich den Fehler. Jedoch habe ich keine Ahnung was ich falsch mache. Hier nun mein Problem:

    Ich habe einen Selektionsbildschirm und dahinter eine Subfile. Die Subfile wird mit embedded SQL gefüllt. Der SQL-String wird im Programm variabel zusammengebaut. Wenn ich im Auswahlformat nichts angebe, werden alle Daten aus der Tabelle gelesen. Soll ja auch so sein :-)

    Wenn ich aber eine Filterfunktion auswähle, z. B. (F1JAHR)Jahr = '2004', bekomme ich den SQL-Fehler 312 (Variable &1 nicht definiert oder nicht verwendbar) beim "PREPARE S1 FROM :SQLSTA".
    Die Variable SQLSTA hat zu diesem Zeitpunkt den Wert:
    'SELECT FELD1, FELD2, FELD3 from TABELLE_1 WHERE FELD1=:F1JAHR'

    Kann mir jemand sagen, warum dieser Fehler kommt. Das Feld F1JAHR ist im DSPF definiert und hat auch einen gültigen Wert.

    Gruß

    Peter
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #3
    Registriert seit
    Sep 2003
    Beiträge
    221
    Hallo Dieter,

    die Variable ist im Bildschirmformat definiert.

    Eine Namenskollision gibt es nicht. Denn ohne die Klausel "WHERE DB_FELD=SPF_FELD" funktioniert es ja.

    Oder muß bei einer WHERE-Abfrage der PREPARE anders aussehen ?

    Die beiden Felder haben auch die gleichen Attribute.

    Peter
    Peter Kinne
    EDV-Beratung
    www.kinne.de

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.307
    Hallo Peter,

    ich habe mich erst mal von der Fehlermeldung leiten lassen; deine WHERE Klausel beim prepare ist auch noch verkehrt. Da brauchst Du Parameter Marker zum mappen der Host Variablen:
    SELECT FELD1, FELD2, FELD3 from TABELLE_1 WHERE FELD1= ?
    prepare S1 from KSQLSTA
    open si using ::F1JAHR


    mfg

    Dieter Bender

    Zitat Zitat von peter.kinne
    Hallo Dieter,

    die Variable ist im Bildschirmformat definiert.

    Eine Namenskollision gibt es nicht. Denn ohne die Klausel "WHERE DB_FELD=SPF_FELD" funktioniert es ja.

    Oder muß bei einer WHERE-Abfrage der PREPARE anders aussehen ?

    Die beiden Felder haben auch die gleichen Attribute.

    Peter
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Sep 2003
    Beiträge
    221
    Hallo Dieter,

    wieso ist mein PREPARE verkehrt ????

    Er sieht zur Zeit so aus:
    PREPARE S1 FROM :SQLSTA
    Und das kommt Deinem sehr nahe !!!!!

    Dein Beispiel zum SELECT. Mein SELECT sieht gleich aus und beim WHERE steht FELD1=:Bildschirmfeld
    Oder kann ich das Bildschirmfeld nicht adressieren?

    OPEN: Warum nimmst Du "using :F1JAHR" ? Brauche ist das ?

    Gruß der "verzweifelte" Peter


    Zitat Zitat von BenderD
    Hallo Peter,

    ich habe mich erst mal von der Fehlermeldung leiten lassen; deine WHERE Klausel beim prepare ist auch noch verkehrt. Da brauchst Du Parameter Marker zum mappen der Host Variablen:
    SELECT FELD1, FELD2, FELD3 from TABELLE_1 WHERE FELD1=: ?
    prepare S1 from KSQLSTA
    open si using ::F1JAHR


    mfg

    Dieter Bender
    Peter Kinne
    EDV-Beratung
    www.kinne.de

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.893
    Zitat Zitat von peter.kinne
    Wenn ich aber eine Filterfunktion auswähle, z. B. (F1JAHR)Jahr = '2004', bekomme ich den SQL-Fehler 312 (Variable &1 nicht definiert oder nicht verwendbar) beim "PREPARE S1 FROM :SQLSTA".
    Die Variable SQLSTA hat zu diesem Zeitpunkt den Wert:
    'SELECT FELD1, FELD2, FELD3 from TABELLE_1 WHERE FELD1=:F1JAHR'
    Dein Problem liegt in der Verwendung der Host Variablen:

    Bei dynamischem SQL hast Du zwei Möglichkeiten:
    1. Die Host-Variablen auflösen
    Beispiel:
    PHP-Code:
    SQLSTA 'Select Feld1, Feld2, Feld3 from Tabelle_1 
               where Feld1 = ''' 
    HostVar1 ''' and FeldNum = ' HostVar2
    Bei alphanumerischen Feldern müssen die Hochkommata korrekt angegeben werden.
    Datums-Felder werden korrekt konvertiert, sofern sie als alphanumerische Darstellung mit 4-stelligem Jahr übergeben werde.

    2. Verwendung von Parameter-Markern
    Die Variablen werden dann beim PREPARE Befehl über USING angegeben.
    Beispiel:
    PHP-Code:
        SQLSTA 'Select Feld1, Feld2, Feld3 from Tabelle_1 
                     where Feld1 = ? and FeldNum = ?'
    ;
     /
    End-Free
    C
    /EXEC SQL PREPARE MySQL From SQLSTA 
    C
    +         using :HostVar1, :HostVar2
    C
    /END-EXEC 
    Wenn es nur darum geht unterschiedliche Auswahlen zu treffen, jedoch immer die gleichen Felder in der gleichen Reihenfolge angezeigt werden sollen, brauchst Du kein dynamisches SQL.

    In der WHERE CLAUSE kannst Du für jede Auswahl BETWEEN Von-/Bis-Wert angeben. Je nach Auswahl füllst Du die Von-/Bis-Werte entweder mit dem ausgewählten Wert oder mit *LoVAL und *HiVal. Der Query-Optimizer erkennt ob ein bestimmter Wert oder alle Werte ausgewählt wurden und sucht sich daraufhin den passenden Zugriffs-Weg.

    Selbst Sortierungen können durch den Einsatz von CASE-Bestimmungen variabel gestaltet werden.

    Birgitta
    Birgitta Hauser

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

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.307
    Hallo Peter,

    er oder sie, der kleine Unterschied, der macht's (schon gut, ich überweise 5 Teuro an die Chauvi Kasse).
    Der entscheidende Unterschied im Falle des Prepare ist der Unterschied im Inhalt des prepare Strings (Vertipper korrigiert in vorigem posting)und die Abweichung beim open, die Du ja schon bemerkt hast.

    mfg

    Dieter Bender

    Zitat Zitat von peter.kinne
    Hallo Dieter,

    wieso ist mein PREPARE verkehrt ????

    Er sieht zur Zeit so aus:
    PREPARE S1 FROM :SQLSTA
    Und das kommt Deinem sehr nahe !!!!!

    Dein Beispiel zum SELECT. Mein SELECT sieht gleich aus und beim WHERE steht FELD1=:Bildschirmfeld
    Oder kann ich das Bildschirmfeld nicht adressieren?

    OPEN: Warum nimmst Du "using :F1JAHR" ? Brauche ist das ?

    Gruß der "verzweifelte" Peter
    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
    Sep 2003
    Beiträge
    221
    Hallo Birgitta,

    das war es. Beispiel 2 war ein Treffer.

    Vielen, vielen dank,

    Peter
    Peter Kinne
    EDV-Beratung
    www.kinne.de

  9. #9
    Registriert seit
    Sep 2003
    Beiträge
    221
    Zitat Zitat von B.Hauser
    Dein Problem liegt in der Verwendung der Host Variablen:

    Beispiel:
    PHP-Code:
        SQLSTA 'Select Feld1, Feld2, Feld3 from Tabelle_1 
                     where Feld1 = ? and FeldNum = ?'
    ;
     /
    End-Free
    C
    /EXEC SQL PREPARE MySQL From SQLSTA 
    C
    +         using :HostVar1, :HostVar2
    C
    /END-EXEC 

    Birgitta
    Hallo Birgitta,

    da hatte ich mich glatt zu früh gefreut.

    Ich habe meinen PREPARE wie von Dir angegeben , abgeändert. Jedoch wenn ich den Befehl um

    USING :HV1, :HV2, :HV3

    erweitere, bekomme ich bei der Eingabe eine Sytaxerror, mit der Bemerkung "Schlüsselwort USING nicht erwartet....."

    Und nun ?

    Peter
    Peter Kinne
    EDV-Beratung
    www.kinne.de

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.307
    Hallo Peter,

    Du scheinst meine Antworten heute zwar nicht zu mögen...
    aber immer noch:
    open using

    siehe auch einige postings vorher.
    eine der Tricks hierbei ist auch, dass man ein prepared Cursor mehrfach öffnen kann (und dadurch Zeit spart)

    mfg

    Dieter Bender


    Zitat Zitat von peter.kinne
    Hallo Birgitta,

    da hatte ich mich glatt zu früh gefreut.

    Ich habe meinen PREPARE wie von Dir angegeben , abgeändert. Jedoch wenn ich den Befehl um

    USING :HV1, :HV2, :HV3

    erweitere, bekomme ich bei der Eingabe eine Sytaxerror, mit der Bemerkung "Schlüsselwort USING nicht erwartet....."

    Und nun ?

    Peter
    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.361
    Gehts eigentlich ohne mich ????

    "Prepare Using" ? Kenn ich nicht !!!

    Dein Problem, Peter, ist, dass Hostvariablen nicht "prepared" werden können sondern dies eine Eigenschaft des Pre-Compilers ist, schau dir mal die Auflösung im Spool an, dann verstehst du es besser.

    Im Prepare funktioniert also ":HOSTVAR" nicht, da ja HOSTVAR als Adresse nicht zur Verfügung steht.

    Wie wärs dann mit folgender Variante:

    SQLSTA = 'Select bla bla bla where Feld1 = ''' + Feld1 + ''''

    bzw bei numerischen Feldern:

    SQLSTA = 'Select bla bla bla where Feld1 = ' + %char(Feld1)

    So ist dann mit allen Bedingungen zu verfahren !

    Die 2. Alternative mit "?" (=ParameterMarkern) funktioniert nur beim OPEN !!
    Also:
    SQLSTA = 'Select bla bla bla where Feld1 = ?'
    Prepare ...

    open S1 using :Feld1, :Feld2, ...

    Achtung:
    Du benötigst dann allerdings für jede Variante ein eigenes Open-Statement, da jedem "?" ein passendes Feld zugeordnet werden muss.
    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
    Sep 2003
    Beiträge
    221
    Danke an Dieter (klar finde ich Deine Antworten
    auch h e u t e gut) und an den "frisch erholten" Urlauber, Fuerchau.
    Peter Kinne
    EDV-Beratung
    www.kinne.de

Similar Threads

  1. SQLCOD -501
    By Bernd Wiezroek in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 10-04-06, 06:26
  2. SQLCOD -802 ???
    By Stefan_Sk in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 04-10-05, 09:04
  3. Embedded SQL Newbie
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 27-10-04, 09:19
  4. embedded SQL in ILE RPG, UPDATE
    By Zupfl50 in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 06-10-04, 21:04
  5. Definition von SQLCOD
    By peter.kinne in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 20-09-04, 14:52

Berechtigungen

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