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.

SQL command

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

Moderator: Moderatoren

Antworten
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

SQL command

Beitrag von Bernd Reinhardt » Sa, 07. Jan 2017 1:14

Hallo.
Jetzt noch eine Frage zum Ablauf mit SQL
Wenn ich mit use arbeite kann ich zwischen einer DBF-Tabelle und der SQL Tabelle die Selectbereich umschalten

Code: Alles auswählen

      oSession := DacSession():new( cConnect ) 
       select ODBC_DATEI
       USE kunden ALIAS SQLKUNDEN VIA "ODBCDBE"  // like dbase    
        // Hier bin ich in der SQL Datei und kann mit skip / eof() arbeiten 
      select KUNDEN_D
       use dknd 
       // Hier in der dbf-Datei
Nun möchte ich aber nur die neuen Daten vom SQL-server holen und in der Kundendatei ergänzen.

Code: Alles auswählen

         select ODBC_DATEI
         SQL "SELECT * FROM kunden where updaterecord >" + "'" + "2017-01-07 00:25:37" + "'"  // Hier alle daten die nach dem 07.01. geändert wurden das geht auch so 
         browse()    // zeigt die daten richtig an. 
         dbgotop()
         altd()
         do while !eof()   // hier möchte ich nun alle neuen Datensätze von sql server in eine dbf - Datei schreiben. 
            select KUNDEN_D   // Schalte auf die dbf-Datei und lege den Satz neu an. 
            append blank
            dknd->dk_kndnr := kunden->nummer
           select ODBC_DATEI  // wechsele in die sql tabelle
            skip    // gehe auf den nächsten record  GEHT ABER NICHT hier ist mein Denkfehler. 
         enddo
        oSession:disconnect()

Aber wie mache ich das mit dem SQL-Statement das ich die Liste der erhaltenen Daten auslese und in den dbf-Datei schreiben.

Die Hilft von Xbase++ (2.0) bringt mich hier auch nicht weiter. Denn das ganze einfach in eine liste zu geben brauche ich nicht.

Gruß
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de

Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 241
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: SQL command

Beitrag von HaPe » Sa, 07. Jan 2017 9:51

Hallo Bernd !
Aber wie mache ich das mit dem SQL-Statement das ich die Liste der erhaltenen Daten auslese und in den dbf-Datei schreiben.
Auch in der aktuellsten Version 2.0 Build 762 kann man per SELECT */FIELD ausgewählte Daten bisher nicht direkt in eine DBF holen.
Es wirds zur Zeit nur INTO ARRAY bzw. INTO OBJECT unterstützt (Auskunft vom Support vom 23.12.2016).

Entweder mußt du noch etwas warten oder dir selbst eine Routine schreiben welche aus einem ARRAY bzw. einem OBJEKT eine DBF erstellt und mit Daten füllt.
--
Hans-Peter

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1288
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: SQL command

Beitrag von Werner_Bayern » Sa, 07. Jan 2017 17:35

Servus Bernd,

mit einem SQL-Select holst Du die geforderten Daten in eine virtuelle dbf, die im Arbeitsspeicher vorgehalten wird. Sie ist sozusagen read only. Du kannst dann aber sehr wohl die Sätze durchgehen und in eine physikalische DBF übernehmen, so wie in Deinem Beispiel.

Was funktioniert denn nicht?
es grüßt euch

Werner

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1933
Registriert: Fr, 08. Feb 2008 21:29

Re: SQL command

Beitrag von georg » Sa, 07. Jan 2017 19:51

Hallo,


welche Art von Cursor verwendest Du? Es gibt da - vage Erinnerung - mehrere Varianten, und es kann sein, dass durch das einmalige, komplette Lesen der Cursor-Typ "erschöpft" ist, d.h. keine Positionierung zulässt.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 241
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz

Re: SQL command

Beitrag von HaPe » Sa, 07. Jan 2017 21:47

SKIP funktioniert nur in einem Cursor oder einer Tabelle.
Stehen die Daten in einem ARRAY oder OBJEKT muß man eine FOR NEXT-Schleife mit Index-Zugriff verwenden.
--
Hans-Peter

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

Re: SQL command

Beitrag von brandelh » Di, 10. Jan 2017 9:11

die Verwendung von

Code: Alles auswählen

SELECT xyz
... mach was
SELECT wse
... mach was
skip
ist als Interpreter sicher nützlich und sinnvoll (weniger Schreibarbeit), aber für unsere Zwecke fehleranfällig,
denn ähnliche Namen, Tippfehler oder nachträgliche Einfügungen bergen große Gefahren.

Das ist eindeutig und damit immer vorzuziehen:

Code: Alles auswählen

xyz->(dbFunktionen())
replace xyz->Felder with wse->Felder
... mach was mit Alias oder Variable mit Selektbereich:
(nKunden)->(dbFunktion())
wse->(dbFunktion())
wse->(dbSkip())
Gruß
Hubert

Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Re: SQL command

Beitrag von Bernd Reinhardt » So, 15. Jan 2017 17:37

Hallo
Danke für die viele Unterstützung. Der Fehler lag wohl daran, das ich nicht berücksichtigt habe das SQL einen eigenen Selectbereich aufmacht.

Select MySQL // bringt praktisch nichts
SQL select * From
nSelect := select() // den muss ich mir merken
Select KUNDEN_D // jetzt kann ich den Selectbereich wechseln

select MYSQL
hier bin ich nicht mehr im erwarteten Selectbereich.
Ich musste mir den Selectbereich merken
select (nSelect)
Jetzt bin ich wieder im SQL Bereich

Ansonsten war der Tip mit readonly auch gut.
Es gibt auch noch einen entscheidenden Unterschied zwischen MariaDB und SQL-Server.

Da immer nur ein Datensatz geändert wird habe ich bei Änderungen den Datensatz mit SQL gesucht und wollte ein Update machen.
Das geht nur bei Microsoft SQL Server. Bei MariaDB erfolgt eine Fehlermeldung.
Bei MariaDB geht nur Append.
Wenn also jetzt ein Kunde in der Maske geändert wird lese ich den kompletten Datensatz (wenn vorhanden) aus dem SQL Server.
Lösche den Datensatz (damit MariaDB zufrieden ist)
Mache einen Append und lege den Datensatz neu an. Etwas Umständlich aber es hat dann funktioniert.
MariaDB läuft auf einer NAS ohne Server. Wenn ich nur 3 Clients (PC) habe wäre das eine günstige Alternative zu "ein PC oder Microsoft Server plus SQL-Server immer an"
Dann ist mir egal welcher PC an ist, die NAS ist immer an.

Nochmals Danke
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de

Antworten