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

Alles zum SQL-Dialekt

Moderator: Moderatoren

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

Beitragvon brandelh » Mi, 26. Okt 2016 7: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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: PostgreSQL und XBPBrowse

Beitragvon Werner_Bayern » Mi, 26. Okt 2016 16: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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1210
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitragvon brandelh » Do, 27. Okt 2016 7: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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon Werner_Bayern » Do, 27. Okt 2016 12: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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1210
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitragvon brandelh » Fr, 28. Okt 2016 8: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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon Werner_Bayern » Fr, 28. Okt 2016 10: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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1210
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

Beitragvon brandelh » Fr, 28. Okt 2016 14: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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon Werner_Bayern » Sa, 29. Okt 2016 11: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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1210
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

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

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

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

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

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

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

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

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

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

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

Beitragvon 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: 130
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

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

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

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

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


Zurück zu SQL (Sprache)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron