DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Manfred »

Hi,

ich habe ein Problem mit einem Filter. Eine Db kann in verschiedenen Varianten gefiltert werden. Leider habe ich keine Idee, wie ich den zu einer bestimmten Zeit vorhandenen Filter abfrage, bzw. auswerte. Mit DbFilter() kann ich zwar fragen, was da jetzt los ist, aber der gesamte Filter steht nacheinander dort drin.

Dbsetfilter( {|| lBedingung1 .and. lBedingung2 })

als nächstes könnte ein DbSetFilter( || lBedingung3 }) kommen, aber das soll einmal hinzugefügt werden, oder wenn noch kein Filter gesetzt wurde, dann eben alleine bleiben.

Wenn der 3., oder (1 und 2) entfernt werden sollen, dann muß der jeweils andere erhalten bleiben.

Es gibt aber kein Additive oder so bei den Filtern, oder übersehe ich da was. Damit wäre zumindest 1 Problem gelöst.
Zuletzt geändert von Manfred am Mi, 07. Apr 2010 13:32, insgesamt 1-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Re: DBSETFILTER() später ergänzen abfragen

Beitrag von Martin Altmann »

Manfred,
wenn Du Dir angewöhnst, bei DBSetFilter() zusätzlich zum Codeblock auch den entsprechenden String mit anzugeben, so kannst Du diesen mittels DbFilter() erhalten. Diesen dann einfach auswerten und den neuen Filterausdruck dazu bauen und mittels DbSetFilter() neu setzen.

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBSETFILTER() später ergänzen abfragen

Beitrag von Manfred »

Hi Martin,

das mache ich ja. Den bekomme ich ja auch zurückgeliefert. Aber wie soll ich den auswerten?

ich bekomme sowas zurück. Was sol ich damit anfangen?

Code: Alles auswählen

"(oUmlaufplanVarianten:nArea)->tagesartnr = (oTagesarten:nArea)->nummerint .AND. (oUmlaufplan:nArea)->von >= (oUmlaufplanVarianten:nArea)->gueltigvon .AND. (oUmlaufplan:nArea)->bis <= (oUmlaufplanVarianten:nArea)->gueltigbis"
der wird ja länger um den neuen Filterausdruck. Und dann?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Re: DBSETFILTER() später ergänzen abfragen

Beitrag von Martin Altmann »

Neuer dazu :arrow: ranhängen.
Du könntest auch Deine Filterausdrücke als einzelne Arrayelemente speichern und das Array durchgehen, um Deinen Filterausdruck zusammen zu bauen. Kommt einer hinzu, wird ein Element angehangen und der Filter komplett neu gebaut.
Wird einer entfernt, wird das Element gelöscht und der Filter komplett neu aufgebaut.
Oder Du machst das so, wie ich:
Zwischenablage01.jpg
Zwischenablage01.jpg (76.36 KiB) 4248 mal betrachtet
Oben kann jeder einzelne Filterausdruck modifiziert werden und der Filter insgesamt (rechts am Rand) ein- und ausgeschaltet werden. In dem Beispiel werden nur Einnahmen ungleich 0,00 angezeigt. Andere Filter sind momentan nicht angegeben.
Wann immer was in einem der oberen "Filterfelder" geändert wird, wird der gesamte Filterausdruck neu zusammengebaut (sofern rechts die Checkbox angewählt ist).

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBSETFILTER() später ergänzen abfragen

Beitrag von Manfred »

Aha,

das dachte ich mir. Ich wollte nur verhindern, dass ich nachher gesagt bekomme: "hätteste mal gefragt, das geht ganz einfach."
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DBSETFILTER() später ergänzen abfragen

Beitrag von Tom »

Hallo, Manfred.

Man kann das - etwas unelegant, aber wirksam - über Makros und SET FILTER TO lösen, also ohne Codeblöcke.

Code: Alles auswählen

cBedingung1 := "(kd->nummer = nNummer)"
cBedingung2 := "(Left(kd->name) = 'A')"
cBedingung3 := "(kd->umsatz > 10000)"

SET FILTER TO &cBedingung1 .AND. &cBedingung2 .AND. &cBedingung3 // setzt den Filter auf alle

? DbFilter() // gibt den Ausdruck aufgelöst zurück (kd->nummer = nNummer) .AND. ....

SET FILTER TO // löscht den Filter, weil was Neues passiert ist
* neuen Filter abhängig davon bauen, ob die Bedingungen etwas enthalten:
SET FILTER TO IF(!Empty(cBedingung1),&cBedingung1,(.T.)) .AND. IF(!Empty(cBedingung2),&cBedingung2,(.T.)) ...
DbGoTop()
usw. Ins Blaue und sehr simpel, sollte aber funktionieren.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBSETFILTER() später ergänzen abfragen

Beitrag von Manfred »

Hi ihr beiden,

Martin hat mich auf den richtigen Weg gebracht. Ich kille jedesmal den Filter und baue ihn immer wieder neu auf. Mit entsprechenden Flags weiß ich dann was ich zusammensetzen muß. War mal wieder alles zu simpel, um selbst darauf zu kommen. :angry4:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Manfred »

Moin,

es klappt doch noch nicht so, wie ich mir es gedacht hatte.
Oben (im Thread hier) in der Angabe für den Filter, stehen Variablen, die als Parameter der Funktion übergeben werden. Das klappt auch soweit, aber nur wenn ich den Filter nicht über makros mache. Sobald ich den String in ein makro packe, dann gibt es eine Fehlermeldung, wenn ich mich in der Datenbank bewege. Unbekannte Variable oUmlaufplanVarianten. Ich denke mal, da muß wieder beim makro auf Local Vars geachtet werden. Aber ich kriege es nicht gebacken, wie ich denn den String definieren muß. In dem Filterausdruck steht danach der richtige String. Aber sobald er damit auf die DB zugreift, knallt es.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Martin Altmann »

Schöne Aussage :!: Glaub ich Dir sogar 8)
Nur - woher sollen wir wissen, wie Du es versuchst :?:
Sourcen, wir wollen sourcen sehen... tschalalalalaaaa

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Manfred »

jaja, iss ja schon klar

Code: Alles auswählen

FUNCTION umlaufplanVariantenFiltern(oUmlaufplanVarianten,oTagesarten,oUmlaufplan,oUmlaufroh2umlauf)
         LOCAL cText := ""
         LOCAL nWert := 0

         MEMVAR bText

         (oUmlaufPlanVarianten:nArea)->(DbClearFilter())                        // erstmal wird alles entfiltert
         IF oUmlaufplan:lFilterTagesarten
            cText := "(oUmlaufplanVarianten:nArea)->tagesartnr = (oTagesarten:nArea)->nummerint .AND. (oUmlaufplan:nArea)->von >= (oUmlaufplanVarianten:nArea)->gueltigvon .AND. (oUmlaufplan:nArea)->bis <= (oUmlaufplanVarianten:nArea)->gueltigbis"
            nWert += 1
         ENDIF
         IF oUmlaufplan:lFilterUmlaufVarianten
            IF Empty(cText)
               cText := "(oUmlaufroh2umlauf:nArea)->idulrohdat <> (oUmlaufplanVarianten:nArea)->id"
            ELSE
               cText += ".and. (oUmlaufroh2umlauf:nArea)->idulrohdat <> (oUmlaufplanVarianten:nArea)->id"
            ENDIF
            nWert += 2
         ENDIF
         IF ! Empty(cText)
            bText := "{||" + cText + "}"
            (oUmlaufPlanVarianten:nArea)->(DbSetFilter( &bText ))    <---- das hier meinte ich

         ENDIF
         (oUmlaufplanVarianten:nArea)->(DbGoTop())
         RETURN(.T.)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Martin Altmann »

Moin,
der Einfachheit halber (für mich) mal einfach mein source zu dem Screenshot von mir:

