Meerdere mogelijkheden in If-then Statement

Status
Niet open voor verdere reacties.

Scallebe

Gebruiker
Lid geworden
29 okt 2014
Berichten
528
Goede middag,

Ik ga met de code een dienst gaan opzoeken gelinkt aan een persoon in de tabel TabelCorrespondenten. Die waarde staat in een Combo Box gelinkt aan de TabelDiensten

Nu wil ik een If then statement maken met verschillende mogelijkheden uit die Combo Box.

1 : Kan ik met verschillende "Or's" werken? of moet ik If - ElseIf - Else gebruiken?

2 : Ik vermoed dat ik de DiensID moet gebruiken als waarde in de "Or" of moet ik de werkelijke tekst gebruiken die in het veld Dienst staat?


Code:
Dim Dienstlevel As Integer
    Dienstlevel = DLookup("Dienst", "TabelCorrespondenten", "UserLogin = '" & Forms!FormLogin.txtUserName.Value & "'")
        If Dienstlevel = (1 Or 2 Or 5 Or 9) Then

' Rest van de code...

Thanks

Greetz

Pascal
 
Laatst bewerkt:
Ik heb ondertussen geprobeerd met "If - then - ElsiIf …... Else - End If" en het werk prima.

Code:
If Dienstlevel = 1 Then
        DoCmd.OpenForm "FormMilitairen", acNormal
        
        ElseIf Dienstlevel = 2 Then
        DoCmd.OpenForm "FormMilitairen", acNormal

        ElseIf Dienstlevel = 5 Then
        DoCmd.OpenForm "FormMilitairen", acNormal

        ElseIf Dienstlevel = 8 Then
        DoCmd.OpenForm "FormMilitairen", acNormal

        ElseIf Dienstlevel = 9 Then
        DoCmd.OpenForm "FormMilitairen", acNormal

        Else
        MsgBox ("OPGELET!! - ATTENTION!! :" & vbCrLf & vbCrLf & "Je bent geen lid van Tar A")
        DoCmd.Close acForm, "FormMilitairen", acSaveNo

Waarschijnlijk kan het op een gemakkelijkere manier... een beknoptere code... :confused:

Maar na wat uittesten ben ik toch al zover gekomen... :eek:

Greetz

Pascal
 
Het kan zéker korter en netter. Ook de manier waarop je het formulier sluit trouwens :). Het argument acSaveNo doet namelijk helemaal niks :).

Code:
    Select Case Me.Dienstlevel
        Case 1, 2, 5, 8, 9
            DoCmd.OpenForm "FormMilitairen", acNormal
        Case Else
            MsgBox ("OPGELET!! - ATTENTION!! :" & vbCrLf & vbCrLf & "Je bent geen lid van Tar A")
            DoCmd.Close acForm, Me.Form.Name
    End Select
 
Het argument acsaveno zorgt ervoor dat, indien men het formulier had gewijzigd terwijl men het open heeft, niet gevraagd wordt of de wijziging dient opgeslagen te worden.
 
Maar alleen als je het formulier zelf wijzigt. En daar is hier geen sprake van.
 
Octafish,

Het is inderdaad korter en netter op die manier. :d

Bedankt voor de aanpassing :thumb:

In jouw code refereer je naar de Form :
Code:
Select Case Me.Dienstlevel
Maar in de Form waar de code moet inkomen wordt het veld niet gebruikt.

Ik werk wel met een FormLogin bij openen van de database. Na invoer van het paswoord blijft de FormLogin open maar verborgen voor de gebruiker.
Ik heb dan maar een tekstveld txtDienst gecreëerd in het FormLogin met een DLookUp als BesturingselementBron :

=DLookUp("Dienst";"TabelCorrespondenten";"UserLogin = '" & [Formulieren]![FormLogin].[txtUserName].[Value] & "'") en naar daar dan gerefereerd in "Select Case...). (Zie code onderaan)

Het rare is nu wel dat ik de DienstID te zien krijg in het FormLogin ipv van de werkelijke benaming van de dienst. DLookUp("Dienst" is in de TabelCorrespondenten een ComboBox.

Ik weet dat die DienstID nodig is voor de Case in de code.... (Zover ben ik nog mee :confused:)

Maar hoe krijg ik de waarde van de 2de Column in een ander Tekstveld bijvoorbeeld? Die kan ik dan zichtbaar laten en de DienstID onzichtbaar maken voor de gebruiker.

Dit is dan uw lichtjes aangepaste code :

Code:
Private Sub Form_Load()

Dim Dienstlevel As Integer
    
    Dienstlevel = DLookup("Dienst", "TabelCorrespondenten", "UserLogin = '" & Forms!FormLogin.txtUserName.Value & "'")
 

[COLOR="#0000FF"]Select Case [Forms]![FormLogin].[txtDienst][/COLOR]
        Case 1, 2, 5, 8, 9
            DoCmd.OpenForm "FormMilitairen", acNormal
        Case Else
            MsgBox ("OPGELET!! - ATTENTION!! :" & vbCrLf & vbCrLf & "Je bent geen lid van Tar A")
            DoCmd.Close acForm, Me.Form.Name
    End Select

        
End Sub

#OctaFish, #NoellaG : Ik kan dus beter de acSaveNo weglaten dan bij close Form?

Om nog even terug te komen op mijn vraag : kan je meerdere "Or" gebruiken in een criteria of is dit beperkt tot 1

vb

Code:
If Dienstlevel = (1 Or 2 Or 5 Or 9) Then


Bedankt voor het doorgeven van jullie kennis en expertise, het verbaasd mij steeds opnieuw... :thumb::thumb:

Greetz

Pascal
 
Laatst bewerkt:
Ik wist niet dat Dienstlevel een variabele was; dat kon ik niet uit je code halen. Ik ging uit van een keuzelijst op een formulier :). Een formulier open houden puur voor de reden dat je anders een waarde kwijtraakt die je anders nodig hebt, is ook niet nodig. Ik gebruik redelijk vaak TempVar variabelen; die houden hun waarde zolang de db open is. Dus als een gebruiker bij mij inlogt, zet ik de UserID vast in de TempVar varUser, en die kan ik dan overal gebruiken. Het leuke is van Tempvars: je kunt ze ook in queries opvragen. Is soms erg handig!
Dit:
Code:
If Dienstlevel = (1 Or 2 Or 5 Or 9) Then
daarentegen werkt niet. Dat zou zoiets moeten zijn:
Code:
If Dienstlevel = 1 Or Dienstlevel = 2 Dienstlevel = 5 Or Dienstlevel = 9 Then
Eventueel nog:
Code:
If Dienstlevel In(1, 2, 5, 9) Then
Maar die laatste variant gebruik ik zo nooit, dus die heb ik ook niet getest.

acSaveNo doet niks, dus of je hem gebruikt of niet, maakt niks uit :).

txtDienst kun je veel beter vullen vanuit de keuzelijst waarin je de gebruiker kiest. Zet alle kolommen die je nodig hebt in de keuzelijst, en haal de velden er zo uit:
=cboUser.Column(#). Waarbij # dan de gewenste kolom - 1 is, want deze eigenschap ziet de eerste kolom als kolom 0. Een gebruiker zelf zijn naam in laten typen, is wel héél ouderwets :).
 
OctaFish,

De gebruiker wordt in de FormLogin niet gekozen of ingevuld. De gebruiker wordt (standaard) bepaald door de GetWinUser() en is dus automatisch ingevuld. Ik laat het zichtbaar ter controle van de gebruiker :) Ik kan het ook onzichtbaar maken en enkel het paswoord veld zichtbaar houden...

Ik kom er nog steeds niet uit hoe ik de waarde van de 2de of 3de kolom kan bepalen.

Zo lukt het dus niet :confused: : ik krijg een #fout

Dit staat in de BesturingselementBron van het tekstveld, niet in VBA :

=DLookUp("Dienst.Column(2)";"TabelCorrespondenten";"UserLogin = '" & [Formulieren]![FormLogin].[txtUserName].[Value] & "'")

Of het gaat niet zoals ik het wil, of het is waarschijnlijk een kwestie van haakjes of punt of …. :rolleyes:

Ik ben een beetje gaan Googlen ivm de TempVar… Als ik het goed begrijp moet dan wel de dienst, in mijn geval, eerst bepaald worden in het FormLogin. Wat nu het geval is...
Daarna kan ik de TempVar bepalen en die later gebruiken. En dan kan het FormLogin eigenlijk gesloten worden?
Het bepalen van de TempVar gebeurd in de FormLogin, juist?

Ik denk zo iets... :confused:

Code:
    Dim UserDienst As Integer
    
    UserDienst = Me.txtDienst
    
    TempVars.Add "DienstLogin", UserDienst

En de DienstLogin kan dan verder gebruikt worden waar ik die maar nodig zou hebben???

