Avatar billede mpd Nybegynder
30. juli 2015 - 17:07 Der 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
   
    sMatematik = Forms!FrmMain.cboProjektMatematikAar
    lAar = Forms!FrmMain.cboProjektAar
    intBuffer = CVar(sMatematik & lAar)
   
   
   
    If Err.Number <> 0 Then
        MsgBox Err.Description, vbOKOnly + vbCritical, "Fejl i systemet"
        Exit Function
    End If
   
    GetProjektAar = intBuffer
   
End Function
Avatar billede finb Ekspert
31. juli 2015 - 12:39 #1
Utestet:
">=2015"
eller
"">=2015""
Avatar billede neoman Novice
31. juli 2015 - 17:26 #2
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.
Avatar billede mpd Nybegynder
31. juli 2015 - 20:15 #3
Hej neoman

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.
Avatar billede bvirk Guru
01. august 2015 - 08:33 #4
Der skal eval() omkring hvis operatorer skal parameteriseres - et eksempel for at sikre at vi snakker om det samme.

En form: 'fmrOpr' har kombinationsboksen 'opr' med feltlisten "<";"<=";">=";">" og standardværdien "<"

I et standardmodul  ligger:

Function minOperator()
    minOperator = Forms!frmopr.opr
End Function

En tabel Ting ( navn tekst, tal heltal)  med eksempeldata:
radise    2013
squash    2013
majs    2014
agurk    2014
dild    2015
persille    2015

Så virker forespørslen (når frmOpr er åben)
SELECT navn, tal FROM ting
WHERE eval(tal & minOperator() & 2014)

Man behøver ikke nogen funktion - dette virker også:

SELECT [navn], [tal]
FROM ting
WHERE eval(tal & [Forms]![frmopr].[opr] & 2014);
Avatar billede mpd Nybegynder
01. august 2015 - 15:42 #5
Hej bvirk

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.

Kan du gennemskue, hvad jeg gør galt?
Avatar billede bvirk Guru
01. august 2015 - 17:12 #6
Hej mpd

Det var værdiliste jeg fejlagtigt kaldte feltliste
Hedder din formular med comboboksene frmMain?

Vil du vise tabel design og den fulde sql for forespørgslen?
Avatar billede mpd Nybegynder
01. august 2015 - 21:09 #7
Hej bvirk

Det er korrekt, min formular hedder frmMain.

Jeg har lavet forespørgslen noget simplere:

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.

Databasen er lavet i Access 2010.
Avatar billede bvirk Guru
02. august 2015 - 13:46 #8
Hej igen

Det var jo særdeles fyldestgørende oplysninger, når man ved at din comboboks der  vælger operator hedder cboProjektMatematikAar!

udtryk som

[Ordreaar] & [Formularer]![frmMain]![cboProjektMatematikAar] & [Formularer]![frmMain]![cboProjektAar]

bliver sammentrukket til strengen

"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.
Avatar billede bvirk Guru
02. august 2015 - 14:27 #9
og en implementering af side-kommentar i forlængelse af #4

fsuf er underformular kontrolelement på form 'frmopr' - værdilisten er udvidet til "<";"<=";"=";">=";">" - frmopr har klassemodul koden:

Private Sub Form_Open(Cancel As Integer)
    setfsufSourceObject
End Sub

Private Sub opr_AfterUpdate()
    setfsufSourceObject
End Sub

Sub setfsufSourceObject()
    fsuf.SourceObject = "Forespørgsel.fs" & Array("lt", "lteq", "eq", "gteq", "gt")(opr.ListIndex)
End Sub
Avatar billede mpd Nybegynder
04. august 2015 - 21:03 #10
Hej bvirk

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
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