首页 > 解决方案 > 操作方法:在由键组织的字段中包含串联文本的报告

问题描述

我正在尝试在 MS Access 中创建一个具有以下形式的报告:

在此处输入图像描述

此处创建的示例将由下表填充:

在此处输入图像描述

“FK”列指的是另一个表中的一个键,我将从中填充标题文本。SysID 列包含我将填充到每个单元格中的系统文本的 ID。

我有限的理解是我需要在主报告中使用子报告。子报表将从“FK”中提取密钥并使用它来选择与单元格的相应类型匹配的“SysID”条目,即类型 1、类型 2 等。每个单元格中的文本将是找到的匹配条目的文本。

非常感谢任何示例代码或指向先前相关答案的链接。我很迷茫如何让这个工作。

谢谢!

标签: ms-accessreportconcatenation

解决方案


这将需要 VBA 代码。Allen Browne 在http://allenbrowne.com/func-concat.html提供的一种常用函数

假设有一个 Titles 表,其中 ID 是与示例表中的 FK 关联的唯一主键 - 使用该表作为查询源,然后调用该函数 4 次(也假设只有 4 种类型)。

SELECT TitleID, "Title_" & TitleID AS Title, 
ConcatRelated("'Sys_' & [sysID]", "sampleTable", "FK=" & [TitleID] & " AND Type=1", "sysID") AS Type1, 
ConcatRelated("'Sys_' & [sysID]", "sampleTable", "FK=" & [TitleID] & " AND Type=2", "sysID") AS Type2,
ConcatRelated("'Sys_' & [sysID]", "sampleTable", "FK=" & [TitleID] & " AND Type=3", "sysID") AS Type3,
ConcatRelated("'Sys_' & [sysID]", "sampleTable", "FK=" & [TitleID] & " AND Type=4", "sysID") AS Type4
FROM Titles;

替代方案是 CROSSTAB(再次假设只有 4 种类型):

TRANSFORM Max(ConcatRelated("'Sys_' & [sysID]","sampleTable","FK=" & [FK] & " AND Type=" & [Type], "sysID")) AS SysType
SELECT [FK], "Title_" & [FK] AS Title
FROM sampleTable
GROUP BY [FK], "Title_" & [FK] 
PIVOT [Type] IN (1,2,3,4);

请注意,大型数据集的性能可能会很慢。两者在样本数据上似乎具有相同的性能。

不需要子报告。但是,基于 CROSSTAB 构建稳定的报告,其中返回的列是动态的,这可能是一个挑战。


推荐阅读