背景:最近项目上有个erp系统非SAP的,所以很多字段格式非常的乱,讲究的就是一个随意
所以在运行计算逻辑的时候,需要将一个字段里面既有数值,也有文本的
这样我们就需要把文本直接赋值为0,统一改成数值类型
话不多说,了解需求之后,我们来看下SAP能用几中解决方案处理该问题
1、使用标准函数NUMERIC_CHECK
注意:该只能判断整数数字
DATA:g_str1(20) TYPE c,
g_str1(20) TYPE c,
g_str2(4) TYPE DD01V-DATATYPE.
g_str1 = '12.05'.
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
string_in = g_str1
IMPORTING
string_out = g_str1
htype = g_str2.
IF g_srt2 = 'NUMC'.
WRITE:/ '输入的是数字!'.
ELSEIF g_str2 = 'CHAR'.
WRITE:/ '输入的是字符!'.
ENDIF.
2、使用函数CATS_NUMERIC_INPUT_CHECK
注意:这个可以判断带小数的数字,但是在各种SAP版本中,目前发现BW有时候没有预定义好这个函数
REPORT ZESTBYTANML.
DATA : gv_test TYPE string.
DATA : gv_test2 TYPE string.
DATA : gv_test3 TYPE string.
DATA : htype LIKE dd01v-datatype.
gv_test = '3.22'.
CALL FUNCTION 'CATS_NUMERIC_INPUT_CHECK'
EXPORTING
INPUT = gv_test
* INTERNAL = 'X'
* IMPORTING
* OUTPUT = OUTPUT
EXCEPTIONS
NO_NUMERIC = 1
OTHERS = 2.
IF SY-SUBRC = 0.
WRITE:/'你输入的是数字.'.
ELSE.
WRITE:/ '你输入的不是数字.'.
ENDIF.
3、通过正则表达式判断
并且这个是可以判断带小数位的数值,我与上面NUMERIC_CHECK函数作了对比出结果
**&---------------------------------------------------------------------*
**& Report ZESTBYTANML.
**&---------------------------------------------------------------------*
**&
**&---------------------------------------------------------------------*
REPORT ZESTBYTANML.
DATA : gv_str TYPE string.
DATA : gv_str2 TYPE string.
DATA : gv_str3 TYPE string.
DATA : htype LIKE dd01v-datatype.
"正则表达式
gv_str = 'SAPbw'.
gv_str2 = '98329'.
gv_str3 = '122.456'.
WRITE : / '正则表达式'.
WRITE : / .
IF cl_abap_matcher=>matches( pattern = '^(-?[1-9]\d*(\.\d*[1-9])?)|(-?0\.\d*[1-9])$'
text = gv_str ) = abap_true.
WRITE : / gv_str ,' 是数字'.
ELSE.
WRITE : / gv_str ,' 不是数字'.
ENDIF.
IF cl_abap_matcher=>matches( pattern = '^(-?[1-9]\d*(\.\d*[1-9])?)|(-?0\.\d*[1-9])$'
text = gv_str2 ) = abap_true.
WRITE :/ gv_str2 ,' 是数字'.
ELSE.
WRITE :/ gv_str2 ,' 不是数字'.
ENDIF.
IF cl_abap_matcher=>matches( pattern = '^(-?[1-9]\d*(\.\d*[1-9])?)|(-?0\.\d*[1-9])$'
text = gv_str3 ) = abap_true.
WRITE :/ gv_str3 ,' 是数字'.
ELSE.
WRITE :/ gv_str3 ,' 不是数字'.
ENDIF.
WRITE / .
ULINE /.
"NUMERIC_CHECK函数
WRITE : / 'NUMERIC_CHECK函数'.
WRITE : / .
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
string_in = gv_str
IMPORTING
htype = htype.
IF htype = 'NUMC'.
WRITE : / gv_str ,' 是数字'.
ELSE.
WRITE : / gv_str ,' 不是数字'.
ENDIF.
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
string_in = gv_str2
IMPORTING
htype = htype.
IF htype = 'NUMC'.
WRITE : / gv_str2 ,' 是数字'.
ELSE.
WRITE : / gv_str ,' 不是数字'.
ENDIF.
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
string_in = gv_str3
IMPORTING
htype = htype.
IF htype = 'NUMC'.
WRITE : / gv_str3 ,' 是数字'.
ELSE.
WRITE : / gv_str3 ,' 不是数字'.
ENDIF.
WRITE / .
ULINE /.
如上述代码运行结果为:函数NUMERIC_CHECK判断不了带小数位的数值
好了,以上是我最近研究出来的方法,后续有其他的方法我在补充;
4、那么最好在SAP bw中使用转换例程如何处理呢?
如下,使用上诉正则表达式处理也可以使用函数
IF cl_abap_matcher=>matches( pattern
='^(-?[1-9]\d*(\.\d*[1-9])?)|(-?0\.\d*[1-9])$'
text = SOURCE_FIELDS-LOWER_LIMIT ) = abap_true.
RESULT = SOURCE_FIELDS-LOWER_LIMIT .
ELSE.
RESULT = 0.
ENDIF.