Seite 1 von 1

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

Verfasst: Mi, 26. Okt 2016 8:50
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 ...

Re: PostgreSQL und XBPBrowse

Verfasst: Mi, 26. Okt 2016 17:42
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) + "'"

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

Verfasst: Do, 27. Okt 2016 8:38
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

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

Verfasst: Do, 27. Okt 2016 13:29
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.

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

Verfasst: Fr, 28. Okt 2016 9:56
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

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

Verfasst: Fr, 28. Okt 2016 11:34
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.

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

Verfasst: Fr, 28. Okt 2016 15:15
von brandelh
Ich meinte es so, dass man dann eventuell ohne session auf eine normale geöffnete DBF zugreifen könnte ... mal probieren.

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

Verfasst: Sa, 29. Okt 2016 12:23
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?

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

Verfasst: So, 30. Okt 2016 21:17
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.

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

Verfasst: Do, 02. Feb 2017 11:02
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 ;-)

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

Verfasst: Do, 02. Feb 2017 13:05
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>

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

Verfasst: Do, 02. Feb 2017 15:00
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.

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

Verfasst: Do, 02. Feb 2017 15:09
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 ?

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

Verfasst: Do, 02. Feb 2017 17:03
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.

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

Verfasst: Do, 02. Feb 2017 17:07
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.

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

Verfasst: Do, 02. Feb 2017 17:58
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)