PDA

View Full Version : SQLCOD, die zweite



Seiten : [1] 2

peter.kinne
20-09-04, 07:42
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

BenderD
20-09-04, 08:00
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


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
20-09-04, 08:04
Hallo Dieter,

die Variable ist im Bildschirmformat definiert.

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

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

Die beiden Felder haben auch die gleichen Attribute.

Peter

BenderD
20-09-04, 08:17
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


Hallo Dieter,

die Variable ist im Bildschirmformat definiert.

Eine Namenskollision gibt es nicht. Denn ohne die Klausel "WHERE DB_FELD=:DSPF_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
20-09-04, 08:49
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 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

B.Hauser
20-09-04, 08:55
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:


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:


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

BenderD
20-09-04, 09:22
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


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

peter.kinne
20-09-04, 09:49
Hallo Birgitta,

das war es. Beispiel 2 war ein Treffer.

Vielen, vielen dank,

Peter

peter.kinne
20-09-04, 13:12
Dein Problem liegt in der Verwendung der Host Variablen:

Beispiel:


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

BenderD
20-09-04, 13:17
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



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