Avatar billede doeleman Nybegynder
04. april 2000 - 15:36 Der er 12 kommentarer og
1 løsning

Interval

Min udvælgelsesforespørgsel for inputs fra en formular. Jeg vil gerne have, at hvis der i formularen er angivet et interval, skal forespørgslen finde posterne i dette interval, mens hvis der ikke er angivet et interval, skal den returnere alle poster.

BETWEEN [Forms]![frmSøg]![txtKontraktMin] AND [Forms]![frmSøg]![txtKontraktMax]
giver det rigtige resultat, hvis intervallet er angivet, men hvordan for jeg den til at returnere alle poster, hvis ikke [txtKontraktMin] er angivet?

Jeg har forsøgt med:
Like IIf ([Forms]![frmSøg]![txtKontraktMin] Is Null; "*"; "BETWEEN ....")
hvilket returnere alle poster, men tilgengæld kan den ikke finde et interval.

Hvad gør jeg galt?
Avatar billede privaten Nybegynder
04. april 2000 - 15:52 #1
Kan du ikke initiere de to felter når formen startes med 2 værdier i hver enden af skalaen, fx. -1 & 999999999 ??
Avatar billede doeleman Nybegynder
04. april 2000 - 16:08 #2
Jeg har tænk på samme mulighed, men synes ikke den er særlig "pæn".
Ellers tak for hjælpen.
Avatar billede hnteknik Novice
04. april 2000 - 20:45 #3
Prøv sådan noget som dette her. Dette er for datoer, men ideen kan du få her  til andre typer. Den finder også de tilfælde, hvor der ikke er angivet en dato.

Henrik

strDeltaDato = TidsQuery(Nz(Me.LkUpFra), Nz(Me.LkUpTil), StrDatType)

Function TidsQuery(ByVal FieldValFra As Date, ByVal FieldValTil As Date, ByVal StrDatType As String) As String
Dim Str1 As String, Str2 As String

If FieldValFra = 0 And FieldValTil = 0 Then
    'der er intet søgekriterie - case 1
    TidsQuery = ""
Else
    If FieldValTil = 0 Then
        'der må være en startdato -  case 2
        Str1 = StrDatType & " >= #" & Format$(FieldValFra, "mm-dd-yyyy") & "#"
        Str2 = StrDatType & " is Null"
        TidsQuery = "(" & Str1 & " OR " & Str2 & ")"
    ElseIf FieldValFra = 0 Then
        ' der må være en slutdato - case 4
        Str1 = StrDatType & " <= #" & Format$(FieldValTil, "mm-dd-yyyy") & "#"
        Str2 = StrDatType & " is Null"
        TidsQuery = "(" & Str1 & " OR " & Str2 & ")"

    ElseIf FieldValTil >= FieldValFra Then
        ' der er både slut og start dato
        Str1 = StrDatType & " >= #" & Format$(FieldValFra, "mm-dd-yyyy") & "# AND " & StrDatType & " <= #" & Format$(FieldValTil, "mm-dd-yyyy") & "#"
        TidsQuery = "(" & Str1 & ") "
    Else
        ' du må have byttet om på datoerne
        MsgBox "Du har byttet om på start/slut datoer - ingen datovirkning"
        TidsQuery = ""
    End If
End If

End Function
Avatar billede doeleman Nybegynder
07. april 2000 - 13:59 #4
I dk.edb.database.ms-access gav de mig følgende råd:
WHERE
Iif ([Forms]![frmSøg]![txtKontraktMin] Is Null; True; feltnavn >= [Forms]![frmSøg]![txtKontraktMin])
AND
Iif ([Forms]![frmSøg]![txtKontraktMax] Is Null; True; feltnavn <= [Forms]![frmSøg]![txtKontraktMax])

Det var noget lignende denne løsning jeg søgte, men jeg kan ikke helt få det til at virke.

Jeg har bl.a. følgende som kriterie i min udvælgelsesforespørgsel (i SQL-visning):
WHERE (((Kontrakter.Kontraktsum)=IIf([Forms]![frmSøg]![txtKontraktsumMin] Is Null,True,([Kontrakter].[Kontraktsum])>=[Forms]![frmSøg]![txtKontraktsumMin]))

Jeg får ingen resultater, hverken med eller uden indhold i txtKontraktsumMin!
Avatar billede doeleman Nybegynder
07. april 2000 - 14:00 #5
Jeg vil gerne give 150 points ekstra for svar.
Avatar billede hnteknik Novice
08. april 2000 - 17:36 #6
Du har ellers løsningen foroven, men
prøv at sende koden til mig.

Hvornår aktiveres denne kodestump ?
Hvis det er on form load, er det ikke sikkert, at variabler er kendt.

Henrik

hnteknik@post4.tele.dk
Avatar billede doeleman Nybegynder
09. april 2000 - 12:21 #7
>> Til "hnteknik" m.fl.

Databasen kan hentes på http://noko.wiktor.dk/kontrakter.mdb
Jeg vil gerne give endnu flere points for hjælp og gode råd.

På forhånd tak.

>> hnteknik
Koden bliver afviklet som et kriterie i forespørgslen "qdfKontrakter", der modtager input fra formularen "frmSøg".
Avatar billede hnteknik Novice
09. april 2000 - 13:08 #8
Hej Dooleman - jeg var ikke klar over, at jeg var i konkurrence med andre her på dette stade.

Nårmalt ville jeg lave hele forespørgelsen i VBA og sende det hele som en recordsource til en underformular. På den måde, kan man teste og styre de enkelte parametre (som f.eks. ovenfor !!!).

Jeg har kigget på din kode. Man kan ikke se, hvad der evaluerer hvad og hvornår. Jeg tror - uden at teste det nærmere, at dele af forespørgelsen konflikter.

Mit forslag er:

Start med en ren query og din form åben på det, du gerne vil teste og begynd så at fylde på efter princippet:

(((x) and y)and z)

Så har du styr på, hvad og hvornår.

Håber dette her giver dig nogle ideer, men jeg vil nu foretrække en VBA løsning.

Jeg kan lave den for dig, men ikke for points. Jeg lever af at lave sådan noget. Vend tilbage, når og hvis de andre løber træt.

Henrik
Avatar billede doeleman Nybegynder
09. april 2000 - 13:14 #9
>>hnteknik
Tak for kommentaren.
Jeg vil helst undgå en VBA-løsning, da jeg ikke har nogen erfaring med VBA. Jeg tror nu også det må være muligt, at løse opgaven uden, da resten af forespørgelsen kører udemærket.

Jeg vil forsøge at arbejde lidt videre med det, men ellers tak for dit tilbud.
Avatar billede hnteknik Novice
09. april 2000 - 17:44 #10
jeg har kigget lidt på det alligevel:
Du kommer i dette tilfælde ikke helt udenom VBA, Prøv at tonse dette her ind:


Private Sub cmdVis_Click()
Dim txtsql As String
txtsql = "SELECT Kontrakter.ID, Kontrakttype.Kontrakttype, Kontraktmodpart.Kontraktmodpart, Kontrakter.Kontraktsum, Kontrakter.Modtager, Kontrakter.Udbud, Kontrakter.Rammekontrakt, Kontrakter.Miljøkrav, Kontorchef.Kontorchef, Kontor.Kontor, Sagsbehandler.Sagsbehandler, Kontrakter.Starttidspunkt, Kontrakter.Udløbstidspunkt, Kontrakter.Underskrifttidspunkt, Kontrakter.Link"
txtsql = txtsql + " FROM Sagsbehandler INNER JOIN (Kontrakttype INNER JOIN (Kontraktmodpart INNER JOIN (Kontor INNER JOIN (Kontorchef INNER JOIN Kontrakter ON Kontorchef.KontorchefID = Kontrakter.KontorchefID) ON Kontor.KontorID = Kontrakter.KontorID) ON Kontraktmodpart.KontraktmodpartID = Kontrakter.KontraktmodpartID) ON Kontrakttype.KontrakttypeID = Kontrakter.KontrakttypeID) ON Sagsbehandler.SagsbehandlerID = Kontrakter.SagsbehandlerID"
txtsql = txtsql + " WHERE (((Kontrakter.Kontraktsum)=" & IIf(IsNull([Forms]![frmSøg]![txtKontraktsumMin]), " True ", "([kontrakter].[Kontraktsum]) >= " & [Forms]![frmSøg]![txtKontraktsumMin]) & ") AND "
txtsql = txtsql + "((Kontrakter.Modtager) Like "
txtsql = txtsql + IIf(IsNull([Forms]![frmSøg]![grpLeverandør]), " * ", [Forms]![frmSøg]![grpLeverandør]) & ")"
txtsql = txtsql + " AND ((Kontrakter.Udbud) Like " & IIf(IsNull([Forms]![frmSøg]![grpUdbud]), " * ", [Forms]![frmSøg]![grpUdbud]) & ") "
txtsql = txtsql + " AND ((Kontrakter.Rammekontrakt) Like " & IIf(IsNull([Forms]![frmSøg]![grpRammekontrakt]), " * ", [Forms]![frmSøg]![grpRammekontrakt]) & ") "
txtsql = txtsql + " AND ((Kontrakter.Miljøkrav) Like " & IIf(IsNull([Forms]![frmSøg]![grpMiljøkrav]), " * ", [Forms]![frmSøg]![grpMiljøkrav]) & ") "
txtsql = txtsql + " AND ((Kontrakttype.KontrakttypeID) Like " & IIf([Forms]![frmSøg]![cboKontrakttypeID] = 0, " * ", [Forms]![frmSøg]![cboKontrakttypeID]) & ") AND "
txtsql = txtsql + "((Kontraktmodpart.KontraktmodpartID) Like " & IIf([Forms]![frmSøg]![cboKontraktmodpartID] = 0, " * ", [Forms]![frmSøg]![cboKontraktmodpartID]) & ") AND "
txtsql = txtsql + "((Kontorchef.KontorchefID) Like " & IIf([Forms]![frmSøg]![cboKontorchefID] = 0, " * ", [Forms]![frmSøg]![cboKontorchefID]) & ") AND ((Kontor.KontorID) "
txtsql = txtsql + "Like " & IIf([Forms]![frmSøg]![cboKontorID] = 0, " * ", [Forms]![frmSøg]![cboKontorID]) & ") AND ((Sagsbehandler.SagsbehandlerID) Like "
txtsql = txtsql + IIf([Forms]![frmSøg]![cboSagsbehandlerID] = 0, " * ", [Forms]![frmSøg]![cboSagsbehandlerID]) & "));"
MsgBox txtsql

ExecuteSQLDDL txtsql
'DoCmd.OpenQuery "qdfKontrakter"
End Sub
Function ExecuteSQLDDL(SQLString As String)
' Executes SQL query without saving definition in query catalogs
    On Error GoTo SQLERR_HANDLER
    Dim db As Database, qd As QueryDef
    Dim fnc As Integer
   
    Set db = DBEngine.Workspaces(0).Databases(0)
    Set qd = db.CreateQueryDef("")
    qd.SQL = SQLString
    qd.Execute
    On Error Resume Next    ' In case db already open
    db.Close
    Set db = Nothing
    Set qd = Nothing
    Exit Function
Err
SQLERR_HANDLER:
    MsgBox Err & " " & Err.Description
    'fnc = Error_Handler(Err.Description)
    Resume Next
End Function


fejl :
"3075 Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket "(((Kontrakter.Kontraktsum)=([kontrakter].[Kontraktsum]) >= 20) AND ((Kontrakter.Modtager) Like  * ) AND ((Kontrakter.Udbud) Like  * )  AND ((Kontrakter.Rammekontrakt) L "....
osv


Tag dig ikke af fejlen  - det er en jeg genererer, men fejlen er også her med tovariable:

"(((Kontrakter.Kontraktsum)=([kontrakter].[Kontraktsum]) >= 20)

Du har sat Kontrakter.Kontraktsum)= ind
med fast tekst

Henrik

Avatar billede hnteknik Novice
09. april 2000 - 17:49 #11
Udtrykket

"(((Kontrakter.Kontraktsum)=([kontrakter].[Kontraktsum]) >= 20)"

er for så vidt ikke forkert
Den sætter slutværdien til at være true.

Og det er der vel ingen sum, der er.

Kan du selv bære den herfra.

Henrik

Avatar billede doeleman Nybegynder
09. april 2000 - 23:13 #12
Hej hnteknik,
Som sagt kender jeg intet til VBA, så jeg må indrømme at jeg ikke forstod meget af dit svar. Imidlertid fandt de fejlen i dk.edb.database.ms-access:

WHERE (((Kontrakter.Kontraktsum)=IIf([Forms]![frmSøg]![txtKontraktsumMin] Is Null,True,([Kontrakter].[Kontraktsum])>=[Forms]![frmSøg]![txtKontraktsumMin]))

skulle rettes til

WHERE IIf([Forms]![frmSøg]![txtKontraktsumMin] Is
Null,True,[Kontrakter].[Kontraktsum]>=[Forms]![frmSøg]![txtKontraktsumMin]

Da jeg havde løsningen, kunne jeg måske nok se, at det var det, du antyede, uden dog at være helt sikker. Jeg takker for din hjælp og giver dig pointene.

Hvis du mener, du havde det rigtige svar, kan du jo svare på http://www.eksperten.dk/spm.asp?id=14777 og derved få de ekstra 150 points, jeg havde lovet :-)


Avatar billede hnteknik Novice
10. april 2000 - 09:25 #13
Jeg takker - Koden er en udskrift af den forespørgelse, du har genereret.
Jeg har bare lagt den ud i tekst, så man kan se, hvad programmet beregner sig frem til. Nøgleordet i dit eksempel er mangel på overblik. Derfor kan der nemt indsnige sig banale fejl, som ikke er til at se for bar kode.

Jeg forstår ikke, hvad du mener med at du ikke kender noget til VBA. Du bruger det jo hele tiden.

Du kalder en funktion IFF, hvorfor ikke kalde en funktion, du selv har lavet.

I stedet for IFF kald en DOELEMANSFUNK([Forms]![frmSøg]![txtKontraktsumMin])


i et separat modul eller i formens klasse indføjer du:

function DOELEMANSFUNK((txtkontraktmin as variant) as variant
.... kode
end function

En VBA funktion giver dig meget større valgmulighed.

Henrik
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