PDA

Vollständige Version anzeigen : mit Kombifeldern filtern


andreas3366
19.10.2001, 20:56
Hallo Leute,
ich habe folgendes Problem. Ich möchte gern mit 3 Kombifeldern Datensätze aus einer großen Tabelle filtern. In den Kombifeldern möchte ich gern jeweils eintragen "Auftragsnummer" "Woche" und "Datum" nach diesen drei Kriterien möchte ich gerne die Tabelle filtern. Mein Problem ist nun, das wenn ich nun in einem Feld etwas eintrage das in den anderen Feldern danach auch nur eine bestimmte Auswahl angezeit wird. Beispiel: ich trage im Feld Woche ein Wert ein, und beiden anderen Felder sollen nur noch eine entsprechen Anzahl von Werten anzeigen. Und danach soll das Ganze noch die Tabelle filtern.

Grüße und Danke im Voraus
andreas

elmar
19.10.2001, 21:07
Hallo Andreas,
warscheinlich sind Deine Kombifelder "gebunden", also mit einem Steuerelemtinhalt.
---------------
Falls nein: Was macht das 1. Kombo bei der Eigenschaft "Nach Aktualisierung"?? Startet dann schon der 1. Filter??
---------------
Was Du brauchst ist eine Zuweisung der Datenherkunft Deines Forms, die auf den Einstellungen aller 3 Kombos basiert.
Das geht nur mit ungebundenen Kombos, wobei noch zu überlegen wäre, welchem Kombo (dem dritten?) nach dessen Ausfüllen die Aufgabe zu übertragen wäre, die Datenherkunft des Forms nue zu setzen.
Am besten eignet sich dafür eine Befehlsschaltfläche, welche auf einen Klick hin prüft, ob alle drei Kombos ausgefüllt sind und dann daraus eine Abfrage generiert, die dann als Filter dem Form zugewiesen wird.
Eine weitere Schaltfläche könnte dem Form wieder die "normale" Datenherkunft zuweisen.
---
Falls das jetzt ein bisserl viel ist, kannst Du mir ggf. die DB gezippt mal zumailen.
Gruß
Elmar

Thomas Hempel
19.10.2001, 21:39
Hi Andreas,

ich poste mal den Formularcode, mit dem ich das mache:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Compare</span> <span class="TOKEN">Database</span>
<span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Dim</span> gstrMitarbeiter, gstrDatum, _
gstrVerbindlichkeit, gstrKontaktform, _
gstrMitarbeiterin <span class="TOKEN">As</span> Variant
<span class="TOKEN">Dim</span> strFilter <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="REM">'--------------------------------------------------------------------------------</span>
<span class="TOKEN">Sub</span> FilterAdd(strKriterium)
<span class="TOKEN">If</span> Nz(Len(strKriterium), 0) = 0 <span class="TOKEN">Then</span> <span class="TOKEN">Exit Sub</span>
<span class="TOKEN">If</span> Nz(Len(strFilter), 0) = 0 <span class="TOKEN">Then</span>
strFilter = strKriterium
<span class="TOKEN">Else</span>
strFilter = &quot;(&quot; &amp; strFilter &amp; &quot;) AND (&quot; &amp; strKriterium &amp; &quot;)&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
<span class="TOKEN">Sub</span> Filter_bilden()
<span class="TOKEN">Dim</span> strKriterium <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> Beginn, Ende
<span class="TOKEN">Dim</span> ctrlFilterFeld <span class="TOKEN">As</span> <span class="TOKEN">Control</span>
&nbsp;
<span class="TOKEN">On Error GoTo</span> HandleErr
strFilter = &quot;&quot;
<span class="TOKEN">Set</span> ctrlFilterFeld = Me!cmbFilterKontaktform
<span class="TOKEN">If</span> Nz(ctrlFilterFeld, 0) = 0 <span class="TOKEN">Then</span>
GoTo Datum
<span class="TOKEN">Else</span>
<span class="REM">' Select Case ctrlFilterFeld.Column(1, ctrlFilterFeld.ListIndex)</span>
Select Case ctrlFilterFeld.Value
Case &quot;alle&quot;
strKriterium = &quot;&quot;
<span class="TOKEN">Case Else</span>
strKriterium = ctrlFilterFeld.Column(1, ctrlFilterFeld.ListIndex)
strKriterium = &quot;[Kontaktform] = '&quot; &amp; strKriterium &amp; &quot;'&quot;
<span class="TOKEN">End</span> Select
FilterAdd (strKriterium)
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Datum:
<span class="TOKEN">Set</span> ctrlFilterFeld = Me!cmbFilterDatum
<span class="TOKEN">If</span> Nz(ctrlFilterFeld, 0) = 0 <span class="TOKEN">Then</span>
GoTo Verbindlichkeit
<span class="TOKEN">Else</span>
Select Case ctrlFilterFeld.Value
Case &quot;alle&quot;
strKriterium = &quot;&quot;
Case &quot;Benutzerdefiniert&quot;
strKriterium = &quot;&quot;
Beginn = InputBox(&quot;Berichtsbeginn:&quot;, AppName)
Ende = InputBox(&quot;Berichtsende:&quot;, AppName)
strKriterium = &quot;(&quot; &amp; BuildCriteria(&quot;Datum&quot;, dbDate, &quot;&gt;=&quot; _
&amp; Beginn) &amp; &quot;) AND (&quot; _
&amp; BuildCriteria(&quot;Datum&quot;, dbDate, &quot;&lt;=&quot; _
&amp; Ende) &amp; &quot;)&quot;
<span class="TOKEN">Case Else</span>
strKriterium = ctrlFilterFeld.Column(1, ctrlFilterFeld.ListIndex)
strKriterium = strKriterium &amp; &quot;[Datum]&quot;
strKriterium = strKriterium &amp; ctrlFilterFeld.Column(2, ctrlFilterFeld.ListIndex)
<span class="TOKEN">End</span> Select
FilterAdd (strKriterium)
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Verbindlichkeit:
<span class="TOKEN">Set</span> ctrlFilterFeld = Me!cmbFilterVerbindlichkeit
<span class="TOKEN">If</span> Nz(ctrlFilterFeld, 0) = 0 <span class="TOKEN">Then</span>
GoTo Mitarbeiterin
<span class="TOKEN">Else</span>
Select Case ctrlFilterFeld.Value
Case &quot;alle&quot;
strKriterium = &quot;&quot;
<span class="TOKEN">Case Else</span>
strKriterium = ctrlFilterFeld.Column(1, ctrlFilterFeld.ListIndex)
strKriterium = &quot;[Verbindlichkeit] = '&quot; &amp; strKriterium &amp; &quot;'&quot;
<span class="TOKEN">End</span> Select
FilterAdd (strKriterium)
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Mitarbeiterin:
<span class="TOKEN">Set</span> ctrlFilterFeld = Me!cmbFilterMitarbeiterin
<span class="TOKEN">If</span> Nz(ctrlFilterFeld, 0) = 0 <span class="TOKEN">Then</span>
GoTo Filter
<span class="TOKEN">Else</span>
Select Case ctrlFilterFeld.Value
Case &quot;alle&quot;
strKriterium = &quot;&quot;
<span class="TOKEN">Case Else</span>
strKriterium = ctrlFilterFeld.Column(1, ctrlFilterFeld.ListIndex)
strKriterium = &quot;[MA_Name] = '&quot; &amp; strKriterium &amp; &quot;'&quot;
<span class="TOKEN">End</span> Select
FilterAdd (strKriterium)
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Filter:
<span class="TOKEN">If</span> Nz(Len(strFilter), 0) &gt; 0 <span class="TOKEN">Then</span>
DoCmd.ApplyFilter , strFilter
<span class="TOKEN">Else</span>
Me.Filter = &quot;&quot; <span class="REM">'funktioniert leider nicht, Filter wird nur ausgeschaltet</span>
Me.FilterOn = <span class="TOKEN">False</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> (Me.Recordset.EOF) <span class="TOKEN">Then</span>
Me!Chiffre.SetFocus
<span class="TOKEN">Else</span>
MsgBox &quot;Keine Leistungen f&uuml;r diesen Filter&quot;, vbInformation, AppName
<span class="REM">''''''''''''Filter auf alle setzen!</span>
gstrMitarbeiter = &quot;alle&quot;
gstrDatum = &quot;alle&quot;
gstrKontaktform = &quot;alle&quot;
gstrVerbindlichkeit = &quot;alle&quot;
gstrMitarbeiterin = &quot;alle&quot;
Filter_controls_setzen
<span class="REM">''''''''''''Rekursion!</span>
<span class="REM"> 'nur wenn &uuml;berhaupt Datens&auml;tze vorhanden</span>
<span class="TOKEN">If</span> tbl_has_data(&quot;tblLeistungen&quot;) <span class="TOKEN">Then</span>
Filter_bilden
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
Filter_controls_setzen
ExitHere:
<span class="TOKEN">Exit Sub</span>
&nbsp;
<span class="REM">' Fehlerbehandlungsblock hinzugef&uuml;gt vom Fehlerbehandlungsroutinen-Add-In.</span>
<span class="REM">' Bearbeiten Sie diesen Codeabschnitt NICHT.</span>
<span class="REM">' Automatische Fehlerbehandlungsroutine wurde zuletzt aktualisiert: 08-02-2001 19:57:19 </span>
<span class="REM">'ErrorHandler:$$D=08-02-2001</span>
<span class="REM">'ErrorHandler:$$T=19:57:19</span>
HandleErr:
Select Case Err.Number
<span class="TOKEN">Case Else</span>
MsgBox &quot;Fehler &quot; &amp; Err.Number &amp; &quot;: &quot; &amp; Err.Description &amp; vbCrLf &amp; _
vbCrLf &amp; &quot;Prozedur &quot; &amp; &quot;Form_frmEreignisse.Filter_bilden&quot;, vbCritical, AppName
<span class="REM"> 'ErrorHandler:$$N=Form_frmEreignisse.Filter_bilden</span>
<span class="TOKEN">End</span> Select
<span class="REM">' Ende des Fehlerbehandlungsblocks.</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Chiffre_DblClick(Cancel <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>)
Gehe_zu_Auswahl
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> cmbFilterDatum_AfterUpdate()
gstrDatum = cmbFilterDatum
Filter_bilden
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> cmbFilterKontaktform_AfterUpdate()
gstrKontaktform = cmbFilterKontaktform
Filter_bilden
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> cmbFilterMitarbeiterin_AfterUpdate()
gstrMitarbeiterin = cmbFilterMitarbeiterin
Filter_bilden
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> cmbFilterVerbindlichkeit_AfterUpdate()
gstrVerbindlichkeit = cmbFilterVerbindlichkeit
Filter_bilden
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Datum_DblClick(Cancel <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>)
Gehe_zu_Auswahl
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Detailbereich_DblClick(Cancel <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>)
Gehe_zu_Auswahl
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Sub</span> Gehe_zu_Auswahl()
<span class="TOKEN">Const</span> strFormName = &quot;frmKlientinnen&quot;
<span class="TOKEN">Dim</span> frm <span class="TOKEN">As</span> Form
&nbsp;
<span class="TOKEN">On Error GoTo</span> HandleErr
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> isFormLoad(strFormName) <span class="TOKEN">Then</span>
DoCmd.OpenForm strFormName
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Set</span> frm = Forms(strFormName)
frm.RecordsetClone.FindFirst &quot;[KL_NR] = &quot; &amp; Me![KL_NR]
frm.Bookmark = frm.RecordsetClone.Bookmark
<span class="TOKEN">Set</span> frm = <span class="TOKEN">Nothing</span>
DoCmd.Close acForm, Me.Form.Name, acSaveYes
&nbsp;
ExitHere:
<span class="TOKEN">Exit Sub</span>
&nbsp;
<span class="REM">' Fehlerbehandlungsblock hinzugef&uuml;gt vom Fehlerbehandlungsroutinen-Add-In.</span>
<span class="REM">' Bearbeiten Sie diesen Codeabschnitt NICHT.</span>
<span class="REM">' Automatische Fehlerbehandlungsroutine wurde zuletzt aktualisiert: 03-27-2001 22:14:56</span>
<span class="REM">'ErrorHandler:$$D=03-27-2001</span>
<span class="REM">'ErrorHandler:$$T=22:14:56</span>
HandleErr:
Select Case Err.Number
<span class="TOKEN">Case Else</span>
MsgBox &quot;Fehler &quot; &amp; Err.Number &amp; &quot;: &quot; &amp; Err.Description &amp; vbCrLf &amp; _
vbCrLf &amp; &quot;Prozedur &quot; &amp; &quot;Form_frmEreignisse.Gehe_zu_Auswahl&quot;, vbCritical, _
AppName <span class="REM">'ErrorHandler:$$N=Form_frmEreignisse.Gehe_zu_Auswahl</span>
<span class="TOKEN">End</span> Select
<span class="REM">' Ende des Fehlerbehandlungsblocks.</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Form_Current()
Filter_controls_setzen
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Form_Open(Cancel <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>)
gstrMitarbeiter = &quot;alle&quot;
gstrDatum = &quot;Diese Woche&quot;
<span class="REM">' gstrDatum = &quot;Dieses Quartal&quot;</span>
gstrKontaktform = &quot;alle&quot;
gstrVerbindlichkeit = &quot;stattgefunden&quot;
gstrMitarbeiterin = &quot;alle&quot;
<span class="REM"> '</span>
Filter_controls_setzen
<span class="REM"> '</span>
Me.OrderBy = &quot;qryEreignisse.Datum DESC&quot;
Me.OrderByOn = <span class="TOKEN">True</span>
Filter_bilden
<span class="REM">' Me.FilterOn = True</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
<span class="REM">'--------------------------------------------------------------------------------</span>
&nbsp;
<span class="TOKEN">Private Sub</span> Filter_controls_setzen()
Me!cmbFilterDatum = gstrDatum
Me!cmbFilterKontaktform = gstrKontaktform
Me!cmbFilterVerbindlichkeit = gstrVerbindlichkeit
Me!cmbFilterMitarbeiterin = gstrMitarbeiterin
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>

Das Formular dient zur schnellen Datensatzauswahl, die Filter schränken die Datensatzmenge bequem ein. Läuft bei mir schon lange und stabil.

Die KombiBox Mitarbeiterin hat zum Beispiel folgende Quelle:
SELECT tblMitarbeiterinnen.MA_NR, [Vorname] & " " & [Nachname] AS VollName FROM tblMitarbeiterinnen UNION SELECT htb_alle.ITEM_ID, htb_alle.Itemtext as VollName FROM htb_alle;

Die htb_alle liefert:
ID ITEM_ID Itemtext
1 -1 alle

So baue ich die Filterauswahl zusammen (dafür gibt es auch andere Möglichkeiten und Beispiele.

Ciao