If Then Else

  • Onderwerp starter Onderwerp starter Zand
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Zand

Gebruiker
Lid geworden
21 apr 2004
Berichten
12
Hallo allemaal,

Ik heb een formulier gemaakt. In het formulier staat een subform genaamd FrmTVTVakantie

Ook staan er 12 niet afhankelijke tekstvakken in het formulier genaamd vakantie01_v t/m vakantie12_v

Het resultaat in die 12 velden is afhankelijk van het personeelsID en of in het subform een record aanwezig is waarbij de waarde voor Maand ook 1 t/m 12 is.

Ik gebruik het volgende stukje code in VB bij het laden van een formulier:

ZiekMaand1:

If FrmTVTVakantie!maand_v = 1 Then GoTo ZiekJaMaand1 Else GoTo ZiekNeeMaand1

ZiekJaMaand1:

'Joseph
If [PersoneelID_v] = "1" Then vakantie01_v = 16
'Marielle
If [PersoneelID_v] = "3" Then vakantie01_v = 16
'Dennis
If [PersoneelID_v] = "4" Then vakantie01_v = 16
'Nicky
If [PersoneelID_v] = "6" Then vakantie01_v = 16
'Daniel
If [PersoneelID_v] = "12" Then vakantie01_v = 16
'Gerwin
If [PersoneelID_v] = "13" Then vakantie01_v = 16
'Colin
If [PersoneelID_v] = "20" Then vakantie01_v = 16
'Joshua
If [PersoneelID_v] = "24" Then vakantie01_v = 16
'Marijn
If [PersoneelID_v] = "25" Then vakantie01_v = 8
'Jos
If [PersoneelID_v] = "7" Then vakantie01_v = 8

GoTo ZiekMaand2

ZiekNeeMaand1:

'Joseph
If [PersoneelID_v] = "1" Then vakantie01_v = 20
'Marielle
If [PersoneelID_v] = "3" Then vakantie01_v = 20
'Dennis
If [PersoneelID_v] = "4" Then vakantie01_v = 20
'Nicky
If [PersoneelID_v] = "6" Then vakantie01_v = 20
'Daniel
If [PersoneelID_v] = "12" Then vakantie01_v = 20
'Gerwin
If [PersoneelID_v] = "13" Then vakantie01_v = 20
'Colin
If [PersoneelID_v] = "20" Then vakantie01_v = 20
'Joshua
If [PersoneelID_v] = "24" Then vakantie01_v = 20
'Marijn
If [PersoneelID_v] = "25" Then vakantie01_v = 16
'Jos
If [PersoneelID_v] = "7" Then vakantie01_v = 16

GoTo ZiekMaand2

ZiekMaand2:
If FrmTVTVakantie!maand_v = 2 Then GoTo ZiekJaMaand2 Else GoTo ZiekNeeMaand2


ZiekJaMaand2:

'Joseph
If [PersoneelID_v] = "1" Then vakantie02_v = 16
'Marielle
If [PersoneelID_v] = "3" Then vakantie02_v = 16
'Dennis
If [PersoneelID_v] = "4" Then vakantie02_v = 16
'Nicky
If [PersoneelID_v] = "6" Then vakantie02_v = 16
'Daniel
If [PersoneelID_v] = "12" Then vakantie02_v = 16
'Gerwin
If [PersoneelID_v] = "13" Then vakantie02_v = 16
'Colin
If [PersoneelID_v] = "20" Then vakantie02_v = 16
'Joshua
If [PersoneelID_v] = "24" Then vakantie02_v = 16
'Marijn
If [PersoneelID_v] = "25" Then vakantie02_v = 8
'Jos
If [PersoneelID_v] = "7" Then vakantie02_v = 8

GoTo ZiekMaand3

ZiekNeeMaand2:

'Joseph
If [PersoneelID_v] = "1" Then vakantie02_v = 20
'Marielle
If [PersoneelID_v] = "3" Then vakantie02_v = 20
'Dennis
If [PersoneelID_v] = "4" Then vakantie02_v = 20
'Nicky
If [PersoneelID_v] = "6" Then vakantie02_v = 20
'Daniel
If [PersoneelID_v] = "12" Then vakantie02_v = 20
'Gerwin
If [PersoneelID_v] = "13" Then vakantie02_v = 20
'Colin
If [PersoneelID_v] = "20" Then vakantie02_v = 20
'Joshua
If [PersoneelID_v] = "24" Then vakantie02_v = 20
'Marijn
If [PersoneelID_v] = "25" Then vakantie02_v = 16
'Jos
If [PersoneelID_v] = "7" Then vakantie02_v = 16

GoTo ZiekMaand3

De code is nog veel langer maar dit is genoeg om te laten zien denk ik.


PROBLEEM:

Het stuk ZiekMaand1 werkt prima, in het subform is een record met als waarde 1 bij Maand.

Hierdoor wordt er in het veld vakantie01_v uiteraard afhankelijk van het personeelsID de goede waarde ingevuld.

Maar na ZiekMaand1 gaat de code verder met ZiekMaand2. In het subform is een record met als waarde 2 bij Maand. Maar bij vakantie02_v wordt niet de goede waarde weergegeven.

Voor zover ik kan zien kijkt

If FrmTVTVakantie!maand_v = 2 Then GoTo ZiekJaMaand2 Else GoTo ZiekNeeMaand2

alleen in het 1e record van het subform. Maar de bedoeling is dat er in alle records gekeken wordt van het subform.

Hoe doe ik dat?


p.s. het zal wel amateuristisch overkomen wat hier boven staat, ik ben dan ook een beginnende amateur :)
 
Ik denk dat je hier iets met recordsets moet gaan doen. In een subformulier kun je alleen verwijzen naar het huidige record.

Een recordset geeft je de mogelijkheid om door het resultaat van een tabel of query te lopen en op elk record code te laten lopen.

Een klein voorbeeldje:
Code:
dim cnn as ADODB.connection
dim rst as new ADODB.recordset
dim strSQL as string

set cnn=currentproject.connection
strSQL="SELECT * FROM tabel;" 'Hier moet de recordsource van het subform komen
rst.open strSQL, cnn, acOpenDynamic
rst.movefirst
msgbox "Eerste veld in de recordset: " & rst.fields(0)
rst.close
cnn.close
set rst = nothing
set cnn = nothing

Nu alleen nog een loopje eromheen om door de records te lopen.
De helpfile bevat ook nog nuttige informatie.


Grtz,
 
Ik heb inmiddels de code wat aan gepast met een select case zodat het wat overzichtelijker wordt maar nog steeds geen oplossing.

Ik heb een temp database ingevoegd zodat je kan zien wat ik bedoel.


Beheer 25 bedankt voor je antwoord maar zoals ik al zei ben ik een beginnende amateur en je code is een btje abacadabra voor mij :confused:


Zoals je kunt zien wordt alleen bij vakantie04 8 weergegeven en bij vakantie05 10. Terwijl ze beiden 8 moeten geven.

Ook loop ik tegen het probleem aan dat als er geen record is in het sub form dat de hele code dan niet werkt.
 

Bijlagen

Omdat in je code wordt verwezen naar het veld "Maand_v" of het subformulier gaat het mis.

Het veld blijft de waarde "4" houden omdat je in een subformulier alleen kunt verwijzen naar de waarde van de velden van het huidige record of als er niets is geselecteerd is dat het eerste record.

Ik vrees dat er niets anders opzit als een recordset. Hier kun je de code die je al hebt goed binnen gebruiken. Je kunt dan echter ook nog eens door alle records in die recordset lopen. Een klein beetje uitbrteiding op de vorige geplaatste code:

Code:
dim cnn as ADODB.connection
dim rst as new ADODB.recordset
dim strSQL as string

set cnn=currentproject.connection
strSQL="SELECT Maand FROM QryTVTVakantie2 WHERE [Uitgevoerd door] = " & me.PersoneelID_v & ";"
rst.open strSQL, cnn, acOpenDynamic
rst.movefirst
Do
  'Jouw code hier
rst.MoveNext
If rst.EOF Then
  Exit Do
End If
Loop
rst.close
cnn.close
set rst = nothing
set cnn = nothing

Als je dit in de VBA editor plakt moet het bijna vanzelf goed gaan. Ik zag alleen dat je met Access 97 werkt. Dat kan een probleempje geven met de referenties. Kijk even via Extra --> Referenties of daar ADO staat aangevinkt, zoniet doe dat dan even, de naam ervan is "Microsoft ActiveX Data Objects 2.1 Library". Versie kan ook hoger zijn (2.8 is de meest recente).


Suc6,
 
Hoi daar ben ik weer.....


Het is nog steeds niet gelukt, heb je code op verschillende plaatsen geprobeerd maar krijg steeds een foutmelding....


Wat mij het meest logisch lijkt is dat jouw code in combinatie met de mijne er als volgt uit moet zien:



Private Sub Form_Load()

Dim cnn As ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSQL As String



If FrmTVTVakantie!ziek_v = True Then GoTo ZiekMaand1 Else GoTo ZiekNee

Set cnn = CurrentProject.Connection
strSQL = "SELECT Maand FROM QryTVTVakantie2 WHERE [Uitgevoerd door] = " & Me.PersoneelID_v & ";"
rst.Open strSQL, cnn, acOpenDynamic
rst.MoveFirst
Do


ZiekMaand1:

If FrmTVTVakantie!Maand_v = 1 Then GoTo ZiekJaMaand1 Else GoTo ZiekNeeMaand1

ZiekJaMaand1:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie01_v = 16
Case 7, 25
vakantie01_v = 8
End Select

GoTo ZiekMaand2

ZiekNeeMaand1:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie01_v = 20
Case 7, 25
vakantie01_v = 10
End Select

GoTo ZiekMaand2

ZiekMaand2:

If FrmTVTVakantie!Maand_v = 2 Then GoTo ZiekJaMaand2 Else GoTo ZiekNeeMaand2


ZiekJaMaand2:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie02_v = 16
Case 7, 25
vakantie02_v = 8
End Select

GoTo ZiekMaand3

ZiekNeeMaand2:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie02_v = 20
Case 7, 25
vakantie02_v = 10
End Select

GoTo ZiekMaand3


ZiekMaand3:
If FrmTVTVakantie!Maand_v = 3 Then GoTo ZiekJaMaand3 Else GoTo ZiekNeeMaand3

ZiekJaMaand3:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie03_v = 16
Case 7, 25
vakantie03_v = 8
End Select

GoTo ZiekMaand4

ZiekNeeMaand3:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie03_v = 20
Case 7, 25
vakantie03_v = 10
End Select

GoTo ZiekMaand4

ZiekMaand4:
If FrmTVTVakantie!Maand_v = 4 Then GoTo ZiekJaMaand4 Else GoTo ZiekNeeMaand4

ZiekJaMaand4:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie04_v = 16
Case 7, 25
vakantie04_v = 8
End Select

GoTo ZiekMaand5

ZiekNeeMaand4:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie04_v = 20
Case 7, 25
vakantie04_v = 10
End Select

GoTo ZiekMaand5

ZiekMaand5:
If FrmTVTVakantie!Maand_v = 5 Then GoTo ZiekJaMaand5 Else GoTo ZiekNeeMaand5

ZiekJaMaand5:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
Vakantie05_v = 16
Case 7, 25
Vakantie05_v = 8
End Select

GoTo ZiekMaand6

ZiekNeeMaand5:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
Vakantie05_v = 20
Case 7, 25
Vakantie05_v = 10
End Select

GoTo ZiekMaand6

ZiekMaand6:
If FrmTVTVakantie!Maand_v = 6 Then GoTo ZiekJaMaand6 Else GoTo ZiekNeeMaand6

ZiekJaMaand6:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie06_v = 16
Case 7, 25
vakantie06_v = 8
End Select

GoTo ZiekMaand7

ZiekNeeMaand6:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie06_v = 20
Case 7, 25
vakantie06_v = 10
End Select

GoTo ZiekMaand7

ZiekMaand7:
If FrmTVTVakantie!Maand_v = 7 Then GoTo ZiekJaMaand7 Else GoTo ZiekNeeMaand7

ZiekJaMaand7:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie07_v = 16
Case 7, 25
vakantie07_v = 8
End Select

GoTo ZiekMaand8

ZiekNeeMaand7:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie07_v = 20
Case 7, 25
vakantie07_v = 10
End Select

GoTo ZiekMaand8

ZiekMaand8:
If FrmTVTVakantie!Maand_v = 8 Then GoTo ZiekJaMaand8 Else GoTo ZiekNeeMaand8

ZiekJaMaand8:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie08_v = 16
Case 7, 25
vakantie08_v = 8
End Select

GoTo ZiekMaand9

ZiekNeeMaand8:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie08_v = 20
Case 7, 25
vakantie08_v = 10
End Select

GoTo ZiekMaand9

ZiekMaand9:
If FrmTVTVakantie!Maand_v = 9 Then GoTo ZiekJaMaand9 Else GoTo ZiekNeeMaand9

ZiekJaMaand9:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie09_v = 16
Case 7, 25
vakantie09_v = 8
End Select

GoTo ZiekMaand10

ZiekNeeMaand9:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie09_v = 20
Case 7, 25
vakantie09_v = 10
End Select

GoTo ZiekMaand10

ZiekMaand10:
If FrmTVTVakantie!Maand_v = 10 Then GoTo ZiekJaMaand10 Else GoTo ZiekNeeMaand10

ZiekJaMaand10:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie10_v = 16
Case 7, 25
vakantie10_v = 8
End Select

GoTo ZiekMaand11

ZiekNeeMaand10:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie10_v = 20
Case 7, 25
vakantie10_v = 10
End Select

GoTo ZiekMaand11

ZiekMaand11:
If FrmTVTVakantie!Maand_v = 11 Then GoTo ZiekJaMaand11 Else GoTo ZiekNeeMaand11

ZiekJaMaand11:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie11_v = 16
Case 7, 25
vakantie11_v = 8
End Select

GoTo ZiekMaand12

ZiekNeeMaand11:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie11_v = 20
Case 7, 25
vakantie11_v = 10
End Select

GoTo ZiekMaand12

ZiekMaand12:
If FrmTVTVakantie!Maand_v = 12 Then GoTo ZiekJaMaand12 Else GoTo ZiekNeeMaand12

ZiekJaMaand12:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie12_v = 16
Case 7, 25
vakantie12_v = 8
End Select

GoTo Einde

ZiekNeeMaand12:

Select Case [PersoneelID_v]
Case 1, 3, 4, 6, 12, 13, 20, 24
vakantie12_v = 20
Case 7, 25
vakantie12_v = 10
End Select

rst.MoveNext
If rst.EOF Then
Exit Do
End If
Loop
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing


GoTo Einde

ZiekNee:
GoTo Einde

Einde:





Maar dan krijg ik:


Fout 3704 tijdens uitvoering:

De bewerking is niet toegestaan als het object gesloten is


Wat doe ik fout?????


*Edit: Ik gebruik access 2000 maar het voorbeeldbestand is in 97 omdat iemand anders me ook om een voorbeeld vroeg die wel 97 gebruikt maar ik heb het gechekt en ADO staat aangevinkt.
 
In de code die je geplaatst hebt doe je eerst een check: "FrmTVTVakantie!ziek_v = True". Als deze naar false evalueert wordt je recordset niet geopend, sluiten kan dan dus niet wat je onder aan de code doet. En dat zal waarschijnlijk je fout verklaren.

Een handige manier om e.e.a. te checken (want het compileert waarschijnlijk wel) is om regel voor regel door de code te stappen. Dit kun je doen door in de grijze balk voor de code te klikken, er verschijnt dan een stopbordje. Als je dan de code activeert (door het formulier te openen) kom je in de code terecht. Door nu telkens op <F8> te drukken kun je regel voor regel checken wat er gebeurt. Als je met de muis boven een variabele o.i.d gat hangen zie je ook de waarde ervan terug in het tooltipje.


Grtz,
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan