Seite 1 von 2

nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 9:11
von xbaseklaus
Hi @ALL

nach Umstellung von DBEDBF auf DBEFOX und NTX auf CDX und ANSI

ist jetzt folgende Problem aufgetreten ...

Name: Härtel

wenn ich danach suchen lasse "Härtel" obwohl mehrer angelegt sind -> findet er in der Suchfunktion keinen einzigen !!!

gebe ich "Hä" findet er alle die mit "Hä" anfangen und alle "Härtel"

WARUM - liegt das bei CDX am Umlaut ä oder woher kommt nach der Umstellung jetz auf einmal das Problem ?

Mfg. Klaus

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 9:23
von georg
Hallo, Klaus -


da gibt es einige Stellschrauben, die zu solchen Problemen führen können. Mir fallen da folgende ein:
  • SET CHARSET/SET COLLATION: die CDX-Dateien sollten mit der gleichen Einstellung erstellt und genutzt werden;
  • Datenherkunft: wenn die Daten als OEM in die Dateien geschrieben wurden, hast Du sie bei der Umstellung von OEM nach ANSI konvertiert?
  • die Suche mit "Hä" - aus dem Programmquelltext (Compiler-Schalter /ga?) oder aus einer Eingabe?

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 9:29
von Jan
Xbase++ erkennt intern, ob ein dbf in ANSI oder ASCII erstellt wurde. Und konvertiert intern entsprechend um.

Wenn Dein Programm ein "Hä" findet, ein "Härtel" aber nicht, dann kann das ja kein Umlaut-Problem sein.

Jan

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 9:51
von brandelh
Ich indiziere seit Clippertagen mit KeinUmlaut(Name) ...

Härtel, Haertel, HÄRTEL etc. alle will ich als Treffer haben und das geht nur wenn man die Umlaute ausschaltet.
CDX hat auch eine Umlautunabhängige Suche, wobei das genaue Verhalten ab und an zu diskussionen führt...

Code: Alles auswählen

*---------------------------------------------------------------------------
function keinumlaut (txt)            // keine deutschen Umlaute in INDEX
   local TextLen
   TextLen := len( Txt )             // Bei Indexen sind keine kürzeren
                                     // Rückgabewerte erlaubt !
   txt:=upper(txt)
   txt:=STRTRAN(txt,"Ä","AE")        //       A C H T U N G    !!!
   txt:=STRTRAN(txt,"Ö","OE")
   txt:=STRTRAN(txt,"Ü","UE")        //  OEM <-> ANSI könnte Probleme geben.
   txt:=STRTRAN(txt,"ß","SS")

   txt:= left( txt , TextLen )       // Schlüssellänge auf
                                     // alten Wert setzen
return txt
hier wäre es besser den Zeichensatz (ANSI / OEM) abzufragen und mit chr(x) zu tauschen.

Code: Alles auswählen

*--------------------------------------------------------------------------------
function IsOEM()
return ( set(_SET_CHARSET) = 1 )
*--------------------------------------------------------------------------------
function IsAnsi()
return ( set(_SET_CHARSET) = 0 )

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 9:57
von xbaseklaus
Jan hat geschrieben:Xbase++ erkennt intern, ob ein dbf in ANSI oder ASCII erstellt wurde. Und konvertiert intern entsprechend um.

Wenn Dein Programm ein "Hä" findet, ein "Härtel" aber nicht, dann kann das ja kein Umlaut-Problem sein.

Jan
Stimmt es ist kein Umlaute Problem

weil z.B. "Böhm" habe ich auch mehrere und die findet er auch direkt alle !

ABER "Härtel" nicht -> es muß aber ein INDEX CDX Problem sein , da ich einen INDEX Kundname habe und er mit SEEK darüber sucht !