Code: Alles auswählen

	if lOK .and. .not. ( empty( ::dDATUM ) .and. ( val( ::nCODE ) == 0 ) .and. empty( ::cVORGANG ) .and. ( val( ::nABTEILUNG ) == 0 ) .and. ( val( ::nMITGLIED ) == 0 ) .and. ( val( ::nBELEG ) == 0 ) .and. ( ::lBAR == XBP3STATE_IDLE ) .and. ( ::lEINNAHME == XBP3STATE_IDLE ) .and. ( ::lBETRAG == XBP3STATE_IDLE ) )
		cFilter := ""
		if .not. empty( ::dDATUM )
			cFilter += '( DATUM == CtoD( "' + var2char( ::dDATUM ) + '" ) )'
		endif
		if val( ::nBELEG ) > 0
			if .not. empty( cFilter )
				cFilter += " .and. "
			endif
			cFilter += "( BELEG == " + var2char( ::nBELEG ) + " )"
		endif
		if val( ::nCODE ) > 0
			if .not. empty( cFilter )
				cFilter += " .and. "
			endif
			cFilter += "( CID == " + var2char( ::nCODE ) + " )"
		endif
		if .not. empty( ::cVORGANG )
			if .not. empty( cFilter )
				cFilter += " .and. "
			endif
			cFilter += '( at( upper( "' + alltrim( ::cVORGANG ) + '" ), upper( BEZEICHNUN ) ) > 0 )'
		endif
		if val( ::nABTEILUNG ) > 0
			if .not. empty( cFilter )
				cFilter += " .and. "
			endif
			cFilter += "( AID == " + var2char( ::nABTEILUNG ) + " )"
		endif
		if val( ::nMITGLIED ) > 0
			if .not. empty( cFilter )
				cFilter += " .and. "
			endif
			cFilter += "( MID == " + var2char( ::nMITGLIED ) + " )"
		endif
		if ::lBAR <> XBP3STATE_IDLE
			if .not. empty( cFilter )
				cFilter += " .and. "
			endif
			if ::lBAR == XBP3STATE_UNSELECTED
				cFilter += " .not. "
			endif
			cFilter += "BAR"
		endif
		if ::lEINNAHME <> XBP3STATE_IDLE
			if .not. empty( cFilter )
				cFilter += " .and. "
			endif
			if ::lEINNAHME == XBP3STATE_UNSELECTED
				cFilter += " .not. "
			endif
			cFilter += "EINNAHME"
		endif
		if ::lBETRAG <> XBP3STATE_IDLE
			if .not. empty( cFilter )
				cFilter += " .and. "
			endif
			if ::lBETRAG == XBP3STATE_UNSELECTED
				cFilter += " .not. "
			endif
			cFilter += "( BUCHBETRAG == 0 )"
		endif
		( ::dbSelect )->( DbSetFilter( { || &(cFilter) }, cFilter ) )
	else
		( ::dbSelect )->( DbClearFilter() )
	endif
Entscheidend ist, dass der gesamte Ausdruck eine einfache Zeichenkette ist und die Inhalte der Variablen drin stehen (und nicht die Bezeichnungen!)

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Manfred »

Hm,

das verstehe ich jetzt nicht so ganz. Wenn die Werte der Variablen drin stehen, dann steht da ein .T. oder ein .F. das kann es doch nicht sein.
Meinst Du jetzt den fertigen String cFilter, wenn man nach der Zusammensetzerei im Debugger anschaut?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Martin Altmann »

Yup - den meine ich!
Und ein .T. bzw. .F. bedeutet doch (wie Du bei mir sehen kannst) einfach nur:

Code: Alles auswählen

if .not. empty( cFilter )
    cFilter += " .and. "
endif
if ::lBAR == XBP3STATE_UNSELECTED
   cFilter += " .not. "
endif
cFilter += "BAR"
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Manfred »

Nix,

wenn ich es so mache, wie Du es mir vorgeschlagen hast, ändert sich nichts. Der Fehler bleibt der gleiche. Irgendwo denke ich da falsch.

hilf mir bitte mal weiter. Wie muß ich das jetzt korrekt machen?

Code: Alles auswählen

cText := "(oUmlaufplanVarianten:nArea)->tagesartnr = (oTagesarten:nArea)->nummerint .AND. (oUmlaufplan:nArea)->von >= (oUmlaufplanVarianten:nArea)->gueltigvon .AND. (oUmlaufplan:nArea)->bis <= (oUmlaufplanVarianten:nArea)->gueltigbis"
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Martin Altmann »

Manfred,
was sind denn (oUmlaufplanVarianten:nArea) und (oTagesarten:nArea) und (oUmlaufplan:nArea)? Sind das die entsprechenden Selectbereiche?
Wenn ja, nimm die Nummern statt der Variablen in den Klammern!
Also:

Code: Alles auswählen

cText := "(" + var2char( oUmlaufplanVarianten:nArea ) + ")->tagesartnr = (" + var2char( oTagesarten:nArea ) + ")->nummerint .AND. (" + var2char( oUmlaufplan:nArea ) + ")->von >= (" + var2char( oUmlaufplanVarianten:nArea ) + ")->gueltigvon .AND. (" + var2char( oUmlaufplan:nArea ) + ")->bis <= (" + var2char( oUmlaufplanVarianten:nArea ) + ")->gueltigbis"
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DBSETFILTER() später ergänzen abfragen [ERLEDIGT]

Beitrag von Manfred »

Hi Martin,

jetzt verstehe ich was Du gemeint hast. Da wäre ich nie drauf gekommen. Ich dachte ich müßte irgendwie die xxx:nArea kapseln oder so. Ja, das ist natürlich genial und auch verständlich.

Danke, das hat mir jetzt geholfen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten