SAP ABAP 直接获取excel粘贴板上的数据,而不用做excel文件导入 CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT

原文链接:https://saper.blog.csdn.net/article/details/129308098?spm=1001.2014.3001.5502
如下,我先在EXCEL上写三列数据,然后选择它们,直接 Ctrl + C 复制进粘贴板
在这里插入图片描述
然后执行程序直接获得这部分数据
在这里插入图片描述
源代码:

*&---------------------------------------------------------------------*
*& Report ZCYCLE069
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZCYCLE069.

DATA : BEGIN OF ITAB OCCURS 0, "定义要接受剪贴板的格式
          EBELN TYPE EBELN,
          EBELP TYPE EBELP,
          LFDAT	TYPE EINDT,
       END OF ITAB.
TYPES : BEGIN OF TY_ITAB,  "拿到粘贴板上的数据后做个性化处理
          EBELN TYPE EBELN,
          EBELP TYPE EBELP,
          LFDAT	TYPE EINDT,
          STATUS_ICON TYPE ICON_D,
          MSG TYPE CHAR50,
        END OF TY_ITAB.
DATA : GT_ITAB TYPE STANDARD TABLE OF TY_ITAB,
       GW_ITAB LIKE LINE OF GT_ITAB,
       GT_RET  TYPE TABLE OF BAPIRET2,
       GS_RET  LIKE LINE OF  GT_RET.

*&---------------------------------------------------------------------*
*&     START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

  "获取Excel剪贴板数据
  PERFORM CLIPTOITAB TABLES  ITAB.
  "确认数据
  WRITE : / 'Excel剪切板数据:'.
  LOOP AT ITAB.
    WRITE : / ITAB-EBELN,ITAB-EBELP,ITAB-LFDAT.
  ENDLOOP.

"--------------------- 这下面是其它个性化数据处理 ----------------------------
  LOOP AT ITAB.
    CLEAR GW_ITAB.
    MOVE-CORRESPONDING ITAB TO GW_ITAB.
    SELECT COUNT(*) FROM EBAN
      WHERE BANFN = ITAB-EBELN. "看看是不是PR转的PO
    IF SY-SUBRC = 0.
      PERFORM CHANGE_PR USING GW_ITAB. "PO更改BAPI
    ELSE.
      SELECT COUNT(*) FROM EKKO
        WHERE EBELN = ITAB-EBELN. "再看这张PO是不是存在,还是用户写错的
      IF SY-SUBRC = 0.
        PERFORM CHANGE_PO USING GW_ITAB. "PO更改BAPI
      ELSE.
        GW_ITAB-MSG = 'Not PR/PO'. "否则报错
        GW_ITAB-STATUS_ICON = ICON_INCOMPLETE.
      ENDIF.
    ENDIF.
    APPEND GW_ITAB TO GT_ITAB.
  ENDLOOP.


  WRITE : /.
  WRITE : / '处理后的数据:'.

  "确认数据
  LOOP AT GT_ITAB INTO GW_ITAB.
    WRITE : / GW_ITAB-EBELN,GW_ITAB-EBELP,GW_ITAB-LFDAT,GW_ITAB-MSG,GW_ITAB-STATUS_ICON.
  ENDLOOP.
*&---------------------------------------------------------------------*
*&      Form  CLIPTOITAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ITAB       text
*----------------------------------------------------------------------*
FORM CLIPTOITAB  TABLES   ITAB.
  DATA : HTAB TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB. "#号 -- excel单元格分隔符
  DATA : LT_CLIP TYPE TABLE OF CHAR2048 WITH HEADER LINE,
         LT_FLD TYPE TABLE OF CHAR2048 WITH HEADER LINE .
  DATA : CXROOT TYPE REF TO CX_ROOT,
         EXCMSG TYPE STRING.
  FIELD-SYMBOLS : <FS_FLD>,
                  <FS_TAB>.
  ASSIGN ITAB TO <FS_TAB>.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_IMPORT
    IMPORTING
      DATA                 = LT_CLIP[]  "直接获取excel粘贴板上的数据,用#隔开
