Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutzen ?

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutzen ?

Beitrag von brandelh »

Werner_Bayern hat geschrieben:
brandelh hat geschrieben:Ich frage ja auch regelmäßig in der Newsgroup nach einfachen Beispielen wie man Variablen in die Abfragen bekommt ... scheint schwer zu sein, kommen keine ;-)
Servus Hubert,
was suchst Du?
zum Beispiel wollte ich aus einem Array (das soll ja gehen) die Zeilen mit Suchbegriff herausfinden, aber eben variablem Suchbegriff:

cSuch := "Meier"
select .... where upper(nachname) = cSuch // Pseudocode Datenbank * Ergebnis dann als Array (mit Datenobjekten) zurück
select .... where ... Array mit Datenobjekten - Feld Nachname ... = cSuch // Pseudocode Array ...

am liebsten wäre mir die Doku für den Objekt Zugriff, aber irgendwie stehe ich da wie der Ochs vorm Berg ...

Achja, da war doch noch was mit SQLite ...
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: PostgreSQL und XBPBrowse

Beitrag von Werner_Bayern »

brandelh hat geschrieben:
cSuch := "Meier"
select .... where upper(nachname) = cSuch // Pseudocode Datenbank * Ergebnis dann als Array (mit Datenobjekten) zurück
select .... where ... Array mit Datenobjekten - Feld Nachname ... = cSuch // Pseudocode Array ...

Code: Alles auswählen

cBefehl := "select * from ticket where ID = '" + cID + "' LIMIT 1"
daraus wird: Select * from ticket where ID = '2015-0000072' LIMIT 1
und dann:

Code: Alles auswählen

oStmt := DacSqlStatement(::oSession):FromChar(cBefehl)
oStmt:Build():Query(nResultType, @xVar)
PostgreSQL kennt auch upper(), also: "select * from xy where upper(nachname) = '" + upper(cSuch) + "'"
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von brandelh »

Ich habe das mal hier in ein neues Thema abgespalten ... :D

::oSession // wie hast du das erzeugt ? Ein Selectbereich ist das ja sicher nicht oder ?

oStmt:Build():Query(nResultType, @xVar)

was kommt da in xVar an ?
und war xVar vorbelegt oder NIL oder egal ?

PS: danke für deine Mühe
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von Werner_Bayern »

Servus Hubert,

::oSession ist aus meiner SQL-Klasse, entstanden durch:

Code: Alles auswählen

cConnect := "DBE=" + ::cDBE + ";SERVER=" + ::cSQL_Server + ";DB=" + ::cDB + ";UID=" + ::cSQL_BENUTZER + ";PWD=" + ::cSQL_PASSWORT
::oSession := DacSession():New( cConnect )
Ich hab hier

Code: Alles auswählen

default nResultType to USQL_RESULT_WORKAREA
also enthält in diesem Fall xVar den gewünschten Alias-Namen.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von brandelh »

Wenn ich das richtig sehe braucht die DacSession() ODBCDBE, PGDBE oder ADSDBE ...

aber nach der Beschreibung müsste oSession doch optional sein oder ?
DacSqlStatement( [<oSession>] ) -> oSqlStatement
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von Werner_Bayern »

Ja, ist optional.
Da ich es aber in einer Klasse verwende, geb ich die Connection halt immer mit, weil es durchaus mehrere sein können.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von brandelh »

Ich meinte es so, dass man dann eventuell ohne session auf eine normale geöffnete DBF zugreifen könnte ... mal probieren.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von Werner_Bayern »

Ok. Das hab ich nicht gemacht, da sehe ich für mich keinen wirklichen Sinn darin.
Du möchtest vermutlich eine Anwendung universell damit gestalten, entweder Zugriff auf DBF oder auf SQL, der Code dabei mit Universal-SQL?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von brandelh »

Ich schreibe ja nur noch Tools für mich und da breche ich mir ab und an wirklich einen ab, SQL hingegen wäre da ab und zu eine Erleichterung.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von brandelh »

SQL IN MEMORY Tables .... in der Newsgroup habe ich dazu das gefunden:

VON: Otto Trapp
Titel: In-memory Work Area
NewsGroup: public.xbase++.data-access
Datum: 19.01.2017 11:04
Hello Otto,

It is possible but not documented yet.

Try this:

Code: Alles auswählen

#include "dac.ch"
#include "sql.ch"

PROCEDURE Main

   LOCAL oStmt, cStmt, aResult := NIL

   // create in-memory-table //

   TEXT INTO cStmt TRIMMED
      CREATE TABLE art_mem( artid Char(10), artnr char(10), artbez char
(50) );
   ENDTEXT

   USQLStatement():New():FromChar( cStmt ):Build():Execute()

   // fill in-memory-table from dbf 'artikel' //

   USE artikel EXCLUSIVE
   INSERT INTO art_mem( artid, artnr, artbez ) SELECT artid, artnr, artbez 
FROM artikel

   // create in-memory-index //

   oStmt := USQLStatement():New():FromChar( "CREATE INDEX 'artid' on art_mem
( artid )" ):Build()
   oStmt:Execute()

   TEXT INTO cStmt TRIMMED
      SELECT art_mem.artid, art_mem.artnr, art_mem.artbez FROM art_mem ORDER 
BY art_mem.artbez
   ENDTEXT

   ? Time()
   DacSqlStatement():fromChar( cStmt ):Build():query( NIL, @aResult )
   ? Time()
   wait

   CLOSE DATABASES

RETURN

PROCEDURE DbeSys
   DbeLoad( "FOXDBE", .T.)
   DbeLoad( "CDXDBE" , .T.)
   DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )
RETURN
Regards,
Soeren
Boris gibt auch ein Beispiel für SQLExpress ...

ich denke mal das stört keinen ;-)
Gruß
Hubert
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von HaPe »

Hallo Hubert !
SQL IN MEMORY Tables .... in der Newsgroup habe ich dazu das gefunden:
Danke für die Info.

Das werde ich gleich mal ausprobieren.

PS: Das was mich bei der bisherigen SQL-Umsetzung für SELECT * FROM von Alaska stört ist die Notwendigkeit dass die Tabelle zuvor geöffnet werden muß. Bei VFP geht das automagisch =D>
--
Hans-Peter
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von Werner_Bayern »

Code: Alles auswählen

oStmt := DacSqlStatement():FromChar('select * from customers')
oStmt:Build():Query(USQL_RESULT_WORKAREA, 'customers')
Erzeugt eine Tabelle im Speicher. Diese muss nicht zuvor geöffnet werden.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von brandelh »

Ist customers der name einer DBF oder ?
somit wäre das etwa so als ob eine memory DBF mit append from file customers (wenn es das gäbe) geladen würde ?

Ich vermute dass das für Hilfstabellen oder Auswertungen großer Daten dann recht flott geht oder ?

wobei ist das nicht ein Cursor in der neuen Workarea - also Zugriff wie gehabt und nicht mit SQL ?
Gruß
Hubert
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von HaPe »

Hallo Werner !
Erzeugt eine Tabelle im Speicher.
Läuft das Beispiel bei dir?

Bei mir bricht das Programm in der zweiten Zeile ab mit:

Code: Alles auswählen

Xbase++ Version     : Xbase++ (R) Version 2.00.762
Betriebssystem      : Windows 10 10.00 Build 14393
------------------------------------------------------------------------------
oError:args         : VALTYPE: U VALUE: NIL
oError:canDefault   : J
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : not implemented yet
oError:filename     :
oError:genCode      :       9999
oError:operation    : USQLSTATEMENT:SETRESULTHANDLER
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :       9999
oError:subSystem    : USQL
oError:thread       :          1
oError:tries        :          0
------------------------------------------------------------------------------
Diese muss nicht zuvor geöffnet werden.
Es ging mir nicht darum dass Man(n) die Ziel-Tabelle bzw. den -Cursor öffnen muss sondern die Quell-Tabelle.
In deinem Beispiel wäre das die Tabelle Customers.
--
Hans-Peter
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von HaPe »

Hallo Hubert !
wobei ist das nicht ein Cursor in der neuen Workarea
Genau das würde ich auch sagen.
So ist es auch in VFP.
Liegen die Daten auf einem SQL-Server, baut die Datenbank-Engine mittels der Connection zum Server einen lokalen Cursor (Tabelle im Speicher) auf.
Darauf lassen sich (fast) alle Tabellen-Funktionen wie SKIP, BROWSE, DELETE, REPLACE, usw. durchführen.
--
Hans-Peter
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Wie kann ich die neuen SQL Befehle in Xbase++ 2.00 nutze

Beitrag von Werner_Bayern »

Sorry, ich hab mich zu kurz ausgedrückt. DacSqlStatement() greift in meinem Beispiel auf eine bestehende PostgreSQL-Table zu. In dem Beispiel verwende ich die aus den Alaska-Beispielen, die nach einem upsize erzeugt wurde.

Also vorher ein Connect auf die PostgreSQL-Table, dann erfolgen alle Abfragen so wie gezeigt und erzeugen eine neue virtuelle Tabelle (= DBF) im Speicher, die auf read only steht, ansonsten aber ganz normal benutzt werden kann.

Code: Alles auswählen

  cConnStr := "DBE=pgdbe;"
  cConnStr += "UID=postgres;"
  cConnStr += "PWD=xxx;"
  cConnStr += "SERVER=SRVxy;"
  cConnStr += "DB=xppsamples;"

  oSession := DacSession():New(cConnStr)
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten