我找到了另一个Tech发布的解决方案:
新公式:
{Product.Size} <> “xsm” or IsNull({Product.Size})
不幸的是,在预览报告时,您会发现这不起作用。这不是因为我们的逻辑错误,而是我认为是Crystal Reports中的错误。如果我使用完全相同的条件并使用查询分析器或查询工具将其应用于数据库记录,我会看到空白记录。不幸的是,即使我们的公式表明他们应该使用,Crystal也不允许空值通过。
规避这个错误的诀窍是将IsNull()检查FIRST放在公式中。
因此,如果我们重新安排条件:
IsNull({Product.Size}) or {Product.Size} <> "xsm"
像一个魅力一样
问题是,如果我为第二个OR语句选择标准({HiredRate.UTRANSDOC}startswith{?TransYN})
而第一个({HiredRate.UTRANSWEB}startswith{?WebYN})
选择NO,我只得到一个符合TransYN标准的记录。如果我在公式中切换位置({HiredRate.UTRANSDOC}startswith{?TransYN})
第一,我得到所有数据。
当我运行SQL查询时,无论它们处于何种顺序,我都会获得所有数据.Crystal Preview仅向OR部分提供了第一个数据。
从SQL查看数据中唯一突出的是,Crystal传输的一条记录在Transdoc字段中为YES,而Transweb字段为空。所有其他记录对Transdoc显示YES,对Transweb字段显示NULL。
这是水晶记录选择公式
{HiredRate.CONTSUPREF} startswith {?LanguageCombo}
and {HiredRate.ONDATE} = {?ProjectDate}
and {HiredRate.ACTVCODE}= "SIG"
and {HiredRate.RESULTCODE} = "CLM"
and (
{HiredRate.UTRANSWEB}startswith{?WebYN}
or {HiredRate.UTRANSDOC}startswith{?TransYN}
or {HiredRate.UTRANLANL0}startswith{?LanloYN}
or {HiredRate.UINTCONSEC}startswith{?InterpYN}
or {HiredRate.UINTCONF}startswith{?IntConfYN}
or {HiredRate.UINTOPI}startswith{?OPIYN}
)
以下是Crystal正在使用的SQL查询:
SELECT HiredRate.DEAR, HiredRate.CONTSUPREF, HiredRate.LASTDATE, HiredRate.CONTACT, HiredRate.USOURCLANG, HiredRate.UTARGLANG, HiredRate.UTRANSDOC, HiredRate.UTRANSWEB, HiredRate.UTRANLANL0, HiredRate.UINTCONSEC, HiredRate.UINTCONF, HiredRate.UINTOPI, HiredRate.ONDATE, HiredRate.ACTVCODE, HiredRate.RESULTCODE
FROM GoldMine_Main.dbo.HiredRate HiredRate
WHERE HiredRate.CONTSUPREF LIKE 'ENG>SPA%' AND (HiredRate.ONDATE>={ts '2012-04-01 00:00:00'} AND HiredRate.ONDATE<{ts '2013-04-06 00:00:00'}) AND HiredRate.ACTVCODE='SIG' AND HiredRate.RESULTCODE='CLM' AND (HiredRate.UTRANSWEB LIKE 'NO%' OR HiredRate.UTRANSDOC LIKE 'YES%' OR HiredRate.UTRANLANL0 LIKE 'NO%' OR HiredRate.UINTCONSEC LIKE 'NO%' OR HiredRate.UINTCONF LIKE 'NO%' OR HiredRate.UINTOPI LIKE 'NO%')
ORDER BY HiredRate.DEAR, HiredRate.CONTACT
答案 0 :(得分:1)
这种情况正在发生,因为{HiredRate.UTRANSWEB}
为空 - 因此表达式的其余部分在Crystal中评估为null,即使(逻辑上)它不应该。
当交换前两个or
条件时,{HiredRate.UTRANSDOC}
条件的计算结果为true,表达式的其余部分被短路 - 这就是记录 的原因然后选择。