5

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

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

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,不幸的是,我无法提交图像。所以,这里有一个“课程表”的链接,这基本上就是我想要做的:

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

编辑:

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

4

4 回答 4

10

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

在此处输入图像描述

创建和加载断开连接的记录集的代码包含在下面的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
于 2012-10-27T19:14:23.910 回答
3

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

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

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

于 2012-10-27T20:22:20.073 回答
2

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

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

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

于 2012-10-27T15:12:18.830 回答
0

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

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

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

于 2016-07-13T10:04:55.200 回答