Seite 1 von 1

SQL command

Verfasst: Sa, 07. Jan 2017 1:14
von Bernd Reinhardt
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

Re: SQL command

Verfasst: Sa, 07. Jan 2017 9:51
von HaPe
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.

Re: SQL command

Verfasst: Sa, 07. Jan 2017 17:35
von Werner_Bayern
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?

Re: SQL command

Verfasst: Sa, 07. Jan 2017 19:51
von georg
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.

Re: SQL command

Verfasst: Sa, 07. Jan 2017 21:47
von HaPe
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.

Re: SQL command

Verfasst: Di, 10. Jan 2017 9:11
von brandelh
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())

Re: SQL command

Verfasst: So, 15. Jan 2017 17:37
von Bernd Reinhardt
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