04. april 2000 - 15:36Der 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.
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
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.
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
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!
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.
>>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.
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:
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.
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
Synes godt om
Ny brugerNybegynder
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.