Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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 更改记录源时自动设置的LinkChildFields和LinkMasterFields_Ms Access_Vba_Ms Access 2010 - Fatal编程技术网

Ms access 更改记录源时自动设置的LinkChildFields和LinkMasterFields

Ms access 更改记录源时自动设置的LinkChildFields和LinkMasterFields,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,在子窗体的访问属性中,我有“LinkChildFields=””和“LinkMasterFields=”(即两者都为空,这就是我想要的:无链接) 当我更改子窗体的Recordsource并重新查询子窗体时,(在VBA中),它们都会自动设置为一个字段,在我的例子中是“CaseID”(导致不显示任何记录) 这是我的记录源: stSQL = "SELECT qryCasesAndCards1.CaseID, qryCasesAndCards1.CaseStatusID, qryCasesAndCard

在子窗体的访问属性中,我有“LinkChildFields=””和“LinkMasterFields=”(即两者都为空,这就是我想要的:无链接)

当我更改子窗体的Recordsource并重新查询子窗体时,(在VBA中),它们都会自动设置为一个字段,在我的例子中是“CaseID”(导致不显示任何记录)

这是我的记录源:

stSQL = "SELECT qryCasesAndCards1.CaseID, qryCasesAndCards1.CaseStatusID, qryCasesAndCards1.Status, qryCasesAndCards1.CompanyName, qryCasesAndCards1.NumberOfCards, qryCasesAndCards1.FullName, qryCasesAndCards1.CaseCreatedDate, qryCasesAndCards1.CaseClosedDate, qryCasesAndCards1.CreatedBy" & _
            " FROM qryCasesAndCards1 where not caseID = " & Me.CaseID & " and cardnumber in (select qryCasesAndCards1.cardnumber from qrycasesandcards1 where qryCasesAndCards1.caseID = " & Me.CaseID & ")"
我尝试过用一个更简单的查询“select*fromqrycases1”替换,但问题仍然存在

在VBA中,在重新查询之后,我正在调试。打印“.linkchildfields”和“.linkmasterfields”,这就是我如何看到它们都被自动设置为“CaseID”

我尝试过将Access form属性中的两个值都更改为无意义值、重新保存、再次更改、重新保存等,但仍然没有任何乐趣

我可以通过在recordsource运行之后立即设置这两个值来解决这个问题,但这样做会有不可接受的延迟(每个值大约5秒)

我现在想知道的一件事是,我的表单过滤器是否正在传播到子表单?(我正在通过“docmd.open…caseid=x”打开它)

CaseID可能在很久以前的某个阶段被输入到那些链接字段中…但现在绝对不是。就像他们被锁在某个地方的出入保险库中,它在想“天哪,天哪,我很确定他想要CaseID在那里,天哪,我马上就去!"

我找到了,我找到了,但是我不能从他们那里得到任何帮助


感谢您提供的任何帮助:我正在撕扯我的头发:)

我过去所做的只是删除链接“子/主设置”

  Dim strSql        As String

  ' load sub-form to this tour....
  strSql = "select * from qryGuidesForTour2 where Tour_id = " & Me!ID


  Me.subGuides.Form.RecordSource = strSql
  Me.subGuides.LinkChildFields = ""
  Me.subGuides.LinkMasterFields = ""
然后在代码中我设置了子标准。因此,在下面的代码中,链接主/子标准应该按照tour_id进行过滤,但我只是将这些标准包含在SQL中,然后敲出设置

  Dim strSql        As String

  ' load sub-form to this tour....
  strSql = "select * from qryGuidesForTour2 where Tour_id = " & Me!ID


  Me.subGuides.Form.RecordSource = strSql
  Me.subGuides.LinkChildFields = ""
  Me.subGuides.LinkMasterFields = ""

以上是一个修复程序,修复了所有性能问题。我想这实际上取决于主窗体记录的“设置方式”,但是如果您正在设置“主窗体”“通过代码进行表单记录,然后如上所述,直接使用所需的准则填充子表单记录集。虽然在上面我确实清空了主/子设置,但如果您要允许在子表单中添加REOCRD,那么很可能在上面您应该设置主/子字段,而不是将其清空。

为了防止Access自动更新子表单上的LinkChildFields和LinkMasterFields

  • 确保RecordSource查询没有匹配的关键字字段名。
  • 确保子窗体对象的属性页上的链接子字段和链接主字段为空
  • 不要在代码中设置LinkChildFields和LinkMasterFields属性(即删除任何以前的代码,如MySubForm.LinkChildFields=“”),否则负面影响可能无法解决
  • 如果表单和/或子表单直接绑定到表,只需更新其中一个即可查询表,并为其中一个关键字段添加别名。对于现有查询,可能在大多数情况下,可以为其中一个关键字段名添加别名,而不会产生负面影响。在我的例子中,我只需在子窗体的RecordSource SQL的SELECT部分的单个字段中添加“AS Acct”――在FROM、WHERE或ORDER BY子句中不需要进行其他更改,即使在每个子句中都引用了原始的[Account]字段名

    SELECT Actions.[Account] As Acct, ...
    
    当然,这需要更新表单上相关控件的ControlSource属性

    这些更改消除了在更改父记录和在子窗体上切换记录时额外的几秒钟延迟!同样,它消除了记录导航期间的冗余事件


    我发现没有其他设置阻止Access通过LinkChildFields和LinkMasterFields属性自动重新绑定子表单。正如评论中已经指出的那样,在设置RecordSource后重置链接字段(例如LinkChildFields=“”)也没有帮助,主要是因为Access重置字段需要时间,大部分时间都花在自动分配链接字段以及重置为空时触发的事件上。(例如,每个新记录导航至少调用两次Form_Current。)

    年过去了。。。即使在Microsoft Access 2019上,更改子窗体.RecordSource始终会更改原始的.LinkChildFields和.LinkMasterFields,重新分配好的字段将花费我们为每个属性花费5秒的时间,我们无法避免这一点

    作为一个工作区,我们可以在设计时始终使用相同的查询,例如,
    qrySelTmp
    ,作为子窗体的.RecordSource

    Mainform.subform.Form.RecordSource = "qrySelTmp"
    
    当我们必须更改.RecordSource内容时,我们只更改查询的定义,如下所示

    CurrentDb.QueryDefs("qrySelTmp").SQL = "SELECT qryCasesAndCards1.CaseID, qryCasesAndCards1.CaseStatusID, qryCasesAndCards1.Status, qryCasesAndCards1.CompanyName, qryCasesAndCards1.NumberOfCards, qryCasesAndCards1.FullName, qryCasesAndCards1.CaseCreatedDate, qryCasesAndCards1.CaseClosedDate, qryCasesAndCards1.CreatedBy" & _
      " FROM qryCasesAndCards1 where not caseID = " & Me.CaseID & " and cardnumber in (select qryCasesAndCards1.cardnumber from qrycasesandcards1 where qryCasesAndCards1.caseID = " & Me.CaseID & ")"
    
    
    If(Mainform.subform.Form.RecordSource = "qrySelTmp") then
      Mainform.subform.Form.Requery
    else
      Mainform.subform.Form.RecordSource = "qrySelTmp"
    End if
    
    如代码所示,我们只执行一个子表单.Requery,而不是分配一个新的.RecordSource

    由于
    Subform.Form.Requery
    不会改变子表单属性.LinkChildFields和.LinkMasterFields,因此每次实际更改.RecordSource时,我们都会获得大约8秒的时间


    在我的1个客户-多个订单图中,我的时间增加了2个/20个。

    您是否尝试过搜索应用程序中隐藏的任何可能将LinkChild/Master设置为“CaseID”的死代码?这可能是一个开始。是的,我查过了,运气不好。感谢您的回复。这有帮助吗?这不是很有帮助,但我只能建议删除子窗体控件(而不是它包含的子窗体),并使用其他名称创建一个新控件。我自己可能也会以编程方式设置子窗体的recordsource,而不是将其放入窗体本身,但我不能说这应该或不应该有帮助。感谢John,感谢Overmind找到了它,我错过了它:但我95%确定我已经尝试了所有这些建议。我会继续尝试错误的建议,比如