alternative zu delete

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

Moderator: Moderatoren

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

alternative zu delete

Beitrag 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
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: alternative zu delete

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: alternative zu delete

Beitrag 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  
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: alternative zu delete

Beitrag 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 ...
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: alternative zu delete

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: alternative zu delete

Beitrag von Martin Altmann »

Wozu überhaupt extra ein Filter?

Code: Alles auswählen

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

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: alternative zu delete

Beitrag 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 ...
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: alternative zu delete

Beitrag 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.
Grüsse Herbert
Immer in Bewegung...
Antworten