Avatar billede jasman Nybegynder
19. juni 2004 - 21:45 Der er 14 kommentarer og
1 løsning

Udsøgning med "betingede" kriterier

Hejsa,

jeg har en formular hvorpå jeg indtaster kriterier til en forespørgsel.
Jeg har bl.a. felterne:

PostNrFra og PostNrTil
StillingsbetegnelseFra StillingsbetegnelseTil

Jeg vil nu gerne have det sådan, at hvis jeg f.eks. kun indtaster en værdi i PostNrTil, så skal forespørgslen udsøge
* Alle postnumre op til værdien i PostNrTil
* Alle stillingsbetegnelser

Altså hvis jeg ikke taster noget i felterne, skal forespørgslen bare vælge alt, men hvis jeg taster noget i et af felterne skal den tage feltet i betragtning under søgningen.

I forespørgslen har jeg disse kriterier:

PostNummerfelt:
>[Forms]![KriterieForm]![PostNummerFra] AND <[Forms]![KriterieForm]![PostNummerTil]

StillingsbetegnelseFelt:
>[Forms]![KriterieForm]![StillingsbetegnelseFra] AND <[Forms]![KriterieForm]![StillingsbetegnelseTil]

Men man kan jo ikke gøre en del af en WHERE clause betinget ?

Kan nogen af jer hajer hjælpe mig med et hint ?

MVH

Jacob
Avatar billede mugs Novice
19. juni 2004 - 21:55 #1
Du kan i din formular indsætte nogle filtrer, der begrænser udvalget af poster. Du kan herefter f.eks udskrive en rapport med formularens filter, så rapporten er en afspejling af din formular.

Thomas Jepsen har lavet et fremragende esempel, som jeg selv har brugt i flere sammenhænge. Kan downloades her og hedder noget med filter og søgning:

http://www.nyholm.dk/makeiteasy/Home.asp?ContentID=30
Avatar billede jasman Nybegynder
19. juni 2004 - 22:38 #2
Hej Mugs,

i sandhed smart det Thomas har lavet der, men det er ikke lige det jeg skal bruge.
Jeg har en opdateringsforespørgsel, som udsøger nogle data og opretter disse i en tabel.

Til denne forespørgsel, har jeg som sagt en form, hvor jeg kan aflevere nogle kriterier.

I Thomas' eksempel, er det jo et filter i en form, hvorfor man nemt kan ændre på kriterierne, ved at bygge en helt ny SELECT sætning, og fodre formen med denne.

Men, man kan jo, så vidt jeg ved, ikke ændre på en forespørgsels kriterier runtime kan man ?

MVH

Jacob
Avatar billede jasman Nybegynder
19. juni 2004 - 22:41 #3
For at skære det lidt mere ud i pap. ;)
Min formular anvendes udelukkende til at hente afgrænsningskriterierne.
Avatar billede jasman Nybegynder
19. juni 2004 - 22:42 #4
Til dagligt koder jeg i Axapta (x++).
I dette sprog kan man runtime bygge en query (forespørgsel), og anvende denne til hvilket som helst formål.
Kan dette lade sig gøre i Access ?
Avatar billede hekla Nybegynder
19. juni 2004 - 23:33 #5
Jeg ved ikke om det er det nemmeste men det kan gøres ved at:
lave et modul med

Public strPostnummer as string
Public strStilling as string

function GetPostnummer()¨
getpostnummer = strpostnummer
end function

function GetStilling()
getstilling = strstilling
end function

Og i din formulars kommandoknap at skrive:
if me!postnummerfra = "" or isnull(me!postnummerfra) then
if me!postnummertil = "" or isnull(me!postnummertil) then
strpostnummer = null
else
strpostnummer = "<" & me!postnummertil
else
if me!postnummertil = "" or isnull(me!postnummertil) then
strpostnummer = ">" & me!postnummerfra
else
strpostnummer = ">" me!PostNummerFra & " AND < " & me!PostNummerTil
endif

if me!Stillingsbetegnelsefra = "" or isnull(me!Stillingsbetegnelsefra) then
if me!Stillingsbetegnelsetil = "" or isnull(me!Stillingsbetegnelsetil) then
strStilling = null
else
strStilling = "<" & me!Stillingsbetegnelsetil
else
if me!Stillingsbetegnelsetil = "" or isnull(me!Stillingsbetegnelsetil) then
strStilling = ">" & me!Stillingsbetegnelsefra
else
strStilling = ">" me!StillingsbetegnelseFra & " AND < " & me!StillingsbetegnelseTil
endif

Du kan herefter hente dine kriterier ved at skrive hhv = getpostnummer() og = getstilling() i dine kriteriefelter
Avatar billede terry Ekspert
20. juni 2004 - 09:59 #6
If the query exists alreday then you can use


CurrentDb.QueryDefs("QueryNameGoesHere").Sql = "SELECT * FROM YourTable WHERE ......"

to alter the query in code
Avatar billede terry Ekspert
20. juni 2004 - 10:14 #7
'NOTE: If fields in dB are text then you need to enclose value in ''
'EG sSQL = sSQL & " AND PostNummerfelt >= '" & Me.PostNummerFra & "'"


Dim sSQL as string

    sSQL = "SELECT * FROM YourTable WHERE 1 "
   
    If Not fldIsEmpty(Me.PostNummerFra) Then
        sSQL = sSQL & " AND PostNummerfelt >= " & Me.PostNummerFra
    End If
   
    If Not fldIsEmpty(Me.PostNummerTil) Then
        sSQL = sSQL & " AND PostNummerfelt <= " & Me.PostNummerTil
    End If
   
    If Not fldIsEmpty(Me.StillingsbetegnelseFra) Then
        sSQL = sSQL & " AND StillingsbetegnelseFelt >= " & Me.StillingsbetegnelseFra
    End If

    If Not fldIsEmpty(Me.StillingsbetegnelseTil) Then
        sSQL = sSQL & " AND StillingsbetegnelseFelt <= " & Me.StillingsbetegnelseTil
    End If
   

    CurrentDb.QueryDefs("QueryNameGoesHere").Sql = sSQL



'You need a fucntion which tests if field is empty


Function fldIsEmpty(fld As Variant)

    fldIsEmpty = True
    If Len(Trim(fld)) > 0 Then fldIsEmpty = False
   
End Function
Avatar billede terry Ekspert
20. juni 2004 - 10:17 #8
You can also create and delete queries in code

CurrentDb.CreateQueryDef "qryTest", "SELECT * FROM tabel1"

CurrentDb.QueryDefs.Delete "qryTest"
Avatar billede hekla Nybegynder
20. juni 2004 - 15:03 #9
Der var et par småfejli formularkoden. Den skal være:

If me.postnummerfra = "" or isnull(me.postnummerfra) then
If me.postnummertil = "" or isnull(me.postnummertil) then
strpostnummer = null
Else
strpostnummer = "<" & me.postnummertil
End if
Else
If me.postnummertil = "" or isnull(me.postnummertil) then
strpostnummer = ">" & me.postnummerfra
Else
strpostnummer = ">" me.PostNummerFra & " AND < " & me.PostNummerTil
End if
End if

If me.Stillingsbetegnelsefra = "" or isnull(me.Stillingsbetegnelsefra) then
If me.Stillingsbetegnelsetil = "" or isnull(me.Stillingsbetegnelsetil) then
strStilling = null
Else
strStilling = "<" & me.Stillingsbetegnelsetil
End if
Else
If me.Stillingsbetegnelsetil = "" or isnull(me.Stillingsbetegnelsetil) then
strStilling = ">" & me.Stillingsbetegnelsefra
Else
strStilling = ">" me.StillingsbetegnelseFra & " AND < " & me.StillingsbetegnelseTil
End if
End if
Avatar billede terry Ekspert
21. juni 2004 - 09:56 #10
status?
Avatar billede jasman Nybegynder
21. juni 2004 - 09:58 #11
Jeg har prøvet at få Heklas metode til at virke,
og jeg har også prøvet din Terry.
Men jeg synes ikke jeg kan få det til at virke :(.
Jeg vil prøve igen i aften, simpelthen ved at bygge queryen dynamisk,
og så hører I lige fra mig igen.
Håber det er i orden ?

Jacob
Avatar billede terry Ekspert
21. juni 2004 - 10:58 #12
what cant you get to work?
If you can send your dB (or an example) then I can perhaps help. eksperten@NOSPAMsanthell.dk
remove NOSPAM
Avatar billede jasman Nybegynder
21. juni 2004 - 22:48 #13
Jeg fik det til at virke.
Med "CurrentDb.QueryDefs("QueryNameGoesHere").Sql = "..." fremgangsmåden.
Et spørgsmål m.h.t. dette.
I et flerbrugermiljø, kan der da opstå problemer, hvis flere brugere tilgår queryen med forskellige SQL-sætninger ???
Avatar billede terry Ekspert
22. juni 2004 - 17:14 #14
In relation to your last question. "I et flerbrugermiljø ....."
I would have to answer NO to this, because if a multi-user system was made correctly, then each user (in my oppionion) should have a copy of the front-end database, and this contains forms, reports and also TEMP tables and queries. So each user will only have access to their own TEMP tables and queries. The back-end database which is located on a file server contains "global" tables and queries.

and thanks for the points :o)
Avatar billede jasman Nybegynder
22. juni 2004 - 18:01 #15
Jamen velbekomme og tak for hjælpen.
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