0

別の技術者が投稿した解決策を見つけました:

新しい式:

{Product.Size} <> “xsm” or IsNull({Product.Size})

残念ながら、レポートをプレビューすると、これが機能しないことがわかります。これはロジックの誤りによるものではなく、Crystal Reports のバグと思われるものです。これとまったく同じ条件を使用して、クエリ アナライザーまたはクエリ ツールを使用してデータベース レコードに適用すると、空白のレコードが表示されます。残念ながら、Crystal は null 値の通過を許可していませんが、式ではそうすべきだと言っています。

このバグを回避する秘訣は、IsNull() チェックを最初に数式に入れることです。

したがって、条件を次のように並べ替えると、次のようになります。

IsNull({Product.Size}) or {Product.Size} <> "xsm"

魔法のように働いた


問題は、2 番目の OR ステートメントに基準を選択({HiredRate.UTRANSDOC}startswith{?TransYN})し、最初のステートメントに NOを選択する({HiredRate.UTRANSWEB}startswith{?WebYN})と、TransYN 基準を満たすレコードが 1 つしか得られないことです。1 番目の数式の場所を入れ替えると、({HiredRate.UTRANSDOC}startswith{?TransYN})すべてのデータが得られます。

SQL クエリを実行すると、データの順序に関係なくすべてのデータが取得されます。Crystal Preview では、OR セクションの最初のデータのみが表示されます。

SQL からのデータを見て際立っているのは、Crystal が返す 1 つのレコードの Transdoc フィールドが YES で、Transweb フィールドが空白であることだけです。他のすべてのレコードは、Transdoc フィールドに対して YES を示し、Transweb フィールドに対して NULL を示します。

これがCrystal Recordの選択式です

{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
4

1 に答える 1

1

これは{HiredRate.UTRANSWEB}が null であるために発生しています。したがって、Crystal では式の残りの部分が null として評価されますが、(論理的には) そうすべきではありません。

最初の 2 つのor条件が入れ替わると、{HiredRate.UTRANSDOC}条件が true と評価され、式の残りの部分が短絡されます。これが、レコード選択される理由です。

于 2013-04-05T17:34:55.913 に答える