微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将2个参数从子表单传递到另一表单

如何解决将2个参数从子表单传递到另一表单

我有一个名为frmGeneralinformation的主窗体,其子窗体为frmRetroVerso。

表格frmRetroVerso具有2个字段:SurveyID和FolioNo,以及2个按钮:Retro和Verso。

“复古”按钮打开frmFolioRetro的形式。

我希望frmFolioRetro从frmRetroVerso获取参数SurveyID和FolioNo,并显示记录或让我输入新记录的详细信息。某种程度上,SurveyID和FolioNo不会根据发送的参数进行更新。有人可以帮忙吗?

这是我在子窗体frmRetroVerso中的代码

Private Sub Verso_Click()
Const FORMNAME = "frmFolioVerso"
Const MESSAGETEXT = "No current folio number."
    ' be sure a record has been entered
    If Not IsNull(Me.FolioNo) And Not IsNull(Me.SurveyID) Then
        ' save current client record
        Me.Dirty = False
    
        ' open linked form in dialogue mode
        DoCmd.OpenForm FORMNAME,_
            WhereCondition:=Me.FolioNo & " AND " & Me.SurveyID,_
            OpenArgs:=(Me.FolioNo & ";" & Me.SurveyID)
    Else
         MsgBox MESSAGETEXT,vbExclamation,"Invalid Operation"
    End If

End Sub

Private Sub Retro_Click()

Const FORMNAME = "frmFolioRetro"
    Const MESSAGETEXT = "No current folio number."
    
    ' be sure a record has been entered
    If Not IsNull(Me.FolioNo) And Not IsNull(Me.SurveyID) Then
        ' save current client record
        Me.Dirty = False
        ' open linked form in dialogue mode
        DoCmd.OpenForm FORMNAME,"Invalid Operation"
    End If

End Sub

这是我在frmFolioRetro中拥有的代码,应该与frmFolioVerso几乎相同:

Private Sub SurveyID_GotFocus()
    On Error Resume Next
    Forms("frmRetroVerso").Dirty = False
    Me.SurveyID.DefaultValue = """" & Forms("frmRetroVerso").SurveyID & """"
End Sub

Private Sub FolioNo_GotFocus()
    On Error Resume Next
    Forms("frmRetroVerso").Dirty = False
    Me.FolioNo.DefaultValue = """" & Forms("frmRetroVerso").FolioNo & """"
End Sub

Private Sub Form_Current()

    If IsNull(Forms("frmGeneralinformation").SurveyID) Then
        Me.AllowAdditions = False
    Else
        Forms("frmGeneralinformation").Dirty = False
        Me.AllowAdditions = True
    End If
    
End Sub

Private Sub Form_Open(Cancel As Integer)

    If Not IsNull(Me.OpenArgs) Then
    
        Dim value1 As String
        Dim value2 As String
        
        value1 = Split(Me.OpenArgs,";")(0)
        value2 = Split(Me.OpenArgs,";")(1)
        Me.SurveyID.DefaultValue = """" & value2 & """"
        Me.FolioNo.DefaultValue = """" & value1 & """"
        MsgBox (Me.SurveyID.DefaultValue)
        MsgBox (Me.FolioNo.DefaultValue)
   End If

End Sub

解决方法

“条件”不完整。需要引用参数应应用于的表单上的字段。如果这些字段分别命名为FolioNo和SurveyID且为数字类型:

WhereCondition:="FolioNo=" & Me.FolioNo & " AND SurveyID=" & Me.SurveyID,

,

如果您的where子句正确,那么将仅显示与where子句匹配的记录,并且我认为不需要将值“传递”给表单-它会过滤到您要求的记录。

现在,可能该记录不存在。但是然后,我将编写代码进行检查,并在启动该表单之前添加记录。因此,这两个值现在再次以该目标形式作为带有值的文本框可用。

如果出于某种奇怪的原因,您除了需要已经满足您要求的过滤器之外,还需要传递两个值?

然后在目标表单中简单地在表单的代码模块级别声明两个变量(在任何代码这样的开头开始:

Option Compare Database
Option Explicit

Public MyFoioNum    As Long
Public MySurvayID   As Long

因此,现在您可以在代码中进行操作了:

code to open the form with filter as you have
dim strF      as string
strF = "name of form to open"
DoCmd.OpenForm strF,_
        WhereCondition:=Me.FolioNo & " AND " & Me.SurveyID,_
        OpenArgs:=(Me.FolioNo & ";" & Me.SurveyID)
forms(strF).MyFoioNum = me.FoiliNo
forms(strF).MySurvayID = me.SurveyID

因此,以上内容现在允许该格式的任何VBA代码自由使用MyFoioNo和MySurvaryID。但是请注意,由于您用这两个数字过滤了表单,因此我几乎没有理由传递两个值。

如前所述,目标表格记录MIGHT是否不存在?然后编写代码以检查目标记录是否存在,如果没有,则在其中添加代码,然后运行您现在要使用过滤器打开表单的相同代码。 (因此,它将始终有效,因为它(您是开发人员)总是假设目标记录将基于过滤器而存在)。

因此,在启动该表单之前,如果没有添加它,则检查记录是否容易一些,然后再启动该表单。

我想您可以尝试将代码放置在目标表单启动中以检查记录,如果没有添加,则该记录将被添加(但是该表单已经设置了过滤器)。因此,在启动表单之前,这样做比较容易。 因此,您必须权衡设置传递两个值并从调用代码中设置它们的能力,或者简单地让调用代码添加reo​​crd。这样,调用表单无需关心也不需要传递两个值-只是一个过滤器,因此系统中的任何代码都可以自由调用该表单而不必传递值。 您采用的代码规则是,发送给ALSO的过滤器还假定目标表单和记录已经存在。

请注意,是否按照上述建议在表单加载后“设置”值?当然,这仅适用于模型表单或弹出表单(您的情况!)。对于以对话框形式打开的表单,调用代码将停止,并等待,直到用户关闭该表单,调用代码才能继续。

因此,您可以使用以上在目标表单中创建公共变量的想法传递1、2或5个值,然后通过调用代码将其打开,因此,调用代码可以在表单之后自由设置这些公共值打开。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。