und bei Eingabe von "Härtel" findet er NICHTS ... habe den INDEX auch gelöscht und neu erstellt KEINE Änderung ... BIN SPRACHLOS :-(

Mfg Klaus

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:16
von xbaseklaus
Ich habe die Datenbank in VDBU geladen

alle Umlaute sind in ANSI !

habe dazu den Index Kundname geladen

Alle "Härtel" werden auch in der Tabelle mit dem Index nacheinander richtig angezeigt - jetzt verstehe ich gar nix mehr :-(

dann muß er sie doch bei SEEK finden ?

Code: Alles auswählen

set index to kundname
seek trim(sname)

if eof()
@21,2 say "Kein Datensatz mit "+sname
wait("Weiter mit Taste")
kann der TRIM Befehl stören ?

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:27
von Jan
Klaus,

Du hast Dir die Anwort schon gegeben. Mach NIEMALS ein Trim/RTrim/LTrim/AllTrim auf den Suchbegriff! Das muß scheppern.

Jan

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:34
von brandelh
Der Suchbegriff kann getrimmt werden wie er will, nur beim Indizieren darf man die Länge nicht ändern !
Ich nutze normal alltrim() ;-)

In der Datenbank müssen die Namen natürlich linksbündig stehen, führende Blanks ... kann man aber ausschließen, sonst würde "Hä" auch nix finden.

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:34
von Manfred
Beim Suchen dürfte das doch egal sein. Er findet ja ein "Hä". (Da ich es aber generell nicht mache (glaube ich) vermute ich das mal.) Beim Index selbst darf man das nicht, das ist klar.

Verflixt, Hubert war schneller. Hoffentlich nicht auch einsamer ;-)

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:36
von xbaseklaus
Jan hat geschrieben:Klaus,

Du hast Dir die Anwort schon gegeben. Mach NIEMALS ein Trim/RTrim/LTrim/AllTrim auf den Suchbegriff! Das muß scheppern.

Jan
sname:= space(30)

sname ist das was ich eingebe zu vergleichen ... verwende ich hier kein TRIM findet er garnichts ...

das ist nicht der INDEX

bei "H" findet er was
bei "Hä" findet er was

bei "Här" findet er schon nichts mehr

gebe ich z.B.

Suchwort "Böhm"

"B" "Bö" "Böh" "Böhm" findet er immer was !!!

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:41
von Manfred
mach doch mal einen Softseek und schaue mal wo er landet. Dann versuche es mal statt mit EOF() mit Found() nur mal so zur Probe. Ich habe schon die dollsten Sachen erlebt. Oder geh mal zu der Stelle im Debugger und tippe den Seek in der Console ein um zu schauen, was er dann macht. Nur mal so um evtl. andere blödsinnige Fehler zu finden.

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:47
von Jan
Jungs,

natürlich habt Ihr Recht - Trim auf den Suchbegriff ist natürlich in Ordnung. Nur bei der Indexerstellung gilt das, was ich geschrieben hatte.

Jan

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:54
von xbaseklaus
Manfred hat geschrieben:mach doch mal einen Softseek und schaue mal wo er landet. ...
OK ... setze ich am Anfang SET SOFTSEEK ON

Suchwort: "Härtel"

Dann findet er "Haertel" und alle "Härtel"

also muß ich SOFTSEEK auf ON setzen !

Wenn ich SOFTSEEK auf ON setze findet er auch alle "Härtel" überall auf anhieb ...

