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.

Kopieren einzelner Datensätze und Append from

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Kopieren einzelner Datensätze und Append from

Beitrag von xbaseklaus » Mi, 16. Mär 2016 8:31

Guten Morgen ,

folgendes Problem: Datensätze mit einer speziellen Bedingung sollen in der Datenbank teilweise verändert an die Datenbank wieder neu Angehängt werden !

Ich hätte das jetzt so gemacht:

Temp DBF angelegt mit den Datensätzen die die Bedingung erfüllen also

copy to Temp.dbf for ... ( da werden doch dann auch vorhandene FTPs mit kopiert )

danach in der Temp DBF die 2 Felder pro Datensatz geändert

und dann mit

Append from ...

wieder alle geänderten Datensätze angehängt und die Temp DBF wieder gelöscht

oder ?

Mfg Klaus

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

Re: Kopieren einzelner Datensätze und Append from

Beitrag von brandelh » Mi, 16. Mär 2016 8:32

ja so kann man das machen und die Memofelder werden (sogar komprimiert) mitkopiert
Gruß
Hubert

xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: Kopieren einzelner Datensätze und Append from

Beitrag von xbaseklaus » Mi, 16. Mär 2016 8:42

brandelh hat geschrieben:ja so kann man das machen und die Memofelder werden (sogar komprimiert) mitkopiert
Ok Danke, da bin ich dann schon mal nicht auf dem Holzweg :-)

und wenn vor dem APPEND FROM

mit SET INDEX TO XXX.CDX der Index Aktiv ist werden auch alle darin enthaltenen TAGs aktualisiert ?!

Da ich jetzt alles auf FOXCDX umgestellt habe mit mehreren TAGs im INDEX !

Mfg Klaus

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

Re: Kopieren einzelner Datensätze und Append from

Beitrag von georg » Mi, 16. Mär 2016 8:51

Hallo, Klaus -


man sollte grundsätzlich die Index-Datei direkt nach der DBF-Datei öffnen, damit alle Änderungen an den Daten auch in der Index-Datei widergespiegelt werden. Alles andere bringt mit hoher Wahrscheinlichkeit Inkosistenzen in die Index-Dateien.

Ausnahme ist aus meiner Sicht, wenn ein PACK oder DELETE ALL durchgeführt werden soll, dann öffnet man nur die Datei und erstellt danach die Index-Datei (mit den Tags) neu.
Liebe Grüsse aus der Eifel,

Georg

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

Re: Kopieren einzelner Datensätze und Append from

Beitrag von brandelh » Mi, 16. Mär 2016 8:59

Ich kann Georg nur voll zustimmen.

Eine andere Ausnahme sind Änderungen an der Datei die ohne Index laufen müssen, dann kann man alle Indexe löschen, Änderungen durchführen und danach neu aufbauen.
Gerade bei sehr großen Dateien kann es enorm schneller sein die Dateien ohne Index Ballast zu verarbeiten, wenn man diese nicht braucht.
Beispiel PACK ... oder mein Ersatz copy to for .not. deleted() in temporäre Datei, alte löschen, neue umbenennen.
Gruß
Hubert

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 6793
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Kopieren einzelner Datensätze und Append from

Beitrag von Tom » Mi, 16. Mär 2016 9:17

Temp-Tabellen sollte man allerdings nur ausnahmsweise verwenden. Leichter und schneller ist es, die fraglichen Datensätze in ein Array einzulesen - im elegantesten Fall in ein Array aus Datensatzobjekten - und dieses zu bearbeiten. Anschließend hängt man alle Arrayelemente an die bestehende Tabelle wieder an. Das funktioniert bei fast jeder Datenmenge - und es ist immer schneller und robuster als der Umweg über temporäre Tabellen.

Code: Alles auswählen

a := {}
DbSetFilter/DbSetScope // Bedingung für Tabelle setzen
DbGoTop()
n := FCount()
x := 0
DO WHILE !Eof()
  AAdd(a,Array(n))
  x ++
  FOR i := 1 TO n
    a[x,i] := FieldGet(i)
  NEXT
  DbSkip(1)
ENDDO
* jetzt sind alle fraglichen Datensätze im Array, weitermachen. Geht auch noch eleganter über DbEval() und ggf. eine Datensatzklasse (Scatter/Gather)
Herzlich,
Tom

Antworten