PostgreSQL 和 Crystal Reports
本文档的用途
我从大约 7.0 版本开始使用 Crystal Reports。直到最近,我一直使用它来针对 Microsoft Access、Microsoft Outlook、Microsoft SQL Server 和 Sybase 数据库进行报表。当我开始针对 PostgreSQL 数据库进行报表时,我遇到了一些难以找到解决方案的怪癖。我希望本文档能够帮助其他必须使用 Crystal Reports 和 PostgreSQL 组合的人。先决条件
- 一个可用的 Crystal Reports 版本。本文档是使用 Crystal Reports 9.0 Professional 作为开发工具编写的。早期版本的 Crystal 应该支持针对 PostgreSQL 数据源进行报表,但存储过程除外。您的 Crystal 版本必须支持编辑 Crystal 为针对存储过程进行报表而生成的 SQL 语句。
- 我建议您安装 Service Pack 1 或从 Crystal 搜索热修补程序。Crystal 9.0 在 Crystal 解释某些数据库列名的方式方面存在一个错误,这是因为 PostgreSQL 使用的数据类型造成的。
- 本文档是使用 PostgreSQL 7.X 版本作为数据库版本编写的。当然,需要访问 PostgreSQL 数据库。如果您无法连接到数据库,请联系您的管理员或阅读 PostgreSQL 文档以检查您的数据库设置。
- 一个 PostgreSQL ODBC 驱动程序。本文档是使用 ODBC 连接到数据库编写的。驱动程序可以从 https://odbc.postgresql.ac.cn/ 获取。我使用了版本 psqlodbc-07 03 0200。
- 一个配置到您的 PostgreSQL 数据库的 ODBC 连接。
数据源
- 针对表的报表
- 针对视图的报表
- 针对存储过程的报表
- 无参数
- 有参数
针对表的报表
针对表的报表可以进行,但有一些注意事项。可以使用数据库专家将表添加到 Crystal Reports,就像其他任何数据库一样,但它们必须是 public 架构的成员。如果表不是 public 架构的成员,并且您尝试将它们添加到报表中,Crystal 会向您显示一条错误消息(不支持)。如果您必须针对 public 架构以外的架构中的表进行报表,请针对该表创建视图,并根据该视图进行报表。您可以添加多个表并在 Crystal 中链接它们,就像在任何其他数据库中一样。
针对视图的报表
针对视图的报表是大多数针对 Crystal 的报表将执行的方式。针对视图进行报表时,您不需要知道任何特殊内容或使用任何特殊技巧。但是,在创建视图时,我建议您为列名指定数据类型,以确保如果您重命名列或为列分配名称,Crystal 能够读取列名。以下是一个示例:CREATE OR REPLACE VIEW myschema.view_intercultural AS SELECT d.client_name, 'Intercultural Overall'::bpchar AS question FROM myschema.international d; 在上述示例中,请勿使用 ::text 代替 ::bpchar,否则 Crystal 将不允许您选择分组列。
针对存储过程的报表
无参数
这就是我写这个简短教程的真正原因。在 PostgreSQL 中针对存储过程进行报表与我在其他数据库中遇到的情况截然不同。为了针对存储过程进行报表,您必须能够告诉 Crystal 它可以从存储过程中预期接收哪些数据字段及其类型。指定数据字段的唯一方法是将 SQL 语句手动输入到 Crystal 报表中。语法与使用 psql 调用存储过程完全相同,只是传递给存储过程的任何参数的格式不同。在 Crystal 9.0 中,这是通过从顶部菜单中选择数据库 -> 选择您设置的 ODBC 数据源 -> 添加命令来完成的。这将打开一个弹出窗口,您可以在其中直接输入 SQL 语句。对于没有参数的存储过程,语句的格式如下:SELECT field1, field2 FROM myschema.mystoredprocedure AS (field1 varchar(100), field2 int4) 这是用于创建报表中引用的存储过程的 SQL:CREATE OR REPLACE FUNCTION myschema.mystoredprocedure RETURNS SETOF record AS ' DECLARE r record; BEGIN for r in EXECUTE \'SELECT t.field1, t.field2 FROM myschema.mytable t ;\' loop return next r; end loop; return; END; ' LANGUAGE 'plpgsql' STABLE; 表本身的 SQL 如下:CREATE TABLE myschema.mytable ( field1 varchar(100), field2 int4 );
有参数
在 Crystal 9.0 中,这是通过从顶部菜单中选择数据库 -> 选择您设置的 ODBC 数据源 -> 添加命令来完成的。这将打开一个弹出窗口,您可以在其中直接输入 SQL 语句。屏幕右侧的创建按钮用于创建您希望从 Crystal 传递到存储过程的任何参数。对于有参数的存储过程,语句的格式如下:SELECT * FROM myschema.mytable({?parameter1},{?parameter2}) as recs( field1 varchar(100), field2 int4, submit_date date) 这是用于创建报表中引用的存储过程的 SQL:CREATE OR REPLACE FUNCTION myschema.mystoredprocedure(date, date) RETURNS SETOF record AS ' DECLARE r record; from_date ALIAS FOR $1; to_date ALIAS FOR $2; BEGIN for r in EXECUTE \'SELECT t.field1, t.field2, t.submit_date FROM myschema.mytable t WHERE t.submit_date >=\'||quote_literal( from_date )||\' and t.submit_date <=\'||quote_literal( to_date )||\' ;\' loop return next r; end loop; return; END; ' LANGUAGE 'plpgsql' STABLE; 表本身的 SQL 如下:CREATE TABLE myschema.mytable ( field1 varchar(100), field2 int4. submit_date date );
字符集
在从 Crystal Reports 通过 ODBC 使用 PostgreSQL 时,尤其是在您升级以使用更高版本时,请注意字符集。我(Phil)发现,当我从使用 Crystal Reports 8.5 迁移到 2005 时,特殊字符无法正确渲染。特别是,上标 2 字符 (²) 被渲染成一个非常不同的字符 (ʕ)。最终,我发现我一直在使用的 ODBC 数据源不合适。事实证明,我需要更改数据源,使其为“PostgreSQL ANSI”类型,而不是“PostgreSQL”类型。
总之,您需要确保 ODBC 数据源类型(ANSI 或 Unicode)与您的数据库相符。看起来早期版本的默认驱动程序被解释为 Unicode,但我不确定这一点。
更新时间:2009-03-13 10:30