Mfg Klaus

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 10:55
von xbaseklaus
kann mir dann BITTE auch jemand erklären warum das so ist ! Damit ich nicht dumm sterbe :-(

Anscheinend war auf jeden Fall das Problem das es auch noch einen "Haertel" gab !

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 11:20
von Tom
Simple Frage: Schon ein Reindex ausgeführt?

Softseek ist gefährlich, weil es den Datensatzzeiger dort positioniert, wo der "nächsthöhere" Indexeintrag gemäß Suchbegriff zu finden ist. Wenn der Index beispielsweise mit DtoS() auf ein Datumsfeld erzeugt wurde und man sucht nach dem 01.01.2017, "findet" DbSeek() den 02.01.2017, wenn Softseek aktiv ist. Ohne Softseek würden Found() auf .F. und Eof() auf .T. gehen. Ist also kein "Härtel" in der Tabelle, dafür aber ein "Meier", wobei es dazwischen keine Einträge gibt, findet Deine Suche eben "Meier", obwohl Du nach "Härtel" gesucht hast.

Da "Böhm" ordnungsgemäß gefunden wird, gibt es neben Indexfehlern auch die Möglichkeit, dass Du beispielsweise irgendwie nur die ersten 4 Buchstaben verwendest. Oder vergleichbare Fehler machst. Hol Dir doch an den entsprechenden Programmstellen mal Informationen wie "IndexKey()" und "&(IndexKey())" sowie den Suchbegriff. Positioniere direkt auf "Härtel" und lass Dir das dort auch anzeigen. Das ist kein Fehler der DBE, sondern mit Sicherheit Deiner.

Und Softseek nur verwenden, wenn Du dieses spezielle Verhalten auch wirklich brauchst. Das Beispiel mit dem Datum ist so falsch nicht - will man beispielsweise wissen, ob irgendein Mitarbeiter gemäß Tabelle im aktuellen Monat einen Urlaubsbeginn hat, sucht man schlicht mit aktivem Softseek nach dem ersten des Monats. Anschließend muss man natürlich prüfen, ob das möglicherweise falsche Ergebnis auch im fraglichen Monat liegt. Bei konkreter Suche ist Softseek gefährlich.

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 12:37
von Manfred
der Softseek war auch nur um den/einen Fehler mal einzugrenzen. Das sollte nicht auf Dauer so bleiben. Es könnte an dem EOF() liegen, deshalb ja auch mein Vorschlag mal Found() und im Debugger zu schauen wo er denn landet bei EOF(). Ich habe im Debugger schon des öfteren erlebt, dass ein ! Found() z.B. zurückkam, obwohl der Satz gefunden wurde.
Wenn es aber mit Softseek gefunden wird, scheint das EOF() falsch zu sein.
Wobei ich aber auch wieder darauf hinweisen will, alles ohne Aliasangabe. Wer weiß, was Klaus da so abfragt..... ;-)

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 14:13
von brandelh
Meine Test ergeben auch ein Problem mit den Suchbegriffen (DBF mit CDX)

Hä findet Härtel, aber Ha findet kein Haertel den ich auch eingetragen hab ...

Code: Alles auswählen

PROCEDURE dbeSys()

  SET DATE TO GERMAN
  SET EPOCH TO year(date())-80

  SET COLLATION TO GERMAN      // SYSTEM ??? 
  SET CHARSET   TO OEM / ANSI  // beides probiert

  IF ! DbeLoad( "DBFDBE", .t.)
     Alert( "DBFDBE wurde nicht geladen" , {"OK"} )
  ENDIF

  IF ! DbeLoad( "NTXDBE", .t.)
     Alert( "NTXDBE wurde nicht geladen" , {"OK"} )
  ENDIF

  IF ! DbeBuild( "DBFNTX","DBFDBE","NTXDBE"  )
     Alert( "DBFNTX wurde nicht erstellt" , {"OK"} )
  ENDIF

  IF ! DbeLoad( "CDXDBE", .t.)
     Alert( "CDXDBE wurde nicht geladen" , {"OK"} )
  ENDIF

  IF ! DbeBuild( "DBFCDX","DBFDBE","CDXDBE"  )
     Alert( "DBFCDX wurde nicht erstellt" , {"OK"} )
  ENDIF

*  DbeInfo( COMPONENT_DATA,  FOXDBE_MEMOBLOCKSIZE , 80 )
  DbeInfo( COMPONENT_ORDER, DBE_LOCKMODE         , LOCKING_EXTENDED )

RETURN
Ich meine mich zu erinnern, dass es für uns 2 Sortiervorschriften gibt, DIN und DIN2 in Clipper, für die Behandlung von Umlauten.
Aus meiner Sicht ist das aber alles daneben, und unnötig, wenn man die Umlaute im Index (und in der Suche) mit meiner Funktion umwandelt.

Ein Anwender kann einen Müller eben auch als Mueller erfassen (müssen) ... teilweise weil die Leute tatsächlich so heißen oder weil er es will.
Eine Suche nach Müller muss also auch Mueller finden und in der Liste sauber einsortieren.

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 14:33
von Tom
Hallo, Hubert.
Aus meiner Sicht ist das aber alles daneben, und unnötig, wenn man die Umlaute im Index (und in der Suche) mit meiner Funktion umwandelt.
Tatsächlich mache ich das auch so, aber nicht, um Indexprobleme zu beheben, sondern um die Suche zu erleichtern. Manchmal schreibt man Namen nicht mit Umlauten, obwohl sie mit Umlauten gesprochen werden.

Allerdings ist die realistische Ersetzungsliste noch deutlich länger. Unsere Anwender haben Patienten oder Kunden aus aller Herren Länder, also gibt es beispielsweise noch französische, polnische, dänische/skandinavische und (ohnehin viele) türkische Sonderzeichen. Nicht zu vergessen das Es-Zett. Und ob sich Lefevre so schreibt oder Léfevre oder Lèfevre oder Lêfevre - das weiß nur die Person selbst genau.

Ich hab's übrigens auch getestet. FOXCDX mit ANSI (auch mit ANSI erzeugt!), COLLATION GERMAN. Ich finde Härtel.

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Do, 14. Apr 2016 15:54
von brandelh
Tom hat geschrieben:Hallo, Hubert.
Tatsächlich mache ich das auch so, aber nicht, um Indexprobleme zu beheben, sondern um die Suche zu erleichtern.
klar das ist auch mein Hauptzweck ;-)

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Fr, 15. Apr 2016 0:21
von Werner_Bayern
brandelh hat geschrieben:Ich indiziere seit Clippertagen mit KeinUmlaut(Name) ...
Servus Hubert,

damit hat Du im Index aber evtl. nicht mehr den kompletten Namen. Hattest Du damit noch keine Probleme? Oder sind Deine Namens-Felder so extrem groß?

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Fr, 15. Apr 2016 9:21
von Tom
Im Index benötigt man den kompletten Namen meistens auch nicht - er steht ja im Tabellenfeld. Und notfalls generiert man einfach einen weiteren Index ohne Konvertierung.

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Sa, 16. Apr 2016 18:58
von brandelh
Meine Namensfelder haben normal 40 Zeichen und die sind alle im Index

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: So, 17. Apr 2016 23:09
von Werner_Bayern
brandelh hat geschrieben:Meine Namensfelder haben normal 40 Zeichen und die sind alle im Index
Eben nicht, wenn Du Umlaute ersetzen lässt, der Name aber schon 40 Zeichen hat. Dann steht er nicht mehr komplett im Index.
Ist jetzt aber auch nicht so tragisch - denke ich. Muss man halt bei allen Suchoperationen entsprechend berücksichtigen.

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Mo, 18. Apr 2016 8:42
von brandelh
OK wenn 40 Stellen ausgefüllt sind und 2 Ä dabei sind wird im Index Ä zu Ae und bei 40 gekürzt.
Natürlich MÜSSEN alle Suchbegriffe auch mit der Funktion bei DBSEEK() behandelt werden, somit merkt der Anwender davon nix.
Auch bei normalem Suchen (do while cSuch = cFeld ...) nutze ich normal die Funktion.

Ich kann mir nicht vorstellen, dass es einen Namen gibt, der tatsächlich die 40 Stellen braucht ;-)

Re: nach Umstellung auf CDX Problem beim SUCHEN!

Verfasst: Mo, 18. Apr 2016 9:01
von Koverhage
Vor allem das jemand Lust hat, einen 40-stelligen Suchbegriff einzugeben.