Avatar billede dla Praktikant
22. december 2004 - 10:53 Der er 17 kommentarer og
1 løsning

Undgå meddelelse hvis man trykker i et bestemt felt

I en underformular har jeg følgende kode i EfterOpdatering-hændelsen:

Private Sub Form_AfterUpdate()

        Besked = MsgBox("Husk at opdatere opfølgningsdato", vbExclamation, "Har du husket?")

DoCmd.SelectObject acForm, "frmIndtastning"
DoCmd.GoToControl "NæsteOpfDato"

End Sub

Men jeg vil gerne undgå meddelelsen, hvis det felt brugeren trykker på efter indtastning i underformularen faktisk er ”NæsteOpfDato”. Hvordan gør jeg det?
Avatar billede mugs Novice
22. december 2004 - 10:56 #1
If Me.FELTNAVN = Me.NæsteOpfDato Then
exit sub
else:
Besked = MsgBox("Husk at opdatere opfølgningsdato", vbExclamation, "Har du husket?")
DoCmd.SelectObject acForm, "frmIndtastning"
DoCmd.GoToControl "NæsteOpfDato"
end if

Det forudsætter at felterne begge ligger i underformularen, ellers skal du referere til parentform
Avatar billede dla Praktikant
22. december 2004 - 10:58 #2
Det er præcis det jeg ikke kan finde ud af: at referere til parentformen. For NæsteOpfDato ligger i parentformen.
Avatar billede mugs Novice
22. december 2004 - 11:14 #3
If Me.FELTNAVN = Me.Parent.NæsteOpfDato Then
22. december 2004 - 11:20 #4
Som jeg forstår det, så vil du have, at når brugeren har indtastet data i underformularen, så skal han mindes om, at han skal skrive noget i feltet NæsteOpfdato på hovedformularen!?
Så jeg tror ikke, at dt forslag vil hjælpe, Mugs!

Jeg har ikke lige selv en god løsning, andet end at jeg ville sætte feltet NæsteOpfDato til obligatorisk/påkrævet således at brugeren skulle taste denne dato INDEN han fik lov at hoppe ned i underformularen.

btw, i stedet for
DoCmd.SelectObject acForm, "frmIndtastning"
DoCmd.GoToControl "NæsteOpfDato"

kan du nøjes med denne:

Me.Parent!NæsteOpfDato.Setfocus
Avatar billede dla Praktikant
22. december 2004 - 11:25 #5
Hvad mener du med Me.Feltnavn? Underformularen består af 3 felter: dato, initialer og kommentarer. Når man har udfyldt dem, skal man jo lukke parentformularen, men huske at opdatere opfølgningsdatoen i parentformen. Så hvis man bare trykker på luk-knappen, skal den lige minde en om først at opdatere opfølgningsdatoen, men hvis man ikke har glemt det og derfor trykker i NæsteOpfDato-feltet, ville det være rart ikke at skulle få påmindelsen op.
Avatar billede dla Praktikant
22. december 2004 - 11:28 #6
Hov, Thomas, jeg havde ikke set dit svar da jeg svarede mugs, men du har ret i det du skriver. Problemet er bare at det ikke er påkrævet at skrive en opfølgningdato, det er ikke sikkert der skal følges op. Den skal bare minde brugeren om det.
22. december 2004 - 13:27 #7
Jeg tror, at du er nødt til at lægge koden på Form_BeforeUpdate og Form_Unload:

If Me!DinUndeformular.Form.Recordsetclone.recordcount > 0 and isnull(Me!NæsteOpfDato) then
    if msgbox("Du skal huske at udfylde NæsteOpfDato! Er du sikker på at du vil forlade posten uden at indtaste opfølgningsdato?", vbquestion+vbyesno, "Husk Opfølgningsdato!") = vbno then
    docmd.cancelevent
    Me!NæsteOpfDato.Setfocus
endif
Avatar billede dla Praktikant
22. december 2004 - 13:50 #8
Perfekt Thomas! Endnu en gang imponerede du mig med din viden!

Men hvordan er det lige jeg slipper for beskeden "Du har annulleret den forrige handling"?
22. december 2004 - 13:55 #9
Tak for de pæne ord :o)

Sæt
on Error resume next
foran din Docmd.Close eller hvad det måtte være, som giver fejlen.

Dette kan godt "forsvares" da det er en af de eneste fejl, som ka opstå ved en docmd.Close
Avatar billede dla Praktikant
22. december 2004 - 14:07 #10
Jeg mener godt nok de pæne ord, men der er faktisk en ting der ikke virker rigtigt her, for den tager ikke hensyn til om man overhovedet har været nede i underformularen, den kigger kun på om der står noget i NæsteOpfDato eller ej. Hvis jeg f.eks. bare åbner en post og lukker den igen, spørger den også. Faktisk som om koden lå på luk-knappen. Jeg har lagt koden på Form_BeforeUpdate og Form_Unload som du skrev. Hvad nu?
Avatar billede dla Praktikant
22. december 2004 - 14:12 #11
...og den skal faktisk kun tjekke om man har skrevet i underformularen, ligemeget om der står noget i NæsteOpfDato, det kunne jo være en gammel dato...
22. december 2004 - 14:15 #12
damn, mit ry er ødelagt ;o)

Min kode checker om der er en post i underformularen (hvormange poster kan der egentlig være?) og om der står noget i NæsteOpfDato. Der er masser af 'huller' i den metode. Nogle af hullerne kan lukkes, hvis man definerer det kriterierne ordentligt.

Men hvis du ikke vil have at den skal checke for gamle poster, så må vi finde en anden metode.....tænke tænke tænke....
Avatar billede mugs Novice
22. december 2004 - 14:16 #13
Hæ....Hæ
22. december 2004 - 14:20 #14
...ok, her er den:

I et modul (ligegyldigt hvilet) erklærer du en public variabel i toppen:

Public SubFormOpdateret as Boolean

På underformularen lægger du denne kode på Form_Afterupdate:
SubFormOpdateret = True

På underformularens Form_Current lægger du denne sætning:
SubFormOpdateret = False


På hovedformularens Form_Beforeupdate og form_Unload lægger du denne kode:
If SubFormOpdateret = true And isnull(Me!NæsteOpfDato) then
    if msgbox("Du skal huske at udfylde NæsteOpfDato! Er du sikker på at du vil forlade posten uden at indtaste opfølgningsdato?", vbquestion+vbyesno, "Husk Opfølgningsdato!") = vbno then
    docmd.cancelevent
    Me!NæsteOpfDato.Setfocus
endif

Det er ikke afprøvet, men det virker i mit hovede (måske med lidt justeringer ;)
Avatar billede dla Praktikant
22. december 2004 - 14:30 #15
NU virker det!

Og nu er jeg da først rigtig imponeret! Hvordan hulen kan du have det i dit hoved?
Hvad siger du så, mugs?

Jeg siger i hvert fald 1000 tak!
Avatar billede mugs Novice
22. december 2004 - 14:33 #16
Jeg er vant til det. Hans hjerne er både binær og vanskabt :o)
22. december 2004 - 14:35 #17
Vi siger tak for bidraget til Mugs, haha ;o)

Men 12-13 års arbejde med Access skal vel bære frugt på eet eller andet tidspunkt.
Avatar billede dla Praktikant
22. december 2004 - 15:09 #18
Hej Thomas
Jeg lavede selv en tilsvarende funtion til NæsteOpfDato, så i stedet for:

If SubFormOpdateret = true And isnull(Me!NæsteOpfDato) then

har jeg nu dette:

If SubFormOpdateret = True And DatoOpdateret = False Then

for det kunne jo godt være der stod en gammel dato der skulle ændres.

Jeg bliver også dygtigere, takket være geniale folk som dig!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester