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.
DBSEEk findet leeren Suchbegriff
Moderator: Moderatoren
- Manfred
- 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
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!!
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!!
- Manfred
- Foren-Administrator
- Beiträge: 21189
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
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?
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!!
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!!
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
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))
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
Hubert