Avatar billede fogh Nybegynder
10. januar 2005 - 13:13 Der er 26 kommentarer og
4 løsninger

Sende variabler fra VBA som kriterier til forespørgsel

Hej!

Problem : Ønsker at kunne sende variabler defineret i VBA til "kriterie-felterne" i en forespørgsel. Jeg har forsøgt mig med driis's forslag fra spm.92484, men jeg kan ikke få funktionen "idFunc" til at returnere andet end '0', selvom variablem "idVar" godt nok bliver tildelt en værdi fra min Fromular. - What is wrong?

Denne funktion er oprettet (ifølge spm.92484):
Public Function idFunc() As Integer
  idFunc = idVar
End Function

Jeg har oprettet en Form der indeholder teksbokse og rammer, hvor brugerne indtaster kriterierne til forespørgslen.
Herefter skal man kunne trykke på en knap - og kriterierne fra min form skal sendes til "kriterie-felterne" i forespørgslen "qryTest" :

Private Sub Knap_Click()
idVar = Me.Ramme4.Value  '(kan returnere værdier 1,2 eller 3)
MsgBox "IdVar = " & idVar
MsgBox "IdFunc = " & idFunc
DoCmd.OpenQuery "qryTest", acViewNormal
End Sub
10. januar 2005 - 13:17 #1
Du skal sikre dig, at idvar er erklæret i et modul som:

public IdVar as Integer
Avatar billede madschristensen Nybegynder
10. januar 2005 - 13:19 #2
Kan det være det scope (privat) variablen bliver erklæret med?
Avatar billede madschristensen Nybegynder
10. januar 2005 - 13:19 #3
privat=private... Som ganske rigtigt skal være public
10. januar 2005 - 13:22 #4
Funktionen idfunc tillige ligge i et modul. Det må ikke ligge på formularen (ellers skal kaldet i hvert fald være anderledes)
Avatar billede fogh Nybegynder
10. januar 2005 - 13:59 #5
Funktionen ligger i et modul... Jeg har nu tilføjet "public IdVar as Integer" til modulet. Og jeg har prøvet at kalde Sub'en på min form for "Public Sub" det hjælper heller ikke... Har I andre bud?
10. januar 2005 - 14:03 #6
prøv at trykke Ctrl+G (for at komme i immidiate-vinduet i VBA editoren)

Her skriver du nu:

idvar = 88 (tryk ENTER)

skriv:
?idFunc  (tryk ENTER)

Herefter skulle der skrives 88 nedenunder, hvis funktionen og idvar er sat korrekt op.
Avatar billede fogh Nybegynder
10. januar 2005 - 14:09 #7
Smart, det kendte jeg ikke - men den returnerer desværre stadig 0 ...
Avatar billede fogh Nybegynder
10. januar 2005 - 14:10 #8
Hvordan skal det så helt præcist sættes op - siden det ikke fungerer som det er nu?
Avatar billede madschristensen Nybegynder
10. januar 2005 - 14:11 #9
Kan du ikke lige sætte erklæringen ind?
10. januar 2005 - 14:12 #10
så er der noget galt.

Dette indsættes i toppen af et modul

Public idvar as Integer

Public Function idFunc() As Integer
  idFunc = idVar
End Function
Avatar billede terry Ekspert
10. januar 2005 - 19:41 #11
Simple example, and you need a reference to DAO

you have a query named qryGetEmployee

PARAMETERS [Enter Number] Text ( 255 );
SELECT tblEmployee.ID, tblEmployee.EmpName, tblEmployee.EmpNumber
FROM tblEmployee
WHERE (((tblEmployee.EmpNumber)=[Enter Number]));


Code:

Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset

    Set dbs = CurrentDb
   
    Set qdf = dbs.QueryDefs("qryGetEmployee")
   
    qdf.Parameters("Enter Number") = "123"
   
    Set rst = qdf.OpenRecordset()
   
    With rst
        If .RecordCount > 0 Then
       
            Debug.Print rst!EmpName
        End If
    End With
   
    'Clean up goes here
Avatar billede terry Ekspert
10. januar 2005 - 19:44 #12
you can also have a query WITHOUT the PARAMTERS declaration

SELECT tblEmployee.ID, tblEmployee.EmpName, tblEmployee.EmpNumber
FROM tblEmployee
WHERE (((tblEmployee.EmpNumber)=[Enter Number]));
10. januar 2005 - 19:55 #13
Du kan også bare referere direkte til Ramme4 således:

Select * From DinTabel Where ID = [Forms]![DinFormular]![Ramme4]
14. januar 2005 - 14:50 #14
Fogh?
Avatar billede fogh Nybegynder
14. januar 2005 - 18:18 #15
Jeg har lige været lidt væk fra den igen - men jeg har ikke kunnet få noget af det til at fungere...
Det nemmeste er at refere direkte til formen, men hvordan får jeg så værdien "3" til i forespørgslen at returnere "blank" (intet kriterie) - med iif() ??
Avatar billede terry Ekspert
14. januar 2005 - 19:30 #16
I think you need to convert the value to an integer

try:
Select * From DinTabel Where ID = CInt([Forms]![DinFormular]![Ramme4])
14. januar 2005 - 19:37 #17
hmm, så er du nok nødt til at skrive din SQL en smule om:

SELECT * FROM Dintabel WHERE [Forms]![DinFormular]![Ramme4]=IIf([Forms]![DinFormular]![Ramme4]=3,[Forms]![DinFormular]![Ramme4],[ID])
Avatar billede terry Ekspert
14. januar 2005 - 19:40 #18
SELECT T1.*, T1.Kode
FROM T1
WHERE (((IIf(IsNull([Forms]![Form1]![Frame5]),[Forms]![Form1]![Frame5],CInt([Forms]![Form1]![Frame5]))) Is Null)) OR (((T1.Kode)=IIf(IsNull([Forms]![Form1]![Frame5]),[Forms]![Form1]![Frame5],CInt([Forms]![Form1]![Frame5]))) AND ((IIf(IsNull([Forms]![Form1]![Frame5]),[Forms]![Form1]![Frame5],CInt([Forms]![Form1]![Frame5]))) Is Not Null));
Avatar billede terry Ekspert
14. januar 2005 - 19:45 #19
In the example The form is named form1 and the Frame = Frame4

If the frame is NOT set (NULL) then you will select ALL records. Otherwise the recordse where Kode = the frame value

Table name = T1
14. januar 2005 - 19:46 #20
terry, er mit eksempel så ikke lidt mere elegant (og kortere)?
Avatar billede terry Ekspert
14. januar 2005 - 19:49 #21
only if it works Thomas :o)
Avatar billede terry Ekspert
14. januar 2005 - 19:56 #22
Thomas, has one of us misunderstood what fogh wants?

If NO value is select (NULL) then isnt it supposed to return ALL? and if I understand your query corectly it doesnt, but maybe I'm getting tired after a Looo...ng day at work.
Avatar billede terry Ekspert
14. januar 2005 - 19:59 #23
fogh, I've placed and example here if you still cant get it working

http://home1.stofanet.dk/santhel/Download/579103.mdb

and now I'm off for the evening
14. januar 2005 - 20:32 #24
Terry, jeg tror, at du har misforstået det. Hvordan vil du bære dg ad med at sætte rammen til Null, når først du har haft klikket én gang?
Det er når værdien 3 er valgt, at alle poster skal returneres!

Fogh, inden du går kold i alle disse indlæg, så mener jeg stadig bare, at du skal indsætte denne SQL i din forespørgsel og så kører den:

SELECT * FROM Dintabel WHERE [Forms]![DinFormular]![Ramme4]=IIf([Forms]![DinFormular]![Ramme4]=3,[Forms]![DinFormular]![Ramme4],[ID])
Avatar billede fogh Nybegynder
17. januar 2005 - 22:58 #25
Hej Gutter! Tak for jeres indsats: Jeg har fået Thomas' løsning til at fungere - og vil se nærmere på Terry's inden længe... Kan I vente med point-tildelingen lidt endnu?
(Det irriterer mig dog stadig at det er nødvendigt at have en form åben for at sende værdierne til forespørgslen)
Avatar billede terry Ekspert
18. januar 2005 - 07:46 #26
with the solution I gave you do NOT need to have a form open. BUT you have to open the query from code. But if you dont have a form open then where is your frame?
18. januar 2005 - 08:27 #27
Fogh-> Det behøver ikke nødvendigvis at være en form, du refererer til. Det kan også være en funktion eller en parameterværdi.
Jeg foreslog kun formular-løsningen fordi du selv skrev, at det var nemmere og fordi det hele tager udgangspunkt i din ramme på formularen.

Hvis du hellere il bruge din funtkion, så skal den bare se således ud:

SELECT * FROM Dintabel WHERE idFunc()=IIf(idFunc()=3,idFunc(),[ID])
27. januar 2005 - 21:33 #28
fogh?
17. februar 2005 - 15:30 #29
lukketid?
Avatar billede fogh Nybegynder
07. september 2005 - 21:46 #30
Undskyld mit smøleri - I er begge altid hjælpsomme
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