繁体   English   中英

SQL转换(varchar, <fieldname> )等价于Crystal Reports记录选择公式

[英]SQL Convert(varchar, <fieldname>) equivalent in Crystal Reports record selection formula

我有一个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放入代码中时,就不会喜欢它。 给出一个bracket脚的错误,即缺少括号。 我知道这不是一个括号问题,并且肯定与情况有关。

完整的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。

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

我找到了。 在我的新条件下,“双引号”存在问题。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM