我正在建立一个访问数据库来跟踪军队中的空降作战。其中一个要求是我能够将存储的数据输出到军队表格中。
此表单有一个标签,我需要在其中输入操作类型,该操作类型可以是以下之一或组合:
行政,战术,大规模战术,战斗,夜战,战斗装备。
基于此,我将数据存储为复选框,在实际数据库中提供是/否(非三重状态)字段。
我想要做的是能够打印(在报告中)实际接受的缩写(即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或更高版本上运行。
答案 0 :(得分:1)
您的数据结构对我来说似乎不错。您有六个类别,可以选择它们的任意组合。在接受跳转输入的表单上,您需要六个复选框或一个列表框,可以选择多个项目。在获取输入并将其存储在记录中之后,此解决方案将启动。我假设你的数据看起来像:
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非常适合根据模板创建政府表单。它真的可以简化你的生活!
答案 1 :(得分:0)
您目前的做法并不是那么糟糕。这取决于具体情况。报告的记录集通常不可用。据我所知,隐形字段对性能的影响很小。
如果它是基于查询的报告,您可能希望使用用户定义的函数创建字符串,或者只在查询中创建平面SQL。 如果它是基于表格的报告,则可以向表格添加计算字段(如果这是您要经常访问的信息)。
您可能希望将计算移出VBA并进入文本控件的控件源。表达式将是这样的:
=IIF(chkAdminNonTactical; "A/NT/"; "") & IIF( chkTactical; "T/"; "") & IIF( .... etc
我可能会建议你使用最后一个选项,因为如果可能的话,它可能会提高性能并避免使用vba。
答案 2 :(得分:0)
这是我的最终代码解决方案,适用于需要执行此类操作的任何其他人。根据Sandpiper的建议,它基于99.9%。没有更多隐藏的复选框,也没有要求运行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)