重写子报表数据源时链接主报表和子报表

时间:2016-05-05 13:40:04

标签: ms-access access-vba

我有一套' Master'表(表A,表B,表C),每个表可以任选地链接(多对多)到一组“链接”表。表(TableX,TableY,TableZ)通过连接表(jctTableAX,jctTableAY,jctTableAZ等)

表中的每个项目都有一个唯一的(长)标识符(例如Aid,Xid),用于构建链接和一个显示给用户的唯一(字符串)选择器(例如ASelector,XSelector)。 p>

每个主表或链接表都有一个关联的查询(例如qryA,qryX),它可以提取所有表数据并通过Selector对其进行排序。

我想制作一套报告,显示来自“' Master”的每个项目的完整详细信息。表(A / B / C);每个报告都有一组三个子报告,显示链接选择器的列表。

(实际上有十几个主表和十几个链表,有些表可以是主表或链表,具体取决于上下文,所以我需要一个通用的可扩展解决方案 - 大多数子报表都会有但是,在任何报告中都是4,因为不支持表链接的每个组合。)

我当前的设计包含每个主表的报告,以及每个链接表的单个子报告。这些子报表包含在每个主报表中,子报表的数据源将在子报表Open事件中重写(示例是针对X类型的链接项的子报表)

     Dim strMasterType As String
     Dim strJunctionTable As String
     Static intCallCount As Long

     If intCallCount = 0 Then 'Only execute this once

         strMasterType = FormItemType(CurrentMasterForm) 'returns A B or C
         strJunctionTable = GetJunctionTable(strMasterType, "X") 'returns the relevant junction table name

         Me.RecordSource = "SELECT " & strJunctionTable & ".*,  qryX.*, " & strJunctionTable & "." & strMasterType & "id AS MasterID FROM " & strJunctionTable & " LEFT JOIN qryX ON " & strJunctionTable & ".Xid = qryX.Xid;"


     End If
     intCallCount = intCallCount + 1

Link Master Field是Aid。链接子字段是MasterID(这些是在报表设计时设置的,但我相信这应该让我重写不同主报表的子报表源,只要子报表源始终包含MasterID字段。)

  1. 这个设计是否合理或是否有更好的解决方法?
  2. 在链接主字段/链接子字段设置或RecordSource SQL中出现错误,因为我在子报告中获取相同的数据,即使主项目之间的链接数据不同,但是我正在尝试将其解决问题。

1 个答案:

答案 0 :(得分:1)

我认为你所描述的内容听起来很合理,尽管我不确定更精细的细节。我建议删除Link Master&的设置。孩子在设计视图;从父报表的子报表控件中删除子报表本身也是一个好主意。如果您这样做,当报告打开时,主报告的开放事件将被触发(因为还没有子报告):

private sub report_open(cancel as integer)
    me.recordsource = ...
    me.childreport1.sourceobject = ... 'name of child report; 
        'this line will cause the open event of the sub report to fire; 
        'use that event to set the sub-report's record source by
        'if me.recordsource = "" then 
        '    me.recordsource = ... 
    me.childreport1.linkmasterfield = ... 'or whatever the property is called
    me.childreport1.linkchildfield = ...
end sub

这种方法可以快速地以一种形式显示在同一子表单对象中的不同子表单,具体取决于用户在另一个控件中的选择,所以我希望它也适用于您的应用程序。

相关问题