-
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
-
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](images/misc/quote_icon.png) 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
-
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
-
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](images/misc/quote_icon.png) Zitat von peter.kinne
Hallo Dieter,
die Variable ist im Bildschirmformat definiert.
Eine Namenskollision gibt es nicht. Denn ohne die Klausel "WHERE DB_FELD= ![Big Grin](images/smilies/biggrin.gif) SPF_FELD" funktioniert es ja.
Oder muß bei einer WHERE-Abfrage der PREPARE anders aussehen ?
Die beiden Felder haben auch die gleichen Attribute.
Peter
-
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](images/misc/quote_icon.png) 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
-
![Zitat](images/misc/quote_icon.png) 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
-
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](images/misc/quote_icon.png) 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
-
Hallo Birgitta,
das war es. Beispiel 2 war ein Treffer.
Vielen, vielen dank,
Peter
-
![Zitat](images/misc/quote_icon.png) 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
-
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](images/misc/quote_icon.png) 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
-
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.
-
Danke an Dieter (klar finde ich Deine Antworten
auch h e u t e gut) und an den "frisch erholten" Urlauber, Fuerchau.
Similar Threads
-
By Bernd Wiezroek in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 10-04-06, 06:26
-
By Stefan_Sk in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 04-10-05, 09:04
-
By JonnyRico in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 27-10-04, 09:19
-
By Zupfl50 in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 06-10-04, 21:04
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks