2013-04-21 43 views
0

由于之前的回答结果不是我真正需要的,我正在更新此信息。创建访问报告,该报告列出来自另一个表的ID匹配的表中的信息

我在我的Access数据库中有两个表。一个叫Billings,一个叫Bookings。每张表都有一个名为预订号码的栏目,它们是如何关联的。 Billings表还有一个名为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的报告。 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); 

这将创建一个逗号分隔每个订房号码相关联的容器的名单,但我要为每一个集装箱,其中也将包括来自比林斯其他信息的单独行表。

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

回答

1

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

+0

你真棒,戈德。我很早就对这种不接受表示歉意。如果我能接受这两个答案,我会的。非常感谢您的帮助。 – 2013-05-02 13:16:33

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 
+0

谢谢你,戈德!我稍微修改了一下,以包含报告所需的其他信息,但这正是我所期待的。非常感激! – 2013-04-22 13:07:22