DbsetScope + Index [ERLEDIGT]

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

Moderator: Moderatoren

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Manfred hat geschrieben: Und somit wird die Schleife beendet, weil EOF() geliefert wird.
Wie löst man so ein Problem?
naja das Problem hättes du auch ohne SCOPE nur mit Index ...:(

ich kenne da nur eine Lösung : "nächste" RECNO() vorher herraus finden
bevor du dein "leeren" und DELETE machst und dann GOTO(nNext) statt
einen SKIP.

gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom,

hm, werde ich morgen mal testen, sieht recht simpel aus. Die Schleife reagiert erst, wenn das Enddo angesteuert wird!?

@Jimmy

hatte ich auch zuerst vor, war mir aber nicht sicher.....

Da dachte ich einfach: Frag mal nach, bevor du dir wieder etwas zusammenbastelst.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Korrigierte Fassung (entspricht ja letztlich Jimmys Vorschlag)

Code: Alles auswählen

lEof := db->eof()
Do while !lEof
    skip
    if !db->eof()
      nRecno := recno()
      else
       lEof := .T.
    endif
    skip -1
    satzleeren und zurückschreiben
    delete
    if !lEof()
      go nRecno
    endif
enddo
(Muß natürlich noch erweitert werden, da Du ja nicht jeden Satz löschen willst.)

Das Problem hat man auch bei Filterfunktionen. Wenn man einen Datensatz bearbeitet, so daß die Filterbedingung plötzlich nicht mehr genügt, feuert Eof() im Anschluß. Desgleichen, wie Jimmy angedeutet hat, bei Seek und einem führenden Index. Plötzlich steht man ganz woanders in der Tabelle - nicht nur bei DbDelete(). Da muß man ein bißchen aufpassen. ;-)
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom,

habe gerade Deine 1.Fassung ausprobiert. Es klappt.

Prima......
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

wenn du in dieser Schleife alle zum Suchbegriff gehörigen löschen möchtest,
kannst du dbgotop() aufrufen, bis dieser eof() liefert.

Code: Alles auswählen

Setscope blah blah

Do while .t.
    dbGotop()  // springt auf ersten passenden Datensatz
    if eof()
       exit
    endif
    satzleeren und zurückschreiben
    delete
enddo 
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Manfred,

möchtest du die gelöschten Datensatze ausblenden? dann mußt du auf jedenfall am Programmanfang ein
Set Deleted On setzen, damit die gelöscht-makierten Datensätze rausgefiltert werden.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Rolf, hallo, Manfred.

Die Idee kann man auch umdrehen. Wenn man vor dieser Loop SET DELETED OFF setzt, bleiben die gelöschten Datensätze in Sicht (vorausgesetzt, es gibt KEINEN konditionalen Index der Art FOR !Deleted()), und dann muß man überhaupt nichts machen, kann den Satzzeiger einfach weiterbewegen. Die Datensätze bleiben in Sicht, und am Ende der Schleife setzt man DELETED wieder auf ON.

Edit: Das geht auch gefahrlos bei Multithreaded-Anwendungen, weil SET DELETED thread-lokal ist.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hallo Tom,

Stopp, so geht das nicht. Der Satz wird doch vorher genullt und ist somit vom Index her schon am Anfang der Datei. Und dann wird erst gelöscht.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Stimmt ja. Das hatte ich vergessen.
Herzlich,
Tom
Antworten