Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Teilstring suchen

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Teilstring suchen

Beitrag von Jan » Sa, 07. Okt 2017 13:26

Moin,

ich glaube, wir hatten das Thema schon mal, ich finde das nur nicht.

Ich möchte eine Suche machen auf ein indiziertes Feld. Problem: Ich suche nicht nach dem vollen Feldinhalt, sondern nach einem Teilinhalt. Einfach ist dabei zum Glück, daß dieser Teilstring IMMER der Beginn des Feldinhaltes ist. Nicht irgendwo mitten drin.

Das Problem ist: Ein Softseek geht nicht. Aus irgend einem Grund steht der z. B. bei einer Suche nach HA auf HÄ. Obwohl es durchaus Einträge mit HA gibt. Ein Scope geht auch nicht, der findet keine Teilstrings.

Locate fällt eher aus - das wäre zwar entsprechend flexibel, aber die dbf kann schon mal ein paar zehntausend Datensätze haben. Das würde dann doch etwas arg lange dauern.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Teilstring suchen

Beitrag von Werner_Bayern » Sa, 07. Okt 2017 13:42

Servus Jan,

bei mir geht das einwandfrei mit softseek. "HA" wird gefunden, "Hägar der Schreckliche" steht am Ende der Liste.
Ordwildseek funktioniert mit Umlauten nicht. Ich verwende dbfntx mit SET COLLATION TO GERMAN.
es grüßt euch

Werner

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13598
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Martin Altmann » Sa, 07. Okt 2017 13:43

Index über das Feld und dann seek mit left(...,..)

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Jan » Sa, 07. Okt 2017 16:42

Hallo,

der Index lautet auf Upper(feldname). Und egal was ich mache - immer steht der mit Hä vor Ha. Und will da auch nicht von weggehen - so lange ich mit Softseek suche. Ohne Softseek geht es. Aber dann finde ich nur das einzelne "H", oder dann mit drei Buchstaben. Zwei Buchstaben werden niemals gefunden. Immer dann, wenn das ein Suchbegriff ist, wo bei mindestens einem potentiellen Treffer an zweiter Stelle ein Umlaut steht.

Ich bin irritiert ...

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Teilstring suchen

Beitrag von Werner_Bayern » Sa, 07. Okt 2017 17:47

Servus Jan,

ist bei mir nicht anders, auch upper(text) und ein Dbseek(cText, .T.). Funktioniert einwandfrei. Hast Du

Code: Alles auswählen

SET COLLATION TO GERMAN
eingestellt?
test.PNG
test.PNG (6.17 KiB) 367 mal betrachtet
test2.PNG
test2.PNG (6.03 KiB) 365 mal betrachtet
es grüßt euch

Werner

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Jan » Sa, 07. Okt 2017 17:52

Hallo Werner,

ja, SET COLLATION TO GERMAN ist eingestellt. Und FOXCDX.
Index.jpg
Index.jpg (16.71 KiB) 364 mal betrachtet
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 865
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Roland Gentner » Sa, 07. Okt 2017 20:42

Jan hat geschrieben:
Sa, 07. Okt 2017 17:52
SoftSeek
FOXCDX
Hast Du den Index Auch mit Upper aufgebaut?
Die linksbündige Suche mache ich dann nicht mit SoftSeek sondern mit Exact
Dann sollte das funktionieren:

z.B.:
Index on Upper( TEXTFELD ) to index1

gesuchter Begriff "Hä"

cSuchen := "Hä"
Set exact off
DbSeek( Upper( cSuchen ) )
Set Exact On
? FIELD->TEXTFELD Anzeige: "Hägar"

oder gesuchter Begriff "Ha"

cSuchen := "Ha"
Set exact off
DbSeek( Upper( cSuchen ) )
Set Exact On
? FIELD->TEXTFELD Anzeige: "Hans"

Sonst tippe auf FOXCDX...
Gruß
Roland

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Teilstring suchen

Beitrag von Werner_Bayern » Sa, 07. Okt 2017 23:09

dann mach doch mal einen dbfntx-Test?
es grüßt euch

Werner

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Teilstring suchen

Beitrag von AUGE_OHR » So, 08. Okt 2017 3:51

Jan hat geschrieben:
Sa, 07. Okt 2017 17:52
ja, SET COLLATION TO GERMAN ist eingestellt. Und FOXCDX.
zeige mal deine DBESYS ... was für ein FOXCDX

ich habe das "ä" hinter dem "Z" ... allerdings mit DBFNTX oder Comix

Code: Alles auswählen

   dbCreate( "__ANSI", {{ "CHAR", "C", 3, 0}})
   USE __ANSI EXCLUSIVE NEW

   // throw in all possible chars
   FOR x := 1 TO 255
      dbAppend()
      __ANSI->Char := CHR( x)
   NEXT

   // index it ...
   INDEX ON __ANSI->Char TO __ANSI
   browse()
gruss by OHR
Jimmy

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Teilstring suchen

Beitrag von AUGE_OHR » Mo, 09. Okt 2017 1:46

Jan hat geschrieben:
Sa, 07. Okt 2017 13:26
Aus irgend einem Grund steht der z. B. bei einer Suche nach HA auf HÄ. Obwohl es durchaus Einträge mit HA gibt.
kann ich inzwischen bestätigen das er 1 Position VOR dem Found() steht ABER :

ich arbeite sonst mit Comix

Code: Alles auswählen

   SET COLLATION TO GERMAN
   SET DATE TO GERMAN

   DbeInfo( COMPONENT_DATA, FOXDBE_CREATE_2X, .T. )
   DbeInfo( COMPONENT_DATA, FOXDBE_LOCKMODE, FOXDBE_LOCKMODE_CLIPPER )
   //
   DbeInfo( COMPONENT_ORDER, CDXDBE_MODE, CDXDBE_FOXPRO2X )
laut Hilfe File müsste man für Visual FoxPro dies haben

Code: Alles auswählen

   SET COLLATION TO GERMAN
   SET DATE TO GERMAN

   DbeInfo( COMPONENT_DATA, FOXDBE_CREATE_2X, .F. )
   DbeInfo( COMPONENT_DATA, FOXDBE_LOCKMODE , FOXDBE_LOCKMODE_VISUAL )
   //
   DbeInfo( COMPONENT_ORDER, CDXDBE_MODE, CDXDBE_VFOXPRO )
@Jan : sieht deine DbeSys so aus ?

ich habe damit den o.g. Code (1-255) ausprobiert und bekomme "nur Unsinn" mit der DBE Einstellung

Code: Alles auswählen

   INDEX ON __ANSI->Char TO __ANSI
   SEEK("€")
ich suche nach dem € Zeichen und er findet nichts [-X

also zurück auf Comix und da findet er es unter CHR(128) =D>

nun hab in der MAIN und Comix mal diese Zeile mit rein genommen

Code: Alles auswählen

   SET CHARSET TO ansi
er findet zwar was aber er sollte auf dem € Zeichen stehen und nicht auf 1 Position davor :shock:
Comix_ANSI.JPG
Comix_ANSI.JPG (43.04 KiB) 304 mal betrachtet
hier der Source dann könnt ihr es selbst ausprobieren
Comix_ANSI.ZIP
pure Xbase++ Source
(1.16 KiB) 1-mal heruntergeladen
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Teilstring suchen

Beitrag von brandelh » Mo, 09. Okt 2017 8:39

SET COLLATION TO GERMAN
Für die deutsche Sortierung ist ä gleich a, wobei es zwei Arten gibt:

Ä wird als AE einsortiert oder danach (oder war es davor) ... hängt davon ab, ob man Namen oder Bücher sortiert.

Wenn der Index a von ä getrennt suchen soll, muss man wohl ANSI indizieren.
Und FOXCDX.
Hinzu kommt, dass FOXCDX immer wie upper(feldname) sortiert, egal ob das angegeben wurde oder nicht.
Gruß
Hubert

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Jan » Mo, 09. Okt 2017 8:41

brandelh hat geschrieben:
Mo, 09. Okt 2017 8:39
Hinzu kommt, dass FOXCDX immer wie upper(feldname) sortiert, egal ob das angegeben wurde oder nicht.
Moin Hubert,

stimmt, da war doch was. Hab ich erfolgreich verdrängt gehabt.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Teilstring suchen

Beitrag von AUGE_OHR » Di, 10. Okt 2017 2:15

hi,

das ganze nützt nichts wenn die DBESYS falsch eingestellt ist welche Jan bislang nicht gezeigt hat.
auch spricht er nur von FOX aber nicht explizit welchen Type er meint (FoxPro_v2, Six/Comix, Visual FoxPro) :?:

wie ich schon sagte sollte man eine Demo nehmen und die DBESYS Einstellungen testen ob die zu einem Ergebnis führen. mit der Visual FoxPro Einstellung kommt bei mir nur "Mist" raus ... noch nicht mal die Reihenfolge bei Ziffern stimmt

von Jan weiss ich das er mit ANSI arbeiten möchte aber der Eintrag

Code: Alles auswählen

SET CHARSET TO ansi
in MAIN sorgt, bei SixDrive/Comix Einstellung, für das komische Verhalten bei SEEK("€") :shock:
... zumindest bei der v1.9x mit/ohne Hotfix #38 (FOXDBE.DLL)
gruss by OHR
Jimmy

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Jan » Mo, 16. Okt 2017 20:24

Alaska hat bestätigt, das es ein Problem mit SET COLLATION T GERMAN gibt. Schreibe ich das auf SET COLLATION TO SYSTEM um, und baue dann den Index neu auf, dann wird auch "Ha" wieder gefunden. Aber leider hat SYSTEM die möglicherweise unangenehme Nebenwirkung, das Vergleichoperatoren ebenfalls Case-Sensitiv sind. Aber Alaska untersucht das Problem näher. Mal schauen, was dabei rum kommt. Einen PDR gibt es dazu aber noch nicht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Teilstring suchen

Beitrag von Werner_Bayern » Mo, 16. Okt 2017 20:55

Jan hat geschrieben:
Mo, 16. Okt 2017 20:24
Alaska hat bestätigt, das es ein Problem mit SET COLLATION T GERMAN gibt.
Auch für dbfntx?
es grüßt euch

Werner

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Teilstring suchen

Beitrag von AUGE_OHR » Mo, 16. Okt 2017 22:14

Werner_Bayern hat geschrieben:
Mo, 16. Okt 2017 20:55
Auch für dbfntx?
hast du Probleme mit DBFNTX ?
gruss by OHR
Jimmy

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Jan » Mo, 16. Okt 2017 22:19

Werner_Bayern hat geschrieben:
Mo, 16. Okt 2017 20:55
Auch für dbfntx?
Hallo Werner,

keien Ahnung. Alaska hat sich nur auf meine Mail und mein Sample bezogen. Näheres kann man nur sagen, wenn es dazu von Alaska mehr Infos gibt als nur "Das müssen wir uns näher anschauen", wie die mir geschrieben haben (mal wieder anonym, ohne Namen drunter - wie ich das hasse). Also ausführlichere Mail, PDR, was auch immer.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Roland Gentner
1000 working lines a day
1000 working lines a day
Beiträge: 865
Registriert: Fr, 24. Nov 2006 8:30
Wohnort: Neresheim
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Roland Gentner » Mo, 16. Okt 2017 22:22

Hallo Jan

hast Du das mal mit "set exact" versucht?
Gruß
Roland

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Teilstring suchen

Beitrag von Werner_Bayern » Di, 17. Okt 2017 1:26

AUGE_OHR hat geschrieben:
Mo, 16. Okt 2017 22:14
hast du Probleme mit DBFNTX ?
nein
es grüßt euch

Werner

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Teilstring suchen

Beitrag von Werner_Bayern » Di, 17. Okt 2017 1:28

Jan hat geschrieben:
Mo, 16. Okt 2017 22:19
(mal wieder anonym, ohne Namen drunter - wie ich das hasse)
:roll: =D>
es grüßt euch

Werner

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Jan » Di, 17. Okt 2017 11:39

Alaska schlägt vor, das ich den Index mit SET COLLATION TO SYSTEM aufbaue. Und dann das Programm aber mit GERMAN laufen lasse. Damit ist der Index dann für "Ha"-findbar aufgebaut, ich laufe aber nicht in Gefahr, eventuelle Probleme im laufenden Betrieb mit den Case-sensitiven Vergleichsoperatoren zu bekommen.

Da stellt sich mir aber die Frage: Wie stelle ich denn fest, ob ein Index bereits mit SYSTEM aufgebaut worden ist, oder noch mit GERMAN? Ich will das ja immer nur 1x durchaufen lassen, und nicht bei jedem Programmstart ... Und ich finde in der Doku nichts, wie ich die COLLATION eines Indizees auslesen könnte.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Teilstring suchen

Beitrag von Werner_Bayern » Di, 17. Okt 2017 14:21

Warum machst Du die 2 Befehle nicht einfach in Deine Reindizierungs-Routine? Dann muss die max. 1x manuell aufgerufen werden und gut ist es - auch künftig.
es grüßt euch

Werner

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Jan » Di, 17. Okt 2017 14:33

Werner,

versteh ich jetzt nicht, was Du da meinst.

Mir geht es um folgendes: Ich muß ja bei jedem Kunden einmalig den Index neu aufbauen. Genau nur dann, denn der noch mit GERMAN aufgebaut ist. Ich habe da keinen Einfluß drauf, wann der Kunde das nächste mal das Programm startet - das kann morgen, nächste Woche, nächsten Monat, oder nächstes Jahr sein. Aber der Index soll (zumindest aus diesem Grund) nur einmal neu aufgebaut werden. Alles andere würden die Kunden irritieren oder nerven.

Wir reden hier von einem Programm, das nahezu ausschließlich von Privatpersonen genutzt wird. Und oft in einem höheren Alter (recht viele Rentner z. B.). Und oft nicht sonderlich EDV-Affin.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1294
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Teilstring suchen

Beitrag von Werner_Bayern » Di, 17. Okt 2017 17:38

Ich meinte halt so:

Code: Alles auswählen

set COLLATION TO SYSTEM
index on ...
SET COLLATION TO GERMAN
Einen Marker setzen im Update, dass das beim 1. Start einmalig gemacht wird.
es grüßt euch

Werner

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12310
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Teilstring suchen

Beitrag von Jan » Di, 17. Okt 2017 18:14

Werner,

mir ist klar, WIE ich das mit dem Index machen muß. Aber das festellen, ob schon gelaufen oder nicht, das ist das Problem. Was stellst Du Dir denn als Marker vor? Da ich keine Registry-Einträge oder ini habe - wo sollte ich das Teil hinstecken?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Antworten