Datumvelden

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

spw

Gebruiker
Lid geworden
18 nov 2016
Berichten
83
Hoi,

Ik heb een formulier met een startdatum veld en een einddatum veld per order.
Deze velden hebben de eigenschap [datumkiezer weergeven] = voor datums (datepicker)
Dwz wanneer je op dit veld klikt krijg je de kalender te zien.
Men kan nu een datum selecteren.
Maar wanneer men op het veld [startdatum] klikt en men kiest een datum verder dan de einddatum dan zou er een melding moeten komen "Startdatum voorbij einddatum" en de orginele startdatum moet teruggeplaatst worden.
En indien mogelijk moet de focus terug op het veld [startdatum] staan.
Het is access 2013.

Vb
Startdatum : 21/01/2017
Einddatum : 25/01/2017

Ik klik op het veld [startdatum]. Zie de kalender. Kies voor 1/02/2017. Dan melding "startdatum voorbij einddatum" + originele startdatum terugplaatsen (21/01/2017 + focus op veld [startdatum]. En liefst de focus zonder dat de kalender zichtbaar is.
Het probleem is dat ik heb is dat de melding "startdatum voorbij einddatum" wel krijg (bij eigenschap 'verlaten') maar dat ik de originele startdatum kwijt ben.

Alvast bedankt.
 
Laatst bewerkt:
Gruwelijk ingewikkeld allemaal.... om te beginnen mag het natuurlijk nooit voorkomen dat je een einddatum kan kiezen vóórdat je een startdatum invult. Lijkt mij niet logisch. Daarnaast is een einddatum doorgaans afhankelijk van een termijn. Dus als je een levertijd hebt van 100 dagen, dan is de einddatum bekend a.d.h.v. de ingevoerde startdatum.
Jouw oplossing deugt dus eigenlijk niet, want de einddatum is per definitie afhankelijk van een ander veld (startdatum) en dat hoort niet in een tabel. Nooit afhankelijke gegevens in één tabel dus.
 
In het formulier heeft men eerst een begin- en einddatum ingevuld. Deze gegevens komen van een ERP systeem met check of data goed is ingevuld.
Dus in eerste instantie zijn de data goed. En het heeft niets met levertermijnen te maken.
Men moet ad hoc kunnen reageren.
Op een bepaald wil men de data aanpassen. Vb de startdatum. En dan zou het leuk zijn of er een controle kan gebeuren.
Dus de vraag is : is het technisch, Access matig, mogelijk om zoiets te programmeren ?
En zoja, op welke manier ?

Alvast bedankt.
 
Dat valt toch wel mee? :D.
Zo bijvoorbeeld:

Code:
Private Sub start_datum_a_GotFocus()
    Application.RunCommand (acCmdShowDatePicker)
End Sub

Code:
Private Sub start_datum_a_AfterUpdate()
    If Me.start_datum_a > Me.eind_datum_a Then
        MsgBox "De startdatum moet vóór de einddatum liggen...", vbCritical
        Me.start_datum_a = Null
    End If
End Sub

Code:
Private Sub eind_datum_a_GotFocus()
    Application.RunCommand (acCmdShowDatePicker)
End Sub

Code:
Private Sub eind_datum_a_AfterUpdate()
    If Me.eind_datum_a < Me.start_datum_a Then
        MsgBox "De einddatum moet ná de begindatum liggen...", vbCritical
        Me.eind_datum_a = Null
    End If
End Sub
 
Thx.

Dit werkt.
Maar is het ook mogelijk om de focus op hetzelfde record te plaatsen (van het record met foute aangepaste datum) ?
Maw ik wijzig de datum maar wanneer ik klik om een ander record, vb 5 plaatsen hoger of lager (of eender welk ander record), krijg ik de foutmelding.
Maar hij laat dan de datepicker zien van het record waar ik op geklik heb maar niet op het "foute" record.

Alvast bedankt.
 
Huh? Ik heb de code gemaakt voor een enkelvoudig formulier, niet voor een doorlopend.
 
Het is idd een doorlopend formulier.
Ik heb al geprobeerd met recordnummer te onthouden ed maar lukt niet.
Of een variable te gebruiken van tmp_data = start_datum
Maar helaas.
Hopelijk weet iemand wel een oplossing.

Alvast bedankt.
 
Doe er een voorbeeldje bij, zou ik zeggen. En over welke foutmelding hebben we het eigenlijk? Desnoods laat je de code Application.RunCommand (acCmdShowDatePicker) weg die gelijk de kalender laat zien.
 
Ik krijg geen foutmelding indien ik uw code gebruik. Enkel wanneer ik wil gaan werken met variabelen.

Het is een doorlopend formulier. Maw je ziet vb 20 regels (of meer regels) op uw scherm.
Per regel heb je ordernummer, omschrijving, start- en einddatum.
Wanneer ik vb de startdatum aanpas maar verder zet dan einddatum krijg ik pas de melding wanneer ik in een ander veld klik.
De startdatum van het veld dat ik heb aangepast krijgt de waarde 'null'. Maar de datepicker komt te voorschijn in het veld dat ik daarna aanklik.

Vb : ik klik in het veld startdatum van lijn 10. Ik pas deze datum aan maar is verder dan de einddatum.
Dan wil de ik vb einddatum aanpassen van lijn 23. Dus ik klik in dit veld [einddatum] van lijn 23 en dan pas verschijnt de melding "Startdatum moet voor einddatum liggen".
Maar de focus blijft op einddatum van lijn 23. En dat zou dus eigenlijk de startdatum van lijn 10 moeten zijn.
Dus is dit mogelijk ?

Alvast bedankt.
 
Wanneer ik vb de startdatum aanpas maar verder zet dan einddatum krijg ik pas de melding wanneer ik in een ander veld klik.
De startdatum van het veld dat ik heb aangepast krijgt de waarde 'null'. Maar de datepicker komt te voorschijn in het veld dat ik daarna aanklik.

Dat is allemaal logisch, want de code wordt getriggerd op de <Na bijwerken> gebeurtenis. Oftwel: als je in een ander object klikt en het datumveld niet meer de focus heeft. Als je dat doet door in een ander record te klikken, dan heb je natuurlijk een probleem. De code maakt het datumveld ook leeg, om te voorkomen dat de voorwaarden niet meer kloppen.
Ik vind je voorbeeldje ook qua werkwijze niet logisch:

Vb : ik klik in het veld startdatum van lijn 10. Ik pas deze datum aan maar is verder dan de einddatum. Dan wil de ik vb einddatum aanpassen van lijn 23. Dus ik klik in dit veld [einddatum] van lijn 23 en dan pas verschijnt de melding "Startdatum moet voor einddatum liggen". Maar de focus blijft op einddatum van lijn 23. En dat zou dus eigenlijk de startdatum van lijn 10 moeten zijn.
Lijkt mij helemaal correct; als je de startdatum wilt aanpassen naar een datum die voorbij de huidige einddatum ligt, dan kan dat niet. Dan moet je in ieder geval ook de einddatum veranderen. Maar dat is volgens jou ook uiteindelijk de bedoeling.... Dus dan pas je eerst de einddatum aan, en klik je daarna in het (nu lege) veld startdatum en vul je daar een datum in. Probleem opgelost...
 
Dat klopt ook.
Maar er zijn verschillende personen die met het programma moeten werken.
En niet iedereen is "computer-minded".
Dus om de foutgevoeligheid te verlagen is het natuurlijk altijd beter dat men terug op het juiste veld komt te staan met de originele stardatum.
En dan zal men, hopelijk toch, eerst de einddatum veranderen en dan de begindatum.
Maar nu krijgt met, en is ook logisch zoals het nu gemaakt is, pas bij klik op een ander veld de melding.
Dus ik weet niet of het programmamatig kan opgevangen worden.
 
Een tekstveld herkent een klik op een datepicker niet, dus je moet wel een gebeurtenis gebruiken die reageert op de AfterUpdate. En dat betekent: het veld verlaten door op een ander object te klikken. Op een enkelvoudig formulier heb je dat probleem niet.
 
En werken met het bijhouden van recordnummers ?

Dit in "voor update"
Vb dim recnum as long
recnum = me.currentrecord

dit na update.
msgbox "startdatum moet voor einddatum"
docmd.gotorecord acdataform, formuliernaam, acgoto, recnum

dus zou naar het originele record moeten gaan maar is niet.
Bestaat er een work-around om naar het foutieve record te gaan ?

mvg
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan