Seite 1 von 1

alternative zu delete

Verfasst: Sa, 28. Jun 2014 10:05
von xbaseklaus
Guten Morgen,

ist es möglich Daten aus einer DBF in einem Rutsch zu löschen über die ein FILTER gelegt ist

Code: Alles auswählen

select 3
set index to Lartikel,Lprodukt,lnr

set filter to htitel = "Koestner"
go top
do while .not. eof()
 delete
skip
enddo
pack
set filter to 
Bei der Löschung von 380000 Artikeln dauert das nämlich ewig !

Mfg Klaus

Re: alternative zu delete

Verfasst: Sa, 28. Jun 2014 10:58
von Jan
Hallo Klaus,

ich würde da einen Scope drauf setzen. Scopes sind rasant schneller als Filter. Wichtig: Da durch das löschender Inhalt des Scopes sich ändert, mußt Du bestimmte Regeln einhalten, wie Du das in Deinem Filter-Beispiel ja auch schon gemacht hast. Etwa so:

Code: Alles auswählen

cAlias->OrdSetFocus(cPassenderIndexAufHtitel)
cAlias->(DbSetScope(SCOPE_BOTH, "Koestner"))
Do While .NOT. cAlias->(EoF()))
   cAlias->(DbDelete())
   cAlias->(DbGoTop())
EndDo
Das ist ungeprüft, sollte aber funktionieren.

Jan

Re: alternative zu delete

Verfasst: Sa, 28. Jun 2014 11:19
von xbaseklaus
Danke , werde ich mal Probieren

aber wie ich jetzt grad sehe , ist es das neue einschreiben der 380000 Artikel von der datanorm dbf in die artikel dbf was so etwa ne Stunde dauert.

Code: Alles auswählen

append blank
replace artikelnr with koe->artikelnr
replace produkt with koe->produkt
replace produkt2 with koe->produkt2
replace einheit with  koe->einheit
replace vkpreis with koe->vkpreis
replace htitel with "Koestner"
replace lagernr with str(a)
select 44
skip  

Re: alternative zu delete

Verfasst: Sa, 28. Jun 2014 14:05
von brandelh
PACK ist zwar schnell, aber unsicher, COPY TO ist besser da immer ein definierter Bestand bestehen bleibt.

Wenn die Datensätze mit DELETE schon markiert sind:

COPY TO ... FOR ! deleted()

Wenn die Datensätze nach Kriterien erst gelöscht werden sollen, kann man entweder mehrere DELETE ausführen oder dies so erledigen:

COPY TO ... FOR ! ... Löschbedingungen ...

Re: alternative zu delete

Verfasst: Sa, 28. Jun 2014 15:54
von AUGE_OHR
xbaseklaus hat geschrieben:

Code: Alles auswählen

select 3
set index to Lartikel,Lprodukt,lnr

set filter to htitel <> "Koestner"
COPY TO TEEEMP
CLOSE
DELETE FILE OLD.DBF
RENAME TEEEMP.DBF TO OLD.DBF

Re: alternative zu delete

Verfasst: Sa, 28. Jun 2014 16:56
von Martin Altmann
Wozu überhaupt extra ein Filter?

Code: Alles auswählen

DELETE FOR htitel = "Koestner"
macht doch das selbe.

Viele Grüße,
Martin

Re: alternative zu delete

Verfasst: Sa, 28. Jun 2014 17:46
von georg
Hallo, Martin -


aus Geschwindigkeitsgründen. Der DELETE muss einmal durch die DBF durch, um zu löschen. Danach wird kopiert (nur die nicht gelöschten Sätze) und die alte Datei entsorgt. Das Ergebnis ist eine DBF ohne gelöschte Sätze, was den PACK erspart.

Na, was lobe ich mir da SQL ...

Re: alternative zu delete

Verfasst: Mo, 30. Jun 2014 15:25
von Herbert
Falls nach htitel ein Index bestehen würde, wäre alles schneller. Filter erst recht und scope fallen so weg.
Ein seek auf "Köstner" und solange dieser Name zutrifft ein delete und fertig ist.
georg hat geschrieben:Danach wird kopiert (nur die nicht gelöschten Sätze) und die alte Datei entsorgt. Das Ergebnis ist eine DBF ohne gelöschte Sätze, was den PACK erspart.
Dieses Vorgehen ist ohnehin nahe einem Unsinn, denn falls im Netzwerk gearbeitet wird, klappt ein Pack nicht. Ein Wegkopieren schon, aber ein Umbenennen erst recht auch nicht. Daher gehört ein Pack (wenn überhaupt) in eine separate Reorganisations-Rutine, die einzig bei alleinigem Betrieb laufen kann.
Ja bei SQL geht das auch während dem Betrieb, nur läuft die Operation so wesentlich langsamer als wenn man alleine im Programm steht. Darum ist auch bei SQL-Systemen eine Wartungsfunktion notwendig und sinnvoll, welche z.B. ein Aufräumen oder auch ein Prüfen der Indizes der Daten vornimmt.