创建访问报告,列出一个表中的信息,该表与另一个表的ID匹配

时间:2013-04-21 20:05:59

标签: sql ms-access ms-access-2007

我正在更新这个,因为之前的答案不是我真正需要的。

我的Access数据库中有两个表。一个叫比林斯,一个叫做预订。每个表都有一个名为Booking Number的列,它们是相关的。 Billings表还有一个名为Container的字段。我想做的是:

  • 为每个预订编号创建一页报告(可根据容器数量扩展到多个页面)
  • 在报告正文中,我想在单独的行中列出每个Container(以及有关每个容器的其他信息)

以下是我的表格:

Bookings
----------------
ID | Booking Number
 1 | '1234'
 2 | '1235'


Billings
----------------
ID | Booking Number | Container
 1 | '1234'         | '12'
 2 | '1234'         | '16'
 3 | '1235'         | '18'

根据这两个表,应该有预订#1234和预订#1235的报告。预订#1234的报告应该列出容器的12和16,而Booking#1235的报告只列出18.我是PHP / MySQL开发人员,所以我理解SQL查询。但是,我为MySQL编写查询的方式显然不适用于Access。目前我正在使用类似于下面答案的模块,但它没有做我需要它做的事情。这是我目前的查询:

SELECT
    b.*,
    ListContainers(b.[Booking Number]) AS Containers
FROM
    Bookings AS b
WHERE
    ((b.[Booking Number]) Is Not Null);

这将创建一个逗号分隔的与每个预订编号关联的容器列表,但我想为每个Container创建一个单独的行,其中还包括Billings表中的其他信息。

有没有人有类似情况的经验,或者知道我可以采取哪些步骤来完成我想要做的事情?

2 个答案:

答案 0 :(得分:1)

[这是我在“规范”改变之前对原始问题的回答。]

在Access中创建一个新的Module并粘贴以下代码

Public Function ListContainers(Booking_Number As String) As String
Dim cdb As DAO.Database, rst As DAO.Recordset, rtn As String
Const Separator = ", "
Set cdb = CurrentDb
rtn = ""
Set rst = cdb.OpenRecordset("SELECT Container FROM Billings WHERE [Booking Number]=""" & Booking_Number & """ ORDER BY Container", dbOpenSnapshot)
Do While Not rst.EOF
    rtn = rtn & rst!Container & Separator
    rst.MoveNext
Loop
rst.Close
Set rst = Nothing
Set cdb = Nothing
If Len(rtn) > 0 Then
    rtn = Left(rtn, Len(rtn) - Len(Separator))  '' trim trailing separator
End If
ListContainers = rtn
End Function

然后,您可以在查询中使用该功能,例如

SELECT [Booking Number], ListContainers([Booking Number]) AS Containers
FROM Billings

那将返回

Booking Number  Containers
--------------  ----------
1234            12, 16
1235            18

答案 1 :(得分:1)

对于新要求,您需要使用“子报告”列出容器(和相关信息)。有关详细信息,请参阅我最近对类似问题here的回答。