我正在使用Crystal Reports XI构建一个报表,该报表调用需要参数@Type_ID和@Subtype_ID的SQL Server存储过程。
数据库中还有一个表,它以一对多的关系关联类型和子类型。
我想让报告的参数提示屏幕要求:
类型 - 列出的类型之一或Null。如果为空,则屏幕不会要求子类型。
子类型 - 与所选类型或Null关联的列出的子类型之一。
...并将这两个值分别作为@Type_ID和@Subtype_ID传递给存储过程。 (如果存储过程获得@Type_ID = Null,它将返回所有类型的记录。如果它获得@Type_ID&lt;&gt; Null并且@Subtype_ID = Null,它将返回与所选类型相关联的所有子类型的记录。)< / p>
有没有办法让我的Crystal报告做到这一切?
到目前为止,使用来自this answer的建议,我在@Subtype_ID上设置了一个动态级联参数(DCP),它按照我上面描述的方式请求Type然后是Subtype,然后传递所选的Subtype到@Subtype_ID。但是,我还没有想出如何将通过此DCP选择的Type传递给@Type_ID,因此如果Subtype为Null,则存储过程可以返回具有所选Type的所有记录。
答案 0 :(得分:2)
问题是您的过程的定义会创建两个参数:TYPE_ID
和SUBTYPE_ID
。 Crystal Reports的参数(动态或静态)不是为相互交互而设计的。
在我看来,你有三个选择:
使用单个提示组创建一个报告(确保提示组创建两个参数)(主报告不需要数据源,顺便说一句) ;插入一个使用您的过程的子报表(它将创建两个参数);将主报表中的参数链接到子报表中的参数;如有必要,您可以在主报表中创建公式(然后链接到子报表中的两个参数)以获取额外的逻辑(例如,将“所有类型ID”的参数值转换为NULL)。
< / LI>重构您的程序,以获得一个VARCHAR
参数,该参数将会收到连结的TYPE_ID
和SUBTYPE_ID
。创建一个动态参数,该参数将具有键和描述的连接值(例如1/3;类型[1] - 子类型[3])。您的过程逻辑需要解析参数的值以确定TYPE_ID
和SUBTYPE_ID
的值。您需要创建一个生成密钥和描述的查询,这些查询将通过BusinessView的各个层公开。
放弃了支持Command或“普通”查询的过程。根据我的经验,绝大多数报告都可以在没有存储过程的情况下构建。结合w /单个提示组,这将为您提供所需的灵活性。