Stop uitvoering functie

Status
Niet open voor verdere reacties.

Sytse1

Gebruiker
Lid geworden
9 aug 2007
Berichten
584
Office versie
miDer
Met Exit sub of Exit Function wordt als er niet aan een vraag wordt voldaan de sub of function beeindigd.
Op welke manier kan de functie die een andere functie aanroept worden beëindigd?
B.v een opdracht knop met de opdracht om naar een volgend record te gaan.
Maar voordat er naar het volgend record wordt gegaan wordt een functie aangeroepen die in het te verlaten record het e.e.a. controleert.
Als bij die functie uitvoering blijkt dat er in het te verlaten record nog het e.e.a aangepast moet worden komt er een msgbox die dit aangeeft en deze functie wordt dan gestopt en de gebruiker komt weer in het betreffende record terug.
Maar er wordt daarna alsnog naar het volgend record gegaan.
Nu kan de functie natuurlijk bij elke knop(1e, volgende, vorige, laatste, nieuw of verwijder) ingebouwd worden en met een exit function wordt er dan niet naar een volgend record gegaan.
Maar ik kan geen opdracht vinden om ook de eerste functie vanuit de aangeroepen functie direct te stoppen.
Wellicht bestaat die niet?
 
Ik snap je vraag eerlijk gezegd niet. GoToRecord moet je natuurlijk pas laten uitvoeren als de controle correct is, anders niet. Ik vermoed dat je de verplaatsing dus op de verkeerde plaats hebt staan.
 
Wellicht leg ik het dan niet goed uit.
De controle op de inhoud van het record staat in een functie.
De menu knoppen volgen, vorig, 1e laatste enz roepen voorafgaand aan de uitvoering de funtie aan.
Hier is de andere functie CtrMw
Als de functie CtrMw geen fout oplevert wordt naar het laatste record gegaan.
Als dit wel is moet na de aanpassing die CtrMw eist er niet naar het laatste record gegaan worden.
Met een Exit Function in CtrMw wordt de uitvoering om naar het laatste record te gaan toch uitgevoerd.
De code van CtrMw kan natuurlijk ook voorafgaand aan With recordset enz gezet worden.
Met knippen en plakken kom je een eind maar een code eenmaal in een functie en meermalen gebruiken lijkt mij beter.
Ik hoop dat dit duidelijker is. Wellicht is er geen End die alle code direct stopt.

Code:
CtrlMw
' ga naar het laatste record en laat geen nieuw record zien.
With Recordset
If .AbsolutePosition = .RecordCount - 1 Then
 MsgBox "Dit is de laatste medewerker in de lijst." & Chr(13) & " Kies Ok ", 0, "Attentie"
 Else
DoCmd.GoToRecord , , acNext
End If
End With
 
Algemene regel : in functies toon je geen message box, alleen in sub procedures.
Principe oplossing: laat je functie alle input conroleren en , indien een fout gevonden,een tekst teruggeven met de fouten. Als geen fout gevonden dan geeft de functie een lege tekst terug. In de procedure roep je de functie op en als de lengte van de tekst > 0 dan cancel je de goto nextrecord en geef je een messagebox met de foutboodschap die je functie teruggeeft. Als de lengte van de fouttekst = 0 (geen fouten) ga je gewoon naar het volgend record.
 
NoellaG, bedabkt voor je reactie.
De code met de msgbox staat in een sub.
In de sub wordt met CtrlMw een functie aangeroepen,
 
Als CtrlMw de naam van een functie is dan kan bevoorbeeld :
public function CtrlMw(arg1, arg2, ..., argn) as string
dim strErrorMessage as string
....
hier de code die de foutentekst opbouwt
....
CtrlMw = strErrorMessage
......


en dan in de sub:

strError = CtrlMw(arg1, arg2, ..., argn)
If len(strError) > 0 then
msgbox strError
... cancel hier de actie goto next
else
... ga hier voort met alle acties als er geen error is
end if
 
Ik zou die hele truc met AbsolutePosition vergeten; met EOF kun je altijd de laatste record vinden. Daarnaast is het niet zo spannend denk ik; ik gebruik mijn bladerknoppen altijd om bij het laatste record automatisch naar het eerste te springen, en niet naar een nieuwe. Daarmee voorkom je al veel ellende. En omgekeerd: bij achteruitbladeren vanaf de eerste gelijk door naar de laatste. Op die manier kun je oneindig door je records cirkelen zonder één probleem. En als je zelf wél msgboxen gebruikt in een functie: gewoon blijven doen; ik doe het al jaren :). Maakt namelijk echt niet uit waar je ze gebruikt.
 
En als je zelf wél msgboxen gebruikt in een functie: gewoon blijven doen; ik doe het al jaren . Maakt namelijk echt niet uit waar je ze gebruikt.

Mijn excuses, ik vergeet soms dat dit een forum voor amateurs is en niet voor profs
 
NoellaG,
Nog een echt oprechte vraag. Waar kan ik die algemene regel vinden waarin staat dat in Functies geen MsgBox gebruikt wordt?
 
Ik heb dat geleerd in de cursus algorithmen en programmatie technieken aan de univ. Als ik zelf cursus programmatietechnieken geef, dan geef ik dat ook door. Ook de programmeurs op het werk werken zo. De reden: een functie wordt meestal in verschillende omstandigheden opgeroepen, en dan moet je steeds een aangepaste boodschap geven, wat een boel programmeerwerk is. Of als je een functie in Excel schrijft, en je voert die door over 100 rijen, dan krijg je 100 keer de boodschap. Dat wil je niet. Dus neem je van start al de goede gewoonte aan om in functies, die een waarde teruggeven, geen messageboxen te tonen.

Maar, zoals ik al zei, als amateur luistert het niet zo nauw. Trouwens ik zou niet weten waarom amateur zijn een belediging zou zijn. Zelf amuseer ik me enorm als amateur kok en gamer.
 
Het ‘probleem’ dat Noella beschrijft, kun je ook met subs krijgen, dat is niet voorbehouden aan functies. In mijn ‘amateuristische’ ogen dus een flut argument.
Wat betreft je opmerking: je wekt de suggestie dat ik niet professioneel ben, en ik denk niet dat jij in staat bent om dat te beoordelen, dus doe dat dan ook niet. Ik noem jou toch ook geen prutser?
 
Niet als je subs op een goede manier gebruikt, dat leer je ook in de cursus programmatie technieken. ;-) .
En amateur betekent blijkbaar in Nederland 'prutser', in België betekent amateur dat iemand iets voor zijn/haar plezier doet en er niet voor betaald wordt.
 
Dat betekent het hier ook, zoals je zou moeten weten. En je argumentatie blijft een beetje kul, zoals je zelf ongetwijfeld ook wel weet. Punt erachter wat mij betreft :), want een MsgBox zet je alleen in functies/procedures waarin ze niet geloopt worden. Da’s een fout die je één keer maakt, en dan nooit meer :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan