Late breaking news!
If I manually create the new record with SQL and then open the form in edit mode using the code below, it works. I would still like to know what the problem was before, but at least I can get on with my application now.
Form1
Form1 is bound to Table1. Table1 has an ID field.
Form2
Form2 is bound to Table2 joined to Table1 on Table2.Table1_ID=Table1.ID
Here is the SQL (generated by Access):
SELECT
Table2.*,
Table1.[FirstFieldINeed],
Table1.[SecondFieldINeed],
Table1.[ThirdFieldINeed]
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.[Table1_ID];
Form2 is opened with this code in Form1:
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Form2", , , , acFormAdd, , Me.[ID]
DoCmd.Close acForm, "Form1", acSaveYes
And when loaded runs:
Me.[Table1_ID] = Me.OpenArgs
When Form2 is loaded, fields bound to columns from Table1 show up correctly.
Form3
Form3 is bound to Table3 joined to Table2 on Table3.Table2_ID=Table2.ID
Here is the SQL (generated by Access):
SELECT
Table3.*,
Table2.[FirstFieldINeed],
Table2.[SecondFieldINeed]
FROM Table2 INNER JOIN Table3 ON Table2.ID = Table3.[Table2_ID];
Form3 is opened with this code in Form2:
DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Form3", , , , acFormAdd, , Me.[ID]
DoCmd.Close acForm, "Form2", acSaveYes
And when loaded runs:
Me.[Table2_ID] = Me.OpenArgs
When Form3 is loaded, fields bound to columns from Table2 do not show up correctly.
WHY?
UPDATES
I tried making the join query into a separate query and using that as my record source, but it made no difference at all.
If I go to the query for Form3 and view it in datasheet view, I can see that the information that should be pulled into the form is there. It just isn't showing up on the form.
Another round of updates
Let me provide an analogous situation so what I'm trying to do is clear.
Table1 is now Houses. Table2 is now Drivers. Table3 is now Cars.
Pretend I am writing an insurance application. The relation of these tables will exactly match what I'm trying to do.
Each house can have one or more driver, and each driver has exactly one car. Right now, I'm just trying to get it working with one house, one driver, and one car. The user should first see a form called HouseInformation which will ask them to fill in information about their house. Then they will see DriverInformation which will ask them to fill in information about themselves. Then they will see CarInformation which will ask them to fill in information about their car. After they are done, there will be one record in each table. The record in Drivers will contain HouseId, matching the corresponding house, and the record in Cars will contain DriverId, matching the corresponding driver. I don't especially care how the forms are linked, just that they are and that it works reliably.
For what it's worth, I've also tried numerous other methods of loading the form and setting it's foreign key id. None of them have caused the form to pull in the data from the previous form's table, even though this exact pattern does work between the first two forms.
More updates
Subforms are not acceptable to the client, who specifically requested separate forms.
I find this extraordinarily confusing, but after Form3 loads, if I close it, go into design view, open the query for Form3 and switch to datasheet view, the correct data is there, including the fields I want from Form2. It just won't show up on the form. I requeried. It makes no difference. It won't show up.