Variablenabfrage im SELECT Statement [erfolgreich erledigt!]

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Variablenabfrage im SELECT Statement [erfolgreich erledigt!]

Beitrag 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
Dateianhänge
Error.jpg
Error.jpg (9.23 KiB) 5264 mal betrachtet
Zuletzt geändert von Wolfgang_B am Fr, 08. Apr 2022 14:18, insgesamt 2-mal geändert.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2121
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 72 Mal

Re: Variablenabfrage im SELECT Statement

Beitrag 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()
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablenabfrage im SELECT Statement

Beitrag von Wolfgang_B »

Hallo Werner,
ändert sich nichts. Es kommt der gleiche Fehler ...
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement

Beitrag 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
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement

Beitrag von Marcus Herz »

seh gerade, der Filter entspricht doch nicht der Where Bedingung. Schon so gewollt?
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablenabfrage im SELECT Statement

Beitrag 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 ...?
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement

Beitrag von Marcus Herz »

Dann sollte der Vorschlag von Werner funktionieren, jedenfalls darf nicht die gleiche Fehlermeldung kommen. Bitte prüf das nochmal
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablenabfrage im SELECT Statement

Beitrag 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
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenabfrage im SELECT Statement

Beitrag 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"
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement

Beitrag von Jan »

Jimmy,

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

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag von Wolfgang_B »

Hallo jimmy,
wie Jan sagt .. ich benutze kein PGDBE. Aber Danke für die Meldung!
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag 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
We love Xbase++, and you?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Variablenabfrage im SELECT Statement

Beitrag 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:
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag 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!
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag 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.
Viele Grüße
Wolfgang
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag 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?
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 852
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag von Marcus Herz »

Wie lange ist diese static Variable dann gültig?
Bis das Programm beendet wird
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag 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
Dateianhänge
STATIC Doku.png
STATIC Doku.png (99.75 KiB) 5062 mal betrachtet
Zuletzt geändert von Frank Grossheinrich am Fr, 08. Apr 2022 13:38, insgesamt 1-mal geändert.
We love Xbase++, and you?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablenabfrage im SELECT Statement [lieder erledigt!]

Beitrag 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
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Antworten