Sql 具有独立记录集的同一表单的多个实例

Sql 具有独立记录集的同一表单的多个实例,sql,ms-access,Sql,Ms Access,下面的代码是Allen Browne打开同一表单的多个实例的代码。问题是我需要每个表单数据都基于“那个”表单中的下拉列表,而不是第一个。他有一个表作为表单上的记录源,我在表单中嵌入了以下SQL。我认为关键是where语句,或者删除where语句并使用过滤。现在所有打开的表单都基于第一批表单数据 我的SQL Where语句- 其中(((tbl\U买方列.ael\U id)=[表格]![frm\U基线]![ael])) 艾伦密码 Option Compare Database Option Expl

下面的代码是Allen Browne打开同一表单的多个实例的代码。问题是我需要每个表单数据都基于“那个”表单中的下拉列表,而不是第一个。他有一个表作为表单上的记录源,我在表单中嵌入了以下SQL。我认为关键是where语句,或者删除where语句并使用过滤。现在所有打开的表单都基于第一批表单数据

我的SQL Where语句-

其中(((tbl\U买方列.ael\U id)=[表格]![frm\U基线]![ael]))

艾伦密码

Option Compare Database
Option Explicit
Public clnClient As New Collection

Function OpenAClient()
    Dim frm As Form
    Set frm = New Form_frm_baseline
    frm.Visible = True
    frm.Caption = "New Form Opened " & Now()
    clnClient.Add Item:=frm, Key:=CStr(frm.Hwnd)
    Set frm = Nothing
End Function

Function CloseAllClients()
    Dim lngKt As Long
    Dim lngI As Long
    lngKt = clnClient.Count
    For lngI = 1 To lngKt
        clnClient.Remove 1
    Next
End Function

你在正确的轨道上。这里的诀窍是在打开表单时跟踪表单。我就是这样做的。您可以看到,当我创建新实例时,我传入了一个参数,该参数指定了我要在该表单上使用的记录集。你也可以把它改成一个过滤器

这是标准模块中的代码

Public multiInstanceDic As Dictionary

'returns the window handle (long)
Public Function OpenNewMyFormSheetInstance(queryForRecordSource As String, Optional inputCaption As String) As Long

    If multiInstanceDic Is Nothing Then
        Set multiInstanceDic = New Dictionary
    End If

    Dim frm As Form
    Set frm = New Form_MyForm
    frm.Caption = inputCaption
    frm.SetRecordSource queryForRecordSource
    multiInstanceDic.Add frm.Hwnd, frm   'required to keep form alive after function exits
    frm.SetFocus

    OpenNewDynamicDataSheetInstance = frm.Hwnd
End Function

Public Function GetMyFormInstance(frmHandle As Long) As Form_MyForm
    Set GetDynamicDataSheetInstance = multiInstanceDic(frmHandle)
End Function
我在整个应用程序中都这样使用它

Dim createdWindowHandle As Long
createdWindowHandle = Windows.OpenNewMyFormInstance("VW_SomeView", "A wonderful informative caption")
然后,每当我需要更改在创建表单时未处理的表单的其他内容时,我都会将
hwnd
放在手边,因为在创建表单时我将其返回给调用方

Dim dMyForm As Form_MySheet
Set dMyForm = Windows.GetMyFormInstance(createdWindowHandle)

dMyForm.[change any public property]  

这一切对我来说都很好。我可以使用不同的数据同时打开同一表单的多个实例。当传递查询/记录集时,此特定表单将动态创建绑定控件。但是,我认为你不需要这样。您只需要使用不同的过滤器显示两个表单。完全可能

我只是好奇,因为我以前从未做过类似的事情,但是窗体的新实例上的控件何时呈现?我认为在加载表单后,可能需要进行
重新查询
,而
Hwnd
仍然是焦点,但是我不确定新表单如何知道过滤内容,因为它们基本上只是复制第一个表单?@Brad-谢谢,我发现有人把艾伦的方法作为其他地方的基础来做一些我想做的事情。这与您所介绍的内容相结合,我觉得我有信心完成这项工作。@请注意表单的
打开
加载
事件会在您调用
新表单时触发。调用
SetFocus
时,表单实际上会绘制在屏幕上,其效果与
相同。Visible=true
。如果您正在更改recordsource的
where
子句,但由于OP只是更改
。Filter
设置
。FilterOn=true
将触发要执行的筛选。@请注意……每个新表单都是一个新对象,因此它们完全独立于任何其他表单。就像创建
newdictionary
时一样,它会创建类Dictionary的一个新对象,但任何新对象都与其公共结构以外的任何旧对象无关。这里我们定义了一个名为
Form\u MyForm
的类。Access通常一次只打开一个实例,因为它自己管理这种结构。所以DoCmd.OpenForm每个类只能打开一个表单。非常有趣,感谢您的回复。回想起来,所有这些都是必要的吗?如果OP正在创建相同表单的新对象,如果OP没有更改每个表单上的下拉列表以过滤记录,那么返回的数据会有什么不同?一旦过滤,我会认为只需要一个
重新查询
。不过,我想我可能很难跟上。