原文链接: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