1

这是一个有趣的。我正在为一家非营利组织编写一份水晶 XI 报告,该报告基于从他们的筹款数据库中导出。导出会创建一个 MDB 文件,该文件用作报告的数据源。

我的数据源中有三个表,其中一个字段包含以分号分隔的捐赠律师列表。我需要将这三个字段组合成一列不同的名称。此命令的结果将用于过滤和分组。这是表格设置和所需的输出:

表格1

多伊,约翰;能源部,简;史密斯,鲍勃

表 2

史密斯,鲍勃

表3

多伊,约翰;史密斯,鲍勃

我必须结合它来创建:

Doe、John
Doe、简·
史密斯、鲍勃

很容易,对吧?但是,我必须仅使用 SELECT 语句来执行此操作。你为什么问?

  • 每次运行都会覆盖 MDB。这意味着不能将 UDF 或存储过程添加到 MDB,因为它们将在下一次导出运行期间被删除。
  • 最终用户没有安装 Access,所以即使我为他们编写了一个脚本来将一个对象添加到 MDB 作为导出和我的报告之间的一个步骤,他们也无法运行它。
  • Crystal 中的 SQL 命令不能声明变量,所以我不能编写游标或任何在 BEGIN 和 END 之间进行处理的东西。
  • 我无法控制生成我的数据源的过程,所以我无法在那里修复它。

我不确定这是否可能在这些限制内实现,但它们是具体的。我几乎正在尝试将 UDF 保存在单独的数据库中并将 SQL 命令作为跨数据库查询运行,以便我可以利用该功能,但我不知道 Crystal 的 SQL 命令是否可以处理跨数据库查询。数据库查询。

在这些限制范围内有任何解决方案的想法吗?

4

1 回答 1

0

如果您使用命令,您将能够组合三个记录集:

SELECT NAME_FIELD
FROM   TABLE_1

-- eliminate duplications
UNION

SELECT NAME_FIELD
FROM   TABLE_2

UNION

SELECT NAME_FIELD
FROM   TABLE_3

然后,您可以创建一个将值拆分为数组的公式:

//{@names}
Stringvar Array names;
Split({Command.NAME_FIELD}), ";");
true;

不幸的是,您将无法使用此公式将数组转换为“行”。水晶只是不支持这一点。本质上,您处于“死胡同”。

Your best option (and only one given the requirements) is to have the source system (i.e. the one that creates the MDB file) split the fields' values into equivalent recordsets. This will require you to create either a stored procedure or user-defined function in the source system. If you are using Oracle, see How can I combine multiple rows into a comma-delimited list in Oracle?.

于 2012-05-14T13:28:32.590 回答