Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

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: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Mi, 26. Okt 2016 8:50

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
Programmier-Gott
Programmier-Gott
Beiträge: 1280
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: PostgreSQL und XBPBrowse

Beitrag von Werner_Bayern » Mi, 26. Okt 2016 17:42

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 euch

Werner

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 27. Okt 2016 8:38

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
Programmier-Gott
Programmier-Gott
Beiträge: 1280
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitrag von Werner_Bayern » Do, 27. Okt 2016 13:29

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 euch

Werner

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Fr, 28. Okt 2016 9:56

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
Programmier-Gott
Programmier-Gott
Beiträge: 1280
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitrag von Werner_Bayern » Fr, 28. Okt 2016 11:34

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 euch

Werner

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Fr, 28. Okt 2016 15:15

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
Programmier-Gott
Programmier-Gott
Beiträge: 1280
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitrag von Werner_Bayern » Sa, 29. Okt 2016 12:23

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 euch

Werner

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » So, 30. Okt 2016 21:17

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: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 02. Feb 2017 11:02

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
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 234
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

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

Beitrag von HaPe » Do, 02. Feb 2017 13:05

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
Programmier-Gott
Programmier-Gott
Beiträge: 1280
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitrag von Werner_Bayern » Do, 02. Feb 2017 15:00

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 euch

Werner

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

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

Beitrag von brandelh » Do, 02. Feb 2017 15:09

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
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 234
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

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

Beitrag von HaPe » Do, 02. Feb 2017 17:03

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
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 234
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

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

Beitrag von HaPe » Do, 02. Feb 2017 17:07

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
Programmier-Gott
Programmier-Gott
Beiträge: 1280
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitrag von Werner_Bayern » Do, 02. Feb 2017 17:58

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 euch

Werner

Antworten