gelöschte Datensätze werden nicht gefunden {erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

gelöschte Datensätze werden nicht gefunden {erledigt]

Beitrag von Wolfgang_B »

Mahlzeit,
ich stolpere wieder mal über ein Phänomen. Wenn ich nach Beispiel 1. die gelöschten Datensätze suche, wird immer nur der erste gelöschte Datensatz gefunden. Mit Beispiel 2. werden alle gefunden. Warum, ist mir ein Rätsel ...

Code: Alles auswählen

 // 1.
   IF !net_use4("MITGLIED",.T.,1,"NEW","Mitglied")
      PostAppEvent( xbeP_Close, , , oDlg )
      RETURN( NIL )
   ENDIF
   SET DELETED OFF
   		
   DO WHILE ! EOF()																																				// Alle
      IF DELETED()
         AADD(aNames, { Mitglied->mitglnr }) 	
      ENDIF
      DBSKIP()       
   ENDDO 
   Mitglied->(DBCLOSEAREA())

   MSgBox("LEN(aNames): "+STR(LEN(aNames)) )
   // Ergebnis -> 1 gelöschter Datensatz
   
   
   
   // 2. 
   USE Mitglied NEW EXCLUSIVE
   SET DELETED OFF
		
   DO WHILE ! EOF()																																				// Alle
      IF DELETED()
         AADD(aNames, { Mitglied->mitglnr }) 	
      ENDIF
      DBSKIP()       
   ENDDO 
   Mitglied->(DBCLOSEAREA())

   MSgBox(LEN(aNames): "+STR(LEN(aNames)) )
   // Ergebnis -> 5 gelöschte Datensätze



FUNCTION NET_USE4(file, ex_use, wait, new, al)                                                                                                                                                // 02.12.2019
   PRIVATE forever
   forever = (wait = 0)

   DO WHILE (forever .OR. wait > 0)

      IF ex_use                                                                                                                                                                                                            // exclusive
         USE &file alias &al EXCLUSIVE new
      ELSE
         USE &file alias &al SHARED new                                                                                                                                                                        // Shared
      ENDIF

      IF .NOT. NETERR()                                                                                                                                                                                                   // Wenn kein Netzfehler
         RETURN (.T.)
      ENDIF

      INKEY(1)                                                                                                                                                                                                           // 1 second warten
      wait = wait - 1
   ENDDO

RETURN (.F.)                                                                                                                                                                                                           // Netzfehler
// End - NET_USE4()
Zuletzt geändert von Wolfgang_B am Sa, 20. Mär 2021 18:04, insgesamt 1-mal geändert.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von brandelh »

könnte es am Index liegen ?

was passiert wenn du die Datei mit einem einfachen Programm durchläufst ?
Gruß
Hubert
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Wolfgang_B »

Es wird kein Index verwendet ..
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 996
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von HaPe »

Hallo Wolfgang !

Mach mal ein GOTO TOP vor die Schleife und prüfe nochmal.
--
Hans-Peter
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Tom »

Ich sehe keinen Unterschied. Ist es möglich, dass Du in einem der beiden Fälle noch eine Tabelle unter dem Alias geöffnet hast? Hast Du Dir in der DO-WHILE-Schleife mal die Datensatznummern auswerfen lassen?

Randbemerkung:

Code: Alles auswählen

USE &cDAtei ALIAS &cAlias ... -> USE (cDAtei) ALIAS (cAlias) 
Der Makroexpander kostet unnötig Kraft. Das Ergebnis ist aber das gleiche.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Wolfgang_B »

@ HaPe - goto TOP bringt nichts bei Beispiel 1.
@Tom - Es wird nur die mitglied.dbf geöffnet. Alias abgefragt vor Öffnung der Tabelle -> kein Alias da. Mit recCount() die Anzahl der Datensätze angezeigt, in der DO WHILE die einzelnen RecNo() angezeigt -> alle werden durchlaufen. Ergebnis 1 statt 5!
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von brandelh »

das lesen der zusammengeschobenen Quellcodes ist echt mühsam.

Sehe ich das richtig, dass im ersten fall deine NET_USE Funktion verwendet wird und im 2. nicht ?

Sonst fällt mir kein Unterschied auf, die 2. bringt das richtige, die 1. das Falsche Ergebnis ?

wird die 2. Version auch aus der GUI EXE aufgerufen ?
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von brandelh »

Ich sehe grundsätzlich problematische Teile für GUI Anwendungen (Fenster kann man mehrfach aufrufen):

1. ALIAS Namen ... sind nicht eindeutig, besser mit SELECT() den Selectbereich abfragen und diesen in einer Var verwenden => nMitglied = select(), (nMitglied)->xxx
2. Wenn schon ALIAS oder numerischen Benenner, dann überall !

Diese Zeilen nutzen die aktuelle DBF:
- DO WHILE ! EOF() // Alle
- IF DELETED()
- DBSKIP()
diese nutzen Mitglied->mitglnr ... das kann, muss aber nicht identisch sein !
- AADD(aNames, { Mitglied->mitglnr })
- Mitglied->(DBCLOSEAREA())

3. Private durch LOCAL ersetzten, solange sie nicht für Macros zwingend nötig sind (besser Macros vermeiden)
4. &cVar => durch LOCAL ersetzen und mit (cVAR) nutzen
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Tom »

Alias abgefragt vor Öffnung der Tabelle -> kein Alias da.
Das betrifft nur den aktuellen Select-Bereich. Wenn Du in einem anderen den gleichen Alias verwendest, wird er trotz Angabe im aktuellen Selectbereich nicht benutzt. Einfach mal ausprobieren!

Hubert hat auf eine Inkonsistenz hingewiesen, die damit einhergeht und die ich auch meine. Du machst vor den Schleifen keinen expliziten DbSelectArea('Mitglied') - es wird also in der Tabelle gewurschtelt, die gerade selektiert ist, aber wenn z.B. eine Öffnung fehlschlug, muss das nicht die erwartete Tabelle sein. Mit dem Alias-Access (mitglied->mitgliedsnummer) gehst Du dann wieder explizit in die erwartete Tabelle. Setz mal ein DbSelectArea('Mitglied') vor die Schleife. Und notfalls auch ein DbGotop().
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Wolfgang_B »

Ich habe jetzt mal alles ausprobiert, hat aber nichts geändert.

Aber mir ist was anderes aufgefallen. In der DO WHILE Schleife wird ja dem Array noch mehr zugeführt. Für das Forum habe ich nur verkürzt AADD(aNames, {M1->mitglnr}) .. : So sieht das AADD() normalerweise aus.
AADD(aNames, { M1->mitglnr, ALLTRIM(M1->name)+", "+ALLTRIM(M1->vorname), ALLTRIM(M1->strasse), ALLTRIM(M1->wohnort), IF(M1->einzug<>"R","JA","NEIN") ,DTOC(M1->aufdat),DTOC(M1->ausdat), TRANSFORM(SUMME_OP(M1->mitglnr),"9999.99"), IF(!EMPTY(M1->poname),"JA","NEIN "), IF(M1->mahnkz,"JA", "NEIN" ), IF( !EMPTY(m1->email),"JA","NEIN") })
Und bei der Funktion SUMME_OP() wird über eine andere Tabelle eine Summe ermittelt und zurückgegeben. In der Version 1 tritt mit dieser Funktion der Fehler auf, in der Version 2 nicht.

In der Funktion SUMME_OP() wird aber der Bereich gespeichert -> LOCAL seldb := SELECT() und am Ende wieder mit SELECT(seldb) aktiviert.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Tom »

Wenn eine Funktion etwas mit einer Tabelle macht, die von einer anderen Funktion reingereicht wird, sollte sie am Ende immer den Record-Pointer restaurieren. Und den Bereich reselektieren, der ggf. beim Aufruf der Funktion selektiert war.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von brandelh »

Ich stimme TOM zu ... erweitert:

Wenn du die ! EOF() und dbSKIP() etc. mit dem Alias versehen würdest, dann wäre der Wechsel der aktiven Workspace nicht so gravierend.

ABER alles was abhängig von äußeren Änderungen ist, ist immer problematisch. So handelt man sich Fehler und schwer wartbaren Code ein.
Gruß
Hubert
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Wolfgang_B »

reselecten tue ich ja. SELECT(seldb). Aber RecordPointer restaurieren ?? Ich frage mich nur, warum das Ganze mit Beispiel 2 funktioniert.

Ist jetzt auch egal. Für diese Funktion tuts die 2. Lösung.

Trotzdem vielen Dank für die Tipps. Werde ich zukünftig mal einiges beachten.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Wolfgang_B »

Jetzt habe ich so viel rumgebastelt, dass die 2. Lösung auch nicht mehr funktioniert. ICh muß nochmal "Back to the roots" :(
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2121
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 72 Mal

Re: gelöschte Datensätze werden nicht gefunden

Beitrag von Werner_Bayern »

Servus,

Wolfgang hat mir den Code von SUMME_OP() geschickt, dort stand ein
set deleted on
drin. :wink:

net_use4 haben wir so geändert wg. Makros und new als Parameter für use - was ja ein reserviertes Wort ist:

Code: Alles auswählen

FUNCTION NET_USE4(file, ex_use, wait, cNeu, al) // cNeu "NEW" oder "Y" für neuer Bereich, alles andere im akt. Bereich öffnen      
   local forever
   forever = (wait = 0)

   DO WHILE (forever .OR. wait > 0)
      DbUseArea(cNeu == "NEW" .or. cNeu == "Y",, file, al, .not. ex_use)

      IF .NOT. NETERR()                                                                                                                                                                                                   // Wenn kein Netzfehler
         RETURN (.T.)
      ENDIF

      INKEY(1)                                                                                                                                                                                                           // 1 second warten
      wait--
   ENDDO

RETURN (.F.)
Sollte jetzt passen.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten