【问题标题】:Creating a 'calendar matrix' in Access在 Access 中创建“日历矩阵”
【发布时间】:2012-10-17 02:23:40
【问题描述】:

我正在尝试创建以“日历”形式显示数据的报告或表单。

我有一个课程查询(简化)为“课程名称”; “课程日”; “课程时间”---

Course; Days; Times
PSY 1; MW; 8A-9A
SOC 150; M; 8A-11A
ANTH 2; Tu; 8A-9A
ANTH 199; MW; 8A-9A

在 Access 中,我正在尝试基于查询创建一个表单,该表单将为我提供以下矩阵:

  • 列:以小时为单位的时间
  • 行:星期几

因此,例如,使用上述数据,它会如下所示: 编辑:Yargh,很遗憾我无法提交图片。所以,这里有一个指向“课程表”的链接,这基本上就是我想要做的:Schedule

我不知道从哪里开始。任何提示(或链接)?

编辑:

我的一个想法是为矩阵中的每个可能的单元格创建一个包含字段的表单(例如,将有一个“星期一,8-9A”字段 - 该字段将是一个过滤器仅显示“day”包含“M”和 BeginTime 或 EndTime 或介于 8A 和 9A 之间的结果的查询。不幸的是,我不知道该怎么做。

【问题讨论】:

  • 嗯。好吧,我并不是要建立一个传统的“日历”——比如“我在一天的时间和时间将在哪里”。我正在尝试做的是设置一个课程,以便在管理上使用来查看我们的整个日程安排(几百门课程)以及使用最多的日期和时间。我们还希望过滤到仅查看某些主题领域等。我不确定 Google 日历是否会提供灵活性。

标签: forms ms-access matrix report vba


【解决方案1】:

您可以做一些接近您想要的访问表单的事情,但这并不容易。此屏幕截图在 数据表视图 窗体中显示您的示例数据,其记录源是 ADO 断开连接的记录集。当文本框值不为 Null 时,它使用条件格式设置文本框背景颜色。您的图片为每个 Course 建议了不同的颜色,但我不想在同一时间段内安排多个 Course 时处理这个问题......我的方式对我来说更容易应付。 :-)

创建和加载断开连接的记录集的代码包含在下面的GetRecordset() 中。表单的打开事件将其记录集设置为GetRecordset()

Private Sub Form_Open(Cancel As Integer)
    Set Me.Recordset = GetRecordset
End Sub

请注意,我以不同方式存储了您的示例数据。这是我的Class_sessions 表:

Course   day_of_week  start_time  end_time
------   -----------  ----------  -----------
PSY 1              2  8:00:00 AM   9:00:00 AM
PSY 1              4  8:00:00 AM   9:00:00 AM
SOC 150            2  8:00:00 AM  11:00:00 AM
ANTH 2             3  8:00:00 AM   9:00:00 AM
ANTH 199           2  8:00:00 AM   9:00:00 AM
ANTH 199           4  8:00:00 AM   9:00:00 AM

这是创建断开连接记录集的功能,这是此方法的关键部分。我使用早期绑定开发了这个,它需要“Microsoft ActiveX Data Objects [version] Library”的引用;我用的是2.8版。对于生产用途,我会将代码转换为使用后期绑定并丢弃引用。我将其保留为早期绑定,以便您可以使用 Intellisense 来帮助您了解它的工作原理。

Public Function GetRecordset() As Object
    Dim rsAdo As ADODB.Recordset
    Dim fld As ADODB.Field
    Dim db As DAO.Database
    Dim dteTime As Date
    Dim i As Long
    Dim qdf As DAO.QueryDef
    Dim rsDao As DAO.Recordset
    Dim strSql As String

Set rsAdo = New ADODB.Recordset
With rsAdo
    .Fields.Append "start_time", adDate, , adFldKeyColumn
    For i = 2 To 6
        .Fields.Append WeekdayName(i), adLongVarChar, -1, adFldMayBeNull
    Next
    .CursorType = adOpenKeyset
    .CursorLocation = adUseClient
    .LockType = adLockPessimistic
    .Open
End With

strSql = "PARAMETERS block_start DateTime;" & vbCrLf & _
    "SELECT day_of_week, Course, start_time, end_time" & vbCrLf & _
    "FROM Class_sessions" & vbCrLf & _
    "WHERE [block_start] BETWEEN start_time AND end_time" & vbCrLf & _
    "ORDER BY day_of_week, Course;"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strSql)

dteTime = #7:00:00 AM#
Do While dteTime < #6:00:00 PM#
    'Debug.Print "Block start: " & dteTime
    rsAdo.AddNew
    rsAdo!start_time = dteTime
    rsAdo.Update

    qdf.Parameters("block_start") = dteTime
    Set rsDao = qdf.OpenRecordset(dbOpenSnapshot)
    Do While Not rsDao.EOF
        'Debug.Print WeekdayName(rsDao!day_of_week), rsDao!Course
        rsAdo.Fields(WeekdayName(rsDao!day_of_week)) = _
            rsAdo.Fields(WeekdayName(rsDao!day_of_week)) & _
            rsDao!Course & vbCrLf
        rsAdo.Update
        rsDao.MoveNext
    Loop

    dteTime = DateAdd("h", 1, dteTime)
Loop

rsDao.Close
Set rsDao = Nothing
qdf.Close
Set qdf = Nothing
Set GetRecordset = rsAdo
End Function

【讨论】:

  • 所有人的答案都很好,但这正是我所需要的!非常感谢!
  • 我知道,我知道,我们已经过了四年,但这恰好正是我想要的。不幸的是,我的数据表显示为空。我正在运行 MS Access 2016 并按照信函的答案进行操作。您能否提供有关表单设置的一些详细信息?谢谢
【解决方案2】:

实际上,如果您观看我的以下视频,您可以看到在 Access 中创建的日历,该日历在具有新 Access Web 发布功能的浏览器内运行。

http://www.youtube.com/watch?v=AU4mH0jPntI

因此,您在这里真正需要做的就是用文本框格式化表单并设置一些代码来填充它们。 VBA 甚至上面的视频显示这对于 Access 来说非常容易。

【讨论】:

    【解决方案3】:

    我怀疑您是否会在 Access 表单或报告中找到解决此问题的简单方法。
    问题是您需要以不同的方式格式化不同的单元格,并且单元格可以跨越多行并且必须合并。

    如果我是你,我会朝这两个方向走:

    • 从 Access 驱动 Excel,因为您可以独立格式化和合并单元格
    • 使用Web Browser Control 显示您使用表格或更高级别的库(如FullCalendar)构建的HTML

    我会偏爱尝试网络浏览器并找到可以正确格式化数据的正确库。

    【讨论】:

      【解决方案4】:

      我知道这篇文章已经很老了,但我有同样的要求,但我通过以下操作解决了它:

      • 我创建了一个模块,该模块将编写 HTML 代码(作为文本文件)以使用表格生成数据。
      • 我使用表格的 colspan 功能来动态生成所需的视图。
      • HTML 文件是在 Form_Open 事件中创建的,通过将 webbrowser 控件指向 HTML 文件,视图会显示最新数据。
      • css 文件用于处理 HTML 文件的视觉显示,使其看起来类似于已使用的 Access 表单。

      如果有人有兴趣,我可以发布一些代码来进一步说明。

      【讨论】:

      • 感谢您花时间发帖。答案应该简洁、完整、公正地回答问题。如果您有可以回答问题的答案,请发布。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      相关资源
      最近更新 更多