Access VBA: Date- en Time Picker met Alert voorziening

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Hallo. Ik heb een database waaraan ik een ToDo-list heb toegevoegd. Bij het ToDo item in het formulier (op basis gemaakt van de Query ToDo List) wil ik in twee velden een datum en tijd toevoegen waarbij bij afloop -30 minuten een Alert MsgBox wordt getoond. De velden DateEnd en TimeEnd zijn aan de tabel ToDo en Query ToDo List toegevoegd.

Ik wil een sub aanmaken waarin de einddatum en eindtijd wordt bewaakt en deze plaatsen in de "gemeenschappelijke" Module 1. De sub moet hiermee volgens mij op de achtergrond draaien gedurende verdere werkzaamheden door de gebruiker met de db. Ik realiseer mij dat deze sub moet worden aangeroepen maar door welke trigger? Er is nmi. geen trigger voor het aanroepen van de sub, er wordt immers geen formulier geladen of een knop aangeklikt. Hoe kan ik het realiseren?
 
Ik wil een sub aanmaken waarin de einddatum en eindtijd wordt bewaakt en deze plaatsen in de "gemeenschappelijke" Module 1.
Ik vind je aanpak niet geweldig en niet getuigen van een goed doordacht plan. Je hebt een probleem dat je op wilt lossen, en die oplossing begint niet met de stelling dat je een sub nodig hebt :).
...er wordt immers geen formulier geladen of een knop aangeklikt.
Kijk, en dát had dus de oplossing moeten zijn waar je op uit komt :). Een formulier heeft een OnTimer event waarmee je een formulierprocedure kunt triggeren. Bijvoorbeeld het requeryen van je formulier.
 
Ik ben ook aan het verkennen en niet meer dan dat. Volgens mij zijn er niet zoveel mogelijkheden om met VBA code de gewenste resultaten te krijgen dan met een Sub. Ik zou geen trigger weten die ik kan gebruiken. Je hebt het over een OnTimer en een formulierprocedure. Bedoel je van het formulier ToDo de trigger "Bij timer"? Stel je voor om bij deze trigger de programmacode (in de vorm van een Sub) te plaatsen? Als het formulier gesloten en niet actief is, loopt dan de timer door? Wat bedoel je met "het requeryen van je formulier" ?
 
Bedoel je van het formulier ToDo de trigger "Bij timer"? Stel je voor om bij deze trigger de programmacode (in de vorm van een Sub) te plaatsen? Als het formulier gesloten en niet actief is, loopt dan de timer door?
Jij hebt iets met 'subs' zo te lezen :). Alles dat je met VBA programmeert is een sub of een functie, dus ook de gebeurtenis <Bij Timer>.
Code:
Private Sub Form_Timer()
...
End Sub
Het heeft dus geen enkele zin om daarvoor een nieuwe procedure te maken. Mag best, maar waarom zou je? Code op formulieren loopt natuurlijk alleen als het formulier geopend is, dus je formulier ToDo moet geopend blijven. maar dat is toch niet erg? Waarom zou je dat willen sluiten? Als je het formulier niet wil zien, kun je het altijd onzichtbaar maken. Dan blijft de code gewoon draaien, wat je dus ook zou moeten willen :).
 
Dank voor je antwoord. Als ik het begrijp, wordt het dus een Sub, getriggerd op <Bij Timer>. Het formulier ToDo geopend houden is niet te zekeren, het wordt af en toe vanuit een ander formulier geopend en wordt door de gebruiker gesloten. Een ander idee, de Sub Timer te starten bij het openen van het gemeenschappelijk navigatieformuiler, dat draait immers altijd. Is dat een optie? Wat voert de trigger <Bij Timer> eigenlijk uit?
 
Als ik het begrijp, wordt het dus een Sub, getriggerd op <Bij Timer>.
Nee, nogmaals: je hóeft geen aparte sub te maken, want de <Bij Timer> is al een (Private) sub. Maar het mág best, als je dat wilt. Wie wil er nou niet meer werk maken van een simpele klus? :D. Tja, als je formulier met de timer info gesloten wordt door de gebruiker, moet je dat dus voorkomen. Door het te verbergen. Jij bepaalt wat de gebruikers kunnen/mogen doen, niet andersom! Je moet de timer draaien op het formulier dat de parameters bevat; een ander formulier is dus bepaald onhandig.

Wat doet de procedure? Die kijkt naar de ingestelde tijd (staat standaard op 0) en voert op de ingestelde tijd een actie uit. Bijvoorbeeld controleren of de ingestelde tijd al bereikt is (door een requery van de databron). Daarbij moet je weten dat het getal 1000 voor één seconde staat. Kan ook een minuut zijn trouwens, is zo uit het hoofd op een iPad lastig te achterhalen :). Maar daar heb je dan de Help weer voor, want dat wordt prima uitgelegd.
Dus: je code staat bij <Bij Timer>, en de interval waarmee de code wordt uitgevoerd stel je in bij de tijd eronder.
 
Het heeft even geduurd maar heb intussen eea. getest. Ik heb het formulier Notities_ToDo in de achtergrond voortdurend actief. Als het formulier wordt gesloten dan wordt het formulier verborgen met de code
Code:
DoCmd.OpenForm "Notities_ToDo", , , , , acHidden
.

<Bij Timer> heb ik code geplaatst om eea. te kunnen beproeven maar de proef gaat niet goed. Hoe simpel het ook is. Ik heb de <timer interval> voor de proef ingesteld op 1000. Er is sprake van een tabel met meerdere ToDo acties waarbij een Alarmtimer kan worden ingesteld. Van de tabel is een Query <Query ToDo list> beschikbaar. Omdat er meerdere ToDo's zijn, zijn in de query ook meerdere einddatums ( en straks ook tijden) ingevoerd. In de volgende proefcode wil ik met de instructie <Do While Not rs.EOF> etc. de query doorlopen en bepaalde velden dmv. debuggen tonen.

Code:
Private Sub Form_Timer()                            'Voordurend testen of de ToDo alarmen aflopen.

Const Domain = "Query ToDo list"                           'Query
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(Domain)

       rs.MoveFirst
    Do While Not rs.EOF
          Debug.Print [n_todo1]
          Debug.Print [o_Werknummer]
       rs.MoveNext
    Loop
rs.Close
End Sub

Het resultaat van deze al eerder met succes toegepaste code, is slechts een continue lijst met de inhoud van dezelfde n_todo1 tekst en steeds hetzelfde werknummer. Ik zie dus geen verwachte lijst met verschillende werknummers en teksten uit de querytabel c.q. de brontabel. Hoe vreemd: "Er worden steeds dezelfde gegevens van het record getoond van het formulier dat op dat moment met het getoonde werknummer is geopend". <rs.MoveNext> zou er toch voor moeten zorgen dat steeds de volgende record getoond. Ik kom er niet achter wat het probleem is en blijf er maar naar staren. Svp. hulp. Alvast bedankt.
 
Ik zou zeggen: post eens een voorbeeldje, want ik heb geen tijd (lees: geen zin) om zelf een voorbeeldje in elkaar te flansen. De Timer procedure start nu elke cyclus steeds opnieuw op. Of dat in dit geval handig is.... Dit:
Code:
       Set rs = CurrentDb.OpenRecordset(Domain)
       [B][COLOR="#FF0000"]rs.MoveFirst[/COLOR][/B]
is dat in ieder geval niet, want als je een recordset opent, sta je altijd op het eerste record. Nergens voor nodig dus om dat nog eens extra uit te laten voeren. En dit:
Code:
Const Domain = "Query ToDo list"
zou ik hooguit bovenin declareren, boven alle procedures. Zeker niet in de timer.
 
Dank voor je antwoord. rs.MoveFirst was mij al duidelijk, probeerseltje. Bijgaande een testvoorbeeldje. Ik verwacht als de gehele query record per record wordt doorlopen, dat de opeenvolgende ToDoteksten en werknummers worden gepresenteerd.
Het is de bedoeling dat gedurende het werken met de db, in de achtergrond alle ToDo acties in de tabel voortdurend worden gecontroleerd op het aflopen van de Einddatum/tijd en dan daarop een melding wordt gegeven. Vandaar dat de Timer steeds opnieuw wordt opgestart, of heb je een ander voorstel.
 

Bijlagen

  • Test ToDo.zip
    318,4 KB · Weergaven: 19
Ik heb volgens mij de oplossing zoals je hem kunt gebruiken. De verdere uitwerking kun je denk ik zelf wel bedenken. Bedenk wel dat de timer op het formulier de werking van je db er niet soepeler op maakt :).
 

Bijlagen

  • Test ToDo.zip
    31,4 KB · Weergaven: 24
Top hulp, OctaFish. Het is anders dan ik had verwacht. Ik ga het bestuderen en kijken hoe ik het moet toepassen.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan