0

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

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

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

这是我的表:

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


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

根据这两个表,应该有一个关于 Booking #1234 和 Booking #1235 的报告。Booking #1234 的报告应该列出 Container 的 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);

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

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

4

2 回答 2

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
于 2013-04-21T21:44:38.357 回答
1

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

于 2013-05-02T08:55:13.270 回答