browse mit ordwildseek

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

Moderator: Moderatoren

Antworten
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

browse mit ordwildseek

Beitrag von gf210957 »

Hallo,

in einer Clipper-Anwendung, die ich umzusetzen habe, hat der Anwender die Möglichkeit, in der Kunden Datei einen Browser anzuzeigen. Dazu gibt er im Feld Name und oder im Feld Ort einen Suchbegriff in eine Variable ein.

Bsp. Name = "W"
Ort = "R"
Danach erhält er alle Kunden mit Namen "W" und Ort "R" angezeigt.

Dazu habe ich einen String erstellt, der mit ordwildseek gesucht wird, und auch gefunden wird.

Will ich das Ganze jedoch anschliessend im Browser mit scope darstellen, bleibt dieser jedoch leer.

Was mache ich falsch? Oder wird Ordwildseek von scope nicht unterstützt.

Ich bin für jeden Tip dankbar

Günter Früholz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12910
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: browse mit ordwildseek

Beitrag von AUGE_OHR »

hi,
gf210957 hat geschrieben: Dazu habe ich einen String erstellt, der mit ordwildseek gesucht wird,
und auch gefunden wird.

Will ich das Ganze jedoch anschliessend im Browser mit scope darstellen, bleibt dieser jedoch leer.

Was mache ich falsch? Oder wird Ordwildseek von scope nicht unterstützt.
Wenn du OrdWildSeek() benutzt wird "normalerweise" der String nicht
zu einem Scope passen sonst könnte man ja ein "normales" Seek benutzten.

Was einen Browser mit OrdWildSeek angeht kommt es "nur" auf deinen
"Skipper" an ob der in der Lage ist dir den "nächsten" Datensatz anzu-
zeigen ... ein "SKIP" reicht da nicht (und ein "SKIP -1" ist mit OrdWildSeek
nur mit "Trick" zu realisieren)

Bevor du dich da nun lange "rumquälst" würde ich aus den "Treffern" eine
Listbox machen.

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

oder noch besser mit OrdWildSeek die Daten oder die Satznummern in ein Array setzen. Zur Anzeige gleich die Daten ins Array und einen ArrayBrowser, wenn geändert werden soll, dann ein Array mit den Satznummern der Treffer, dann muss man im Skipper nur dbgoto(aArray[x+1]) etc. setzen, wobei man die Grenzen Len(aArray) und 1 beachten muss.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9370
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Man muß nur den ersten gefundenen Ausdruck (angenommen, W* wurde im Namen gesucht und "Walter" ist der erste Treffer) und analog den letzten gefundenen für das Scoping setzen (SCOPE_TOP, SCOPE_BOTTOM). Also Ordwildseek(cBegriff), Feld auslesen, DO WHILE Found(), letztes Feld auslesen, Scope setzen, DbGoTop().
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12910
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Tom hat geschrieben:Man muß nur den ersten gefundenen Ausdruck (angenommen, W* wurde im Namen gesucht und "Walter" ist der erste Treffer) und analog den letzten gefundenen für das Scoping setzen (SCOPE_TOP, SCOPE_BOTTOM). Also Ordwildseek(cBegriff), Feld auslesen, DO WHILE Found(), letztes Feld auslesen, Scope setzen, DbGoTop().
um kein Missverständniss aufkommen zu lassen : Das Beispiel
Bsp. Name = "W"
Ort = "R"
Danach erhält er alle Kunden mit Namen "W" und Ort "R" angezeigt.
ist eigendlich nicht geeignet um die Fähigkeiten von OrdWildSeek() zu
demonstrieren. Das wäre auch mit "normalen" Seek() möglich.

benutzen würde man OrdWildSeek() wenn der gesuchte Ausdruck "in der
Mitte" stehen würde und nicht "am Anfang". Deshalb ist es dann auch
nicht möglich einen SCOPE zu setzten da der Index nichts mit der
gefundenen "Reichenfolge" zu tun hat.

Beispiel "reis", Index UPPER(Artikel) würde bei SEEK nur :

"REIS essig" ... finden. Mit OrdWildSeek("*reis*") finde ich aber auch
"brauner REIS","duftREIS", "parboild REIS", "REIS essig" usw. also
alles was "reis" enthält wie "REIS" $ UPPER(ARTIKEL) nur eben viel
schneller.

man kann also die "Treffer" nur in ein Array aufnehmen und dann per
Listbox, oder wie Hubert sagte Array Browser, zum navigieren benutzen
wenn man sich nicht die Mühe machen will eine "speziellen SKIPPER"
zu schreiben. Das Problem bei dem "SKIPPER ist jedoch das OrdWildSeek
nicht einfach "rückwärtz" (SKIP -1) kann ...

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

AUGE_OHR hat geschrieben:Deshalb ist es dann auch
nicht möglich einen SCOPE zu setzten da der Index nichts mit der
gefundenen "Reihenfolge" zu tun hat.
Das ist nicht ganz richtig, die Treffer von OrdWildSeek kommen in der Sortierreihenfolge des aktuellen Indexbegriffes. Somit könnte man schon den ersten und letzten Treffer (linksbündig !) als Anfang und Ende von SCOPE setzen, nur muss man dann per FILTER noch die unerwünschten rausfiltern. Je nach Menge kann das OK sein oder eine Katastrophe werden.

Am Besten ist meiner Meinung die Arrayanzeige.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

brandelh hat geschrieben:Am Besten ist meiner Meinung die Arrayanzeige.
:D - Gut, dass ich mich diesmal zurückgehalten habe :!:
Ich sehe es genau so - wie auch sonst :wink:

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

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

Beitrag von brandelh »

Hallo Martin,

schön dass wir auch mal einer Meinung sind :D
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9370
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Das ist nicht ganz richtig, die Treffer von OrdWildSeek kommen in der Sortierreihenfolge des aktuellen Indexbegriffes.
Eben. Und deshalb kann man auch sowas machen:

Code: Alles auswählen

IF Found()
  cFirst := db->name
  DO WHILE suchbegriffstimmtnoch()
     cLast := db->name
     SKIP
  ENDDO
  DbSetScope(SCOPE_TOP,cFirst)
  DbSetScope(SCOPE_BOTTOM,cLast)
  DbGoTop()
ENDIF
Die Funktion "suchbegriffstimmtnoch" muß so oder so geschrieben werden. 8)
Herzlich,
Tom
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1931
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Suchen-browsen

Beitrag von Rolf Ramacher »

Hallo,

oder setzt einen Filter auf die Datenbank nach der Eingabe und zeigst dann die gefilterten daten mit dem Browse an.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suchen-browsen

Beitrag von brandelh »

Rolf Ramacher hat geschrieben:Hallo,
oder setzt einen Filter auf die Datenbank nach der Eingabe und zeigst dann die gefilterten daten mit dem Browse an.
das ist kein oder, mit SCOPE setzt man die Unter- und Obergrenze und mit der Filter erledigt den Rest in der Mitte. Je nach Anzahl der Datensätze zwischen Unter und Obergrenze kann dies aber auch sehr langsam werden.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12910
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben:
AUGE_OHR hat geschrieben:Deshalb ist es dann auch nicht möglich
einen SCOPE zu setzten da der Index nichts mit der gefundenen
"Reihenfolge" zu tun hat.
Das ist nicht ganz richtig, die Treffer von OrdWildSeek kommen in der Sortierreihenfolge des aktuellen Indexbegriffes.
ok soweit stimme ich zu, aber
brandelh hat geschrieben: Somit könnte man schon den ersten und letzten Treffer (linksbündig !) als Anfang und Ende von SCOPE setzen, nur muss man dann per FILTER noch die unerwünschten rausfiltern. Je nach Menge kann das OK sein oder eine Katastrophe werden.
FILTER (äh, bä...) ?!
Tom hat geschrieben: DO WHILE suchbegriffstimmtnoch()
Das ist ja praktsch auch ein FILTER ... warum dann nicht gleich einen
Codeblock, da kann man auch gleich seine Anfang-/Ende- Bedingung
mit einbauen :

Code: Alles auswählen

bBlock := {|| field->Name = "W" .AND. field->Ort = "R" }
...
obrowse:SKIPBLOCK     := {|x| gonext  (X, bBlock ) }
obrowse:GOTOPBLOCK    := {||  GOTOP   (   bBlock ) }
obrowse:GOBOTTOMBLOCK := {||  GOBOTTOM(   bBlock ) }
...
FUNCTION gonext(ntoskip, bwhilecond )
LOCAL nskipped := 0, ndirection
   ndirection := IIF(ntoskip > 0, 1, -1)
   DO WHILE nskipped != ntoskip .AND. ;
            EVAL(bwhilecond)    .AND. ;
           !EOF() .AND. !BOF()
      SKIP ndirection
      nskipped += ndirection
   ENDDO
   IF EOF()
      SKIP -1
      nskipped--
   ELSEIF BOF()
      GOTO RECNO()
      nskipped++
   ELSEIF !EVAL(bwhilecond)
      SKIP -ndirection
      nskipped += -ndirection
   ENDIF
RETURN nskipped

FUNCTION GOTOP( bwhilecond )
   DO WHILE EVAL( bwhilecond ) .AND. !BOF()
      SKIP -1
      IF !EVAL( bwhilecond )
         SKIP
         EXIT
      ENDIF
   ENDDO
RETURN (NIL)

FUNCTION GOBOTTOM( bwhilecond )
   DO WHILE EVAL( bwhilecond ) .AND. !EOF()
      SKIP
   ENDDO
   *- We always skip 1 too far, so skip back
   SKIP -1
RETURN (NIL)
trotzdem hat auch das noch erhebliche Nachteile weil er ja jedes mal
"hin-und-her" SKIP wenn er EOF() oder BOF() erreicht. Auch mit SCOPE
und "optimaler" Reihenfolge ist ein "spezieller SKIPPER" mit OrdWildSeek()
wesentlich schneller da er nicht SKIP sondern praktisch ein SEEK macht.

Der "Witz" an OrdwildSeek() ist aber eigendlich das er "mittendrin" was
finden kann also *cBegriff* (man beachte die BEIDEN * ) also sowas
wie "cBegriff $ field->sowieso". "normal" müsste man durch die ganze
DBF SKIPpen ... und das kann wie bei einem FILTER sehr lange dauern
bei 1 Mio. Datensätzen und langsamen Netzwerk ...
brandelh hat geschrieben: Am Besten ist meiner Meinung die Arrayanzeige.
yup, und das ist mit OrdWildSeek() auch die (einfachste ) Lösung zu der
Frage von diesem Thread.

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

AUGE_OHR hat geschrieben: FILTER (äh, bä...) ?!
Wenn die Datenmenge klein ist oder durch SCOPE deutlich eingeschränkt wird, kann man ohne Probleme zusätzlich einen Filter setzen. Wenn nicht wird es übel.
Gruß
Hubert
Antworten