动态参数不会拉出字段外的值列表

时间:2011-02-04 20:42:56

标签: crystal-reports

我在我正在制作的特定Crystal Report中有两种参数 - 我在SQL查询中直接使用的两个日期,以及一个将根据查询中的销售代表过滤报表的参数。

我在创建命令时定义了两个日期(date1和date2,如果你愿意的话),那些工作正常。但是,在添加动态参数以选择“销售代表”字段所需的值时,仅显示一个文本框,这意味着参数列表尚未像广告中那样动态生成。

我知道原因 - 查询尚未运行,因此没有任何动态值可供选择。日期范围也是一个必要的恶魔,因为如果没有设置日期范围由于许多旧记录(需要坚持做历史目的),报告需要运行五分钟。

是否可以动态生成此列表,还是我不得不使用静态值更新列表?

感谢。

2 个答案:

答案 0 :(得分:1)

要使动态参数起作用,您必须将任何表添加到包含“sales rep”字段的报表中。您可以将表格拉到您正在创建的SQL命令旁边,只需将它们链接到您想要的外部联接,以便不限制您的记录(您甚至可以根本不链接它们,但Crystal会抱怨有“多个起点”或其他什么。

现在,您可以将销售代表拉入动态参数,并将其作为参数在SQL命令本身中使用,或者您可以在记录选择公式中使用它来过滤SQL命令的结果。在这两种情况下,CR都会查询数据库两次;第一次简单地获取整个reps列表,第二次运行SQL Command。

这里的主要内容是表格,而不是命令,需要在报告中才能成为填充动态参数的候选者......即使您不在报告中再次使用该表格。希望这有助于,即使它已经晚了7个月。

答案 1 :(得分:1)

最后想出来了:

  1. 使用SQL创建收集报告数据的存储过程。此存储过程不能有参数。它必须在执行时生成所有报告数据
  2. 示例1:Exec MyReportStoredProcedure

    1. 创建另一个存储过程以收集参数列表值。同样在存储过程中没有使用参数。
    2. 示例2:Exec MyCrystalParameterList

      1. 在数据库下的Crystal Reports中 - >数据库专家将两个存储过程(被调用的表)添加到"选择的表"部分。单击"确定"。然后,Crystal将尝试在两个表之间建立链接。单击"删除所有链接"。点击"确定"关于随后的所有链接警告。
      2. 现在使用MyReportStoredProcedure
      3. 中的列构建报告
      4. 运行报告。您将不会收到输入参数的提示。所有可能的数据都将显示在报告中。
      5. *现在是时候将参数链接到数据了。 *

        • Crystal报表将在您打开报表后立即执行这两个存储过程。
        • Crystal报表不会根据报表服务(SSRS)等参数提取数据。
        • Crystal会根据您收集所有数据后选择的参数值过滤数据。

        运行MyReportStoredProcedure会返回以下内容:

        1 Stop XX 7A [columns5] [columns6] [columns7] [columns8]
        1 Gone CC 88 [columns5] [columns6] [columns7] [columns8] 
        1 Gone CC 88 [columns5] [columns6] [columns7] [columns8] 
        2 Nice XX C3 [columns5] [columns6] [columns7] [columns8] 
        3 Loop EE C3 [columns5] [columns6] [columns7] [columns8] 
        3 Loop DD C3 [columns5] [columns6] [columns7] [columns8] 
        3 Loop DD C3 [columns5] [columns6] [columns7] [columns8]
        ... 
        ... 700,000,000 Additional records
        ...
        

        运行MyCrystalParameterList会返回以下内容:

        1 Stop XX 7A
        1 Gone CC 88
        2 Nice XX C3
        3 Loop EE C3
        3 Loop DD C3
        >> A distinct list of values only 5 rows <<
        

        *将参数数据列链接到相应的报告列*

        现在将参数Column1链接到报告column1。此链接将主报表值(MyReportStoredProcedure)与参数值(MyCrystalParameterList)相关联。

        在数据库下的Crystal Reports中 - &gt; Database Expert单击名为Links的选项卡。

        在本节中,您将表/列链接在一​​起。您可以在上面的步骤中完成此操作但为了更好地理解,我希望您在显示为两个存储过程(表)返回的数据后在此处执行此操作。

        *创建级联参数*

        在Crystal Reports中找到Field Explorer面板。通常它位于屏幕的右侧。

        • 现在右键单击[参数字段]并选择[新建]
        • 命名参数
        • 将类型保留为[String]
        • 设置&#34;值列表&#34;至[动态]
        • 设置&#34;选择数据源&#34;径向按钮到[新]
        • 在径向按钮下方的表格中,点击“#34;值&#34;
        • 一词下的第一行
        • 将显示两个表格的下拉列表([MyReportStoredProcedure和MyCrystalParameterList])
        • 从MyCrystalParameterList存储过程(表格)中选择第一个参数的列。
        • 您的专栏现在列在第一行。
        • 现在单击下一行并从参数存储过程(表)中选择下一列。
        • 重复,直到所有所需参数都显示在表格行中。
        • 在此表的右侧,您将看到一个名为&#34;的参数&#34;每列中都有文本。
        • 点击&#34;参数&#34;中的每个字段。在Crystal报表中创建与您的参数存储过程(表)列对应的列和参数。
        • 点击&#34;好的&#34;关闭&#34;创建新参数&#34;对话框。

        如果您运行报告,系统将提示您选择参数值,参数将列出可用值。

        所有数据将在报告中返回!我们还没有完成。

        *最后一步(最后!)*

        告诉Crystal报表根据参数值过滤报表数据。

        在水晶报告中,点击报告 - &gt;选择专家 - &gt;记录

        • A&#34;选择字段&#34;对话框将显示

        • “字段”面板查找报告存储过程并展开它以使列显示

        • 选择链接到参数存储过程(表)的其中一列。

        • 现在,您将看到一个公式对话框,其默认值为&#34;是任何值&#34;。

        • 将此值更改为&#34;等于&#34;

        • 右侧会出现一个下拉框。

        • 下拉框将显示您的参数!!!!!!

        • 选择与您选择的报告字段对应的参数。

        • 重复所有参数。

        • 现在运行您的报告。数据现在由参数值!!

        • 报告
        • 你完成了!!!!感谢上帝!

        注意: 您可以为每个参数创建一个存储过程。只需使用Database Expert将它们添加到报告中即可。

        在我的示例中,我创建了一个存储过程来提取所有可能的参数组合。

        请勿调整您的注册设置,并将结晶报告读取超过1000个记录!!!

        您的报告存储过程可以返回10亿条记录,但您的参数列表不应超过1000个唯一值。

        您无法从报表存储过程构建参数列表,因为水晶报表只会查看前1000条记录。

        您的参数列表必须是一个单独的存储过程,可以提取不同的值。

        *你有基础,现在构建其余部分。祝好运。 *