browse mit ordwildseek
Moderator: Moderatoren
browse mit ordwildseek
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
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
- AUGE_OHR
- 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
hi,
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
Wenn du OrdWildSeek() benutzt wird "normalerweise" der String nichtgf210957 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.
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
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
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.
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
Hubert
- Tom
- 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:
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
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12910
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
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
um kein Missverständniss aufkommen zu lassen : Das BeispielTom 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().
ist eigendlich nicht geeignet um die Fähigkeiten von OrdWildSeek() zuBsp. Name = "W"
Ort = "R"
Danach erhält er alle Kunden mit Namen "W" und Ort "R" angezeigt.
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
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
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.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.
Am Besten ist meiner Meinung die Arrayanzeige.
Gruß
Hubert
Hubert
- Martin Altmann
- Foren-Administrator
- Beiträge: 16517
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
- Gut, dass ich mich diesmal zurückgehalten habebrandelh hat geschrieben:Am Besten ist meiner Meinung die Arrayanzeige.
Ich sehe es genau so - wie auch sonst
Viele Grüße,
Martin
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.
- Tom
- 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:
Eben. Und deshalb kann man auch sowas machen:Das ist nicht ganz richtig, die Treffer von OrdWildSeek kommen in der Sortierreihenfolge des aktuellen Indexbegriffes.
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
Herzlich,
Tom
Tom
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1931
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Suchen-browsen
Hallo,
oder setzt einen Filter auf die Datenbank nach der Eingabe und zeigst dann die gefilterten daten mit dem Browse an.
oder setzt einen Filter auf die Datenbank nach der Eingabe und zeigst dann die gefilterten daten mit dem Browse an.
- brandelh
- 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
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.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.
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12910
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
Codeblock, da kann man auch gleich seine Anfang-/Ende- Bedingung
mit einbauen :
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 ...
Frage von diesem Thread.
gruss by OHR
Jimmy
ok soweit stimme ich zu, aberbrandelh hat geschrieben:Das ist nicht ganz richtig, die Treffer von OrdWildSeek kommen in der Sortierreihenfolge des aktuellen Indexbegriffes.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.
FILTER (äh, bä...) ?!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.
Das ist ja praktsch auch ein FILTER ... warum dann nicht gleich einenTom hat geschrieben: DO WHILE suchbegriffstimmtnoch()
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)
"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 ...
yup, und das ist mit OrdWildSeek() auch die (einfachste ) Lösung zu derbrandelh hat geschrieben: Am Besten ist meiner Meinung die Arrayanzeige.
Frage von diesem Thread.
gruss by OHR
Jimmy