DbSetFilter

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

DbSetFilter

Beitrag von Jan »

Das hier ist genau das richtige Unterforum für diese Frage :( : Wie bitte schon schreibe ich das hier

Code: Alles auswählen

Set Filter TO &cAltFilter
mit DbSetFilter({|| })?

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

Re: DbSetFilter

Beitrag von brandelh »

Hallo Jan,

ich vermute, dass cAltFilter der ausgeschriebene Text der Filterbedingung ist oder ?

cAltFilter := "Name='Meier'" ... oder cAltFilter := DbFilter()

für DBSetFilter() benötigen wir einen CodeBlock, den könnte man nun so erzeugen:

Code: Alles auswählen

dbSetFilter( &("{||"+cAltFilter+"}") )
allerdings wird es bei Syntaxfehlern schwer die zu finden. Daher mache ich das eher so:

Code: Alles auswählen

cAltFilter := "{||"+cAltFilter+"}"   // falls cAltFilter vorher gebildet wurde ... 
// cAltFilter := "{|| Name='Meier' }"   // sonst gleich so
bFilter     := &(cAltFilter)
dbSetFilter( bFilter )
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DbSetFilter

Beitrag von Rolf Ramacher »

HI Jan,

ein Beispiel von mir

Code: Alles auswählen

				Spfolg1->(DbSetFilter({|| substr(Artnr,1,3) >= alltrim(aFelder[10][2]) .and.;
							substr(Artnr,1,3) <= alltrim(aFelder[11][2]) .and.;
							Saison=alltrim(aFelder[6][2]) .and. Sa=="32"} ))
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DbSetFilter

Beitrag von Jan »

Hallo Hubert,

OK, das werd ich mal versuchen. Ich hatte mir das zu einfach gemacht und das & mit in den Codeblock reingesetzt. Und ja, der Ausdruck kommt aus DbFilter(). Ich möchte vor einigen Operationen den alten Filter auslesen und hinterher wiederherstellen.

Rolf,

Ich weiß schon, wie ich mit DbSetFilter den Filter setze, den nehme ich schon ab und an mal, wenn die wesentlich schnelleren Scopes partout nicht gehen. Aber hier war das Problem der Makrooperator.

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

Re: DbSetFilter

Beitrag von brandelh »

Rolf Ramacher hat geschrieben:HI Jan,

ein Beispiel von mir

Code: Alles auswählen

				Spfolg1->(DbSetFilter({|| substr(Artnr,1,3) >= alltrim(aFelder[10][2]) .and.;
							substr(Artnr,1,3) <= alltrim(aFelder[11][2]) .and.;
							Saison=alltrim(aFelder[6][2]) .and. Sa=="32"} ))
damit das funktioniert, brauchst du aber PRIVATE Variablen (aFelder[]) oder ?
Ich baue den String aus lokal Variablen zusammen und generiere dann local codeblocks.
Privates gibt es bei mir nicht mehr und Publics eigentlich auch nicht. ;-)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: DbSetFilter

Beitrag von Jan »

Hallo Hubert,
Hubert hat geschrieben:Privates gibt es bei mir nicht mehr und Publics eigentlich auch nicht. ;-)
Womit wir wieder bei der allseits beliebten Diskussion sind 8) . Aber ich muß gestehen: Privates habe ich inzwischen auch komplett rausgeschmissen. Die hatte ich als letztes Überbleibsel noch in der Schleifenabarbeitung von SLE. Aber Publics habe ich schon noch ein paar. Aber auch reduziert gegenüber früher.

Eben in vielen Fällen eine philosophische Frage. Und eine Sache der Gewohnheit und Vorlieben. Siehe meine Frage von evrganegener Woche. Was nimmt man als "ungleich"? <>, #, oder !=? Oder lieber IF - Elseif - Else - Endif oder lieber Do Case -Case - Endcase. Oder um wie viele Leerzeichen rücke ich in Schleifen ein? Und immer der gleiche Wert, egal ob If, Case oder Next? Am besten das, womit man am Besten klarkommt.

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

Re: DbSetFilter

Beitrag von brandelh »

Hallo Jan,

ich wollte ja nur erwähnen, dass es so mit locals nicht geht und mit Arrays immer der letzte Wert käme (das war auch vor kurzem ;-) )

Der Rest (if oder do case und Einrücken) ist wirklich Geschmackssache ...
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: DbSetFilter

Beitrag von Rolf Ramacher »

Hi,

also aFelder ist schon lokal definiert. Wobei ich in manchen Dingen das Array an weitere Function weitergeben und mit
Return wieder erhalte.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: DbSetFilter

Beitrag von Lewi »

Hi Hubert,
es besteht auch die Möglichkeit, eine Filterbedingung mittels von lokalen Variablen zusammen zu setzen:

Code: Alles auswählen

   Local cFilter     := ""
   Local set         := .F.
   Local cStr        := ""
   LOcal aSearch       := Array(4)

   aSearch[ 1]   := date()-100
   aSearch[ 2]   := date()
   aSearch[ 3]   := "Test"
   aSearch[ 4]   :=  123


   set       := .F.
   cFilter   := ""

   // Beipspiel Datum
   IF ( !empty( aSearch[1] ) )
      aSearch[1]     := chr(39) + DTOS( aSearch[1] ) +chr(39)
      cCondition  := IIF( empty( aSearch[2]),"=" ,">=" )
      cFilter     := "DTOS( FIELD->DATUM) " + cCondition + aSearch[1]
      Set         := .T.
   END

   IF ( !empty( aSearch[2] ) )
      aSearch[2] := chr(39) + DTOS( aSearch[2] ) +chr(39)
      cStr           := " DTOS(FIELD->DATUM) <= "  + aSearch[2]
      IF ( set )
         cFilter   := cFilter + " .and. " + cStr
      ELSE
         cFilter   := cStr
         set := .T.
      END

   END

   // Beispiel Nr
   IF ( !empty( aSearch[4] ) )
      aSearch[4] := Str(aSearch[4],1)
      cStr  :=  " FIELD->NR = " + aSearch[4]
      IF ( set )
         cFilter := cFilter + " .and. " + cStr
      ELSE
         cFilter := cStr
         set := .T.
      END
   END

   // Beispiel String
   IF ( !empty( aSearch[3] ) )
      cStr :=  " FIELD->NAME = " +chr(39) +  aSearch[3] +chr(39)
      IF ( set )
         cFilter := cFilter + " .and. " + cStr
      ELSE
         cFilter := cStr
         set := .T.
      END
   END

   IF Set
      DBSetFilter( {||  &( cFilter )   }   )
   ENDIF

Gruß, Olaf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: DbSetFilter

Beitrag von brandelh »

Hallo Olaf,

so ähnlich mache ich es ja auch: Felder mit Alias in den Text und Suchbegriffe aus den local Variablen als Text einsetzen und dann alles mit &() übersetzen. Du baust die {|| } halt später ein.

Was mich oben stutzig macht, ist dass im Codeblock eine local Variable ... :? ... :shock: oh es rieselt der Kalk. :evil:
Ich hatte es verwechselt mit:

Code: Alles auswählen

local cSuchbegriff := "Test"
local cFilter         := "dbf->Name = cSuchbegriff"
set filter to &(cFilter) -> hier ist dann zur Laufzeit cSuchbegriff unknown ...
Sorry Rolf,

natürlich geht dein Beispiel auch mit Locals ;-)
Gruß
Hubert
Antworten