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 »

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: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Kopieren einzelner Datensätze und Append from

Beitrag von brandelh »

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 »

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: 2821
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 94 Mal
Danksagung erhalten: 13 Mal

Re: Kopieren einzelner Datensätze und Append from

Beitrag von georg »

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 S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Kopieren einzelner Datensätze und Append from

Beitrag von brandelh »

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: 9343
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 358 Mal
Kontaktdaten:

Re: Kopieren einzelner Datensätze und Append from

Beitrag von Tom »

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