如何在abap程序以及bw转换例程判断字段是否为数字(带小数位)

背景:最近项目上有个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.

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在SAP BW系统中,转换例程是用于转换数据的自定义ABAP代码。转换例程可以用于实现各种数据转换需求,例如数据分摊。 下面是一个简单的数据分摊例子,演示如何在转换例程中实现数据分摊。 假设您有一个数据源,其中包含销售数据和销售成本数据。您希望根据销售数据分摊销售成本数据。您可以使用以下步骤来实现此目标: 1. 在SAP BW中创建一个转换,并将销售数据和销售成本数据源添加到转换中。 2. 在转换中创建一个数据包,并将销售数据和销售成本数据源映射到该数据包中。 3. 在数据包中创建一个转换例程,并在该例程中添加以下代码: ``` DATA: lt_sales TYPE TABLE OF zsales_data, ls_sales TYPE zsales_data, lt_costs TYPE TABLE OF zcost_data, ls_costs TYPE zcost_data, lv_total_sales TYPE f, lv_cost_share TYPE f. " 从销售数据源中选择销售数据 SELECT * FROM zsales_data INTO TABLE lt_sales. " 从成本数据源中选择成本数据 SELECT * FROM zcost_data INTO TABLE lt_costs. " 计算总销售额 LOOP AT lt_sales INTO ls_sales. lv_total_sales = lv_total_sales + ls_sales-sales_amount. ENDLOOP. " 分摊成本数据 LOOP AT lt_sales INTO ls_sales. lv_cost_share = ls_sales-sales_amount / lv_total_sales. LOOP AT lt_costs INTO ls_costs WHERE product_id = ls_sales-product_id. ls_costs-cost_amount = ls_costs-cost_amount * lv_cost_share. MODIFY lt_costs FROM ls_costs INDEX sy-tabix. ENDLOOP. ENDLOOP. " 将更新后的成本数据写回到转换中 CLEAR: lt_costs. SELECT * FROM zcost_data INTO TABLE lt_costs. ``` 在此转换例程中,我们首先从销售数据源和成本数据源中选择数据,并将其存储在内部表中。然后我们计算总销售额,并使用循环遍历销售数据,以便计算每个产品的成本分摊比例。最后,我们在内部表中更新成本数据,并将其写回到转换中。 请注意,上述代码仅供参考,并且可能需要根据您的具体需求进行修改。此外,您还需要确保您的转换例程正确地映射到数据包中,并且您已正确设置源系统连接和目标系统连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值