0

我目前正在使用连续表格来显示一组数据,这些数据导致以下格式(每行是一个记录):

1/04/13     Person1
31/03/13    Person1
30/03/13    Person1
29/03/13    Person2
28/03/13    Person1

这些记录有 100 条,我想将其浓缩为以下内容:

30/03/13 - 1/04/13     Person1
29/03/13               Person2
28/03/13               Person1

数据来自查询,因此可以在进入表单阶段之前在 SQL 级别进行操作。我也很乐意使用宏或 VBA 来操作表单。但是,我仍然无法找到合适的方法来做到这一点。

我意识到这是报表的典型行为,但是由于我最终希望将其作为子表单嵌入到另一个表单中,因此我不能使用报表(除非我遗漏了某些内容,否则无法在表单中创建子报表)。

非常感谢任何帮助或建议。

4

1 回答 1

1

很好地描述了问题。尝试像这样构建您的源查询(假设字段被调用MyDate并且MyPerson源表是MyTable):

Select Person, min(MyDate) as StartDate, max(MyDate) as EndDate
from MyTable
group by Person

这为您提供了 3 个可以放入表单的字段。

编辑

现在我们有了更完整的画面,任务变得更加复杂,但是您仍然可以选择假设人们之间的“事件”不重叠(如果它们重叠,那么我想不出之后如何创建 eventID) . 在没有 EventID 的情况下,您必须创建一个:

  1. 首先,您需要将数据移动到一个新表中,以便重新排序并为您将在步骤 2 中添加的事件 ID 添加一个空白字段。
    1a。将 MyTable 复制到新表中。添加一个名为 EventID 的额外字段。
    1b。要填充此表,首先是Delete * from TmpTbl
    1c。然后是这样的:
    Insert into TmpTbl.* from MyTable order by MyDate,MyPerson

  2. 此代码将查看您的临时表(我称之为 TmpTbl)并添加一个事件 ID。

    Sub AddEventIDs()
    Dim rst As Recordset
    Set rst = CurrentDb.OpenRecordset("TmpTbl")
    Dim LastPerson As String
    Dim EventID As Integer
    docmd.setwarnings false
    While rst.EOF = False
        If LastPerson <> rst.Fields("MyPerson") Then EventID = EventID + 1
        LastPerson = rst.Fields("MyPerson")
        rst.Edit
        rst.Fields("EventID") = EventID
        rst.Update
        rst.MoveNext
    Wend
    docmd.setwarnings true
    End Sub
    
  3. 在表单的 On Load 事件中,添加 2 个查询和来自 #1 和 #2 的子例程。

  4. 您的最终查询将是:

    Select MyPerson, EventID, min(MyDate) as StartDate, max(MyDate) as EndDate
    from MyTable
    group by MyPerson,EventID
    
于 2013-04-08T19:56:47.483 回答