<一> SAP ABAP 将数字转换成本地语言(中文、英文)大写

本文介绍了一个用于将数字转换为英文大写的SAP函数SPELL_AMOUNT,替代了手动实现的代码,简化了操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于打印invoice和packing list等时需要将数量和金额转换成英文大写,所以写了段代码进行转换。利用此段代码可以将所有数字类型的值转换成英文大写。源代码如下:

 

if total_amount ne 0.
perform get_num_len using total_amount
      changing integer point leng1 leng2.
perform write_integer using integer leng1 changing amount_text.
perform write_point using point leng2 changing amount_text.

if amount_text ns 'HUNDRED' and amount_text ns 'THOUSAND'
  and amount_text ns 'MILLION' and amount_text ns 'BILLION'
  and amount_text cs 'AND'.
    replace 'AND' with space into amount_text..
endif.
concatenate amount_text 'ONLY' into amount_text separated by space.
elseif total_amount = 0.
  amount_text = 'ZERO'.
endif.
condense amount_text.

 

 

  form get_num_len using  value(p_total_amount)
                     changing p_integer p_point p_leng1 p_leng2.
  data: mod type i,integer1 type i,point_str(12) type c,
        counter type i value 0.
  p_integer = trunc( p_total_amount ).
  point_str = frac( p_total_amount ).
  integer1 = p_integer.
  if point_str cs '.'.
      p_leng2 = sy-fdpos + 1.
  endif.
  while integer1 ne 0.
    mod = integer1 mod 10.
    integer1 = integer1 - mod.
    integer1 = integer1 / 10.
    p_leng1 = p_leng1 + 1.
  endwhile.
  while point_str+p_leng2(1) ne space.
    p_point+counter(1) = point_str+p_leng2(1).
    add 1 to p_leng2.
    add 1 to counter.
  endwhile.
  p_leng2 = counter + 1.

  endform. "get_num_len

**********************************************************************
* FORM    :  write_integer
* Created :  21.08.2008 09:35:54
**********************************************************************
form write_integer using  value(p_integer) value(p_leng1)
                     changing p_amount_text.
  data: counter type i value 0,ind type i,
        num1 type i,num2 type i,num3 type i,
        amount_str(15) type c,
        text1(10) type c,text2(8) type c,text3(14) type c.
  if p_integer eq 0.
    p_amount_text = 'ZERO'.
  else.
    amount_str+0(p_leng1) = p_integer.
    while p_leng1 gt 0.
      counter = counter + 1.
      p_leng1 = p_leng1 - 2.
      if p_leng1 ge 0.
        num2 = amount_str+p_leng1(1).
        case num2.
          when 0.
            text2 = ' '.
          when 1.

              ind = 1.
            text2 = ' '.
          when 2.
            text2 = 'TWENTY'.
          when 3.
            text2 = 'THIRTY'.
          when 4.
            text2 = 'FORTY'.
          when 5.
            text2 = 'FIFTY'.
          when 6.
            text2 = 'SIXTY'.
          when 7.
            text2 = 'SEVENTY'.
          when 8.
            text2 = 'EIGHTY'.
          when 9.
            text2 = 'NINETY'.
        endcase.
      endif.

      p_leng1 = p_leng1 + 1.
      if p_leng1 ge 0.

          num1 = amount_str+p_leng1(1).
        case num1.
          when 0.
            if ind = 1.
              text1 = 'TEN'.
            else.
              text1 = ' '.
            endif.
          when 1.
            if ind = 1.
              text1 = 'ELEVEN'.
            else.
              text1 = 'ONE'.
            endif.
          when 2.
            if ind = 1.
              text1 = 'TWELVE'.
            else.
              text1 = 'TWO'.
            endif.
          when 3.
            if ind = 1.

                text1 = 'THIRTEEN'.
            else.
              text1 = 'THREE'.
            endif.
          when 4.
            if ind = 1.
              text1 = 'FOURTEEN'.
            else.
              text1 = 'FOUR'.
            endif.
          when 5.
            if ind = 1.
              text1 = 'FIFTEEN'.
            else.
              text1 = 'FIVE'.
            endif.
          when 6.
            if ind = 1.
              text1 = 'SIXTEEN'.
            else.
              text1 = 'SIX'.
            endif.
          when 7.
            if ind = 1.
              text1 = 'SEVENTEEN'.
            else.

                text1 = 'SEVEN'.
            endif.
          when 8.
            if ind = 1.
              text1 = 'EIGHTEEN'.
            else.
              text1 = 'EIGHT'.
            endif.
          when 9.
            if ind = 1.
              text1 = 'NINETEEN'.
            else.
              text1 = 'NINE'.
            endif.
        endcase.
      endif.

      p_leng1 = p_leng1 - 2.
      if p_leng1 ge 0.
        num3 = amount_str+p_leng1(1).
        case num3.
          when 0.
            text3 = ' '.
          when 1.
            text3 = 'ONE HUNDRED'.
          when 2.

              text3 = 'TWO HUNDRED'.
          when 3.
            text3 = 'THREE HUNDRED'.
          when 4.
            text3 = 'FOUR HUNDRED'.
          when 5.
            text3 = 'FIVE HUNDRED'.
          when 6.
            text3 = 'SIX HUNDRED'.
          when 7.
            text3 = 'SEVEN HUNDRED'.
          when 8.
            text3 = 'EIGHT HUNDRED'.
          when 9.
            text3 = 'NINE HUNDRED'.
        endcase.
      endif.
      case counter.
        when 1.
          if text1 ne space or text2 ne space.
            concatenate text3 'AND' text2 text1 into p_amount_text
            separated by space.
          else.
            concatenate text3 text2 text1 into p_amount_text
            separated by space.
          endif.
          clear text1.clear text2.clear text3.
        when 2.

            concatenate text3 text2 text1 'THOUSAND' p_amount_text into
    p_amount_text separated by space.
          clear text1.clear text2.clear text3.
        when 3.
          concatenate text3 text2 text1 'MILLION' p_amount_text into
    p_amount_text separated by space.
          clear text1.clear text2.clear text3.
        when 4.
          concatenate text3 text2 text1 'BILLION' p_amount_text into
    p_amount_text separated by space.
          clear text1.clear text2.clear text3.
      endcase.
    endwhile.
  endif.
  clear counter.clear ind.
endform. "write_integer

**********************************************************************
* FORM    :  write_point
* Created :  21.08.2008 09:36:16
**********************************************************************
form write_point using  value(p_point) value(p_leng2)
                     changing p_amount_text.
  data: "amount_str(5) type c,
        counter type i value 0,
        num type i,text(7) type  c.

    check p_point ne 0.
*  amount_str+0(p_leng2) = p_point.
  while p_point+counter(1) ne space.
    num = p_point+counter(1).
    case num.
      when 0.
        text = 'ZERO'.
      when 1.
        text = 'ONE'.
      when 2.
        text = 'TWO'.
      when 3.
        text = 'THREE'.
      when 4.
        text = 'FOUR'.
      when 5.
        text = 'FIVE'.
      when 6.
        text = 'SIX'.
      when 7.
        text = 'SEVEN'.
      when 8.
        text = 'EIGHT'.
      when 9.
        text = 'NINE'.
    endcase.

 
      if counter = 0.
        concatenate p_amount_text 'POINT' text into p_amount_text separated by space.
      else.
        concatenate p_amount_text text into p_amount_text separated by space.
      endif.

    add 1 to counter.
  endwhile.
endform. "write_point

 

前段时间发现将数字转换为英文大写,SAP已提供相关函数执行这个功能,函数名称为:SPELL_AMOUNT,我这段代码属于多余而已。

转载自:http://blog.youkuaiyun.com/paulun/article/details/3288678

 

 

 

### SAP ABAP SD报表开发常用函数模块和方法 在SAP ABAP中,SD(Sales and Distribution)模块是销售与分销管理的核心组件之。开发SD相关的报表时,通常需要调用特定的函数模块来获取数据、处理业务逻辑或生成输出。以下是些常用的函数模块及其典型应用场景。 #### 获取销售订单数据 - **`BAPI_SALESORDER_GETLIST`**:用于根据查询条件获取销售订单列表信息。此函数模块适用于从外部系统或接口中提取订单数据。 ```abap DATA: lt_orders TYPE STANDARD TABLE OF bapisdord, ls_return TYPE bapiret2. CALL FUNCTION 'BAPI_SALESORDER_GETLIST' EXPORTING salesorg = '1000' " 销售组织 distr_chan = '10' " 分销渠道 division = '00' " 产品组 TABLES orders = lt_orders return = ls_return. ``` - **`READ_TABLE`**:该函数可用于直接读取透明表(如 `VBAK` 和 `VBAP`),适合内部报表开发中快速获取订单头和行项目数据[^4]。 ```abap DATA: lt_vbak TYPE STANDARD TABLE OF vbak. CALL FUNCTION 'READ_TABLE' EXPORTING query_table = 'VBAK' del_mode = 'D' TABLES data = lt_vbak EXCEPTIONS OTHERS = 1. ``` #### 计算交货与开票状态 - **`STATUS_READ`**:用于读取业务对象的状态信息,例如销售订单、交货单或发票的状态,常用于展示当前业务流程进度[^4]。 ```abap DATA: lv_status TYPE jstat. CALL FUNCTION 'STATUS_READ' EXPORTING objnr = '50069700' " 示例对象编号 langu = sy-langu IMPORTING status = lv_status. ``` - **`BAPI_DELIVERYPROCESS_GETDETAIL`**:用于获取交货单的详细信息,包括交货状态、数量等,适用于生成交货跟踪报表。 #### 查询客户主数据 - **`BAPI_CUSTOMER_GETDETAIL2`**:用于获取客户主数据的详细信息,如地址、联系人、信用额度等,适用于客户相关报表的开发。 ```abap DATA: ls_customer TYPE bapikna1. CALL FUNCTION 'BAPI_CUSTOMER_GETDETAIL2' EXPORTING customer = '100001' " 客户编号 IMPORTING customerdata = ls_customer. ``` #### 价格与条件分析 - **`PRICING_RULE_GET_DETAIL`**:用于获取定价规则的详细信息,适用于需要分析销售订单中的价格构成或条件记录的报表开发。 - **`COND_I_GET_CONDITIONS`**:用于读取指定条件类型的定价数据,如折扣、运费等,常用于财务分析类报表。 #### 报表输出格式化 - **`CONVERSION_EXIT_ALPHA_OUTPUT`**:用于去除字段前导零,例如将客户编号、物料编号标准化为无前导零的显示格式[^2]。 ```abap DATA: lv_matnr TYPE matnr VALUE '000000123'. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = lv_matnr IMPORTING output = lv_matnr. ``` - **`SPELL_AMOUNT`**:将金额换为大写形式,适用于发票或合同文档中金额的正式书写需求。 ```abap DATA: lv_amount TYPE i VALUE 123456, lv_spell TYPE string. CALL FUNCTION 'SPELL_AMOUNT' EXPORTING amount = lv_amount IMPORTING in_words = lv_spell. ``` #### 数据比较与致性校验 - **`CTVB_COMPARE_TABLES`**:用于比较两个内表的数据差异,常用于校验订单与交货单之间的匹配情况,或在数据迁移后验证致性[^2]。 ```abap DATA: lt_table1 TYPE STANDARD TABLE OF vbak, lt_table2 TYPE STANDARD TABLE OF vbak, lt_diff TYPE STANDARD TABLE OF ctvb_diff. CALL FUNCTION 'CTVB_COMPARE_TABLES' EXPORTING itab1 = lt_table1 itab2 = lt_table2 TABLES diff = lt_diff. ``` #### 时间与日期处理 - **`RP_CALC_DATE_IN_INTERVAL`**:用于计算基于某个起始日期的时间间隔,例如“最近30天内的订单”,适用于时间维度分析的报表开发。 ```abap DATA: lv_date TYPE d. CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date_start = '20240101' days_add = 30 IMPORTING date_end = lv_date. ``` - **`DAY_IN_WEEK`**:返回某天是星期几,适用于按周进行销售统计的场景[^2]。 ```abap DATA: lv_day TYPE i. CALL FUNCTION 'DAY_IN_WEEK' EXPORTING date = sy-datum IMPORTING day = lv_day. ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值