DBSEEk findet leeren Suchbegriff

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

Moderator: Moderatoren

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

DBSEEk findet leeren Suchbegriff

Beitrag von Manfred »

Moin,

mal wieder ein tolles Problem:

Ich muß gerade feststellen, dass ich mit einem ganz normalen DBSeek() in einer DB einen Treffer lande, obwohl der Suchbegrifff leer ist, kein leerer Satz in der DB steht und Softseek .F. ist. Es sieht aber so aus, als wenn der Zeiger nicht auf Lastrec() + 1 geht, sondern auf Lastrec(). EOF() zeigt .F. an.
Wo stelle ich mich denn jetzt schon wieder doof an?

::regisseur := ""
(oRegie:nArea)->(DbSeek(Upper(::regisseur),.F.,"bez"))

PS: Er wird nicht gefunden, aber der Zeiger bleibt auf dem letzten Satz stehen und das ist doch falsch.
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: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

SET EXACT ON
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
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, das wäre was, steht aber so nicht in der Anleitung drin.

Die Anleitung erklärt es ohne ein Wort darüber zu verlieren und besagt, dass bei Set Softseek off auf Lastrec()+1 gesprungen wird und das tut dbseek() hier nicht.

found() wird .F., aber EOF() bleibt .F. . EOF() soll .T. werden. So steht es in der Anleitung. Und außerdem soll der nicht mehr benutzt werden.
Das kann es aber nicht sein, bei dbseek() ich vergleiche ja nichts miteinander, sondern suche etwas, was es definitiv NICHT gibt in der DB.

Übrigens gilt das wohl für ALLE Suchbegriffe. Ich habe gerade in einer anderen DB gesucht und nichts gefunden und dort wird auch nicht auf LASTREC() + 1 gesprungen.

PS: Ich habe gerade die Knowledgebase auf der Alaska Seite durchgestöbert. Ich vermute einmal, dass es sich um einen Bug handelt. Die Werte, die dort angezeigt werden, die bekomme ich nicht zurückgeliefert beim Suchen mit DBSEEK()
gerade habe ich noch etwas ausprobiert und bin zu dem Ergebnis gekommen, das dieses Problem wohl nur auftaucht, wenn ich mit einem leeren String suche.

PPS: Muß nochmals revidieren. Bei einem leeren String ist das so gewollt. Ich habe nochmals meine Ergebnisse mit der Knowledgebase verglichen.
Und wozu soll das gut sein?
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: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Manfred,

SOFTSEEK - bewirkt, dass der erste zum Suchbegriff passende
Datensatz angezeigt wird (wie immer - found()=.t.) ODER wenn keiner gefunden wird, der nächst größere !

SET EXACT ON/OFF - regelt das Vergleichsverhalten von Stringvergleichen ! wenn ON eingestellt ist, müssen beide Strings exact gleich lang und dann auch gleich sein. Normalerweise reicht es aus, wenn der linke String in der gleichen Länge wie der rechte String gleich ist !
Das ist immer so (außer a == b) auch bei DBSEEK().

Wenn nun der Suchbegriff 0 Byte lang ist (das ist nicht immer das selbe wie empty() ) gibt jede Suche bei SET EXACT OFF immer .t. und die DBF steht somit auf dem ersten Satz oder auf dem alten bei REST = .t..

Dies war auch für mich sehr gewöhnungsbedürftig, als ich von Basic auf Clipper umgestiegen bin, ist aber wirklich sehr nützlich wenn man nach linksbündigen Teilstrings suche will.

Sonst hieße es:

if left(a,len(b)) = b ...

nur muß man aufpassen, dass man nicht mit alltrim(" ") vergleicht, sondern z.B. a = b + " ". Bei DBSEEK mit exacten Ergebnissen empfiehlt es sich die Suchstrings mit Blanks aufzufüllen:

dbseek( left(cName + space(nLen),nLen))
Gruß
Hubert
Antworten