Avatar billede Slettet bruger
12. juli 2004 - 14:51 Der er 17 kommentarer og
3 løsninger

Søgning ved valg fra liste

Hvordan får man en forespørgsel til at søge, hvis det er ud fra en liste, hvor man vælger flere forskellige muligheder?
Avatar billede terry Ekspert
12. juli 2004 - 15:00 #1
You have to build your SQL dynamically, looping through the list to see which records are selected.
12. juli 2004 - 15:11 #2
og det kan du gøre nogenlunde således:

Dim Itm as variant
Dim SQLStr as String

SQLStr = "Where [Ditfelt] In ("
For Each itm In Me!DinListboks.ItemsSelected
    SQLStr = SQLStr & Me!DinListboks.ItemData(itm) & ", "
Next itm
SQLStr = Left(SQLStr, Len(SQLStr) - 4) & ")"

Herefter kan du skrive f.eks.

rs.Open "Select * from Dintabel " & SQLStr
Avatar billede Slettet bruger
12. juli 2004 - 15:34 #3
Jeg ved ikke hvad til og hvor jeg skal bruge koden....
Avatar billede terry Ekspert
12. juli 2004 - 15:42 #4
It isnteasy to give a precise solution without knowing more about your application and requirement!

If you are displaying the result in a form then you will need to alter the forms record source with the SQL which gets made dynamically!

But maybe a bit more information would help first!
12. juli 2004 - 15:47 #5
Du kan også ændre SQL'en på en forespørgsel, efter dit valg på listen:

Dim Itm as variant
Dim SQLStr as String

SQLStr = "Select * From [Din tabel] Where [Ditfelt] In ("
For Each itm In Me!DinListboks.ItemsSelected
    SQLStr = SQLStr & Me!DinListboks.ItemData(itm) & ", "
Next itm
SQLStr = Left(SQLStr, Len(SQLStr) - 4) & ")"

currentdb.Querydefs("Din forespørgel").SQL = SQLStr

Herefter er forespørgslen ændret, så den nu indeholder den nye SQL.

Du kan lægge ovenstående kode på llistens AfterUpdate eller på en kommandoknap, efterfulgt at f.eks. Docmd.OpenReport "en rpport", acviewpreview baseret på forespørgslen.

Metoden kræver reference til "Microsoft DAO 3.x object Library"
Avatar billede Slettet bruger
12. juli 2004 - 15:47 #6
Hvis jeg nu har en forespørgsel i designvisning og der f.eks. er en søgning på 5 felter/variable, men jeg ønsker at begrænse 2 af disse variable med valgene fra min liste. Hvad gør jeg så?
12. juli 2004 - 15:51 #7
problemet er, at du ikke bare kan lave en forespørgsel, som kan aflæse de valgte værdier fra listen.
Du er simpelthed nødt til at ÆNDRE sql'en fra gang til gang. Dette skal brugeren selvfølgelig ikke gøre, hvorfor jeg viste dig en kode, som kan gøre det for dig.

Det er ikke en let løsning.

Hvad skal du bruge forespørgslen til? En rapport? En formular?
Avatar billede Slettet bruger
12. juli 2004 - 15:56 #8
Det er til den db jeg sendte til dig på et tidspunkt omkring ostebedømmelse. Formålet med søgning skulle være at man går ind og vælger ostetype/-typer på en liste og fejltype/-typer på en anden liste. Så er der selvfølgelig en dato fra/til og det er så det.

Om det skal vises i en rapport eller en formular, betyder mindre bare jeg kan få det til at virke.
Avatar billede Slettet bruger
12. juli 2004 - 15:58 #9
Jeg er nød til at forlade computeren nu, men jeg vender tilbage i morgen ved 2-tiden. Indtil videre tak for hjælpen, hvis nogen kan løse det er jeg sikker på at det er jer.
Avatar billede Slettet bruger
13. juli 2004 - 14:09 #10
Okey så er jeg her igen...
13. juli 2004 - 14:41 #11
ok, jeg kan dog ikke rigtig kommet svaret nærmere.
Inden du skal bruge forespørgslen (til en rapport eller formular eller noget 3.) så skal du redefinere den med ovenstående kode.

Dvs hvis du har en knap som åbner en rapport, så skal kodn se nogenlunde således ud:

Dim Itm as variant
Dim SQLStr as String

SQLStr = "Select * From [Din tabel] Where [Ditfelt] In ("
For Each itm In Me!DinListboks.ItemsSelected
    SQLStr = SQLStr & Me!DinListboks.ItemData(itm) & ", "
Next itm
SQLStr = Left(SQLStr, Len(SQLStr) - 4) & ")"

currentdb.Querydefs("Din forespørgel").SQL = SQLStr

Docmd.Openreport "Din rapport", acviewpreview
13. juli 2004 - 14:43 #12
Men hvis du ved, at det er en rapport, du skal bruge forespørgslen til, så kan du lave det nemmere ved blot at generere WHERE-delen og lade forespørgslen indeholde alle data således:

Dim Itm as variant
Dim SQLStr as String

SQLStr = "[Ditfelt] In ("
For Each itm In Me!DinListboks.ItemsSelected
    SQLStr = SQLStr & Me!DinListboks.ItemData(itm) & ", "
Next itm
SQLStr = Left(SQLStr, Len(SQLStr) - 4) & ")"
Docmd.Openreport "Din rapport", acviewpreview,,SQLStr
Avatar billede Slettet bruger
13. juli 2004 - 15:03 #13
Jeg lagde :

Dim Itm as variant
Dim SQLStr as String

SQLStr = "Select * From [stikprøver] Where [sort/type] In ("
For Each itm In Me!ostetype.ItemsSelected
    SQLStr = SQLStr & Me!ostetype.ItemData(itm) & ", "
Next itm
SQLStr = Left(SQLStr, Len(SQLStr) - 4) & ")"

currentdb.Querydefs("søgning fejl").SQL = SQLStr

Ind på EfterOpdatering i listeboksen. Forespørgslen "søgning fejl", ser sådan ud:

SELECT Stikprøver.Dato, Stikprøver.[Sort/type], Stikprøver.[Vægt i gram], Bedømmelser.[Fejl ydre], Bedømmelser.[Fejl bygning], Bedømmelser.[Fejl konsistens], Bedømmelser.[Fejl lugt og smag], Bedømmelser.Bemærkning
FROM Stikprøver INNER JOIN Bedømmelser ON Stikprøver.Id = Bedømmelser.[indtastet id]
WHERE (((Stikprøver.Dato)>=[forms]![søgeside]![fra] And (Stikprøver.Dato)<=[forms]![søgeside]![til]));

Indtil videre har jeg forsøgt at søge på flere forskellige ostetyper, det med at søge på flere fejl er der yderligere problemer med fordi, der er 4 forskellige fejltyper, osv. Så en ting ad gangen.

Nåh, men når jeg forsøger at vælge en ostetype siger programmet:

Microsoft Access kan ikke finde makroen "Dim Itm as variant
Dim SQLStr as String

SQLStr = "Select * From [stikprøver] Where [sort/type] In ("
For Each itm In Me!ostetype".

Jeg kan godt se, at det her spørgsmål måske ikke skulle have været i kategorien "Let", men jeg troede at det var noget Access ville have rimelig nemt ved.?
13. juli 2004 - 15:12 #14
Koden skal ikke sættes direkte ind i egenkaben "EfterOpdatering". I stedet skal du klikke på knappen til højre med de 3 prikker og åbne kodegeneratoren. Når du er kommet ind i VBA-editoren, skal du skrive koden mellem de 2 linier, som Access har skrevet for dig.
Avatar billede Slettet bruger
13. juli 2004 - 15:23 #15
Hov, jeg har først lige set de 2 kommentarer du allerede var kommet med. Jeg ved at det er en rapport og der er en knap til foremålet.
Avatar billede Slettet bruger
13. juli 2004 - 15:36 #16
Jeg prøvede:

Option Compare Database

Private Sub Kommandoknap39_Click()
Dim Itm As Variant
Dim SQLStr As String

SQLStr = "[sort/type] In ("
For Each Itm In Me!ostetype.ItemsSelected
    SQLStr = SQLStr & Me!ostetype.ItemData(Itm) & ", "
Next Itm
SQLStr = Left(SQLStr, Len(SQLStr) - 4) & ")"
DoCmd.OpenReport "fejlsøgning", acViewPreview, , SQLStr
End Sub

Fejlsøgning ser således ud:

SELECT Stikprøver.Dato AS Produceret, Stikprøver.[Sort/type], Stikprøver.[Vægt i gram], Bedømmelser.[Fejl ydre], Bedømmelser.[Fejl bygning], Bedømmelser.[Fejl konsistens], Bedømmelser.[Fejl lugt og smag]
FROM Stikprøver INNER JOIN Bedømmelser ON Stikprøver.Id = Bedømmelser.[indtastet id]
WHERE (((Stikprøver.Dato)>=[forms]![søgeside]![fra] And (Stikprøver.Dato)<=[forms]![søgeside]![til]) AND (([forms]![søgeside]![fejl])=[fejl ydre] Or ([forms]![søgeside]![fejl])=[fejl bygning] Or ([forms]![søgeside]![fejl])=[fejl konsistens] Or ([forms]![søgeside]![fejl])=[fejl lugt og smag]));

Beskeden er: Der er en syntaksfejl, fordi der mangler en operator i forespørgselsudtrykket "([sort/type]IN (de forskellige valg jeg har til at søge på))".
13. juli 2004 - 15:41 #17
hmm, jeg kan se en lille fejl:
3. sidste linie skal se således ud:
SQLStr = Left(SQLStr, Len(SQLStr) - 2) & ")"

Jeg ved ikke om det hjælper?
Avatar billede Slettet bruger
13. juli 2004 - 15:42 #18
Jeg håber på et svar, men jeg skal snart hjem. Jeg kan nok se dit svar, men ikke efterprøve det. Jeg er her igen imorgen, sikkert fra 1 pm til 4 pm. Det bliver nok sidste gang i et par uger. Imorgen er mit vigtigste mål at forsøge at ordne tabulatorrækkefølge fra underformular til hovedformular i min bedømmelse http://www.eksperten.dk/spm/517400.

Hvis det virker så kører programmet, så må jeg se på visning af data, når jeg kommer tilbage fra mine 2 ugers ferie.

Tak...
Avatar billede Slettet bruger
13. juli 2004 - 15:45 #19
Nej, samme fejl.

Debug stopper ved sidste linie:
DoCmd.OpenReport "fejlsøgning", acViewPreview, , SQLStr
Avatar billede Slettet bruger
06. august 2004 - 14:38 #20
Jeg er tilbage fra ferie og det hele ser lidt uoverskueligt ud. Min boss siger han bare vil have at den søger på én fejl (han ved ikke hvad går glip af...), så jeg lukker spørgsmålet for nu. Det kan være jeg vender tilbage ang. samme.

Det minder mig forresten om at jeg på et tidspunkt også skal have fat dig, Thomas Jepsen ang. det eksempel du har lavet med dynamisk søgning. Det ser fedt ud og det kan jeg klart bruge, men jeg kan ikke få det til at virke, såehh... Men det bliver en anden dag.

Tak for hjælpen til Terry & Thomas.
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
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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