programma stopt niet voor input

Status
Niet open voor verdere reacties.

JEPEDEWE

Terugkerende gebruiker
Lid geworden
14 jun 2006
Berichten
1.680
hallo,
Ik schrijf:

Private Sub Knp_Admin_C_Click()
Me.Txt_datum.Visible = True
Me.Bijschrift_datum.Visible = True
Me.Bijschrift_datum.Caption = "Niet turnen tot:"
Me.Txt_datum.SetFocus
If IsNull(Me.Txt_datum) = True Then
If MsgBox("Correspondentiedatum invullen! ", vbExclamation + vbOKOnly, " ") = vbOK Then
Me.Txt_datum.SetFocus
End If
Else
......

op deze manier blijkt me.txt_datum altijd leeg te zijn omdat het programma niet "wacht" op mijn input
Hoe los ik dit op?

JP
 
De eerste SetFocus is overbodig, want je kunt de waarde van een veld altijd opvragen; .Focus is alleen nodig als je 'live' de waarde uitvraagt met .Text. En dat doe je hier niet. Ik zou de regel If IsNull(Me.Txt_datum) = True Then vervangen door: If Not IsDate(Me.Txt_datum.Value) Then. Lijkt mij een veiliger check. En loop er eens in de Stapmodus doorheen, dan kun je zien wat de waarde in het veld is; dan weet je meestal ook wel waarom hij er overheen stapt. IsNull(Me.Txt_datum) is ook niet hetzelfde als: Me.Txt_datum.Value Is Null bijvoorbeeld. Null is een vreemde om uit te vragen :).
 
Het inputveld Txt_datum is een onafhankelijk veld, dus er staat sowieso niets in
Ik moet wat ingeven en PAS DAN mag de code verder
zoals ik het schrijf is het veld altijd leeg, omdat er niet gewacht wordt op input
JP
 
zoals ik het schrijf is het veld altijd leeg, omdat er niet gewacht wordt op input
??
Een niet-afhankelijk veld is altijd een tekstveld. Een formulier object neemt alleen de eigenschappen van een tabelveld over als dat is gekoppeld. Daarom kun je een tekstvak ook niet testen op Null, want dat object kan nooit die waarde hebben. Het kan wél leeg zijn. Dus dat zou je ook kunnen testen. Of, wat ik voorstel, testen of het een datum is. Een leeg tekstveld kan namelijk ook nooit een datum zijn.
 
OK, ik heb de "isnull-controle" er uit gegooid
dus:
Private Sub Knp_Admin_C_Click()
Me.Txt_datum.Visible = True
Me.Bijschrift_datum.Visible = True
Me.Bijschrift_datum.Caption = "Niet turnen tot:"
Me.Txt_datum.SetFocus
Me.scan.Visible = True
Me.scan = Me.Kode & "_CMUT_" & Format(Me.Txt_datum, "ddmmyy")
Me.scan.SetFocus
DoCmd.RunCommand acCmdCopy
.....

dus, het vakje waar ik uiteindelijk een datum in kwijt moet en wat eerst onzichtbaar is wordt getoond en krijgt focus
maar, ik krijg de kans niet om hier een datum (of wat dan ook) in te vullen
dus, de lijn
Me.scan = Me.Kode & "_CMUT_" & Format(Me.Txt_datum, "ddmmyy")
geeft een fout omdat me.TXT_datum geen gegevens bevat omdat ik ze er niet heb kunnen inzetten, omdat de code gewoon verder liep zonder op mijn input "te wachten"
 
Klinkt mij nogal logisch in de oren. Je processor wacht niet.

Dit zul je moeten oplossen door het tweede deel pas uit te voeren na het indrukken van een button (die je dus nog moet toevoegen) of je koppelt de boel aan het lostfocus event.
 
De eenvoudigste oplossing is om de datum via een inputbox te laten invullen. Dan moet je wel controleren of er wel degelijk een geldige datum is ingevuld. Je kan dat bv. in een loop steken met maximaal 3 pogingen. Vullen ze een geldige datum in, dan loopt het programma verder. Als ze na drie pogingen nog geen geldige datum hebben ingevuld, stopt het programma en wordt een rollback gedaan.
 
Ik vind de werkwijze van het zichtbaar en onzichtbaar maken van veldjes een beetje onzinnig, omdat je er niks mee wint: al je objecten hebben een vaste plek op je formulier en je schiet er dus niks mee op als iets al dan niet zichtbaar is. Je krijgt alleen een chaotisch scherm op beeld met gaten. Wat heb je daar aan? Je kunt veel beter alles gewoon zichtbaar laten, en hooguit de bewerking van bepaalde vakken aan of uit zetten, en met kleurtjes de status van een veld aangeven. maar goed, dat lost je probleem niet op.

Wat ik als oplossing zou doen, is de functie van de knop scheiden; één knop voor het invoeren van gegevens (De admin mode, waarbij je dus de kleurtjes en bewerkingsmodus van velden aan- of uitzet) en een aparte knop voor de kopie actie. Dan bereik je niet alleen een logischere flow, maar ook een betere controle op de kwaliteit van de ingevoerde gegevens. Ik neem aan dat je wél een Datepicker op het datumveld hebt staan, zodat je correcte datums invoert. Dat lukt niet als je een Inputbox gebruikt, want die vreet alles. Dus dan moet je weer extra checks gaan inbouwen op de ingevoerde tekst. Bovendien staat het nogal knullig, om steeds weer inputboxen op het scherm te zetten terwijl je al een net formulier hebt.

Dus functies losknippen :).
 
Ik kom er dus niet echt uit..
In een ander formulier kom ik hetzelfde tegen:
Private Sub Knp_Admin_Ziekte_Click()
Me.Bijschrift3.Caption = "Vul einddatum in"
Me.Txt_datum.BorderColor = RGB(237, 28, 36)
Me.Txt_datum.SetFocus
DoCmd.OpenForm "Administratie_ziekte"
End Sub

bedoeling is dat ik op een knop druk, naar TXT_Datum geleid word, dat ik hier een datum ingeef en dat pas dan de form opent met de datum die ik eerst in Txt_datum ingaf
Het programma stopt echter niet en laat me niet toe het veld in te vullen..

JP
 
Zoals ik al zei: Splitsen van functies.
Code:
Private Sub Knp_Admin_Ziekte_Click()
     Me.Bijschrift3.Caption = "Vul einddatum in"
     Me.Txt_datum.BorderColor = RGB(237, 28, 36)
     Me.Txt_datum.SetFocus
End Sub

Code:
Private Sub KnpFrm_Admin_Ziekte_Click()
     DoCmd.OpenForm "Administratie_ziekte"
End Sub
 
Of, als je het echt mooi wilt doen, een popup formulier waarin je één veld laat invullen op basis van parameters. Dat formulier kun je dan vanuit de andere formulieren aanroepen als er wat ingevuld moet worden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan