Seite 1 von 1

Variablenabfrage im SELECT Statement [erfolgreich erledigt!]

Verfasst: Mi, 06. Apr 2022 14:44
von Wolfgang_B
Hallo,
ich bastle gerade wieder mal SQL und bin auf ein Problem gestoßen. Ohne WHERE Klausel mit einem Filter beim Öffnen der DB funktioniert es einwandfrei. Ohne Filter (SET FILTER TO kdnr == kundennummer) und der WHERE Klausel (WHERE id == msgId) funktioniert das nicht. Es kommt eine Fehlermeldung. Die Variable "msgId" die übergeben wird, wird als Tabellenfeld identifiziert, ist aber kein Feld. Wie kann ich der WHERE Klausel klarmachen, daß das eine Variable ist? Wenn ein kontanter Wert anstatt der "msgId" eingetragen wird, funktioniert es auch.

Code: Alles auswählen

FUNCTION SELECT_ID( msgId)

	LOCAL aData := [}
	
	use tabelle alias tab new
	SET FILTER TO opmsgId == msgID
	GOTOP
	
	SELECT konto AS kto, opmsgId AS id FROM tab WHERE id == msgId GROUP BY kto DESC INTO ARRAY aData
	
RETURN( aData )	

Bild

Re: Variablenabfrage im SELECT Statement

Verfasst: Mi, 06. Apr 2022 15:05
von Werner_Bayern
Servus Wolfgang,

hast die Variable schon mal geklammert?

Ansonsten wird das ja in USQLSTATEMENT umgesetzt, ohne es zu testen, würde ich mal versuchen:

Code: Alles auswählen

os := DacSqlStatement():fromChar("select * from tab where id = '" + msgId + "'")
os:build():query()

Re: Variablenabfrage im SELECT Statement

Verfasst: Mi, 06. Apr 2022 15:21
von Wolfgang_B
Hallo Werner,
ändert sich nichts. Es kommt der gleiche Fehler ...

Re: Variablenabfrage im SELECT Statement

Verfasst: Mi, 06. Apr 2022 15:34
von Marcus Herz

Code: Alles auswählen

SET FILTER TO opmsgId == msgID
nimm das mal weg, ist ja in der WHERE Bedingung enthalten.
Evtl. muss für den Filter msgID PRIVATE/PUBLIC sein, ist ja LOCAL.
Der Filter wird ja auch für die SQL Abfrage verwendet

Re: Variablenabfrage im SELECT Statement

Verfasst: Mi, 06. Apr 2022 15:36
von Marcus Herz
seh gerade, der Filter entspricht doch nicht der Where Bedingung. Schon so gewollt?

Re: Variablenabfrage im SELECT Statement

Verfasst: Mi, 06. Apr 2022 15:39
von Wolfgang_B
Hallo Marcus,
den Filter SET FILTER ... brauche ich ja nur, wenn ich keine WHERE Klausel verwende. So funktionierts ja auch. Ich wollte aber gerade ohne Filter mit WHERE das Gleiche erreichen. ABer hier ist das Problem, daß mir dann das auf die Nase fällt weil der die Variabel msgId als Tabellenfeld interpretiert und das gibts logischerweise nicht ..

Filter ist gleich Where Klausel ...?

Re: Variablenabfrage im SELECT Statement

Verfasst: Mi, 06. Apr 2022 17:00
von Marcus Herz
Dann sollte der Vorschlag von Werner funktionieren, jedenfalls darf nicht die gleiche Fehlermeldung kommen. Bitte prüf das nochmal

Re: Variablenabfrage im SELECT Statement

Verfasst: Mi, 06. Apr 2022 18:56
von Wolfgang_B
Geht nicht. Das SELECT in dieser Form erwartet einen SQL-Server.
So findet das SELECT die Tabelle nicht. Habs umfangreich mit Werner zusammen probiert, leider ohne Ergebnis. Auch die Dokumentation ist hier a) unvollständig b)fehlerhaft.

Trotzdem danke für die Hilfeversuche :D

Re: Variablenabfrage im SELECT Statement

Verfasst: Do, 07. Apr 2022 1:10
von AUGE_OHR
hi Wolfgang,
Wolfgang_B hat geschrieben: Mi, 06. Apr 2022 15:21 ändert sich nichts. Es kommt der gleiche Fehler ...
ich wundere mich das der Vorschlag von Werner nicht funktionieren soll :?:

zum "Update" eines Record verwende ich "__record" was PGDBE "intern" anlegt

Code: Alles auswählen

LOCAL cSql       := "UPDATE " + ::_cTable + " SET "
LOCAL cEditRecno := LTRIM( STR( nRecord ) )
   ... 
   IF !EMPTY( cEditRecno )
      cWhere := cAlias + "__record" + "=" + cEditRecno
   ENDIF
   cSql += " WHERE " + cWhere
p.s. ich "probiere" so was in PgAdmin bis es "passt"

Re: Variablenabfrage im SELECT Statement

Verfasst: Do, 07. Apr 2022 7:25
von Jan
Jimmy,

und was soll das jetzt helfen? Wolfgang benutzt keine PGDBE. Deine Antwort ist also vollkommen wertlos zu diesem Thema.

Jan

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Do, 07. Apr 2022 10:21
von Wolfgang_B
Hallo jimmy,
wie Jan sagt .. ich benutze kein PGDBE. Aber Danke für die Meldung!

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Do, 07. Apr 2022 17:38
von Frank Grossheinrich
Hallo Wolfgang,

und hier ist wieder ein Vorschlag:

Code: Alles auswählen

#include "Common.ch"
#include "dac.ch"

/* This is our main procedure
 */
PROCEDURE Main
   LOCAL aData

   SET DEFAULT TO "..\..\source\samples\data\misc"

   aData := SELECT_ID( "TX" )
   ? aData
   WAIT

RETURN

FUNCTION SELECT_ID( state )
   LOCAL aData := {}
   USE customer NEW
   PassParameterByFunc( state )
   SELECT lastname AS Nachname, state AS Staat FROM customer WHERE staat == PassParameterByFunc() INTO ARRAY aData
   USE
RETURN( aData )

FUNCTION PassParameterByFunc( xLocal )
   STATIC xsVar
   IF xLocal != NIL
      xsVar := xLocal
   ENDIF
RETURN( xsVar )
Das ist zwar etwas umständlich, vor allem, wenn man viele Parameter transportieren möchte. Aber für eine einfache Abfrage ist das völlig ok.
Konnte ich die Botschaft transportieren? Oder habe ich die Aufgabe nicht verstanden?

Grüße
Frank

Re: Variablenabfrage im SELECT Statement

Verfasst: Do, 07. Apr 2022 19:31
von AUGE_OHR
hi Jan,
Jan hat geschrieben: Do, 07. Apr 2022 7:25 und was soll das jetzt helfen? Wolfgang benutzt keine PGDBE.
wie kommst du darauf das ich PGDBE nutze ... da müsste ich ja Xbase++ v2.x haben [-X
Jan hat geschrieben: Do, 07. Apr 2022 7:25 Deine Antwort ist also vollkommen wertlos zu diesem Thema.
das passt zu "deiner" Antwort ... :roll:

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Do, 07. Apr 2022 20:05
von Jan
Jimmy,

was hast Du denn wieder geraucht?

Du hast Wolfgang vorgeschlagen, den __record zu nutzen. Und mal den SQL-String in PGAdmin zu testen. Ich habe darauf hingwiesen das Wolfgang keine PGDB nutzt. Was impliziert das er weder ein __record nutzen kann, noch das der PGAdmin hilft beim Testen eines Strings, der nun mal nicht auf dbf funktioniert.

Du solltest mal Dein Kraut überdenken. Das aktuelle tut Dir nicht wirklich gut.

Abgesehen davon: Warum grätschst Du denn hier in die Diskussion rein, wenn Du ein __record mangels Xbase++ 2.0 ohehin nicht nutzen kannst. Und damit auch die Restriktionen nicht aus eigener Erfahrung kennst.

Jan

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Fr, 08. Apr 2022 11:07
von Wolfgang_B
Hallo Frank,
Botschaft wurde richtig transportiert :D . Verstehen tue ich's zwar nicht, funktioniert aber einwandfrei. Insbesondere verstehe ich den Funktionsaufruf "PassParameterByFunc()" innerhalb des SELECT Statements nicht. Wieso kommt da die Variable zurück, wenn nichts übergeben wird?

Aber schon mal vielen Dank!

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Fr, 08. Apr 2022 11:45
von Wolfgang Ciriack
Hallo Namensvetter,

Code: Alles auswählen

 PassParameterByFunc( state )
 SELECT lastname AS Nachname, state AS Staat FROM customer WHERE staat == PassParameterByFunc() INTO ARRAY aData
da wird beim ersten Aufruf von PassParameterByFunc ja die Variable übergeben. Da diese innerhalb der Function eine Static Variable ist, wird beim Aufruf ohne Parameter innerhalb des selects die sozusagen gespeicherte Variable zurückgegeben. Daher klappt das mit dem Aufruf ohne Parameter.
Hoffe, dass das bei dir ein wenig Klarheit über die Arbeitsweise ergibt.

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Fr, 08. Apr 2022 12:00
von Wolfgang_B
Danke Wolfgang, wußte nicht, daß die Variable in der Funktion gespeichert bleibt. Ich war bisher der Meinung, daß Static oder Local Variablen nur innerhalb der Funktion Gültigkeit haben. Aber ok, wieder was gelernt. Wie lange ist diese static Variable dann gültig?

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Fr, 08. Apr 2022 13:03
von Marcus Herz
Wie lange ist diese static Variable dann gültig?
Bis das Programm beendet wird

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Fr, 08. Apr 2022 13:34
von Frank Grossheinrich
Wolfgang_B hat geschrieben: Fr, 08. Apr 2022 12:00 Danke Wolfgang, wußte nicht, daß die Variable in der Funktion gespeichert bleibt. Ich war bisher der Meinung, daß Static oder Local Variablen nur innerhalb der Funktion Gültigkeit haben. Aber ok, wieder was gelernt. Wie lange ist diese static Variable dann gültig?
Aus unserer Doku: https://doc.alaska-software.com/content ... tatic.html
Und das durch den Google Translator gejagt ...

Das mache ich mir zunutze. Man kann in unserer SQL Implementierung nicht auf Variablen zugreifen (auf Felder natürlich, aber nicht auf Variablen), aber kann Funktionen rufen. Somit habe ich die Variable in die Funktion gestopft / dorthin ausgelagert.

Erklärt es das?

Grüße, Frank

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Fr, 08. Apr 2022 13:35
von Tom
Hallo, Wolfgang.

Der klassische Einsatz von STATIC-Variablen sind Get-Set-Funktionen, also Funktionen, die eine Einstellung liefern, die man aber auch setzen kann. Einfaches Beispiel:

Code: Alles auswählen

FUNCTION IsDebugMode(lSet)
STATIC lDebugMode := .F.
IF pCount()=1
  lDebugMode := lSet
ENDIF
RETURN lDebugMode
Diese Funktion sagt Dir, ob der Debugmodus an ist oder nicht, wenn Du sie ohne Parameter aufrufst, und Du schaltest ihn an oder aus, indem Du sie mit einem Parameter aufrufst. Viele machen so etwas mit PUBLICs oder ähnlich, und das ist wirklich nur ein sehr simples Beispiel, aber das ist im Prinzip die Funktionsweise. So kann z.B. auch eine DLL, die noch keine PUBLICs oder Applikationsobjekte kennt, Schalter verwalten oder manipulieren. Man kann natürlich noch sehr viel mehr mit STATICs machen.

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Verfasst: Fr, 08. Apr 2022 13:42
von Wolfgang_B
achso... Wenn die Static Variable in einer Funktion declariert wurde, kann ich immer wieder egal woher im Programm über diese Funktion auf diese Variable zugreifen. Ich kann aber diese Variable (namensmäßig) in einer anderen Funktion LOCAL verwenden und diese ist dann nur gültig solange diese Funktion läuft. So langsam wird mir das klar. Habe mir da noch nie besondere Gedanken darum gemacht. Wie gesagt, wieder was gelernt. Danke! :D