tempvars in query

Status
Niet open voor verdere reacties.

test1000

Gebruiker
Lid geworden
7 jul 2017
Berichten
277
Hoi,

Ik heb een tabel met veld "Waarde" dat alfanumeriek is.
Op het formulier heb je een dropbox met veld "waarde" waar je kan selecteren 1 of 2 of All.

Dan heb ik een query van deze tabel waarvan het 'Criteria' = TempVars!waarde staat in kolom van "waarde".
Wanneer ik, via dropbox, 1 of 2 selecteer werkt de query.
Maw krijg ik output van alle records waarvan waarde = 1 of waarde = 2.
Maar wanneer ik waarde 'All' selecteer krijg ik geen record als output.
Wat is er fout aan de code ?
Code:
tmp_waarde = "1" & " or " & "2"

Hier de code 'Na bijwerken' :
Code:
    If Me.Waarde = "All" Then
        tmp_waarde = "1" & " or " & "2"
        TempVars!waarde = tmp_waarde
    Else
        tmp_waarde = Me.waarde
        TempVars!waarde = tmp_waarde
    End If

Alvast bedankt.
 
Geen idee waarom je code niet werkt, maar het ziet er nogal gecompliceerd uit. Om te beginnen dit:
Code:
tmp_waarde = "1" & " or " & "2"
Dat is namelijk hetzelfde als:
Code:
tmp_waarde = "1 or 2"
Dus waarom zo ingewikkeld opschrijven? Uit je code haal ik niet wat er gebeurt als je “All” selecteert (werken er alleen Engelsen bij jullie?).
 
Hoi,
De code
Code:
tmp_waarde = "1 or 2"
werkt niet. Heb ik 0 records.
Wanneer ik 1 selecteer heb ik 5 records.
Wanneer ik 2 selecteer heb ik 1 record.
Dus wanneer ik 'All' selecteer zou ik 6 records moeten hebben.
Maar ik heb 0 records.

Idd er werken Engels- en Franstalig personeel.

Voor alle duidelijkheid
Je hebt een tabel. Een veld met de naam "Waarde".
Wanneer je dus 1 selecteert wil ik alle records zien met Waarde = 1
Wanneer je 2 selecteert dan alle records met waarde = 2.
Wanneer je All selecteert dan de records met waarde 1 en 2.


En tempvars!waarde is in de query ingevuld (criteria) onder veld "Waarde"
 
Laatst bewerkt:
Je filtert op getallen, die moet je dus ook behandelen als getallen. Mijn voorbeeld doet dat. Blijkbaar heb je een tekstveld gebruikt voor het veld waarde. Klopt dat?
 
Verder ontbreekt er nogal wat informatie t.a.v. je vraag. Ik vermoed echter een fout in de syntax. Als je op één waarde filtert, zoals 1 of 2, dan krijg je zoiets als SQL:
Code:
SELECT Id, Producten, Inkoop, Criteria, Waarde FROM Tabel1 WHERE Waarde = 2

Bij meervoudige waarden krijg je echter een andere constructie. Ik gebruik het liefst In (#1,#2,#3) zodat de string overzichtelijker wordt, maar hetzelfde probleem krijg je met de operator OR:
Code:
SELECT Id, Producten, Inkoop, Criteria, Waarde FROM Tabel1 WHERE Waarde In (1,2)

Je ziet dat er geen = teken meer in de string zit. Het is dus niet voldoende om de losse getallen te vervangen door meervoudige waarden. Je moet het hele filter aanpassen.

Dit is de code als je OR gebruikt:
Code:
SELECT Id, Producten, Inkoop, Criteria, Waarde FROM Tabel1 WHERE Waarde=1 Or Waarde=2
 
Een redelijk foolproof oplossing is deze, waarbij je de IN parameter ook gebruikt voor de enkele waarde. Dat mag uiteraard altijd.
Code:
Private Sub cboWaarde_Click()
    TempVars.Add "Waarde", Me.cboWaarde.Value
        If Me.cboWaarde.Value = "All" Then
            TempVars!Waarde = "In (1,2)"
        Else
            TempVars!Waarde = "In (Me.cboWaarde.Value)"
        End If
End Sub

Merk ook op dat die extra variabele nergens voor nodig is :). (ook niet in jou code trouwens)
 
@Vena: je krijgt één antwoord van mij, dus geniet ervan: hou op met die nutteloze berichtjes. Punt.
 
Sorry, maar krijg nog steeds geen resultaat.

