SQL command

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

Moderator: Moderatoren

SQL command

Beitragvon 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
Bernd Reinhardt
UDF-Programmierer
UDF-Programmierer
 
Beiträge: 96
Registriert: So, 16. Apr 2006 10:12
Wohnort: Öhringen

Re: SQL command

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

Re: SQL command

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

Re: SQL command

Beitragvon 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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1769
Registriert: Fr, 08. Feb 2008 21:29

Re: SQL command

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

Re: SQL command

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

Re: SQL command

Beitragvon 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
Bernd Reinhardt
UDF-Programmierer
UDF-Programmierer
 
Beiträge: 96
Registriert: So, 16. Apr 2006 10:12
Wohnort: Öhringen


Zurück zu Daten und Tabellen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste