Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access MS Access:是什么原因导致一个具有联接查询的表单正确加载而另一个表单不正确加载? 最新消息!_Ms Access_Data Binding_Foreign Keys_Ms Access 2007 - Fatal编程技术网

Ms access MS Access:是什么原因导致一个具有联接查询的表单正确加载而另一个表单不正确加载? 最新消息!

Ms access MS Access:是什么原因导致一个具有联接查询的表单正确加载而另一个表单不正确加载? 最新消息!,ms-access,data-binding,foreign-keys,ms-access-2007,Ms Access,Data Binding,Foreign Keys,Ms Access 2007,如果我用SQL手动创建新记录,然后用下面的代码在编辑模式下打开表单,它就可以工作了。我仍然想知道以前的问题是什么,但至少我现在可以继续我的申请了 表格1 表格1绑定到表1。表1有一个ID字段 表格2 Form2绑定到Table2,并连接到Table2上的Table1。Table1_ID=Table1.ID 以下是SQL(由Access生成): 打开Form2时,在Form1中使用以下代码: DoCmd.RunCommand acCmdSaveRecord DoCmd.OpenForm "For

如果我用SQL手动创建新记录,然后用下面的代码在编辑模式下打开表单,它就可以工作了。我仍然想知道以前的问题是什么,但至少我现在可以继续我的申请了


表格1

表格1绑定到表1。表1有一个ID字段

表格2

Form2绑定到Table2,并连接到Table2上的Table1。Table1_ID=Table1.ID

以下是SQL(由Access生成):

打开Form2时,在Form1中使用以下代码:

DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Form2", , , , acFormAdd, , Me.[ID]
DoCmd.Close acForm, "Form1", acSaveYes
加载运行时:

Me.[Table1_ID] = Me.OpenArgs
Me.[Table2_ID] = Me.OpenArgs
加载Form2时,绑定到表1中的列的字段将正确显示

表格3

Form.Control Source = SELECT Table3.*, Table2.Col1 FROM Table2 INNER JOIN Table3 ON Table2.Table2_ID=Table3.Table2_ID; 
Form_Load event set to
    Me.[Table2_ID] = Me.OpenArgs
TextBox control named Table3_ID with a Control Source=Table3_ID
TextBox control named Table2_ID with a Control Source=Table2_ID
TextBox control named Col1 with a Control Source=Table2.Col1
Form3绑定到Table3,并连接到Table3上的Table2。Table2_ID=Table2.ID

以下是SQL(由Access生成):

Form3在Form2中使用以下代码打开:

DoCmd.RunCommand acCmdSaveRecord
DoCmd.OpenForm "Form3", , , , acFormAdd, , Me.[ID]
DoCmd.Close acForm, "Form2", acSaveYes
加载运行时:

Me.[Table1_ID] = Me.OpenArgs
Me.[Table2_ID] = Me.OpenArgs
加载Form3时,绑定到表2中列的字段不会正确显示

为什么?


更新

我尝试将连接查询变成一个单独的查询,并将其用作我的记录源,但没有任何区别

如果我转到Form3的查询并在数据表视图中查看它,我可以看到应该拉入表单的信息就在那里。它只是没有出现在表格上


另一轮更新

让我提供一个类似的情况,这样我想做的是清楚的

表1现在是房屋。 表2现在是驱动程序。 表3现在是汽车

假装我在写保险申请书。这些表之间的关系将完全符合我要做的

每个房子可以有一个或多个司机,而每个司机正好有一辆车。现在,我只是想用一栋房子,一个司机和一辆车让它工作。用户应该首先看到一个名为HouseInformation的表单,该表单将要求他们填写关于他们房子的信息。然后他们会看到DriverInformation,要求他们填写自己的信息。然后,他们将看到一个信息,要求他们填写有关他们汽车的信息。完成后,每个表中将有一条记录。Drivers中的记录将包含与相应房屋匹配的HouseId,Cars中的记录将包含DriverId,与相应的driver匹配。我并不特别关心表单是如何链接的,只关心它们是如何链接的,以及它是否可靠地工作

值得一提的是,我还尝试了许多其他加载表单并设置其外键id的方法。这些方法都没有导致表单从上一个表单的表中提取数据,即使这种模式在前两个表单之间确实有效


更多更新

客户不接受子表单,客户特别要求单独的表单


我发现这非常令人困惑,但是在加载Form3之后,如果我关闭它,进入设计视图,打开Form3的查询并切换到数据表视图,正确的数据就在那里,包括我想要从Form2中获取的字段。它不会出现在表格上。我再次询问。这没什么区别。它不会显示。

这通常通过子窗体完成。这有两种方法:

  • 嵌套子窗体,它限制了某些显示选项,因为您有两个级别

  • 级联子窗体

  • 家庭将是你的父母形式

    您的Cars表将有一个HouseholdID外键

    您的驱动程序表将具有CarID外键

    对于这两种解决方案,您都会有一个Cars子表单,其中包含描述汽车的相关字段(品牌、车牌、颜色、车型年份等),并链接到HouseholdID上

    您还将有一个drivers子表单,对于第一个解决方案,您将嵌入Cars子表单中,链接到CarID上。这将强制cars表单成为单个表单,或者更有用的是数据表表单。您可以将驱动程序窗体设置为连续或数据表,因为它位于嵌套窗体的底部

    结果是显示为数据表并具有子数据表的子窗体。当你点击汽车数据表上的星号按钮时,你会得到一个新的记录并输入汽车数据。自动输入HouseholdID(这是子窗体的工作方式)。同样,对于驱动程序,在驱动程序子窗体中点击星号并输入驱动程序

    如果您不想局限于数据表,可以将这两个子表单放在顶级家庭表单上,并从子表单链接CarID上的驱动程序表单,因此:

    林奇菲尔德:卡里德 LinkParentField:汽车。表格!龋齿

    这确实会导致一些UI问题,因为在输入汽车之前,您无法输入驾驶员,最终可能会出现问题。解决方案1并非如此,因为它使用数据表,所以不会导致任何UI问题

    这个解决方案的一个问题是,如果你想在一个家庭中的多辆车上安装一个司机,你必须输入司机两次。解决方案是创建一个连接表,将多辆车连接到多个驾驶员。该表中有一个CarID和DriverID,上面描述的设置中的低级子窗体将TBLCARDRIVE作为其记录源,组合框作为其上唯一从驱动程序表中提取数据的控件。组合框将绑定到联接表的DriverID

    现在,您可以在一个家庭中模拟两名驾驶两辆车的驾驶员,而无需输入每个驾驶员两次,但在该设置中,没有位置输入新驾驶员。因此,通常的方法是为组合框设置NotInList事件,当您在组合框中键入“Fenton,David W.”时,它会询问您是否要将其作为新驱动程序输入,然后NotInList事件中的代码为您处理(即
    Form.Control Source = Table1
    TextBox control named Table1_ID with a Control Source=Table1_ID
    TextBox control named Col1 with a Control Source=Col1
    Command Button with Click event set to:
        DoCmd.RunCommand acCmdSaveRecord
        DoCmd.OpenForm "Form2", , , , acFormAdd, , Me.[Table1_ID]
        DoCmd.Close acForm, "Form1", acSaveYes
    
    Form.Control Source = SELECT Table2.*, Table1.Col1 FROM Table1 INNER JOIN Table2 ON Table1.Table1_ID=Table2.Table1_ID; 
    Form_Load event set to
        Me.[Table1_ID] = Me.OpenArgs
    TextBox control named Table2_ID with a Control Source=Table2_ID
    TextBox control named Table2.Col1 with a Control Source=Table2.Col1
    TextBox control named Col1 with a Control Source=Table1.Col1
    Command Button with Click event set to:
        DoCmd.RunCommand acCmdSaveRecord
        DoCmd.OpenForm "Form3", , , , acFormAdd, , Me.[Table2_ID]
        DoCmd.Close acForm, "Form2", acSaveYes
    
    Form.Control Source = SELECT Table3.*, Table2.Col1 FROM Table2 INNER JOIN Table3 ON Table2.Table2_ID=Table3.Table2_ID; 
    Form_Load event set to
        Me.[Table2_ID] = Me.OpenArgs
    TextBox control named Table3_ID with a Control Source=Table3_ID
    TextBox control named Table2_ID with a Control Source=Table2_ID
    TextBox control named Col1 with a Control Source=Table2.Col1
    
    1. Open Form1 
        a. Table1_ID: 1
        b. Col1: Val
    2. Click the Button.
    3. Form2 Opens in add mode.
        a. Table2_ID shows next ID (probably 4)
        b. Table2.Col1: <blank>
        c. Table1.Col1: Val1
    4. Enter "FOO" in the TextBox for Table2.Col1 and Click the button
    5. Form3 Opens in add mode
        a. Table3_ID: next id (probably 4)
        b. Table2_ID: the id shown in Step 3a.
        c. Table2.Col1: FOO