Ik heb een tabel met 3 velden. Deze tabel wordt opgemaakt door een 'tabelmaakquery'.
Veld "Waarde" heeft als gegevenstype = Numeriek en Veldlengte = geheel getal. (aantal decimalen = Automatisch)
De waarde van dit veld is 1 of 2.
Dus 5 records hebben de waarde 1 en 1 record heeft de waarde 2.

Dan heb ik een formulier met keuzelijst met invoervak. Type is lijst met waarden. De waarden zijn 1,2,All
Dus in de dropdown kan de gebruiker 1 of 2 of All selecteren.

Dan de Gebeurtenis 'Na bijwerken' heb ik deze code :
(Bij selecteren van de waarde)
Code:
Private Sub Waarde_AfterUpdate()
    TempVars.Add "Waarde", Me.Waarde.Value
    If Me.Waarde.Value = "All" Then
        TempVars!Waarde = "In (1;2)"
    Else
        TempVars!Waarde = Me.Waarde.Value
    End If
End Sub

Dan in de query heb ik bij veld Waarde een Group By en in regel van Criteria [TempVars]![Waarde]
Wanneer ik in de dropdown 1 selecteer heb ik 5 records. Is perfect.
Wanneer ik in de dropdown 2 selecteer heb ik 1 record. Is perfect.
Wanneer ik in de dropdown All selecteer krijg ik deze melding :
"Deze expressie is niet correct getypt of te complex voor evaluatie. Een numeriek expressie kan bijvoorbeeld te veel gecompliceerde elementen bevatten. Probeer de expressie te vereenvoudigen door verschillende delen van de expressie toe te wijzen aan variabelen."

Opmerking :
- Wanneer ik in de query, keihard, invul nl In (1,2) krijg ik geen resultaat. Wanneer ik In (1;2) invul dan krijg ik de 6 records. Is perfect. Dus , vervangen door ;
- Kan het zijn dat deze code niet correct is ? nl
Code:
[TempVars]![Plant] = "In (Me.Waarde.Value)"
Want als ik een MSGBOX doe dan zie ik deze tekst nl In (Me.Waarde.Value)
Dus niet de 1 of 2 die ik geselecteerd heb.
En dan krijg ik geen resultaat. Daarom gebruik ik TempVars!Waarde = Me.Waarde.Value
Dan krijg ik de juiste resultaten als ik 1 of 2 selecteer.

Mijn vermoeden is dat er iets misgaat met het overnemen van de [TempVars]![Waarde]. Nogmaals wanneer ik, in de query, de waarde In (1;2) invul heb ik wel resultaat.
Wanneer ik
Code:
TempVars!Waarde = "In (1;2)"
gebruik niet. Krijg ik de bovenstaande foutmelding.

Wat kan dit veroorzaken ?

Alvast bedankt voor uw hulp.
 
Laatst bewerkt:
Test1000,

Nog een manier in dit geval.

Code:
Private Sub Combo1_AfterUpdate()
    TempVars.Add "Waarde", Me.Combo1.Value
        If Me.Combo1.Value = "All" Then
            TempVars.Add "Waarde", "*"
        End If
Me.Requery
End Sub
Private Sub Form_Open(Cancel As Integer)
TempVars.Add "Waarde", "*"
Me.Requery
End Sub


En in de Query bij criteria: Like [TempVars]![Waarde]


Gr. Cor
 
Hoi Cor,

Bedankt voor de info.
En dat zal werken.

Maar het tweede veld in de tabel nl prijs bevat de waarden 10, 20 , 30 , 40 , 50, 60 en 70.
En dan heb ik een multi combo gemaakt. Dus de gebruiker kan verschillende waarden selecteren.
De ene keer de 10 en 50 of 20, 30 en 70 enz.

Daarom de vraag om via TEMPVARS!WAARDE en de optie OR te kunnen werken.
Ivm waarde 1,2 of all kan je idd de '*' gebruiken.

Maar in mijn volgende multicombox moet de OR bruikbaar zijn.
 
Wanneer leer je eens gelijk de juiste informatie te geven? Een Multi-Value veld kun je niet op dezelfde manier uitlezen als een gewone keuzelijst. Sowieso heb ik al aangegeven dat een oplossing met OR een hele lastige gaat worden, omdat je voor elke waarde een compleet filter moet aanmaken. Kijk nog even naar mijn laatste code om te snappen wat dat inhoudt. met IN heb je dat probleem niet: sterker nog, met IN heb je doorgaans überhaupt geen probleem. Dus waarom moet je met OR werken? Wie bepaalt dat?

Begin eens met een correct voorbeeldje te posten waar we wat mee kunnen stoeien, want ik sta niet te popelen (tijdgebrek (lees: totaal geen zin om zelf voorbeeldjes in elkaar te knutselen) om zelf eerst een database te moeten optuigen.
 
- Wanneer ik in de query, keihard, invul nl In (1,2) krijg ik geen resultaat. Wanneer ik In (1;2) invul dan krijg ik de 6 records. Is perfect. Dus , vervangen door ;
Waarom pas je de code die ik heb aangereikt niet toe en kijk je of die werkt?
Dit:
Code:
        TempVars!Waarde = "In (1;2)"
geeft uiteraard een foutmelding, want dit is niet de juiste code als je de SQL met VBA opbouwt. En dat doe je. Natuurlijk werkt In (1;2) als je het in de query zélf zet prima, want dat is de juiste notatie als je een query maakt. In VBA moet je echter een komma gebruiken. Dus dit:
Code:
        TempVars!Waarde = "In (1,2)"
is echt wel correct.
 
In bijlage een Access bestand.
Q_Waarde en Q_Afdeling

Q_waarde wanneer ik 1 of 2 selecteer krijg ik de juiste output. Wanneer ik All selecteer niet. Hier zou ik met Like * kunnen werken maar ivm meerdere selectie had ik graag de In (1,2) gezien. Want misschien is in de toekomst In (1,2) of In (1,3) (afhankelijk van de selectie)
Q_Afdeling is multibox. Hier kan de gebruiker 1 of meerdere selecties kiezen. Bij 1 selectie krijg ik de juiste output. Bij meerdere selecties niet.

Hopelijk dat adhv dit voorbeeld het probleem gevonden kan worden.

Alvast bedankt.
 

Bijlagen

Laatst bewerkt:
Met bijgaande code (je hebt hierbij de knop niet nodig) kun je de SQL van je query aanpassen aan de situatie. Werkt in ieder geval prima in jouw voorbeeld :).
Code:
Private Sub Waarde_Click()
Dim qDef As QueryDef

    Set qDef = CurrentDb.QueryDefs("Q_Waarde")
    TempVars.Add "Waarde", Me.Waarde.Value
    If Me.Waarde.Value = "All" Then
        TempVars!Waarde = "In (1,2)"
    Else
        TempVars!Waarde = "=" & Me.Waarde.Value
    End If
    qDef.SQL = "SELECT Nummer, Prijs, Waarde FROM T_Personeel WHERE Waarde " & TempVars!Waarde
    DoCmd.OpenQuery "Q_Waarde"

End Sub
 
Hoi,

De oplossing van Octafish heeft geholpen.
Maar nu wil ik som maken van een query en het aantal records weten.
Het zou makkelijker zijn als ik via TempVars kon meegeven.
Nu moet ik de query via qDef.SQL schrijven.

Hopelijk dat het mij gaat lukken.
Ik ga dit issue sluiten en bij problemen ga ik dit heropenen of een nieuw issue aanmaken.
 
De ‘som van een query’ en het aantal records in een query zijn waarden die uit één getal bestaan, en daar kun je prima een Tempvar voor gebruiken/maken. Waarom je dat zou doen is mij eerlijk gezegd een raadsel, want die waarde kun je probleemloos in elke query aanmaken zonder dat je daar een variabele voor nodig hebt. Bovendien zijn dit waarden die dynamisch zijn, en een Tempvar is dat niet; die moet je steeds updaten. Dus ik begrijp niet waarom je dat op deze manier zou doen. Maar het is jouw db :).
 
Het voorbeeld dat ik had gestuurd was een gedeelte van het formulier.
Je hebt ook nog de velden [Van Datum] en [Tot datum].

Vb de gebruiker vult in [Van Datum] en [Tot datum].
En dan kan hij selecteren een afdeling of afdelingen.
Afdeling is een multibox. Je kan meerdere afdelingen selecteren.
Dan, denk ik, zou het heel handig zijn geweest TempVars!Afdelingen en je wijst hier de gekozen afdelingen aan toe.
Want je wil vb het aantal records weten. Vb hoeveel bezoeken.


Of zie ik iets over het hoofd ?
 
Tuur een complete versie mee; als je maar een deel meestuurt, krijg je oplossingen die niet gebaseerd zijn op de werkelijke situatie. Daar heb jij niks aan (incomplete oplossing) en wij ook niet (erg zonde van onze tijd).
 
Hoi,

In bijlage een voorbeeld access.

De bedoeling in om de query 'Q_BEREKEN' de tempvars!afd_nummer te vervangen.
Of moet je altijd de QDEF.SQL code gebruiken ?
 

Bijlagen

Ik heb de QDEF.SQL code voor elkaar gekregen adhv voorbeeld van Octafish.
Dank u voor voorbeeld.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan