【问题标题】:Crystal Reports - Adding a parameter to a 'Command' queryCrystal Reports - 向“命令”查询添加参数
【发布时间】:2011-02-16 15:27:01
【问题描述】:

水晶版 - 水晶报表 2008 业务对象 - XI

我编写了一个查询来填充子报表,并希望根据用户的输入将参数拉入该查询。我的问题是,我需要在“Where”子句的第一行输入什么正确的语法来接受参数?

这是我在 Crystal Reports 中使用的查询:

Select 
Projecttname,
ReleaseDate,
TaskName

From DB_Table

Where
(Project_Name like {?Pm-?Proj_Name})) and 
(ReleaseDate) >= currentdate

【问题讨论】:

  • 我已经尝试在 SQL 的顶部声明和设置一个变量,但当我查看子报表的 SQL 时,我仍然看不到我在 SQL 中选择的参数。难道我做错了什么?声明@ProjName varchar(200) set @ProjName = '{?Pm-?Proj_Name}' Select Projecttname, ReleaseDate, TaskName From DB_Table where (Project_Name) like @ProjName and (ReleaseDate) >= currentdate

标签: crystal-reports


【解决方案1】:

在Command中,点击Create创建一个新参数;称之为project_name。创建后,双击其名称将其添加到命令的文本中。您的查询应类似于:

SELECT Projecttname, ReleaseDate, TaskName
FROM DB_Table
WHERE Project_Name LIKE {?project_name} + '*'
AND ReleaseDate >= getdate() --assumes sql server

如果需要,将主报告链接到此 ({?project_name}) 字段的子报告。如果您没有在主报表和子报表之间建立链接,CR 会提示您输入子报表的参数。

在 2008 年之前的版本中,命令的参数只允许为标量值。

【讨论】:

    【解决方案2】:

    我想出的解决方案如下:

    1. 在您喜欢的查询开发工具中创建 SQL 查询
    2. 在 Crystal Reports 的主报表中,创建要传递给子报表的参数
    3. 使用“报表创建向导”的“数据”部分中的“添加命令”选项和 #1 中的 SQL 查询创建子报表。
    4. 子报表添加到主报表后,右键单击子报表,选择“更改子报表链接...”,选择链接字段,然后取消选中“根据字段选择子报表中的数据:”

      注意:您可能必须首先添加参数并选中“根据字段选择子报表中的数据:”,然后返回到“更改子报表链接”并在创建子报表后取消选中它。

    5. 在子报告中,单击“报告”菜单,“选择专家”,使用“公式编辑器”,将#1 中的 SQL 列设置为等于或类似于 #4 中选择的参数。

                      (Subreport SQL Column)  (Parameter from Main Report)
              Example:  {Command.Project} like {?Pm-?Proj_Name}
      

    【讨论】:

    • Crystal 级别的过滤效率非常低。如果可能,最好在数据库级别进行过滤。
    【解决方案3】:
    Select Projecttname, ReleaseDate, TaskName From DB_Table Where Project_Name like '%{?Pm-?Proj_Name}%' and ReleaseDate >= currentdate
    

    注意单引号和通配符。我只花了 30 分钟想出类似的东西。

    【讨论】:

      【解决方案4】:

      试试这个:

      Select Project_Name, ReleaseDate, TaskName
      From DB_Table
      Where Project_Name like '{?Pm-?Proj_Name}'
        And ReleaseDate >= currentdate
      

      currentdate 应该是有效的数据库函数或字段才能工作。如果您使用的是 MS SQL Server,请改用 GETDATE()。

      如果您只想根据主报表中的参数筛选子报表中的记录,则只需将表添加到子报表中,然后在主报表和子报表之间创建 Project_Name 链接可能会更容易。然后,您也可以使用 Select Expert 过滤 ReleaseDate。

      【讨论】:

      • 这行得通吗? Where Project_Name like ?'{?Pm-?Proj_Name}' 当我运行查询并转到“数据库”、“显示 SQL”时,我仍然看到文本“{?Pm-?Proj_Name}”而不是我的参数进入。对吗?
      • 所以我尝试在 SQL 的顶部声明和设置一个变量。
      • Show SQL 仍将显示参数名称。我假设您想在 where 子句中使用通配符?您可以使用这些 SQL 通配符: %:匹配所有字符。 _:匹配单个字符。示例:where Project_Name like '%{?Pm-?Proj_Name}%' 加载 Project_Name 包含 {?Pm-?Proj_Name} 的记录。 where Project_Name like '_{?Pm-?Proj_Name}' 加载 Project_Name 的记录,在 {?Pm-?Proj_Name} 之前有一个字母。
      • 声明和设置变量不会产生影响。在我的回答中使用查询时是否收到错误消息?如果有,是什么?
      • 不,我没有收到错误。但是,当我显示子报表的查询时,我没有看到我输入的参数。我只看到: Project_Name like '{?Pm-?Proj_Name}'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2016-04-18
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多