【问题标题】:SQL Convert(varchar, <fieldname>) equivalent in Crystal Reports record selection formulaCrystal Reports 记录选择公式中的等效 SQL Convert(varchar, <fieldname>)
【发布时间】:2015-12-26 06:26:33
【问题描述】:

我有一个 sql 查询 where 子句如下:

WHERE ("Table1"."count"<>"Table1"."onhand"
       OR "Table2"."batch_code" IS NOT NULL        
       OR ("Table1"."BatchMinVariance"<>0 OR "Table1"."BatchMaxVariance"<>0)
       )

我在我的代码中使用上述水晶等价物即时设置记录选择:

({Table1.count} <> {Table1.onhand}     
           or (not isnull({Table2.batch_code}) 
           or ({Table1.BatchMinVariance} <> 0 OR {Table1.BatchMaxVariance} <> 0) )

这工作得很好,水晶处理它显示正确的结果。

要求是在WHERE 子句中添加另一个条件,如下所示:第 4 行是新条件。

    WHERE 
    ("Table1"."count"<>"Table1"."onhand"
           OR "Table2"."batch_code" IS NOT NULL            
           OR ("Table1"."BatchMinVariance"<>0 OR "Table1"."BatchMaxVariance"<>0)
           OR (CONVERT(varchar, "Table3".in_snapshot_yn) + CONVERT(varchar, "Table3".counted_yn) IN ('01', '10'))
   )

注意条件 4 是新条件,我使用了 sql CONVERT 函数,因为这些是布尔字段,因此只显示那些值为 01 或 10 的行。sql 查询给了我预期的结果, 但我正在努力寻找与这种情况对应的水晶。 对于条件 4,我尝试了:

OR (TOTEXT(TONumber({Table3.in_snapshot_yn}), 0)&""&TOTEXT(TONumber({STAKE_SERIALNO.counted_yn}), 0) IN ("01, 11") <> true) 

我已经在报告本身中对此进行了测试,以查看水晶是否喜欢,水晶不会抱怨。但是当我将它作为条件 4 放入我的代码时,我不会喜欢它。给出缺少括号 ) 的蹩脚错误。我知道这不是一个括号问题,绝对与条件有关。

完整的 CR 等效条件如下所示:

    ({TABLE1.count} <> {TABLE1.onhand} 
OR (not isnull({Table2.batch_code}) 
OR ({TABLE1.BatchMinVariance} <> 0 OR {TABLE1.BatchMaxVariance} <> 0) )
OR NOT (TOTEXT(TONumber({Table3.in_snapshot_yn}), 0)&""&TOTEXT(TONumber({Table3.counted_yn}), 0) IN ("01, 11")) )

任何提示将不胜感激。我正在使用 SQL Server 2014 和 CR 13。

【问题讨论】:

    标签: c# mysql sql-server crystal-reports crystal-reports-2010


    【解决方案1】:

    我找到了。我的新情况下的“双引号”有问题。

    TOTEXT(TONumber({Table3.in_snapshot_yn}), 0)&""&TOTEXT(TONumber({Table3.counted_yn}), 0) IN ("01, 11")
    

    只要我将它们更改为单引号,它就可以正常工作。我不知道它为什么会这样做。我所说的记录选择在报告中做得很好,所以我在 Crystal 中没有庞大的数据集。

    请在下面查看完整的水晶等效记录选择。

    ({TABLE1.count} <> {TABLE1.onhand} 
    OR (not isnull({Table2.batch_code}) 
    OR ({TABLE1.BatchMinVariance} <> 0 OR {TABLE1.BatchMaxVariance} <> 0) )
    OR NOT (TOTEXT(TONumber({Table3.in_snapshot_yn}), 0)&''&TOTEXT(TONumber({Table3.counted_yn}), 0) IN ('01, 11')) )
    

    答案到此结束。

    对于用户@Lan.. 以防万一您需要知道我在 c# 中是如何做到这一点的,我已经粘贴了下面的代码。

    var recordSelection = new List<string>();
    recordSelection.Add(<crystal equivalent where clause as above>);
    reportDocument.RecordSelectionFormula(recordSelection);
    // FYI reportDocument is initialised like this ReportDocument reportDocument;
    

    【讨论】:

      【解决方案2】:

      您应该创建一个 SQLExpression。 SQLExpression 将具有与数据库语法相同的语法,主要优点是它将在服务器上执行。您可以将其添加到记录选择公式中。如果您使用 Crystal 函数,所有记录都将在本地下载和过滤。如果您使用 SQL 表达式,Crystal 将能够生成 WHERE 子句并将其发送到服务器,因此下载到您的机器的记录数会少得多。

      【讨论】:

      • 谢谢。我正在做的方式类似,因为数据在到达报告之前被过滤,因为查询是动态执行的。
      • 否,Crystal 无法将 ToText 和 ToNumber 转换为 SQL 语法。因此将下载所有记录,然后 Crystal 将在本地应用过滤器。假设您有一个包含 10 万条记录的表,并且您想要获取 ID = 'ABC' 的客户的记录。如果您使用 SQL 表达式,Crystal 将向数据库发送如下 SQL:SELECT ... FROM Table WHERE ID='ABC'。如果您使用 ToText 函数或任何其他 Crystal 函数,SQL 将是 SELECT ... FROM Table。不会准备 where 子句。所有 10 万条记录都将在本地下载和过滤。
      • 请看我的回答。有一条评论给你。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多