Functie Checkfilter - één keuzeveld - zoeken in twee velden

  • Onderwerp starter Onderwerp starter jhdw
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

jhdw

Gebruiker
Lid geworden
15 dec 2012
Berichten
166
Goedenavond,
Ik heb weer eens een uitdaging.
Een paar weken terug heb ik via Octafish een code ontvangen die ik nu ook in een andere dB wil toepassen. Het is de functie Checkfilter waarmee je op bijv. keuzelijsten, listboxes enz. kunt filteren.
Nu heb ik een dB waarin ik o.a. één keuzelijst met invoervak (kzl_dealer) heb die als Rowsource een UNION query heeft. Ik wil graag 2 velden (Best_dealer_ID en Ontv_dealer_ID) in één keuzelijst hebben. Dat is wel gelukt.

Code:
SELECT tbl_klacht.Best_dealer_ID,  tbl_klacht.Best_dealer, tbl_klacht.Best_plaats 
FROM tbl_klacht GROUP BY tbl_klacht.Best_dealer_ID, tbl_klacht.Best_dealer, tbl_klacht.Best_plaats 
ORDER BY tbl_klacht.Best_dealer 
UNION SELECT  tbl_klacht.Ontv_dealer_ID, tbl_klacht.Ontv_dealer,  tbl_klacht.Ontv_plaaats 
FROM tbl_klacht GROUP BY  tbl_klacht.Ontv_dealer_ID, tbl_klacht.Ontv_dealer, tbl_klacht.Ontv_plaaats;

Het probleem is dat ik in de Tag (extra info) maar naar één veld kan verwijzen, of Best_dealer_ID of Ontv_dealer_ID en ik wil dus op beide velden kunnen filteren.

De RecordSource is:
Code:
SELECT tbl_klacht.ID_klacht, tbl_klacht.Reg_datum, tbl_klacht.Reg_nummer, tbl_klacht.Oorzaak_ID, tbl_klacht.Afh_datum, 
tbl_klacht.Best_dealer_ID, tbl_klacht.Best_dealer, tbl_klacht.Best_plaats, tbl_klacht.Best_nummer, tbl_klacht.Best_aantal, tbl_klacht.Best_omsch, tbl_klacht.Best_ink_st_prijs, tbl_klacht.Best_inkoop, 
tbl_klacht.Ontv_dealer_ID, tbl_klacht.Ontv_dealer, tbl_klacht.Ontv_plaaats, tbl_klacht.Ontv_nummer, tbl_klacht.Ontv_aantal, tbl_klacht.Ontv_omsch, tbl_klacht.Ontv_ink_st_prijs, tbl_klacht.Ontv_inkoop,
 tbl_klacht.Nal_nummer, tbl_klacht.Nal_aantal, tbl_klacht.Nal_actie_ID, tbl_klacht.Nal_datum, tbl_klacht.Ret_nummer, tbl_klacht.Ret_aantal, tbl_klacht.Ret_actie_ID, tbl_klacht.Ret_datum, tbl_klacht.Opmerkingen, 
Year([Reg_datum]) AS kJaar, DatePart('q',[Reg_datum]) AS Kw_reg_datum, Month([Reg_datum]) AS K_maand FROM tbl_klacht ORDER BY tbl_klacht.Reg_nummer DESC;

De vraag is of dit mogelijk is met deze functie?

Alvast bedankt voor de hulp.
Gr. Jan
 
Je kunt in een tag best naar meer velden verwijzen, mits je er maar een systeem tegenaan gooit. Iets vergelijkbaars heb je trouwens ook bij het OpenArgs argument van formulieren waar je er maar één van hebt.
Mijn truc is simpel: scheid de velden door een vast teken en controleer daar vervolgens op in de functie. Gebruik bijvoorbeeld als tag: [Veld1]|[veld2] om twee velden mee te geven.
In de functie controleer je of het scheidingsteken aanwezig is in de tag (alleen dan hoef je te splitsen) met de functie Instr > 0 en als het scheidingsteken aanwezig is gebruik je de functie Split om een loop te maken die net zo vaak het filter uitvoert als er elementen zijn in de array die je maakt.
De Instr is zelfs niet eens nodig, want als je Split gebruikt en er is geen scheidingsteken, is er maar één element in de array. En dan kun je nog steeds een lus gebruiken, die dan maar één keer wordt uitgevoerd.
 
Goedenavond Michel,

Bedankt voor je reactie, zo laat op de avond.

Ik heb maar een voorbeeldje in elkaar gedraaid want ik weet niet hoe hier aan te beginnen. De velden die voor de vraag niet van belang zijn heb ik onzichtbaar gemaakt. De keuzelijst en de velden waarin gezocht moet worden zijn geel gemarkeerd.

Bekijk bijlage Test_helpmij.rar

Alvast bedankt voor de geboden hulp.

Gr, Jan
 
Hallo Michel,

Als je "geurtop" :D het weer doet, zou je dan nog eens naar mijn vraag willen kijken?

Alvast bedankt.

Gr. Jan
 
No problem. De geurtop ligt op de afvalophaling, maar de SSD zit nu in een andere laptop, dus ik kan weer enigszins werken :).
 
Hallo Michel,

Ik neem aan dat het afval opgehaald is.:)
Zou je nog een blik op mijn probleem willen werpen?
Het lijkt er op dat niemand anders een oplossing ziet.

Alvast bedankt en een prettige wedstrijd vanavond.

Gr. Jan
 
Ik heb inmiddels een nieuwe laptop, waar mijn oude schijf in zit. Krijg je dat gelazer dat Windows niet wil activeren, maar dat staat hier even buiten :). Ik kan deze week dus weer naar je vraag kijken!
 
Goedemorgen Michel,

Helaas voor mij is dit fantastische forum te populair;).
Er zijn heel mensen die hier een beroep doen op de kennis van access specialisten.

Zou je ook nog eens naar mijn vraag willen kijken.
Je weet de spanning wel goed op te bouwen:D

Gr. Jan
 
Heb je gelijk in, ik ben ook veel te druk geweest de laatste tijd. Ik pak de draad weer op dit weekend!
 
Hallo Michel,

Heb je nog een blik over om (even) op mijn vraag te werpen:).
Aan de (geen) reacties te zien is het blijkbaar een lastige vraag.

Alvast bedankt voor de medewerking.

Gr. Jan
 
Was een lang weekend :). Laten we de draad weer eens oppakken, en het probleem bekijken. Ik had je db nog ergens staan op mijn werk (hoop dat het de goede versie is), maar daar zie ik een andere query staan dan je in bericht #1 beschrijft. Geen UNION namelijk. En de tabel tblKlachten ontbreekt in mijn db. Da's dus maar goed ook want ik kan die query niet draaien.

Een meervoudig zoekveld opgeven is niet zo moeilijk, dan zet je dit in de <Extra info>: Best_dealer_ID\Ontv_dealer_ID. Je scheidt de twee velden dus met een backslash (\). Als je vervolgens in de functie kijkt, dan zie je dat je dan een veldenconstructie krijgt die erg lijkt op die van een gewone keuzelijst, alleen werkt die keuzelijst op de inhoud, niet op de velden. Dus een kleine aanpassing is dan nodig. Je zult misschien nog ergens willen aangeven of je op één veld (van de twee) of beide velden wilt filteren, maar dat laat ik aan jou over. Eerst de oplossing voor beide velden. Die is dus eigenlijk simpel: op basis van de \ moet je een lus maken die voor elke waarde in de string het filter toevoegt. Krijg je iets als:

Code:
Case acComboBox
    If LCase(Left(.Name, 10)) = "Keuzelijst" Then
        iFltr = iFltr + 1
        If Not .Value = "" Then
            If InStr(1, .Tag, "\") > 0 Then
                tmpVeld = Split(.Tag, "\")
                For y = LBound(tmpVeld) To UBound(tmpVeld)
                    x = x + 1
                    If x = 1 Then
                        ReDim sTekst(x)
                    Else
                        ReDim Preserve sTekst(x)
                    End If
                    If Right(.Name, 2) = "mv" Then
                        sTekst(x) = tmpVeld(y) & ".Value|" & .Value & "|" & .Name
                    Else
                        sTekst(x) = tmpVeld(y) & "|" & .Value & "|" & .Name
                    End If
                Next y
            Else
                x = x + 1
                If x = 1 Then
                    ReDim sTekst(x)
                Else
                    ReDim Preserve sTekst(x)
                End If
                If Right(.Name, 2) = "mv" Then
                    sTekst(x) = .Tag & ".Value|" & .Value & "|" & .Name
                Else
                    sTekst(x) = .Tag & "|" & .Value & "|" & .Name
                End If
            End If
        End If
    End If
Niet getest hè, ik heb de db niet :). Maar dat idee dus: je kijkt of de keuzelijst het scheidingsteken bevat in de tag, en als dat zo is dan loop je door de opties heen en bouw je elke keer een volgend filter op.
 
Hallo Michel,

Bedankt voor je reactie.
Ik heb de code toegevoegd, helaas loop ik tegen een foutmelding aan: er wordt een matrix verwacht.
Als je nog een keer tijd hebt, zou je dan nog eens willen kijken.
Ik heb het bestandje weer toegevoegd.
Het is ook de bedoeling dat de keuze in de keuzelijst met invoervak (dealer) bepaald wordt door de keuze in het groepsvak status: probleem is afgehandeld, staat nog open of alles.

Bekijk bijlage Test_helpmij.part01.rarBekijk bijlage Test_helpmij.part02.rar

Alvast bedankt voor het meedenken.

Gr. Jan
 
Ik zal er dit weekend naar kijken.
 
Hallo Michel,

Goed weekend gehad?:)

Ik ben zelf ook nog met een andere dB bezig die meer prioriteit heeft, vandaar dat ik niet eerder de behoefte had om te reageren.
Zou je nog een keer naar mijn willen kijken?

Alvast bedankt voor de moeite.

Gr. Jan
 
Lang weekend :). Dit is zo'n database waarvan ik al moe word als ik er naar kijk, vrees ik. Hij zit voor mijn gevoel zó onlogisch in elkaar, dat het mij veel energie kost om mij in de gedachte er achter te verdiepen. En je snapt, dat dat bepaald niet helpt om er snel een oplossing voor te vinden. Zo zit ik er nu al weer een half uur naar te kijken, en die tijd had ik ook naar een cricket wedstrijd kunnen kijken; daar snap ik ook niets van.
Kun je de vraag nog eens goed omschrijven? Dat helpt wellicht.
Even ter info, zodat je wat beter weet wat ik wil weten: de keuzelijst met dealers bevat alleen de dealer gegevens (ID en naam). Nu wil je die dealers blijkbaar filteren op basis van een groepsvak, maar dan moet er wél iets te filteren zijn. Je filtert nu wel de bron van het formulier met dat groepsvak, maar ik kan me niet voorstellen dat je de dealer lijst er ook mee wilt filteren.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan