2012-12-13 50 views
5

我有一个字符串字段,主要包含数字十进制值,但有时包含像“< 0.10”或“HEMOLYSIS”的值。有Crystal Reports公式将数值字符串转换为值,但保留非数字空白/空

我想使用公式将这些数字值字符串转换为值,并将非空值留空(空)。

if isNumeric({a_omgang.omg_resultat}) then 
    toNumber({a_omgang.omg_resultat}) 

对于所有的非数字值返回0,这使得它很难计算例如,平均值或平均值,或者计算值的数量。 (当然,后者当然可以通过使用isNumeric评估公式使用运行总数来实现。)

任何建议如何让公式按我的意愿工作?

编辑:我希望该值为空(空),而不是仅仅在非数字时才可见。

回答

4

在过去,我已经创建了一个返回NULL SQL表达式:

-- {@DB_NULL} 
-- Oracle syntax 
(
SELECT NULL FROM DUAL 
) 

 

-- {@DB_NULL} 
-- MS SQL syntax 
(
SELECT NULL 
) 

然后我在公式中引用此领域:

// {@FormulaField} 
If IsNumberic({table.field} Then 
    ToNumber({table.field}) 
Else 
    ToNumber({@DB_NULL}) 
+0

有趣的概念,但是当我针对MS SQL服务器运行时,我得到了“无效的对象名称'DUAL'”。试图将其更改为实际的表名,但仍然出现错误。 – LapplandsCohan

+2

试试'SELECT NULL'。我没有访问SQL Server的权限,所以我无法测试它。 – craig

+0

工作正常!我认为这是最通用的解决方案。 – LapplandsCohan

0

不知道这是否是最佳解决方案,但它是a的解决方案。

为该字段的最大值创建运行总计公式。由式
NumericText(Replace({a_omgang.omg_resultat}, ".", ","))
评估和式
true

复位这会给你每个项目的最大结果。 (即该条目)。只有可以转换为值的条目才会被评估,所有其他条目都将为空。将true作为重置公式可确保您始终获得正在评估的条目的值。

然后可以使用问题中的公式将此运行总计的结果转换为值。

Replace()是由于语言环境而定,可能不需要,具体取决于您的系统设置。如果需要,它也必须用在价值转换公式中。

0

据我所知,你不能直接这样做。如果数字公式字段返回空值,则将其转换为0.

你说你不能压制。你可以转换成一个数字然后回到一个字符串?

+0

对于这个特定的报告来说,这足以压制,但我对一个通用的解决方案感兴趣。更新问题。 – LapplandsCohan

2

你可以得到这个做的工作如下:

  1. 创建一个新的公式,只要输入一个数字,然后保存。 Crystal现在将此公式与数字返回值相关联。
  2. 回到公式中,删除号码并重新保存。现在你有一个返回null的公式,但是CR已经将它作为一个数字公式,所以你现在可以在任何可以使用数字类型的地方使用它。
if isNumeric({a_omgang.omg_resultat}) 
    then toNumber({a_omgang.omg_resultat}) 
else {@NullNumeric}

请注意,您也可以使用此为任何其他数据类型(包括因为一个空字符串字符串不等于空字符串),它是非常有用的与在那里你只是想汇总函数使用直接忽略某些行。

相关问题