*     LENGTH               =
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
  ELSE.
    CALL METHOD CL_GUI_CFW=>FLUSH.
    LOOP AT LT_CLIP.
      REFRESH LT_FLD[].
      SPLIT LT_CLIP AT HTAB INTO TABLE LT_FLD. "根据#分开一行进表 LT_FLD
      LOOP AT LT_FLD.
        ASSIGN COMPONENT SY-TABIX OF STRUCTURE <FS_TAB> TO <FS_FLD>. "竖着的数据格式转换成横着的格式,即写进ITAB
        CHECK SY-SUBRC = 0.
        TRY.
            LT_FLD = TRANSLATE( VAL = LT_FLD FROM = |\r| TO = '' ). "替换回车符
            LT_FLD = TRANSLATE( VAL = LT_FLD FROM = |\n| TO = '' ). "替换换行符
            <FS_FLD> = LT_FLD.
          CATCH CX_ROOT INTO CXROOT.
            EXCMSG = CXROOT->GET_TEXT( ).
        ENDTRY.
      ENDLOOP.
      APPEND ITAB. "得到一行结果
      CLEAR ITAB.
    ENDLOOP.
    IF EXCMSG IS NOT INITIAL.
      MESSAGE W000(OO) WITH 'Data Conversion Error'.
    ENDIF.
  ENDIF.
ENDFORM.                    " CLIPTOITAB

*&---------------------------------------------------------------------*
*&      Form  CHANGE_PR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PS_DATA    text
*----------------------------------------------------------------------*
FORM CHANGE_PR USING PS_DATA TYPE TY_ITAB.

  DATA: LT_ITEM TYPE TABLE OF BAPIMEREQITEMIMP,
        LS_ITEM LIKE LINE OF LT_ITEM.
  DATA: LT_ITEMX TYPE TABLE OF BAPIMEREQITEMX,
        LS_ITEMX LIKE LINE OF LT_ITEMX.

  CLEAR: LS_ITEM.
  LS_ITEM-PREQ_ITEM = PS_DATA-EBELP.
  LS_ITEM-DELIV_DATE = PS_DATA-LFDAT.
  APPEND LS_ITEM TO LT_ITEM.
  CLEAR: LS_ITEMX.
  LS_ITEMX-PREQ_ITEM = PS_DATA-EBELP.
  LS_ITEMX-PREQ_ITEMX = 'X'.
  LS_ITEMX-DELIV_DATE = 'X'.
  APPEND LS_ITEMX TO LT_ITEMX.

  EXPORT L = 'X' TO MEMORY ID 'IGNORE_VAATZ'.
  CLEAR GT_RET.
  CLEAR GS_RET.
  CALL FUNCTION 'BAPI_PR_CHANGE'
    EXPORTING
      NUMBER                       = PS_DATA-EBELN
*       PRHEADER                     =
*       PRHEADERX                    =
*       TESTRUN                      =
*     IMPORTING
*       PRHEADEREXP                  =
    TABLES
      RETURN                       = GT_RET
      PRITEM                       = LT_ITEM
      PRITEMX                      = LT_ITEMX
*        PRITEMEXP
*       PRITEMSOURCE                 =
*       PRACCOUNT                    =
*       PRACCOUNTPROITSEGMENT        =
*       PRACCOUNTX                   =
*       PRADDRDELIVERY               =
*       PRITEMTEXT                   =
*       PRHEADERTEXT                 =
*       EXTENSIONIN                  =
*       EXTENSIONOUT                 =
*       PRVERSION                    =
*       PRVERSIONX                   =
*       ALLVERSIONS                  =
*       PRCOMPONENTS                 =
*       PRCOMPONENTSX                =
*       SERVICEOUTLINE               =
*       SERVICEOUTLINEX              =
*       SERVICELINES                 =
*       SERVICELINESX                =
*       SERVICELIMIT                 =
*       SERVICELIMITX                =
*       SERVICECONTRACTLIMITS        =
*       SERVICECONTRACTLIMITSX       =
*       SERVICEACCOUNT               =
*       SERVICEACCOUNTX              =
*       SERVICELONGTEXTS             =
*       SERIALNUMBER                 =
*       SERIALNUMBERX                =
            .
  FREE MEMORY ID 'IGNORE_VAATZ'.
  READ TABLE GT_RET TRANSPORTING NO FIELDS
                    WITH KEY ID = '06'
                             NUMBER = '403'.
  IF SY-SUBRC = 0.
    CALL FUNCTION  'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      WAIT           = 'X'
*       IMPORTING
*         RETURN        =
              .
    PS_DATA-STATUS_ICON = ICON_CHECKED.
    PS_DATA-MSG = 'OK'.
  ELSE.
    CALL FUNCTION  'BAPI_TRANSACTION_ROLLBACK'
*       IMPORTING
*         RETURN        =
              .
    PS_DATA-STATUS_ICON = ICON_INCOMPLETE.
    PS_DATA-MSG = 'Error'.
*    PERFORM DISPLAY_BAPI_RETURN.
  ENDIF.
ENDFORM.                    " CHANGE_PR
*&---------------------------------------------------------------------*
*&      Form  CHANGE_PO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PS_DATA    text
*----------------------------------------------------------------------*
FORM CHANGE_PO USING PS_DATA TYPE TY_ITAB.
  DATA: LT_SCHE  TYPE TABLE OF BAPIMEPOSCHEDULE,
        LS_SCHE LIKE LINE OF  LT_SCHE.
  DATA: LT_SCHEX  TYPE TABLE OF BAPIMEPOSCHEDULX,
        LS_SCHEX LIKE LINE OF  LT_SCHEX.
  CLEAR: LS_SCHE.
  LS_SCHE-PO_ITEM = PS_DATA-EBELP.
  LS_SCHE-DELIVERY_DATE = PS_DATA-LFDAT.
  APPEND LS_SCHE TO LT_SCHE.
  CLEAR: LS_SCHEX.
  LS_SCHEX-PO_ITEM = PS_DATA-EBELP.
  LS_SCHEX-PO_ITEMX = 'X'.
  LS_SCHEX-DELIVERY_DATE = 'X'.
  APPEND LS_SCHEX TO LT_SCHEX.
  CLEAR: GT_RET.
  CLEAR: GS_RET.
  CALL FUNCTION 'BAPI_PO_CHANGE'
    EXPORTING
      PURCHASEORDER                = PS_DATA-EBELN
*       POHEADER                     =
*       POHEADERX                    =
*       POADDRVENDOR                 =
*       TESTRUN                      =
*       MEMORY_UNCOMPLETE            =
*       MEMORY_COMPLETE              =
*       POEXPIMPHEADER               =
*       POEXPIMPHEADERX              =
*       VERSIONS                     =
*       NO_MESSAGING                 =
*       NO_MESSAGE_REQ               =
*       NO_AUTHORITY                 =
*       NO_PRICE_FROM_PO             =
*       PARK_UNCOMPLETE              =
*       PARK_COMPLETE                =
*     IMPORTING
*       EXPHEADER                    =
*       EXPPOEXPIMPHEADER            =
    TABLES
      RETURN                       = GT_RET
*       POITEM                       =
*       POITEMX                      =
*       POADDRDELIVERY               =
      POSCHEDULE                   = LT_SCHE
      POSCHEDULEX                  = LT_SCHEX
*       POACCOUNT                    =
*       POACCOUNTPROFITSEGMENT       =
*       POACCOUNTX                   =
*       POCONDHEADER                 =
*       POCONDHEADERX                =
*       POCOND                       =
*       POCONDX                      =
*       POLIMITS                     =
*       POCONTRACTLIMITS             =
*       POSERVICES                   =
*       POSRVACCESSVALUES            =
*       POSERVICESTEXT               =
*       EXTENSIONIN                  =
*       EXTENSIONOUT                 =
*       POEXPIMPITEM                 =
*       POEXPIMPITEMX                =
*       POTEXTHEADER                 =
*       POTEXTITEM                   =
*       ALLVERSIONS                  =
*       POPARTNER                    =
*       POCOMPONENTS                 =
*       POCOMPONENTSX                =
*       POSHIPPING                   =
*       POSHIPPINGX                  =
*       POSHIPPINGEXP                =
*       POHISTORY                    =
*       POHISTORY_TOTALS             =
*       POCONFIRMATION               =
*       SERIALNUMBER                 =
*       SERIALNUMBERX                =
*       INVPLANHEADER                =
*       INVPLANHEADERX               =
*       INVPLANITEM                  =
*       INVPLANITEMX                 =
*       POHISTORY_MA                 =
            .
  READ TABLE GT_RET TRANSPORTING NO FIELDS
                    WITH KEY ID = '06'
                             NUMBER = '023'.
  IF SY-SUBRC = 0.
    CALL FUNCTION  'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      WAIT           = 'X'
*       IMPORTING
*         RETURN        =
              .
    PS_DATA-STATUS_ICON = ICON_CHECKED.
    PS_DATA-MSG = 'OK'.
  ELSE.
    CALL FUNCTION  'BAPI_TRANSACTION_ROLLBACK'
*       IMPORTING
*         RETURN        =
              .
    PS_DATA-STATUS_ICON = ICON_INCOMPLETE.
    PS_DATA-MSG = 'Error'.
*    PERFORM DISPLAY_BAPI_RETURN.
  ENDIF.
ENDFORM.                    " CHANGE_PO
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_BAPI_RETURN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM DISPLAY_BAPI_RETURN .
*   Reset message
  CALL FUNCTION 'MESSAGES_INITIALIZE'.

  LOOP AT GT_RET INTO GS_RET.
*   Send message
    CALL FUNCTION 'MESSAGE_STORE'
      EXPORTING
        ARBGB = GS_RET-ID
        MSGTY = GS_RET-TYPE
        MSGV1 = GS_RET-MESSAGE_V1
        MSGV2 = GS_RET-MESSAGE_V2
        MSGV3 = GS_RET-MESSAGE_V3
        MSGV4 = GS_RET-MESSAGE_V4
        TXTNR = GS_RET-NUMBER.
  ENDLOOP.

*   Show message
  CALL FUNCTION 'MESSAGES_SHOW'
    EXPORTING
      OBJECT = 'Error'."
*   Reset message
  CALL FUNCTION 'MESSAGES_INITIALIZE'.
ENDFORM. " DISPLAY_BAPI_RETURN
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cl_gui_frontend_services=>file_save_dialog是一个SAP ABAP中的类,用于在GUI前端应用程序中调用文件保存对话框。通过使用这个类,可以方便地在SAP系统中将数据保存到本地文件系统中。在调用file_save_dialog时,可以指定文件保存对话框的标题、文件类型、默认文件名、默认目录等参数,从而可以定制保存对话框的外观和行为。 使用file_save_dialog可以让用户通过GUI界面来选择保存文件的位置和命名,从而提高了用户体验和操作的便利性。同时,也可以通过这个类来进行文件的合法性验证,确保用户保存的文件符合系统要求和业务规则。通过file_save_dialog,可以有效地管理文件的保存过程,保证了文件操作的安全性和准确性。 在使用cl_gui_frontend_services=>file_save_dialog时,需要注意合理设置对话框的参数,包括文件类型、默认文件名等,以确保用户可以方便地选择保存的文件类型和文件名,从而减少用户操作过程中的错误和混乱。另外,也需要注意在调用保存对话框后处理用户的选择结果,确保所选的文件能够成功保存到指定的位置。 总之,cl_gui_frontend_services=>file_save_dialog是SAP ABAP中一个非常实用的类,通过它可以轻松地在GUI前端应用程序中实现文件保存对话框,提高了用户体验和系统操作的便利性,同时也保证了文件操作的安全性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值