[ACCESS\VBA] Access formulier en "if statements" op datum

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Access specialisten,

Ik heb een probleem en dus een vraag:

Ben voor onze juridische afdeling een simpel access bestand aan het maken. Grootste wens was eigenlijk termijn bewaking. Nu ben ik al best ver (vind ik zelf :) ) maar loop tegen één dikke muur op.

Voorbeeld:
Datum besluit = X
Aanvang behandel termijn = Y = X + 6weken en 1 dag
Deadline = Z = Y + 12 weken

Nu kan het zijn dat iemand bv. niet alle gegeven aanlevert, waardoor de behandel termijn op "pauze" word gezet.
Deze "pauze dagen" worden alleen gerekend als deze na Y vallen.

Voorbeeld:
X = 1-1-2010
Y= 6-2-2010
Z= 1-5-2010

De pauze termijn is van 1-2-2010 tot 8-2-2010 dan moeten er dus bij "Z" twee dagen worden opgeteld.

Nu dacht ik het zo op te lossen:
Ik heb drie verdagingstermijnen opgenomen met de velden:
-Termijn 1 van
-Termijn 1 tot
-Algemeen veld: "aantal dagen verdaagd"

De som is dus:
IF ("Termijn 1 van" < "Y")
THEN "Aantal dagen verdaagd" = ("Aantal dagen verdaagd"+(Y-"Termijn 1 tot) )
ELSE "Aantal dagen verdaagd" = ("Aantal dagen verdaagd"+("Termijn 1 van"-"Termijn tot"))

Etc. voor termijn 2 en 3.

Tweede en laatste probleempje moet volgens mij simpel zijn:
Als "Verdagen" is aangevinkt ("Aantal dagen verdaagd" + 6 weken)

Ik ben geen VB held en hoop dat iemand me kan helpen hiermee....

Alvast bedankt!!

Bas


Link naar de database: *weg. problemen/vraagstukken mag je zelf oplossen, dat gaan we niet voor je doen. We wijzen je hooguit in de juiste richting.*

[ Voor 7% gewijzigd door RobIII op 04-01-2010 17:08 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
excuses , VB scripting staat daar wel tussen....maar bedankt voor het doorsturen van de topic....

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het is me niet helemaal duidelijk of je dit nu in een query wil of in VBA eigenlijk. Het lijkt erop alsof je berekende data wilt gaan opslaan in je database, maar waarom eigenlijk? Dit kan toch ook gewoon pas in een query? :)

Waarom zijn er maximaal 3 termijnen? Zou het niet mooier zijn om daar een extra tabel voor te hebben, zodat je 'oneindig' vaak uitstel kan krijgen? :)

Verder heb je toch al bijna VB-code? Wat lukt er niet? ;)

Qua berekening bedoel je denk ik iets als:
Visual Basic:
1
Max(0,Tend-Max(Tstart,Y))


En eventueel al dan niet nog een extra +1 (dus 1 dag als Tend=Tstart). Max moet gedefinieerd zijn in een Module als (bijvoorbeeld):
Visual Basic:
1
2
3
4
5
6
7
Public Function Max(a, b)
    If a > b Then
        Max = a
    Else
        Max = b
    End If
End Function


En dat vinkje verdagen is gewoon iets als:
Visual Basic:
1
Iif(verdagen,6*7,0)

En ook dat kun je zo gebruiken in een query, maar het kan ook bijvoorbeeld in een OnChange-event.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Hoe zou dat in een query kunnen dan?

Ik ga in ieder geval even proberen in VB met jouw input....

Een nieuwe tabel met verdagen is ook een goede, volgens mij is het optellen van het aantal verdaagde dagen makkelijker op te tellen....

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Nou volgens mij doe ik echt iets niet goed.... :(

Kan ik die public function ook gebruiken in een query of in een veld waarde?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Hmm, bij nader inzien is dit niet zo'n gelukkig voorbeeld. :p Je kan beter niet de naam Max hebben, omdat Max al bestaat als aggregate function. Dus je kan beter een andere functie hebben:
Visual Basic:
1
2
3
4
5
6
7
Public Function Max2(a, b)
    If a > b Then
        Max2 = a
    Else
        Max2 = b
    End If
End Function

En deze moet in een Module staan. Vervolgens kun je hem gebruiken als "Naampje: Max2([Id],3)" in de design view om een kolom Naampje te genereren,

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
aarggg....ik heb het op meerdere manieren geprobeerd, krijg er maar geen waarde uit.

Zou je een simpel formuliertje met tabelletje kunnen opzetten? Zodat ik kan zien wat ik nu eigenlijk verkeerd doe...
Zal me zelf denk ik wel voor me kop slaan als ik zie wat dat is.... :P

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Zie hier voor een voorbeeld hoe je (VBA-)functies gebruikt. Succes! :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Ga er vandaag of morgen even mee aan de slag, als het me gelukt is laat ik het je weten! Bedankt iig!

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
de functie is me nu gelukt, begrijp er nu ook wat meer van, die link en jou hulp heeft me het licht laten zien ;)

code:
1
2
3
Public Function DagenVerdaagd1(TermijnJZVan1 As Date, AanvangBehandelTermijn As Date, TermijnJZTot1 As Date)
If TermijnJZVan1 < AanvangBehandelTermijn Then DagenVerdaagd1 = TermijnJZTot1 - AanvangBehandelTermijn Else DagenVerdaagd1 = TermijnJZTot1 - TermijnJZVan1
End Function


Ik ga nu voor iedere verdagingstermijn een aparte functie met veld maken. Die velden tel ik bij elkaar op en is dan de totale verdagingstermijn.

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Goed ik heb het me veels te moeilijk gemaakt met die gekken code boven....

heb nu:

code:
1
2
3
4
5
6
7
 Public Function DV(a As Date, b As Date, c As Date)
    If a > b Then
        DV = c - a
    Else
        DV = c - b
    End If
End Function


Je hebt me op de goede weg gezet (en weer stukje wijzer)....

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Weet jij waarom de VB hier op nat gaat?

code:
1
2
3
4
5
6
7
8
9
Public Function DV(a As Date, b As Date, c As Date)
    If a > b And a Is Not Null Then
        DV = c - a
    ElseIf a < b And a Is Not Null Then
        DV = c - b
    Else
        DV = 0
    End If
End Function

Acties:
  • 0 Henk 'm!

  • Moirraine
  • Registratie: Mei 2008
  • Laatst online: 13-02-2024
hij loopt (waarschijnlijk) kapot op "is not null"

Probeer
Visual Basic:
1
Not IsNull(a) then


Oh, en google eens op DateDiff als je met data gaat rekenen ;)

[ Voor 29% gewijzigd door Moirraine op 11-01-2010 18:16 ]


Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Het probleempje is eigenlijk als de velden leeg zijn (null) geeft de functie een fout, als waarde.

Dus de functie moet een if Null dan is DV "0".

Acties:
  • 0 Henk 'm!

  • Moirraine
  • Registratie: Mei 2008
  • Laatst online: 13-02-2024
Oh, dan de functie Nz gebruiken.
Visual Basic:
1
 Nz(a,0) 


het 2e argument, die 0, geeft aan wat a moet worden als hij een null waarde heeft, in dit geval dus een 0.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een Date kan geen null zijn, dus je kan ook gewoon "As Date" weghalen (en IsNulll() gebruiken). :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Moirraine
  • Registratie: Mei 2008
  • Laatst online: 13-02-2024
pedorus schreef op dinsdag 12 januari 2010 @ 14:13:
Een Date kan geen null zijn, dus je kan ook gewoon "As Date" weghalen (en IsNulll() gebruiken). :)
MS SQL server backend accepteert null waarden in datetime velden ;)

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Moirraine schreef op dinsdag 12 januari 2010 @ 14:44:
[...]

MS SQL server backend accepteert null waarden in datetime velden ;)
Dat klopt, maar VBA accepteert geen null als waarde van een Date, vandaar de foutmelding. ;) In VB.NET heb je nullable types, maar in VBA bij mijn weten niet. Dus moet hier de parameter een Variant zijn, en geen Date.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Hoe gebruik ik die Nz functie dan in een if statement?

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
pedorus schreef op dinsdag 12 januari 2010 @ 14:13:
Een Date kan geen null zijn, dus je kan ook gewoon "As Date" weghalen (en IsNulll() gebruiken). :)
ga ik testen, bedankt!

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Hmmmzzz...

Draai nu deze code:
code:
1
2
3
4
5
6
7
Public Function DV(a, b, c)
    If IsNull(a) Then
        DV = 0
    Else
        DV = DateDiff("d", a, c)
    End If
End Function


als ik dit op geef:
code:
1
?DV("","5-5-2009","10-5-2009")


krijg ik weer fout melding.

Bij:
code:
1
?DV("1-5-2009","5-5-2009","10-5-2009")

Krijg ik wel gewoon "9" terug als waarde....

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Ziet er naar uit dat alles nu werkt naar behoren:

code:
1
2
3
4
5
6
7
8
9
Public Function DV(a, b, c)
    If a = "" Or c = "" Then
        DV = 0
    ElseIf a < b Then
       DV = DateDiff("d", b, c)
    Else
        DV = DateDiff("d", a, c)
    End If
End Function

Acties:
  • 0 Henk 'm!

  • Moirraine
  • Registratie: Mei 2008
  • Laatst online: 13-02-2024
deboer.bas schreef op dinsdag 12 januari 2010 @ 15:42:
Hmmmzzz...

Draai nu deze code:
code:
1
2
3
4
5
6
7
Public Function DV(a, b, c)
    If IsNull(a) Then
        DV = 0
    Else
        DV = DateDiff("d", a, c)
    End If
End Function


als ik dit op geef:
code:
1
?DV("","5-5-2009","10-5-2009")


krijg ik weer fout melding.

Bij:
code:
1
?DV("1-5-2009","5-5-2009","10-5-2009")

Krijg ik wel gewoon "9" terug als waarde....
"" Is niet hetzelfde als een Null waarde ;) Null = geen gegevens, "" is een lege alfanumerieke waarde, dat is een wezenlijk verschil.

Visual Basic:
1
?DV(null,"5-5-2009","10-5-2009")


geeft je netjes 0 terug als waarde.

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Lol, de hele tijd had ik het antwoord al, maar speelde ik met de verkeerde data (die "").

Alles werkt nu ook in het formulier!

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Laatste puntje is dus dat éne vinkje....

Als vinkje aan staat moet DV + 6 weken....

True + 6 weken
False - 6 weken
etc..

het vinkje heet "Verdaagd" en het tekstvlak waar "+42" bij moet komen heet "DagenVerdaagd"

[ Voor 45% gewijzigd door deboer.bas op 12-01-2010 17:33 ]


Acties:
  • 0 Henk 'm!

  • Moirraine
  • Registratie: Mei 2008
  • Laatst online: 13-02-2024
Lijkt me nu geen raket technologie meer ;)

Geef die true of false mee als argument

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
Public Function DV(a, b, c, blnVerdaagd as boolean)
    If a = "" Or c = "" Then
        DV = 0
    ElseIf a < b Then
       DV = DateDiff("d", b, c)
    Else
        DV = DateDiff("d", a, c)
    End If
    
    dv = iif(blnverdaagd = true, dv+42,dv -42)

End Function


Iif is een functie die in 1 regel een "if then else" afhandeld.

In code zet je dan ergens neer
Visual Basic:
1
me.dagenverdaagd = dv(argumentA,argumentB,argumentC, me.Verdaagd.value)


edit: Je kunt in het tekstvak bij besturingselementbron ook de functie met de argumenten invullen, er van uit gaande dat die argumenten op het formulier staan. Dan ververst deze ook automatisch. Argumenten dan wel scheiden dmv ";" niet ",". De argumenten die je mee geeft zijn de naam van de control waar de waarde in staat, dus als argumentA in de control "txtDatum1" heet, krijg je het volgende

voorbeeld: =DV([txtDatum1];[txtDatum2];[txtDatum3];[verdaagd])

[ Voor 32% gewijzigd door Moirraine op 12-01-2010 17:56 ]


Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Super bedankt voor alles!

Ik heb voor de laatste een aparte functie gemaakt, alles werkt nu zoals ik het had gehoopt!

THX!

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Heb nog een vraagje....

Nu mijn deadline datum een optelling is van verschillende velden in me formulier word dit veld niet meer bijgewerkt in de database.

Nu heb ik een knop toegevoegd "opslaan" waarmee een query word geladen:
code:
1
2
3
UPDATE BeroepBezwaar 
SET BeroepBezwaar.DeadlineBOB = Forms!BBFormulier.DeadlineBOB
WHERE ((([Forms]![BBFormulier].[Id])=[Id]));


Het resultaat is er, maar je krijgt steeds twee meldingen: één, wilt u query starten; twee, één record gewijzigd.

Is er een manier waardoor ik die meldingen niet krijg?

Acties:
  • 0 Henk 'm!

  • deboer.bas
  • Registratie: November 2006
  • Laatst online: 22-04-2021
Ik heb het probleempje opgelost....misschien niet heel netjes :)

Macro met berichtgeving uit en query starten :D
Pagina: 1