I too am a refugee from the mainframe camp. I came to Access from COBOL in the early 90's (after more than 20 years in the business) and thought I had died and gone to heaven. I could link to DB2 tables on the mainframe and create an Access application to update them. It doesn't get any better than that. It was however, an uphill battle retraining myself to think in events. What should help you is recognizing that the form's class module which probably has thousands of lines of code running to do everything Access is doing for you is the mainline. Form/Report/Control events are "hooks" from the object's mainline to give you the opportunity to add your own code to customize a process when the user takes some specified action. The event model is NOT RANDOM. Every event has a purpose and is designed to let you add code at that point. Easy to understand is the click event of a button. It's use is obvious and people rarely misuse it. But they frequently confuse the purpose of the Before and After update events of the form and controls. I once removed over 5,000 lines of code from an application!!! The developer did not understand the purpose of the BeforeUpdate event. He kept trying to find a way to prevent a form from saving bad data but after 5,000 lines of code, he was totally unsuccessful. He put code in at least 4 control events - but never the BeforeUpdate event of a control. He put code in several form level events but never the form's BeforeUpdate event. He went so far as to duplicate code. That's how we got so many rows. For each control on the form, he would add the validation code for that control to the four events. This didn't work, the form was still saving bad data, so he copied the code. Control1 validated control1. Control2 validated control1 and control2, Control3 validated 1,2,3, Control4 validated 1,2,3,4, you see how this can add up. And apparently he added it all at once without stopping to test since of course this didn't fix his problem either and yet every single form in the database had all this useless code and he never thought to use the form's BeforeUpdate event.
Well, the most important event in the entire form is the form's BeforeUpdate event. Think of it as the flapper at the bottom of a funnel. If you want to save a record, it has to pass through this event and YOU don't call this event. Access calls this event whenever it encounters a situation where it thinks it needs to save a record whether you specifically initiated the save or whether you triggered the save by doing something else like scrolling to a new record or clicking from the main form to a subform or vice versa, among other situations. Access takes data safety as its personal mission. NO DATA WILL EVER BE LOST if Access can help it

Therefore, it wants to save a lot. As you get to understand Access better, you will know when Access wants to save, not that it matters. What matters, is that you have your validation code in the form's BeforeUpdate event (or occasionally the control's BeforeUpdate event) so that YOU ALWAYS are in control over what is valid and what is not valid and therefore should not be saved.
So, your validation code goes in the BeforeUpdate event (or sometimes in a common procedure that is called from this one). When your code identifies an error you use
Cancel = True
and that tells Access to not save this record. PERIOD. Access will not save the record if you cancel the BeforeUpdate event. So you have absolute control over whether or not a record gets saved. Experienced developers come to Access and never discover this event but they know how to code so they decide they can do it better and they use unbound forms. Well, they end up with control but at the expense of giving up the most useful tool Access has to offer plus they end up writing hundreds of lines of unnecessary code and having to make up their own event triggers which is pretty hard when you get right down to it. Essentially they are duplicating code which already exists in the mainline of the form's event model because they didn't understand the concept of "hooks" and how to take advantage of them to control importing things like - should this record be saved?
A common mistake is putting validation code in a control's lostFocus event. Sounds good. Access won't let you leave a control if the value in that control is not valid. There are two flaws with. One is logical and one is technical. The logical error is that if a field is required but focus never enters that particular control, your validation code will NEVER run because the LostFocus event will not run. So, your validation can not possibly ever catch an "empty" field problem using that event - or any other control event for that matter. The other is technical. Ok you try to move to another control but can't because the data is invalid. You click OK on the error message and you're back in the control. You simply cannot move to another control on the form without fixing this error. You get frustrated so you close the form. Well you'll get the message one more time but the form closes. Whoops. The bad data is still in that control and you blew by the error message one too many times when you said it was OK to close the form so the bad data got saved

Clearly, the LostFocus event has holes as big as the Grand Canyon and yet you will STILL see "experts" putting validation code in this event.
Splitting has nothing to do with the volume of data. It is all about splitting the data from the code. Would you want your data to be inside your executable? How would you update the code without worrying about the data. What would the user do while you took his application off line so you could make a change. Clearly he can't keep updating and adding data while you are modifying the code. How are you going to merge your changed code into his version of the app and not affect his data?
The second issue that splitting resolves is one of sharing the code base which leads to corruption. You have a monolithic .accdb in a server folder. User A opens the app and the MSAccess.exe opens the .accdb and loads various code modules into memory. User B opens the app and the MSAccess.exe opens the same file and loads various code modules into memory. Now we have parts of the same physical file in memory on two computers. Access creates a lock file which is always the same name as the main file but with an .laccdb extension. In this log file, it keeps track of who is doing what. Technically users cannot open objects in design view and change them when the database is open by a different user (versions prior to A2007 did allow concurrent updating but that's a different issue) but certain properties can be saved when you close an object. For example, if you sort a continuous subform, Access saves the sort when you close the form. Now what user B has in memory does not match what just got saved to the physical file.
So, if you follow this, you will also understand that you don't want UserA and UserB opening the same shared copy of the FE. This is of course less dangerous since corruption is unlikely to affect the data in the BE but it is still dangerous because a failure on one PC affects all other users, so each user needs to have his own personal copy of the FE that he runs from his LOCAL c: drive NOT from a network folder for efficiency reasons.
Access is pretty good about not having data conflicts when multiple users are updating the shared tables in the BE but having to share the objects just offers too much opportunity for corruption. Also, if user B has a power failure or an internet blip, that crushes user A also.
Here's two videos and a sample you might find interesting
I just added #2 --- that link is further down. It is much shorter than #1. I also added a copy of the database I used for the video. Enjoy:) I created a database to help people to understand how and why to use the Form's BeforeUpdate event to validate data. @Uncle Gizmo and I made a...
www.access-programmers.co.uk
On page 2, I uploaded the sample database I was using in the video to show why you should put your validation in the form's BeforeUPdate event and why you should be careful when you put validation in a control's BeforeUpdate event.
Here's another one that shows the bad effects of using certain function and property names as column names so you can see why they should be avoided at all costs. Date, Time, and Name are the worst offenders.
This database has several useful code procedures that you can copy into your BE to fix up defaults you don't like: 1. Change the allow ZLS string property to No If you want to make a text field required, it makes no sense at all to have the Allow ZLS property set to Yes. 2. Turn off sub...
www.access-programmers.co.uk