【ABAP妙用】复制ALV之负号提前

场景:

用户一般Ctrl+C复制ALV数据到Excel处理,如果有负数的数值,负号在数值的后面,Excel不认识,要费劲巴拉的一个个改正,苦不堪言!

本程序功能:

在ALV复制数据后,直接更改剪贴板里面的数据,把负号提到前面,然后直接在Excel粘贴就可以了。如果有逗号作为千分位符,也一并去掉。

程序逻辑:

获取剪贴板数据后,根据制表符分割字段,如果字段包含

0123456789,.- 之外的字符,说明不是数值,跳过;否则,判断最后的一个字符是不是负号“-”,如果不是,跳过;如果是负号,则把这个负号挪到数值前面,同时把里面的千分位符去掉,例如:23,345.58- 变成 -23345.58。依次处理所有行,处理完毕把处理过的数据再粘贴到剪贴板,就可以直接在Excel粘贴了。

爱心提示:

把事务码放到收藏夹里面,用户只要双击一下就OK了。

比如复制了这样的数据:

使用前:

使用后:

源代码如下:

REPORT ZFRONT_SIGN NO STANDARD PAGE HEADING.

DATA : LT_CLIP TYPE TABLE OF CHAR4000 WITH HEADER LINE,
       LT_OUT  TYPE TABLE OF CHAR4000 WITH HEADER LINE,
       LT_FLDS TYPE TABLE OF STRING WITH HEADER LINE,
       LEN     TYPE I,
       FLAG.

START-OF-SELECTION.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT
    IMPORTING
      DATA                 = LT_CLIP[]
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF LT_CLIP[] IS INITIAL.
    MESSAGE S000(OO) WITH 'No data' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  LOOP AT LT_CLIP.
    CLEAR : LT_FLDS[],LT_OUT.
    SPLIT LT_CLIP AT %_HORIZONTAL_TAB INTO TABLE LT_FLDS.
    LEN = STRLEN( LT_CLIP ) - 1.
    IF LEN > 0 AND LT_CLIP+LEN(1) =  %_HORIZONTAL_TAB.
      APPEND INITIAL LINE TO LT_FLDS.
    ENDIF.

    LOOP AT LT_FLDS.
      LEN = STRLEN( LT_FLDS ) - 1.
      IF LEN > 0  AND LT_FLDS CO ' 0123456789,.-' AND LT_FLDS+LEN(1) = '-'.
        TRANSLATE LT_FLDS USING '- '.
        TRANSLATE LT_FLDS USING ', '.
        CONCATENATE '-' LT_FLDS INTO LT_FLDS.
        CONDENSE LT_FLDS NO-GAPS.
        FLAG = 'X'.
      ENDIF.

      CONCATENATE LT_OUT %_HORIZONTAL_TAB LT_FLDS INTO LT_OUT.
    ENDLOOP.

    SHIFT LT_OUT.
    APPEND LT_OUT.
  ENDLOOP.

  IF FLAG = 'X'.
    CALL FUNCTION 'CLPB_EXPORT'
      TABLES
        DATA_TAB   = LT_OUT
      EXCEPTIONS
        CLPB_ERROR = 1
        OTHERS     = 2.
    IF SY-SUBRC = 0.
      MESSAGE S000(OO) WITH 'Success'.
    ELSE.
      MESSAGE S000(OO) WITH 'Error' DISPLAY LIKE 'E'.
    ENDIF.
  ELSE.
    MESSAGE S000(OO) WITH 'No Data'.
  ENDIF.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值