Seltsames Verhalten bei DBSETORDER()

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

Seltsames Verhalten bei DBSETORDER()

Beitrag von Wolfgang_B »

Grüßt Euch,

Ich stosse gerade auf ein seltsames Problem. Wenn ich als Suchkriterium (cSuchKz) "A verwende, bekomme ich als Ergebnis (LEN(aNames)) 1812 Datensätze bei insgesamt 2318 Datensätzen. Wenn ich "B" verwende, bekomme ich die richtige Anzahl vom 2318 Datensätzen. Wenn ich bei "A" nach Öffnen der Tabelle statt "M1->(DBSETORDER(2))" den Index manuell setze -> "SET INDEX TO vmnrnum" bekomme ich auch die richtige Anzahl.

Die Indexe einer Tabelle öffne ich normalerweise alle in einer Funktion "FUNCTION NET_USE4(file, ex_use, wait, new, al)".
Hat da jemand eine Ahnung an was das liegen könnte?

Code: Alles auswählen

IF !net_use4("MITGLIED",.F.,1,"Y","M1")
	MsgBox("SUCH_DIALOG() -> MITGLIEDERTABELLE GESPERRT")
	PostAppEvent( xbeP_Close, , , oDlg )
	RETURN( NIL )
ENDIF
SET DELETED ON
		
DO CASE
	CASE cSuchkz == "A"	 
 			M1->(DBSETORDER(1))		//     INDEX ON UPPER(name+vorname)  TO vmnavoor	// Index Name
  	CASE cSuchkz == "B"	
 			M1->(DBSETORDER(2))		//     INDEX ON val(mitglnr)         TO vmnrnum	  // Index VAL(Mitglnr)   
ENDCASE

DO WHILE ! EOF()	
  	AADD(aNames,"X")
  	DBSKIP()       
 	ENDDO 
M1->(DBCLOSEAREA())

MSgBox("LEN(aNames): "+ALLTRIm(STR(LEN(aNames))) )



FUNCTION NET_USE4(file, ex_use, wait, new, al) 
PRIVATE forever
// Mit parameter ob new oder nicht, Alle Indexe werden default geöffnet
forever = (wait = 0)

DO WHILE (forever .OR. wait > 0)

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

   IF .NOT. NETERR()    
		// Indexe öffnen
		DO CASE
			CASE file = "mitglied" .OR. file = "MITGLIED"
				SET INDEX TO vmnavoor, vmnrnum, vmnrnavo, vmornavo, mitglnr, vmmitstr
			OTHERWISE
				*MSgBox("Kein Index für Tabelle "+file+" geöffnet")
		ENDCASE
      RETURN (.T.)
   ENDIF

   INKEY(1)
   wait = wait - 1
ENDDO

DBCLOSEALL()

RETURN (.F.)
// End - NET_USE4()
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Seltsames Verhalten bei DBSETORDER()

Beitrag von Wolfgang Ciriack »

Setze doch mal vor den Beginn deiner Schleife ein DbGoTop().
Viele Grüße
Wolfgang
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: Seltsames Verhalten bei DBSETORDER()

Beitrag von Wolfgang_B »

das wars!! =D> Aber warum ist mir ein Rätsel ...

Vielen Dank!!
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Seltsames Verhalten bei DBSETORDER()

Beitrag von Wolfgang Ciriack »

Mit DbSetOrder ändert sich die Sortierung, der Satzzeiger aber bleibt. Ohne DbGoTop fängt deine Schleife an der Stelle an, wo der Satzzeiger steht und beachtet dann nur die Sätze, die danach kommen. In deinem Fall also nur noch die restlichen 1812 Datensätze.
Viele Grüße
Wolfgang
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: Seltsames Verhalten bei DBSETORDER()

Beitrag von Wolfgang_B »

wäre normalerweise logisch. Nur warum der Satzzeiger irgendwo in der Tabelle steht, obwohl die Tabelle ja gerade geöffnet wurde, und ein unterschiedliches Verhalten ja nach Index zeigt ist mir immer noch nicht klar. Die Tabelle wird ja jedes mal neu geöffnet???
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Seltsames Verhalten bei DBSETORDER()

Beitrag von Manfred »

öffne doch einfach mal die Tabelle im Debugmodus, schaue wo der zeiger steht. Dann setze den Focus auf den Index und schaue wo der Zeiger dann steht und welchen Wert der Schlüssel hat. Vielleicht kommst Du ja damit zur Erkenntnis
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: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Seltsames Verhalten bei DBSETORDER()

Beitrag von Tom »

Wenn Du eine Tabelle mit einem führenden Index öffnest, führt das implizite DbGotop() immer dazu, dass der Datensatzzeiger auf dem ersten logischen Datensatz steht:

Code: Alles auswählen

USE KUNDEN INDEX KUNDEN1,KUNDEN2 NEW // KUNDEN1 ist auf "Kundennr.", KUNDEN2 auf "Name", nach Kundennr. ist Datensatz 50 von 100 der oberste
? Recno() // 50
SET ORDER TO 2 // Sortierung auf Name, da wäre 10 der oberste, aber SET ORDER verändert den Datensatzzeiger nicht
? Recno() // 50
DbGotop()
? Recno() // 10
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: Seltsames Verhalten bei DBSETORDER()

Beitrag von Wolfgang_B »

wenn ich das richtig verstanden habe, richtet sich der Satzzeiger bei den Folgeindices immer nach dem Führenden.!?

Dann habe ich aber bisher viel Glück gehabt, daß das nicht an anderen Stellen zu Problemen geführt hat ...

Wieder was gelernt, und das auf meine letzten Programmiertage mit xBase++ :D

Danke an Alle!!
Beste Grüße
Wolfgang

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

Re: Seltsames Verhalten bei DBSETORDER()

Beitrag von brandelh »

Bei der 1.82 gab es da einen üblen BUG, der - wenn ich mich richtig erinnere - nach einer Speicherung der Hauptdatei, die abhängigen Dateien zu einer Positionsänderung veranlasste.
Da hatte ich große Probleme, weil die ersten Datensätze der Kind Dateien statt der gewünschten Folgesätze überschrieben wurden.
Als meine Tante davon berichtet hat, dass irgendetwas mit den Autos zum Kunden schief läuft, wollte ich erst nicht glauben, dass es kein Anwendungsfehler war :oops:
Gruß
Hubert
Antworten