30. juli 2015 - 17:07Der er
9 kommentarer og 1 løsning
Funktion, der skal bruges i en forespørgsel, hvor der bruges >, =, <
Hej
Jeg forsøger at lave en funktion, hvor jeg definerer en variabel til mine forspørgsler. Funktionen skal returnere ex. >=2015, der skal bruges i en forespørgsel.
Jeg har lavet to combo bokse: en hvor du vælger >,= eller < og en, hvor man vælger år.
Jeg har en funktion, der ser således ud, men virker ikke:
Public Function GetProjektAar()
On Error Resume Next
Dim intBuffer As Variant Dim sMatematik As String Dim lAar As Long
Du blander ting sammen. Du kan angive PARAMETRE for en forespørgssel (som er værdier) men ikke operatorer og deslige, som ændrer udtrykket.
For at have variable kriterier så kan du stable logiske udtryk på benene i forespørgslen, så et kriterium kun gælder når en anden kontrol har en vis værdi. Eller du kan lave et nyt SQL-udtryk hver gang. For en forespørgsel kan man ændre i den bestående foresporgsels SQL vha QueryDef objektet. Googl det.
Hvis jeg i en forespørgsel angiver >=2015 som en parameter ved at sætte ">=" foran en henvisning til en comboboks (cbo.ProjektAar), så virker det fint.
Det er muligheden for at kunne vælge større end, mindre end osv. i udtrykket, jeg mangler.
Forespørgslen anvendes til at opdatere en underformular, så jeg har lidt svært ved at se, hvordan jeg skal bruge QueryDefs.
Hvis jeg skal bruge querydefs må du gerne være lidt mere specifik.
Jeg har nu forsøgt med forskellige modeller og eval, men kan ikke få det til at virke.
Jeg har lavet en comboboks (cboprojektMatematikAar) med en værdiliste (ikke feltliste), som du har beskrevet. Jeg har desuden en comboboks, hvor man vælger år (cboProjektAar).
Jeg har droppet funktionen, men prøver i stedet at bruge eval direkte i min forespørgsel. Jeg kan dog ikke fået det til at virke.
Har forsøgt som du har vist. Min eval ser således ud: Eval([cboProjektAar] & [cboProjektMatematikAar] & 2014).
Forespørgslen skal jo gerne returnere ex >=2015, hvis der er det, jeg vælger, men returnerer i stedet -1.
SELECT DISTINCT tblProjektSalg.OrdreAar, tblProjektSalg.OrdreMaaned, tblProjektSalg.Projektnavn, tblProjektSalg.KundeID, tblProjektSalg.Ordresum, tblProjektSalg.Ordredato FROM tblProjektSalg WHERE (((tblProjektSalg.OrdreAar)=Eval([Ordreaar] & [Formularer]![frmMain]![cboProjektMatematikAar] & [Formularer]![frmMain]![cboProjektAar])) AND ((tblProjektSalg.OrdreMaaned) Like IIf([Forms]![frmMain]![cboProjektMaaned]="0","*",[Forms]![frmMain]![cboProjektMaaned])));
Tabellen hedder tblProjektsalg Feltet OrdreAar er et langt heltal - det samme er OrdreMaaned. Projektnavn og kundeID er tekstfelter, Ordresum er et dobbelt reelt tal mens ordredato er et datofelt - kort datoformat.
"2015 < 2014" (for de respektive vædier af ordreår, matår og prjår)
som så eval(...) retunerer som falsk
Det skal IKKE sammenlignes med ordreår - med andre ord bliver den del af sql'en:
WHERE ((Eval([Ordreaar] & [Formularer]![frmMain]![cboProjektMatematikAar] & [Formularer]![frmMain]![cboProjektAar])) AND ...
..........
En side-kommentar:
Det er ikke særligt effektivt rent relationsdatabasemæssigt at kalde vba funktioner som eval for hver post - det modsiger måden sql maskinen er optimeret til at arbejde med indekser på - det er et alternativ til den gængse praksis som er at lave én forespørgsel for hver operatorkombination - det kan sagtens gives samme brugerflade med operatorvalg i comboboks - så her udløsende forespørselsskift.
Det blev ikke helt som skrev, men du skal have points for at lede mig i den rigtige retning.
Jeg lavede i stedet en sql i en funktion ved navn qryProjektsalg, hvor jeg lavede en select case ift. hvad der var valgt i min cboProjektMatematikAar.
Så brugte jeg: Forms!frmmain.frmProjektsalg_Sub.Form.RecordSource = qryProjektsalg
til at opdatere formularen.
Tak for hjælpen
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.