从 Access 2013 中的位字段为报表创建字符串



我正在建立一个访问数据库来跟踪陆军单位的空降行动。其中一个要求是我能够将存储的数据输出到军队表格中。

此窗体有一个标签,我需要在其中输入操作类型,可以是以下一种或组合:

行政,战术,群众战术,战斗,夜间,战斗装备。

基于此,我将数据存储为复选框,这些复选框在实际数据库中提供是/否(不是三重状态)字段。

我想做的是能够打印(在报告中)实际接受的缩写(即A/NT,T,MT,C,N,CE)。为此,我尝试了

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer)
Dim strJumpType As String
strJumpType = ""
If Me.chkAdminNonTactical = True Then
strJumpType = strJumpType & "A/NT/"
End If
If Me.chkTactical = True Then
strJumpType = strJumpType & "T/"
End If
If Me.chkMassTactical = True Then
strJumpType = strJumpType & "MT/"
End If
If Me.chkCombat = True Then
strJumpType = strJumpType & "C/"
End If
If Me.chkNight = True Then
strJumpType = strJumpType & "N/"
End If
If Me.chkCombatEquipment = True Then
strJumpType = strJumpType & "CE/"
End If
If Right(strJumpType, 1) = "/" Then
strJumpType = Left(strJumpType, Len(strJumpType) - 1)
End If
MsgBox strJumpType, vbOKOnly ' test string
Me.lblJumpType.Caption = strJumpType
End Sub

虽然这有效,但它需要我在表单中添加不可见的复选框。我想直接访问当前记录,但我尝试过的每种方法(me.XXX 或 currentrecord.XXX 或设置引用当前记录集的变量)都失败了。

所以我的问题是,这真的是最好的方法,还是有更优雅/更有效的方法?现在我每年只有大约 500 人做 ~6 次跳跃,所以对性能没有明显的影响。我怀疑如果我有一个更大的数据集,这将开始成为一个瓶颈。

另外,我想提高我的整体编程技能。这将在 Access 2013 或更高版本上运行。

您的数据结构对我来说似乎很好。您有六个类别,可以选择它们的任意组合。在接受跳转输入的窗体上,您需要六个复选框或一个允许您选择多个项目的列表框。此解决方案在您获取输入并将其存储在记录中后开始。我假设您的数据看起来像这样:

JumpID|ANT|T|MT|C|N|CE
1     |T  |F|T |F|F|T

报表将提取每条记录,并使用单个文本框控件将项放在一起。然后,您将拥有该框的控制源:

=Switch([ANT]=0,"A/NT/") & Switch([T]=0,"T/") & Switch([MT]=0,"MT/") & 
Switch([C]=0,"C/") & Switch([N]=0,"N/") & Switch([CE]=0,"CE/")

如果全部选择,这将给你留下"A/NT/T/MT/C/N/CE/"作为结果。要去掉最后一个斜杠,您只需像在 VBA 中那样用 LEFT 语句包装它:

=Left(Switch([ANT]=0,"A/NT/") & Switch([T]=0,"T/") & Switch([MT]=0,"MT/") & 
Switch([C]=0,"C/") & Switch([N]=0,"N/") & Switch([CE]=0,"CE/"),
Len(Switch([ANT]=0,"A/NT/") & Switch([T]=0,"T/") & Switch([MT]=0,"MT/") & 
Switch([C]=0,"C/") & Switch([N]=0,"N/") & Switch([CE]=0,"CE/"))-1)

这最终看起来很丑陋,但你只需要输入一次,它的美妙之处在于它会将你的合并跳转类型放入一个文本框中,而无需触摸 VBA。这应该使您的报表更易于使用和设计。

附带说明一下,Access 在基于模板创建政府表单方面非常出色。它真的可以简化你的生活!

你目前的方法还不错。这真的取决于情况。报表的记录集通常不可用。据我所知,不可见字段对性能的影响很小。

如果它是基于查询的报表,则可能需要使用用户定义的函数创建字符串,或者只使用查询中的平面 SQL。 如果是基于表的报表,则可以向表中添加计算字段(如果这是您要经常访问的信息)。

您可能希望将计算移出 VBA 并移入文本控件的控件源。表达式如下所示:

=IIF(chkAdminNonTactical; "A/NT/"; "") & IIF( chkTactical; "T/"; "") & IIF( .... etc

我可能会建议您使用最后一个选项,因为它可能会提高性能,并且如果可能的话,避免 vba 是很好的恕我直言。

这是我为需要做这样的事情的任何其他人的最终代码解决方案。它基于99.9%的Sandpiper的建议。不再隐藏复选框,也无需运行VBA即可在表单中获取正确的输出。

=Left(Switch([AdminNonTactical]=-1,"A/NT/") & Switch([Tactical]=-1,"T/") &
Switch([MassTactical]=-1,"MT/") & Switch([Combat]=-1,"C/") & 
Switch([Night]=-1,"N/") & Switch([CombatEquipment]=-1,"CE/") & 
Switch([Jumpmaster]=-1,"J/") & Switch([AssistantJumpmaster]=-1,"AJ/") & 
Switch([Safety]=-1,"Safety/") & 
Switch([DZSO]=-1,"DZSO/"),Len(Switch([AdminNonTactical]=-1,"A/NT/") & 
Switch([Tactical]=-1,"T/") & Switch([MassTactical]=-1,"MT/") & 
Switch([Combat]=-1,"C/") & Switch([Night]=-1,"N/") & 
Switch([CombatEquipment]=-1,"CE/") & Switch([Jumpmaster]=-1,"J/") & 
Switch([AssistantJumpmaster]=-1,"AJ/") & Switch([Safety]=-1,"Safety/") & 
Switch([DZSO]=-1,"DZSO/"))-1)

最新更新