vb :
Code:
Select Case DienstLogin

of ben ik wartaal aan het typen??? :rolleyes::confused:


Greetz

Pascal
 
Hoi, ik zie niet in waarom je de user in een tempvar moet opslaan als deze de windows user is die je via een functie kan opvragen. De user wordt dus reeds bewaard in Windows. Vraag die daar op als het nodig is. Ik laat mijn programmeurs volgens het KISS principe werken: Keep It Simple Stupid :D
 
Noëlla,

Het is niet de User die ik wil opslaan in een TempVar maar de dienst waar de User lid van is.
De user kan ik inderdaad bepalen waar ik maar wil met GetWinUser()

De vraag is of de manier waarop ik de TempVars in #8 heb bepaald correct is.

En hier zit ik ook nog mee. Ik heb tevergeefs gezocht naar de manier om de waarde uit de 2de of 3de kolom te halen uit de Combobox "Dienst" in een tabel.

Niet met VBA maar in de BesturingselementBron.

Zo krijg ik #Fout als resultaat.

=DLookUp("Dienst.Column(2)";"TabelCorrespondenten";"UserLogin = '" & [Formulieren]![FormLogin].[txtUserName].[Value] & "'")

Greetz

Pascal
 
Je hebt de gave om mij steeds opnieuw in verwarring te brengen :).
Ik ga met de code een dienst gaan opzoeken gelinkt aan een persoon in de tabel TabelCorrespondenten. Die waarde staat in een Combo Box gelinkt aan de TabelDiensten.
Vind je het gek dat ik denk dat je op je formulier met een keuzelijst werkt?
Ik kom er nog steeds niet uit hoe ik de waarde van de 2de of 3de kolom kan bepalen.
Je kunt alleen kolommen uitlezen uit een keuzelijst, nooit uit een tekstveld. Want die heeft geen kolommen :).
Ik zou het altijd zo doen op het inlogformulier:
Code:
    Set rs = CurrentDb.OpenRecordSet(Select "UserID, Dienst, DienstLevel FROM TabelCorrespondenten WHERE UserLogin = """ & Me.txtUserName.Value & """")
    With rs
        TempVars.Add "VarUser", .Fields("UserID").Value
        TempVars.Add "VarDienst", .Fields("Dienst").Value
        TempVars.Add "VarDienstLevel", .Fields("DienstLevel").Value
    End With

Maar goed, ik heb dan ook geen programmeurs in dienst en moet alles zelf doen :).
 
Jammer genoeg heb ik die ook niet en moet ik mij dikwijls beroepen op jullie deskundigheid:thumb:, Onrechtstreeks heb ik er dan toch... :)

Met deze "formule" die ik in BesturingselementBron plaats van een tekstveld "txtDienst" in de FormLogin ga ik dus een waarde gaan zoeken : (Ik heb geen keuzelijst in de FormLogin)

=DLookUp("Dienst";"TabelCorrespondenten";"UserLogin = '" & [Formulieren]![FormLogin].[txtUserName].[Value] & "'") --> Resultaat = 5 (=corresponderende DienstID van de huidige gebruiker zijn dienst) en dit klopt.

Het veld "Dienst" in de tabel "TabelCorrespondenten" is geen tekstveld maar een combobox (Keuzelijst uit de tabel "TabelDiensten" met twee kolommen : DienstID en Dienst)

Ik wil in txtDienst van FormLogin dus niet de DienstID als resultaat maar de corresponderende tekst uit de Column(1) van de Combobox "Dienst" in de tabel "TabelCorrespondenten".


Ik weet dat ik met het bekomen resultaat "5" wel degelijk verder kan met de code om te bepalen of een Form al dan niet geopend mag worden. zoals initieel deze vraag mee begonnen is.

Gewoon uit nieuwschierigheid zou ik willen weten hoe ik de waarde uit Column(1) kan krijgen en niet die uit Column(0) (wat blijkbaar de standaard is indien niet bepaald)


Ik probeer maar de verwarring te ontwarren :rolleyes:


Als ik het goed begrepen heb in uw laatste voorbeeld worden er 3 waarden opgezocht in de tabel "TabelCorrespondenten" waar ik dan in heel de database kan naar verwijzen als ik die nodig heb?


Greetz en slaapwel

Pascal
 
Je gebruikt toch hopelijk geen keuzelijsten in je tabel hè? Gelijk afschaffen die handel, en alle keuzelijsten (behalve keuzelijsten op basis van waarden) vervangen door tekstvelden. Sowieso sla je in die keuzelijst alleen het gebonden veld op (standaard het eerste veld inderdaad) maar daarnaast kun je er niet zoveel mee. Keuzelijsten horen op formulieren te staan, niet in tabellen. Dus als je op je formulier een keuzelijst Dienst hebt (onhandige naa, maak daar cboDienst van) dan gaat het zo:

Code:
txtDienst =cboDienst.Column(1)
Dan heb je dus het tweede veld uit de keuzelijst uitgelezen.
 
Waarom maak je geen query waar alle waarden instaan die je nodig hebt, iets als
Code:
select TC.Userlogin, TD.dienstID, TD.dienst from TabelCorrespondenten TC inner join TabelDiensten TD on TC.dienst =  TD.dienstid
Je slaat die op als qryUsersDiensten en dan kan je een dlookup doen naar die query in plaats van naar de tabel

DLookUp("Dienst";"qryUsersDiensten ";"UserLogin = '" & [Formulieren]![FormLogin].[txtUserName].[Value] & "'")

Lijkt me simpelder
 
OctaFish,

Het is dus wel degelijk een keuzelijst op basis van waarden.:) Het veld Dienst in "TabelCorrespondenten" komt uit de tabel "TabelDiensten" met een One-to-Many relatie.

Dus... tot zover werkt de formule in het formulier FormLogin wel maar niet met het gewenste resultaat. Je kan in de foto zien dat er een 5 staat in het veld txtDienst en niet de benaming van de gevonden dienst uit de tabel "TabelCorrespondenten" die correspondeerd met DienstID 5

=DLookUp("Dienst";"TabelCorrespondenten";"UserLogin = '" & [Formulieren]![FormLogin].[txtUserName].[Value] & "'")

Hij gaat dus de dienst gaan zoeken die correspondeert met txtUserName met als resultaat : 5 en het moet 'Ctl Med - Appl Mgr - POC' zijn.

Ondertussen merk ik dat Noëlla ook nog gereageerd heeft met een oplossing.... Jullie slapen ook niet veel he :shocked:


En zie het resultaat :):thumb:

Login 1.JPG

Het is daarom dat ik zo laat opblijf.

Many many thanks #OctaFish:thumb: & #NoellaG:thumb:

Slaap wel en tot de volgende.


Pascal
 
Het is dus wel degelijk een keuzelijst op basis van waarden.:) Het veld Dienst in "TabelCorrespondenten" komt uit de tabel "TabelDiensten" met een One-to-Many relatie.
Dat bedoel ik dus met verwarring zaaien: je zegt nu dat je een keuzelijst op basis van waarden gebruikt (Lijst met waarden), maar je laat vervolgens een keuzelijst zien op basis van Tabel/Query :). Wat is het nou?
Overigens vind ik je werkwijze (en de oplossing van Noella op basis van die werkwijze) nog steeds erg knullig :). Toch maar eens wat programmeurs in dienst nemen, want blijkbaar ben ik hier toch te dom voor :D.
 
OctaFish,

Sorry... Waarschijnlijk gebruik ik niet altijd de juiste termen, ook al bedoel ik ze goed.:eek:

Het kan dan bijna niet anders dat het voor verwarring zorgt. :(

Een keuzelijst op basis van Tabel/Query zag ik als een keuzelijst op waarden... Ik weet nu wat je bedoeld (denk ik). Op waarden (die je zelf ingeeft) - op tabel/Query (die opgezocht worden in een andere bron)

Ik zal in de toekomst beter mijn best doen... :p

Als ik het goed begrepen heb in uw laatste voorbeeld (#11) worden er 3 waarden opgezocht in de tabel "TabelCorrespondenten" waar ik dan in heel de database kan naar verwijzen als ik die nodig heb?

de code met :

Set rs =…. enz



Greetz

Pascal
 
Dat laatste zie je goed :). Ik gebruik dus eigenlijk altijd een recordset om de gebruiker op te zoeken. Jij hebt daar een aparte functie voor; geen idee wat die doet. Ik doe dat altijd met Environ("Username"). Werkt perfect, en je hebt geen aparte functie nodig. Die Environ gebruik ik dus als filter voor de Usertabel, waar (als het goed is) de juiste instellingen worden bewaard voor de users, zoals in jouw geval de afdeling en het inlogniveau. En vanuit die recordset vul je dan de tekstvelden op het formulier. Nooit een DLookup nodig, die gebruik ik heel sporadisch :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan