Avatar billede j-kid Praktikant
18. november 2010 - 15:12 Der er 56 kommentarer og
1 løsning

Forespørgsel tom ved flere markeringer i liste

Hej

Har oprettet en forespørgsel som bygger på kriterier i en formular. I formularen har jeg oprettet en liste med kriterier. Det hele virker fint, når jeg ikke tillader mere en én markering i listen. Så snart jeg vælger simpel eller sammensat markering i egenskaberne for listen er resultatet i forespørgslen tom.

Jeg har på fornemmelsen, at det er fordi der databasen skal fortælles, at der skal et "Or" imellem de markerede værdier på listen, men jeg kan bare ikke få det til at virke.
Avatar billede fdata Forsker
18. november 2010 - 21:38 #1
Hvis du har kriterierne stående på samme linie i forespørgselsgitteret, gælder der AND imellem dem. For at få OR, skal de stå på hver sin linie (altså som en trappe).
Avatar billede j-kid Praktikant
18. november 2010 - 22:25 #2
I forespørgslen har jeg nede i kriterierne benyttet udtryksgeneratoren til at skrive, at kriteriet for denne kolonne er lig med inputtet i den liste, som jeg har indsat i formularen. Dvs. at der kun er ét kriterie for hver kolonne.

Noget i stil med [Forms]![Køreliste]![Liste1]

Det virker som sagt fint, hvis der kun markeres én værdi i listen. Jeg forstår ikke i dit svar, hvordan jeg skal få den til at acceptere flere markeringer på listen.
Avatar billede fdata Forsker
19. november 2010 - 13:58 #3
Sorry. Misforstod som om du havde flere uafhængige kriterier (altså på flere felter). Du har flere kriterier på eet felt. Har ingen erfaring her. Bakker ud.
Avatar billede j-kid Praktikant
23. november 2010 - 09:28 #4
Slet ingen der kan hjælpe mig med dette?
Avatar billede neoman Novice
23. november 2010 - 09:58 #5
Jo. Hvis du får lukket dine gamle spørgsmål.
Avatar billede j-kid Praktikant
23. november 2010 - 10:28 #6
Ok sorry. Er ikke den store haj herinde... Havde bare ikke rigtigt fået svar på de gamle spørgsmål, så derfor var de ikke lukket. Det er de nu.
Avatar billede neoman Novice
23. november 2010 - 11:08 #7
Du kan ikke burge quiery designeren når du ahr en listbox som tillader flere valg. Du skal selv hive værdierne ud, og så lave en SQL sætning.

Private Function GetDataFromListBox(myListBox As Control) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
   
    iCount = 0
    sTemp = ""
           
    If myListBox.ItemsSelected.Count <> 0 Then
        For Each oItem In myListBox.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & myListBox.ItemData(oItem)
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & myListBox.ItemData(oItem)
                iCount = iCount + 1
            End If
        Next oItem
        GetDataFromListBox = "(" & sTemp & ") "
'    Else
'        MsgBox "Nothing was selected from the list", vbInformation
'        strSQL = strSQL
'        Exit Function 'Nothing was selected
    End If
    'strip last comma from list
End Function


Og

...

Dim strWhere as String

        strWhere = "[MyField] IN " & GetDataFromListBox(Me!MyListbox)

og derpå

            Me.Filter = strWhere
            Me.FilterOn = True

og så bliver formularen filtreret efter kriterierne.
Avatar billede j-kid Praktikant
23. november 2010 - 11:11 #8
Hvor skal jeg sætte koden ind?
myListBox skal vel erstattes med navnet på liste. Korrekt?
Avatar billede neoman Novice
23. november 2010 - 11:20 #9
Koden skal køre i AfterUpdate-eventet for listboxen.

Ja. Altså kun her:  strWhere = "[MyField] IN " & GetDataFromListBox(Me!MyListbox)
Avatar billede j-kid Praktikant
23. november 2010 - 11:29 #10
Jeg har lagt det første stykke kode ind i "EfterOpdatering" i listeboksen. Jeg har ikke ændret noget i koden.

Hvordan skal det næste lægges ind? Min liste hedder Liste27. Hvordan skal dette præcist sættes ind i sætningen?

Beklager jeg er tung at danse med, men VBA har jeg aldrig arbejdet med.

Dim strWhere as String

        strWhere = "[MyField] IN " & GetDataFromListBox(Me!MyListbox)

og derpå

            Me.Filter = strWhere
            Me.FilterOn = True
Avatar billede neoman Novice
23. november 2010 - 11:32 #11
Private Sub Liste27_AfterUpdate()
  Dim strWhere as String

    strWhere = "[MyField] IN " & GetDataFromListBox(Me!MyListbox)
  Me.Filter = strWhere
  Me.FilterOn = True

End Sub
Avatar billede neoman Novice
23. november 2010 - 11:33 #12
Og dt første stykkle kode er en separat funktion, og den skal  ikke være lagt ind i nogen eventhandler, men være klistret ind uændret.
Avatar billede j-kid Praktikant
23. november 2010 - 11:41 #13
"Og dt første stykkle kode er en separat funktion, og den skal  ikke være lagt ind i nogen eventhandler, men være klistret ind uændret."

Hvor "klistrer" jeg noget ind?
Avatar billede neoman Novice
23. november 2010 - 11:57 #14
Der hvor koden er,...

så du i kodevinduet har:

Option Compare Database
Option Explicit


Private Sub Liste27_AfterUpdate()
  Dim strWhere as String

    strWhere = "[MyField] IN " & GetDataFromListBox(Me!MyListbox)
  Me.Filter = strWhere
  Me.FilterOn = True

End Sub

Private Function GetDataFromListBox(myListBox As Control) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
 
    iCount = 0
    sTemp = ""
         
    If myListBox.ItemsSelected.Count <> 0 Then
        For Each oItem In myListBox.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & myListBox.ItemData(oItem)
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & myListBox.ItemData(oItem)
                iCount = iCount + 1
            End If
        Next oItem
        GetDataFromListBox = "(" & sTemp & ") "
'    Else
'        MsgBox "Nothing was selected from the list", vbInformation
'        strSQL = strSQL
'        Exit Function 'Nothing was selected
    End If
    'strip last comma from list
End FunctionPrivate Function GetDataFromListBox(myListBox As Control) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
 
    iCount = 0
    sTemp = ""
         
    If myListBox.ItemsSelected.Count <> 0 Then
        For Each oItem In myListBox.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & myListBox.ItemData(oItem)
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & myListBox.ItemData(oItem)
                iCount = iCount + 1
            End If
        Next oItem
        GetDataFromListBox = "(" & sTemp & ") "
'    Else
'        MsgBox "Nothing was selected from the list", vbInformation
'        strSQL = strSQL
'        Exit Function 'Nothing was selected
    End If
    'strip last comma from list
End Function
Avatar billede j-kid Praktikant
23. november 2010 - 11:59 #15
Tror jeg har fået sat koden ind nu.

Jeg har sat listeboxen til simpel markering. Hver gang jeg markerer en post bugger den i den her sætning:

Private Sub Liste27_AfterUpdate()
Avatar billede j-kid Praktikant
23. november 2010 - 12:04 #16
Sådan ser alt mit kode ud nu:

Option Compare Database

Private Sub Liste27_AfterUpdate()

Dim strWhere As String

    strWhere = "[MyField] IN " & GetDataFromListBox(Me!myListBox)
  Me.Filter = strWhere
  Me.FilterOn = True

End Function


Private Sub Vis_køreliste_Click()
On Error GoTo Err_Vis_køreliste_Click

    Dim stDocName As String

    stDocName = "Køreliste"
    DoCmd.OpenReport stDocName, acPreview

Exit_Vis_køreliste_Click:
    Exit Sub

Err_Vis_køreliste_Click:
    MsgBox Err.Description
    Resume Exit_Vis_køreliste_Click
   
End Sub

Private Function GetDataFromListBox(myListBox As Control) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
 
    iCount = 0
    sTemp = ""
         
    If myListBox.ItemsSelected.Count <> 0 Then
        For Each oItem In myListBox.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & myListBox.ItemData(oItem)
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & myListBox.ItemData(oItem)
                iCount = iCount + 1
            End If
        Next oItem
        GetDataFromListBox = "(" & sTemp & ") "
'    Else
'        MsgBox "Nothing was selected from the list", vbInformation
'        strSQL = strSQL
'        Exit Function 'Nothing was selected
    End If
    'strip last comma from list
End FunctionPrivate Function GetDataFromListBox(myListBox As Control) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
 
    iCount = 0
    sTemp = ""
         
    If myListBox.ItemsSelected.Count <> 0 Then
        For Each oItem In myListBox.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & myListBox.ItemData(oItem)
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & myListBox.ItemData(oItem)
                iCount = iCount + 1
            End If
        Next oItem
        GetDataFromListBox = "(" & sTemp & ") "
'    Else
'        MsgBox "Nothing was selected from the list", vbInformation
'        strSQL = strSQL
'        Exit Function 'Nothing was selected
    End If
    'strip last comma from list
End Function



Den her linie er rød. Ved ikke om det betyder noget.

End FunctionPrivate Function GetDataFromListBox(myListBox As Control) As String

Den bugger fortsat
Avatar billede neoman Novice
23. november 2010 - 12:04 #17
Jeg tror vi snakker forni hinanden.

Hvis du kigger på egenskaberne for din listbox, hvad vises i feltet EfterOpdatering? Der skal stå Liste27_AfterUpdate og intet andet
Avatar billede neoman Novice
23. november 2010 - 12:05 #18
End FunctionPrivate Function GetDataFromListBox(myListBox As Control) As String

ovenståënde er to linjer lagt sammen. SKal være

End Function

Private Function GetDataFromListBox(myListBox As Control) As String
Avatar billede j-kid Praktikant
23. november 2010 - 12:41 #19
I selve feltet i egenskaberne står der:

[Hændelsesprocedure]

Når jeg åbner den, går den ind i koden og stiller sig i det afsnit, hvor der står:


Private Sub Liste27_AfterUpdate()

Dim strWhere As String

    strWhere = "[MyField] IN " & GetDataFromListBox(Me!myListBox)
  Me.Filter = strWhere
  Me.FilterOn = True

End Function

Er det ikke korrekt?
Avatar billede neoman Novice
23. november 2010 - 12:50 #20
Delvist...

Private Sub Liste27_AfterUpdate()

Dim strWhere As String

    strWhere = "[MyField] IN " & GetDataFromListBox(Me!myListBox)
  Me.Filter = strWhere
  Me.FilterOn = True

End Function <-------- skal være End Sub
Avatar billede j-kid Praktikant
23. november 2010 - 12:56 #21
Okay. Den er også så fintfølende :-)

Nu brokker den sig her.

strWhere = "[MyField] IN " & GetDataFromListBox(Me!myListBox)

Ved godt det er pga. navnet så har rettet den til

strWhere = "[MyField] IN " & GetDataFromListBox(Liste27)

Nu brokker den sig ikke mere, og jeg kan godt vælge flere punkter på listen. Problemet er nu, at forespørgslen medtager alt. Muligvis fordi kriteriefeltet i forespørgslen ikke er korrekt. Hvad skal det hedde?
Avatar billede neoman Novice
23. november 2010 - 12:59 #22
hvad hedder det felt du vil anvende kriteriet på ? Det er det der skal stå i stedet for MyField
Avatar billede j-kid Praktikant
23. november 2010 - 13:06 #23
Nu hedder den

Private Sub Liste27_AfterUpdate()

Dim strWhere As String

    strWhere = "[AUF_WERK_ID] IN " & GetDataFromListBox(Liste27)
  Me.Filter = strWhere
  Me.FilterOn = True

End Sub


Den medtager fortsat poster fra de poster på listen, som ikke er markeret.

Skal kriteriefeltet i forespørgslen være tomt?
Avatar billede j-kid Praktikant
23. november 2010 - 13:08 #24
Selvom der intet er markeret på listen kommer alle poster op. Dvs. at den helt ser forbi listen som kriterie.
Avatar billede neoman Novice
23. november 2010 - 13:19 #25
Hvis din formular fortsat er baseret på en forespørgsel, så skal den forespørgsel ikke sortere på det kriterie du nu har lagt et andet sted, nemlig i koden og i formularens filter.

"Den medtager fortsat poster fra de poster på listen, som ikke er markeret." Hvornår? Npr ofrulamren åbens så er der ikke sat noget kriterie, så det er som dest akl vær. Efter at have valgt i listboxen, s åbliver formualrens filter aktivee i AfterUpdate, og derpå skulle gerne kun de valgte poster vises.
Avatar billede neoman Novice
23. november 2010 - 13:19 #26
Arrgh mit keyboard :-(
Avatar billede j-kid Praktikant
23. november 2010 - 13:40 #27
Hmm ok. Når jeg åbner formularen er der 3 udvælgelseskriterier. Et datofelt og 2 lister. Det er kun den ene liste (Liste27), som vi tester med nu. Datofeltet virker fint og den anden liste er sat op til kun én markering. Virker også fint.

I formularen har jeg en kommandoknap, som åbner en rapport baseret på forespørgslen, som datofeltet og listerne skal referere til.

I kolonnen [AUF_WERK_ID], som Liste27 refererer til, er kriteriefeltet nu tomt. Som jeg forstår dig, skal det være tomt, da den indsatte kode gør, at forespørgslen ved, at [AUF_WERK_ID] skal være lig de markerede værdier i listen.

Problemet er bare, at forespørgslen er helt ligeglad med, hvad der er markeret i listen.

Er der et eller andet sted i koden, hvor jeg mangler at fortælle, at forespørgslen kolonne [AUF_WERK_ID] skal baseres på Liste27 mon?
Avatar billede neoman Novice
23. november 2010 - 14:15 #28
Nu briger du nye ting ind i probelmatikken:

1. Du har en forespørgsel med nogle kriterier.

2. Denne forespørgsel udvælger poster efter kriterier angivet i din formular.

3. Formularen er tillige baseret på forespørgslen, så formularen viser alene de poster som forespørgslen har udvalgt efter de kriterier der er angivet for forespørgslen. Forespørgslen aner intet om nogen Liste27.

4. Derpå, i formularen, laver du et filter baseret på Liste27.  Filteret er knyttet til formularen. Resultatet af dette ændrer intet i forespørgslen, men udvælger FRA forespørgslen de poster som opfylder filterkriteriet og viser alene disse i FORMULAREN. Forespørgslen selv er stadig ubekendt med nogen liste 27. Filteret svare til at køre en forespørgsel ovenpå en forespørgsel (i stedet for på en tabel).


5. Nu vil du have en rapport basereret på samme poster. Så skal rapporten have samme filter.

MitRapportNavn.Filter=strWhere
MitRapportNavn.FilterOn = True
MitRapportNavn.FilterOnLoad=True
Avatar billede j-kid Praktikant
23. november 2010 - 15:23 #29
Det beklager jeg. Min uvidenhed...

"Derpå, i formularen, laver du et filter baseret på Liste27"

Hvordan gør jeg det? Har kigget i hjælp, men der er mange muligheder.

"Nu vil du have en rapport basereret på samme poster. Så skal rapporten have samme filter."

Hvor sætter jeg så det ind?
Avatar billede neoman Novice
23. november 2010 - 15:36 #30
Du HAR lavet det filter - det er hvad den indsatte kode gør i AfterUpdate.

Flyt linjen:

Dim strWhere As String

så der i stedet for


Option Compare Database

Private Sub Liste27_AfterUpdate()

Dim strWhere As String

står

Option Compare Database

Dim strWhere As String

Private Sub Liste27_AfterUpdate()



Den knap som åbner rapporten skal i koden køre følgende :

Private Sub KnappensNavn_OnClick()
  DoCmd.OpenReport "navnet på rapporten", , , strWhere
End Sub

Den skal ikke køre macro (den slags fine ting kan jeg ikke finde ud af) men den anførte kode.

Og den flyttede linje er blevet flyttet så den inde i OnCLick rutinen kender indholdet af strWhere
Avatar billede j-kid Praktikant
23. november 2010 - 15:47 #31
Så er koden lavet om.

Mht. hændelsen VedKlik i knappen der åbner rapporten er [Hændelsesproceduren]:

Private Sub Vis_køreliste_Click()
On Error GoTo Err_Vis_køreliste_Click

    Dim stDocName As String

    stDocName = "Køreliste"
    DoCmd.OpenReport stDocName, acPreview

Exit_Vis_køreliste_Click:
    Exit Sub

Err_Vis_køreliste_Click:
    MsgBox Err.Description
    Resume Exit_Vis_køreliste_Click
   
End Sub

Skal den ændres til:

Private Sub KnappensNavn_OnClick()
  DoCmd.OpenReport "navnet på rapporten", , , strWhere
End Sub
Avatar billede j-kid Praktikant
24. november 2010 - 09:51 #32
Nu har jeg erstattet:


Private Sub Vis_køreliste_Click()
On Error GoTo Err_Vis_køreliste_Click

    Dim stDocName As String

    stDocName = "Køreliste"
    DoCmd.OpenReport stDocName, acPreview

Exit_Vis_køreliste_Click:
    Exit Sub

Err_Vis_køreliste_Click:
    MsgBox Err.Description
    Resume Exit_Vis_køreliste_Click
   
End Sub


Med:


Private Sub KnappensNavn_OnClick()
  DoCmd.OpenReport "navnet på rapporten", , , strWhere
End Sub

Nu sker der ingenting, når jeg trykker på knappen.
Avatar billede j-kid Praktikant
24. november 2010 - 09:52 #33
"navnet på rapporten"

er udskiftet med navnet på rapporten:

"Køreliste"
Avatar billede j-kid Praktikant
24. november 2010 - 09:59 #34
Opdagede lige det med "Knappens navn"

Koden er nu for hele db'en:


Option Compare Database

Dim strWhere As String

Private Sub Liste27_AfterUpdate()

    strWhere = "[AUF_WERK_ID] IN " & GetDataFromListBox(Liste27)
  Me.Filter = strWhere
  Me.FilterOn = True

End Sub


Private Function GetDataFromListBox(myListBox As Control) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
 
    iCount = 0
    sTemp = ""
         
    If myListBox.ItemsSelected.Count <> 0 Then
        For Each oItem In myListBox.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & myListBox.ItemData(oItem)
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & myListBox.ItemData(oItem)
                iCount = iCount + 1
            End If
        Next oItem
        GetDataFromListBox = "(" & sTemp & ") "
'    Else
'        MsgBox "Nothing was selected from the list", vbInformation
'        strSQL = strSQL
'        Exit Function 'Nothing was selected
    End If
    'strip last comma from list
End Function

Private Sub Vis_køreliste_Click()

    DoCmd.OpenReport "Køreliste", , , strWhere

End Sub


Når jeg trykker på knappen, spørger den efterparameter for AUF_WERK_ID og den forsøger at printe rapporten selvom den bare skal vise den på skærmen.
Avatar billede j-kid Praktikant
25. november 2010 - 11:11 #35
Neoman:

Kan forstå, at vi giver op. Fair nok. Jeg er overrasket over, hvor omfattende det er, at lave en så "simpel" ting.

Kan du ikke smide et svar, så du om ikke andet kan få point for forsøget?

/Jakob
Avatar billede fdata Forsker
25. november 2010 - 21:26 #36
Så vil jeg lige tillade mig at blande mig (når I nu lukker).

Det ser ud som om, du har fået blandet dine variable sammen.

I sætningen
  DoCmd.OpenReport "Køreliste", , , strWhere
bruger du strWhere; men det er jo den variabel, der indeholder dit filter.

For at se rapporten, skal du bruge acViewPreview
For at printe rapporten, skal du bruge acViewNormal
De fremgår begge af hjælpeteksten, når du skriver DoCmd.OpenReport "Køreliste",
Avatar billede j-kid Praktikant
26. november 2010 - 10:05 #37
fdata

Tak for hjælp. Jeg er som sagt helt "grøn" i VBA. Jeg er defor nød til at bede dig om, at sætte hele koden sammen, hvis jeg skal teste det.
Avatar billede fdata Forsker
28. november 2010 - 14:49 #38
Det er måske at gribe det lidt voldsomt an.

Lad os nu lige give neoman lidt kredit og tillade os at gå ud fra at hans indsats har givet dig den rigtige kode til selve filter-delen.

Lad os så huske på at fejlen opstod i selve kaldet, hvor du (fejlagtigt) skrev:
  DoCmd.OpenReport "Køreliste", , , strWhere

Alt, du skal gøre, er altså at opstille det korrekte kald, der (som jeg skrev) skal være:
  DoCmd.OpenReport "Køreliste", , , acViewPreview
Avatar billede j-kid Praktikant
29. november 2010 - 08:39 #39
Nu er koden ændret til

DoCmd.OpenReport "Køreliste", , , acViewPreview

Når jeg aktiverer knappen, så printer den rapporten. Den skal kun vise den på skærmen.

Filteret virker ikke. Den medtager alle poster i AUF_WERK_ID, selvom der kun er markeret nogle få eller slet ingen poster i listen.
Avatar billede fdata Forsker
29. november 2010 - 22:11 #40
Som skrevet tidligere havde jeg ikke tjekket koden. Det har jeg gjort nu og kan se hvor neoman var på vej hen. Det er jo helt korrekt, at strWhere (filteret) skal med i kaldet.
Det korrekte kald bliver således:
  DoCmd.OpenReport "Køreliste", acViewPreview, , strWhere
Avatar billede j-kid Praktikant
30. november 2010 - 10:18 #41
Nu spørger den om en parameterværdi for de markeringer, som jeg har lavet på listen.

Lader jeg være med at markere noget, så medtager den bare alle de mulige kriterier på listen.
Avatar billede fdata Forsker
01. december 2010 - 22:37 #42
Nu har jeg bygget et lille testmiljø og afprøvet koden. Den ser ud til at virke helt fint!

Jeg kan ikke overskue, hvad det er du gør forkert. Prøv at rette koden til:

Private Sub Liste27_AfterUpdate()
  strWhere = "[AUF_WERK_ID] IN " & GetDataFromListBox(Liste27)
  Debug.Print strWhere

  Me.Filter = strWhere
  Me.FilterOn = True
End Sub

... og aflæs så strWhere i Immediate vinduet (Ctrl-G), når du ændrer på markeringerne i listen. Her burde du se helt fornuftige filtre.
Kører det stadigvæk ikke, så prøv at poste et par af filtrene her, så vi kan tjekke dem.
Avatar billede j-kid Praktikant
07. december 2010 - 17:02 #43
Nu har jeg indsat ovenstående kode. I Immediate vinduet kan jeg se, at der laves en ny linie, hver gang jeg ændrer i markeringerne i listen.

Det ser sådan ud:

[AUF_WERK_ID] IN
[AUF_WERK_ID] IN (ES)
[AUF_WERK_ID] IN (ES,QG)
[AUF_WERK_ID] IN (ES,QG,TH)
[AUF_WERK_ID] IN (ES,QG)
[AUF_WERK_ID] IN (QG)

Den spørger stadig efter værdien. F.eks. hvis ES er markeret, så kommer der en dialogboks op og spørger efter værdien ES.

Værdierne i listen er baseret på en udvælgelsesforespørgsel. Ved ikke om det har/kan have nogen betydning..??
Avatar billede fdata Forsker
08. december 2010 - 22:19 #44
Ahaaa. Der er en lille fejl i den oprindelige kode.
Den forudsætter, at du har numeriske værdier i din liste. Når der er tale om tekster, skal du lige rette et par linier, så du får anførselstegnene med:

            If iCount = 0 Then
                sTemp = sTemp & """" & myListBox.ItemData(oItem) & """"
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & """" & myListBox.ItemData(oItem) & """"
                iCount = iCount + 1
            End If
Avatar billede j-kid Praktikant
09. december 2010 - 13:31 #45
Yessir! Så virker det ;-) Jeg godkender dit første svar.

Jeg har faktisk en liste mere i samme formular, men den bygger på talværdier. Navnet på denne er Liste29. Er det samme kode som den liste vi har arbejdet med indtil nu?

Smider lige nogle ekstra point i, hvis du gider svare på dette :-)
Avatar billede fdata Forsker
12. december 2010 - 13:02 #46
Drop extra point. Nu skal vi bare have lukket denne her :o)

Hvis du vil bruge koden med din anden liste (talværdier), ja så skal du jo tilbage til den tidligere version uden anførselstegn.

Det mest elegante vil derfor være at du parameterstyrer funktionen, så du kan bruge den til begge lister:


Private Function GetDataFromListBox(myListBox As Control, NumericValues As Boolean) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
    Dim Sep As String
 
    iCount = 0
    sTemp = ""
   
    If NumericValues Then  ' Hvis tal, så ingen anførselstegn
      Sep = ""
    Else                    ' Hvis tekst, så anførselstegn
      Sep = """"
    End If
         
    If myListBox.ItemsSelected.Count <> 0 Then
        For Each oItem In myListBox.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & Sep & myListBox.ItemData(oItem) & Sep
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & Sep & myListBox.ItemData(oItem) & Sep
                iCount = iCount + 1
            End If
        Next oItem
        GetDataFromListBox = "(" & sTemp & ") "
'    Else
'        MsgBox "Nothing was selected from the list", vbInformation
'        strSQL = strSQL
'        Exit Function 'Nothing was selected
    End If
    'strip last comma from list
End Function


så skal du rette i kaldene til funtionen:

Private Sub Liste27_AfterUpdate()
  strWhere = "[AUF_WERK_ID] IN " & GetDataFromListBox(Liste27, False)
  Me.Filter = strWhere
  Me.FilterOn = True
End Sub

Private Sub Liste29_AfterUpdate()
  strWhere = "[AUF_WERK_ID] IN " & GetDataFromListBox(Liste29, True)
  Me.Filter = strWhere
  Me.FilterOn = True
End Sub
Avatar billede j-kid Praktikant
13. december 2010 - 13:17 #47
Tak for din fortsatte indsats!

Nu har jeg lagt koden ind, men det virker ikke, som det skal.

Jeg får ikke nogen fejl, men forespørgslen bruger ikke kriterieværdierne i de 2 lister korrekt.

Det er som om, at den nogen gange bruger den ene liste som kriterie, men til gengæld medtager alt fra den anden liste og omvendt.

Min kode er følgende nu:


Option Compare Database

Dim strWhere As String

Private Sub Liste27_AfterUpdate()

  strWhere = "[AUF_WERK_ID] IN " & GetDataFromListBox(Liste27, False)
  Me.Filter = strWhere
  Me.FilterOn = True

End Sub


Private Function GetDataFromListBox(myListBox As Control, NumericValues As Boolean) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
    Dim Sep As String
 
    iCount = 0
    sTemp = ""
   
    If NumericValues Then  ' Hvis tal, så ingen anførselstegn
      Sep = ""
    Else                    ' Hvis tekst, så anførselstegn
      Sep = """"
    End If
         
    If myListBox.ItemsSelected.Count <> 0 Then
        For Each oItem In myListBox.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & Sep & myListBox.ItemData(oItem) & Sep
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & Sep & myListBox.ItemData(oItem) & Sep
                iCount = iCount + 1
            End If
        Next oItem
        GetDataFromListBox = "(" & sTemp & ") "
'    Else
'        MsgBox "Nothing was selected from the list", vbInformation
'        strSQL = strSQL
'        Exit Function 'Nothing was selected
    End If
    'strip last comma from list
End Function

Private Sub Vis_køreliste_Click()

      DoCmd.OpenReport "Køreliste", acViewPreview, , strWhere

End Sub
Private Sub Liste29_AfterUpdate()
 
  strWhere = "[KOPF_TOUR] IN " & GetDataFromListBox(Liste29, True)
  Me.Filter = strWhere
  Me.FilterOn = True

End Sub


Bemærk at Liste_29 henviser til en kolonne i forespørgslen der hedder [KOPF_TOUR], hvis det betyder noget. Jeg har rettet det til i koden.
Avatar billede fdata Forsker
13. december 2010 - 18:32 #48
Nu begynder du at forvirre en smule.

Det er som om, at den nogen gange bruger den ene liste som kriterie, men til gengæld medtager alt fra den anden liste og omvendt

Det kan jo ikke lade sig gøre at listerne bliver blandet sammen. Der er jo tale om to helt uafhængige kald. Jeg er bange for at du ikke har fortalt hele historien om opbygningen.

Den struktur, vi er nået frem til, håndterer to scenarier:
1. Hvis du vælger på Liste_27, filteres formularen på AUF_WERK_ID
2. Hvis du vælger på Liste_29, filteres formularen på KOPF_TOUR

Det slår mig lige: Forestiller du dig, at du kan vælge værdier på begge lister SAMTIDIG? I så fald skal koden jo bygges helt anderledes op.
Ellers må du lige dryppe et par ord om, hvad det er du gerne vil.
Avatar billede j-kid Praktikant
13. december 2010 - 19:06 #49
"Det slår mig lige: Forestiller du dig, at du kan vælge værdier på begge lister SAMTIDIG? I så fald skal koden jo bygges helt anderledes op."

Shit. Ja. Det er lige præcis det jeg forestiller mig :-/ Var sikker på, at når det kørte med den ene liste, kunnne jeg "bare" lige kopiere. Hvis det bliver for meget bøvl, lukker vi som sagt bare her, og så må jeg oprette et nyt spørgsmål. Helt ok med mig.
Avatar billede fdata Forsker
13. december 2010 - 19:35 #50
Ahaa. Ja, det er jo en helt anden historie. Så skal der jo lidt mere krydderi på.
Har desværre ikke tid her til aften; så du må lige væbne dig med lidt tålmodighed.
Avatar billede j-kid Praktikant
13. december 2010 - 20:06 #51
Ingen problem! Jeg har bare lavet et par forespørgsler med faste kriterier som nødløsning pt. Det andet her er den forkromede udgave ;-)
Avatar billede fdata Forsker
13. december 2010 - 23:21 #52
OK. Jeg kom lige i tanke om:

Hersker der OG eller ELLER mellem de to lister (ja, det er lidt tricky)?
"OG" betyder altså, at du kun vil se poster, som svarer til en markering på BEGGE lister.
"ELLER" betyder at du vil se alle poster, der svarer til en markering på mindst EN AF listerne.
Avatar billede j-kid Praktikant
14. december 2010 - 08:31 #53
Der hersker OG imellem de 2 lister. Hver liste styrer kriterierne i hver sin kolonne i forespørgslen.
Avatar billede fdata Forsker
16. december 2010 - 23:11 #54
Så er jeg tilbage med den kombinerede løsning. Håber, du kan få det til at spille:

Option Compare Database
Option Explicit

Dim strWhere As String
Dim strWhere1 As String
Dim strWhere2 As String

'Nulstil vars og fjern filter
Private Sub Form_Open(Cancel As Integer)
  strWhere = ""
  strWhere1 = ""
  strWhere2 = ""
  Me.FilterOn = False
End Sub

Private Sub Liste27_AfterUpdate()
  Dim Dummy As String
 
  Dummy = GetDataFromListBox(Liste27, False)
  If Dummy = "" Then
    strWhere1 = ""
  Else
    strWhere1 = "[AUF_WERK_ID] IN " & Dummy
  End If
  OpdaterFilter
End Sub

Private Sub Liste29_AfterUpdate()
  Dim Dummy As String
 
  Dummy = GetDataFromListBox(Me.Liste29, True)
  If Dummy = "" Then
    strWhere2 = ""
  Else
    strWhere2 = "[KOPF_TOUR] IN " & Dummy
  End If
  OpdaterFilter
End Sub

Private Sub OpdaterFilter()
  strWhere = ""
  If (strWhere1 <> "") And (strWhere2 <> "") Then
    strWhere = "(" & strWhere1 & ") AND (" & strWhere2 & ")"
  Else
    If strWhere1 <> "" Then strWhere = strWhere1
    If strWhere2 <> "" Then strWhere = strWhere2
  End If
  'Debug.Print strWhere
  If strWhere = "" Then
    Me.FilterOn = False
  Else
    Me.Filter = strWhere
    Me.FilterOn = True
  End If
End Sub

Private Function GetDataFromListBox(myListBox As Control, NumericValues As Boolean) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
    Dim Sep As String
 
    iCount = 0
    sTemp = ""
   
    If NumericValues Then  ' Hvis tal, så ingen anførselstegn
      Sep = ""
    Else                    ' Hvis tekst, så anførselstegn
      Sep = """"
    End If
         
    If myListBox.ItemsSelected.Count <> 0 Then
      For Each oItem In myListBox.ItemsSelected
        If iCount = 0 Then
          sTemp = sTemp & Sep & myListBox.ItemData(oItem) & Sep
          iCount = iCount + 1
        Else
          sTemp = sTemp & "," & Sep & myListBox.ItemData(oItem) & Sep
          iCount = iCount + 1
        End If
      Next oItem
      GetDataFromListBox = "(" & sTemp & ")"
    Else
      GetDataFromListBox = ""
    End If
End Function
Avatar billede j-kid Praktikant
17. december 2010 - 09:03 #55
Hej igen,

Nu har jeg følgende kode for hele db'en:

Option Compare Database
Option Explicit

Dim strWhere As String
Dim strWhere1 As String
Dim strWhere2 As String

'Nulstil vars og fjern filter
Private Sub Form_Open(Cancel As Integer)
  strWhere = ""
  strWhere1 = ""
  strWhere2 = ""
  Me.FilterOn = False
End Sub

Private Sub Liste27_AfterUpdate()
  Dim Dummy As String
 
  Dummy = GetDataFromListBox(Liste27, False)
  If Dummy = "" Then
    strWhere1 = ""
  Else
    strWhere1 = "[AUF_WERK_ID] IN " & Dummy
  End If
  OpdaterFilter
End Sub

Private Sub Liste29_AfterUpdate()
  Dim Dummy As String
 
  Dummy = GetDataFromListBox(Me.Liste29, True)
  If Dummy = "" Then
    strWhere2 = ""
  Else
    strWhere2 = "[KOPF_TOUR] IN " & Dummy
  End If
  OpdaterFilter
End Sub

Private Sub OpdaterFilter()
  strWhere = ""
  If (strWhere1 <> "") And (strWhere2 <> "") Then
    strWhere = "(" & strWhere1 & ") AND (" & strWhere2 & ")"
  Else
    If strWhere1 <> "" Then strWhere = strWhere1
    If strWhere2 <> "" Then strWhere = strWhere2
  End If
  'Debug.Print strWhere
  If strWhere = "" Then
    Me.FilterOn = False
  Else
    Me.Filter = strWhere
    Me.FilterOn = True
  End If
End Sub

Private Function GetDataFromListBox(myListBox As Control, NumericValues As Boolean) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
    Dim Sep As String
 
    iCount = 0
    sTemp = ""
   
    If NumericValues Then  ' Hvis tal, så ingen anførselstegn
      Sep = ""
    Else                    ' Hvis tekst, så anførselstegn
      Sep = """"
    End If
         
    If myListBox.ItemsSelected.Count <> 0 Then
      For Each oItem In myListBox.ItemsSelected
        If iCount = 0 Then
          sTemp = sTemp & Sep & myListBox.ItemData(oItem) & Sep
          iCount = iCount + 1
        Else
          sTemp = sTemp & "," & Sep & myListBox.ItemData(oItem) & Sep
          iCount = iCount + 1
        End If
      Next oItem
      GetDataFromListBox = "(" & sTemp & ")"
    Else
      GetDataFromListBox = ""
    End If
End Function
Private Sub Vis_køreliste_Click()

      DoCmd.OpenReport "Køreliste", acViewPreview, , strWhere

End Sub

Den sidste del omkring "Vis_køreliste" har jeg kopieret ind igen, da der ikke skete noget, når jeg trykkede på kommandoknappen i formularen. Det gør der så stadigvæk ikke.

Jeg har prøvet at lave en ny kommandoknap, men så kører den helt udenom de 2 lister som filter.
Avatar billede j-kid Praktikant
17. december 2010 - 12:33 #56
Har rodet lidt videre. Jeg fik klumret rundt i den kommandoknap, men tror jeg er nogenlunde på sporet igen. Nu er koden således:

Option Compare Database
Option Explicit

Dim strWhere As String
Dim strWhere1 As String
Dim strWhere2 As String

'Nulstil vars og fjern filter
Private Sub Form_Open(Cancel As Integer)
  strWhere = ""
  strWhere1 = ""
  strWhere2 = ""
  Me.FilterOn = False
End Sub

Private Sub Liste27_AfterUpdate()
  Dim Dummy As String
 
  Dummy = GetDataFromListBox(Liste27, False)
  If Dummy = "" Then
    strWhere1 = ""
  Else
    strWhere1 = "[AUF_WERK_ID] IN " & Dummy
  End If
  OpdaterFilter
End Sub

Private Sub Liste29_AfterUpdate()
  Dim Dummy As String
 
  Dummy = GetDataFromListBox(Me.Liste29, True)
  If Dummy = "" Then
    strWhere2 = ""
  Else
    strWhere2 = "[KOPF_TOUR] IN " & Dummy
  End If
  OpdaterFilter
End Sub

Private Sub OpdaterFilter()
  strWhere = ""
  If (strWhere1 <> "") And (strWhere2 <> "") Then
    strWhere = "(" & strWhere1 & ") AND (" & strWhere2 & ")"
  Else
    If strWhere1 <> "" Then strWhere = strWhere1
    If strWhere2 <> "" Then strWhere = strWhere2
  End If
  'Debug.Print strWhere
  If strWhere = "" Then
    Me.FilterOn = False
  Else
    Me.Filter = strWhere
    Me.FilterOn = True
  End If
End Sub

Private Function GetDataFromListBox(myListBox As Control, NumericValues As Boolean) As String
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
    Dim Sep As String
 
    iCount = 0
    sTemp = ""
   
    If NumericValues Then  ' Hvis tal, så ingen anførselstegn
      Sep = ""
    Else                    ' Hvis tekst, så anførselstegn
      Sep = """"
    End If
         
    If myListBox.ItemsSelected.Count <> 0 Then
      For Each oItem In myListBox.ItemsSelected
        If iCount = 0 Then
          sTemp = sTemp & Sep & myListBox.ItemData(oItem) & Sep
          iCount = iCount + 1
        Else
          sTemp = sTemp & "," & Sep & myListBox.ItemData(oItem) & Sep
          iCount = iCount + 1
        End If
      Next oItem
      GetDataFromListBox = "(" & sTemp & ")"
    Else
      GetDataFromListBox = ""
    End If
End Function

Private Sub Kommandoknap31_Click()

DoCmd.OpenReport "Køreliste", acViewPreview, , strWhere

End Sub


Alt virker bortset fra, at den ikke godtager, hvis jeg laver flere markering i liste 29.
Avatar billede fdata Forsker
17. december 2010 - 20:41 #57
Øhm. Først og fremmest:
1) Virker det, hvis du kun markerer elementer på Liste27?
2) Virker det, hvis du kun markerer elementer på Liste29?
3) Virker det, hvis du kun markerer ét elementer på hver liste?

Hvis du kan svare ja til alle 3 ovenfor, må der være et eller andet i din OG/ELLER logik, der svigter.

Koden giver dig de poster, der svarer til de markerede elementer fra Liste27 (med ELLER imellem), der SAMTIDIG svarer til de markerede elementer fra Liste29 (med ELLER imellem) - altså med OG imellem de to lister.

Prøv at forklare nærmere, hvad du mener der går galt - evt med et eksempel.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester