POSTING_INTERFACE_DOCUMENT - ooxxvv/MySAPnotes GitHub Wiki
POSTING_INTERFACE_DOCUMENT
- 批次輸入會計傳票
- 相當於以下 Tcode 的功能
- FB01
- FBS1
- FB41
- ABF1
- FBB1
- FBVB
- FBV1
- FBD5
- 可參考 Code20080110
- 需搭配以下 Function 使用,才能真正的產生會計文件:
- POSTING_INTERFACE_START => 在一開始的時候呼叫此 Function。
- POSTING_INTERFACE_END => 在結束的時候呼叫此 Function。
Code
{{{#!abap REPORT ztest6. *============
-
Include
*============ INCLUDE ole2incl.
*============
-
Data Define
*============
CONSTANTS: batchinput(1) TYPE c VALUE 'B', calltrans(1) TYPE c VALUE 'C', mode(1) TYPE c VALUE 'N', xl_max_col TYPE i VALUE 256, xl_hdr_row TYPE i VALUE 8, xl_dtl_row TYPE i VALUE 15, xl_reservd TYPE i VALUE 2.
DATA: BEGIN OF ftpost OCCURS 100. INCLUDE STRUCTURE ftpost. DATA: END OF ftpost.
DATA: BEGIN OF fttax OCCURS 0. INCLUDE STRUCTURE fttax. DATA: END OF fttax.
DATA: BEGIN OF xblntab OCCURS 2. INCLUDE STRUCTURE blntab. DATA: END OF xblntab.
DATA: BEGIN OF hdr_flds OCCURS 5, fnam LIKE ftpost-fnam, END OF hdr_flds.
DATA: BEGIN OF flds OCCURS 200, fnam LIKE ftpost-fnam, END OF flds.
DATA: BEGIN OF out_line OCCURS 40, col_hdr(11) TYPE c, END OF out_line.
DATA: xl_appl TYPE ole2_object, xl_sheet TYPE ole2_object, xl_wkbks TYPE ole2_object.
DATA: open(1) TYPE c, fldlen TYPE i, docl(7) TYPE c, function LIKE rfipi-funct, xbdcc LIKE rfipi-xbdcc.
SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE text-000. PARAMETERS: p_xlfil LIKE rlgrap-filename OBLIGATORY, p_xlsht LIKE rlgrap-filename OBLIGATORY. SELECTION-SCREEN END OF BLOCK 1.
SELECTION-SCREEN BEGIN OF BLOCK 2 WITH FRAME TITLE text-001. SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: p_post LIKE febpdo-xcall_ebck RADIOBUTTON GROUP 1. SELECTION-SCREEN COMMENT 03(29) text-002 FOR FIELD p_post. PARAMETERS: p_mode LIKE rfpdo-allgazmd NO-DISPLAY. SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN BEGIN OF LINE. PARAMETERS: p_xbdc LIKE febpdo-xbinpt RADIOBUTTON GROUP 1. SELECTION-SCREEN COMMENT 03(29) text-003 FOR FIELD p_xbdc. SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE. PARAMETERS: p_test LIKE rfpdo1-febtestl RADIOBUTTON GROUP 1. SELECTION-SCREEN COMMENT 03(29) text-004 FOR FIELD p_test. SELECTION-SCREEN: END OF LINE.
PARAMETERS: group LIKE apqi-groupid OBLIGATORY.
SELECTION-SCREEN END OF BLOCK 2.
*============
-
Main Program
*============
-At Selection-Screen---------------------------------------------- AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_xlfil. PERFORM ws_get_filename.
-Start-Of-Selection-------------------------------------------- START-OF-SELECTION. CLEAR open.
IF p_post='X'. function=calltrans. xbdcc='X'. ENDIF.
IF p_xbdc='X'. function=batchinput. xbdcc=' '. ENDIF.
PERFORM excel_open_workbook CHANGING xl_appl xl_wkbks xl_sheet. PERFORM excel_read_sheet USING xl_sheet. PERFORM excel_save_sheet USING xl_appl xl_wkbks.
FREE OBJECT: xl_appl, xl_sheet, xl_wkbks.
-End-Of-Selection-----------------------------------------------------
END-OF-SELECTION. IF p_test NE 'X'. PERFORM posting_interface_start. PERFORM posting_interface_document. PERFORM posting_interface_close. DESCRIBE TABLE xblntab LINES fldlen. IF ( function=calltrans ) AND ( fldlen > 0 ). ULINE. FORMAT COLOR COL_NEGATIVE. LOOP AT xblntab. docl=text-106. REPLACE '$BELNR' WITH xblntab-belnr INTO docl. REPLACE '$BUKRS' WITH xblntab-bukrs INTO docl. REPLACE '$GJAHR' WITH xblntab-gjahr INTO docl. WRITE: /1(1) sy-vline, docl,80(10) sy-vline. ENDLOOP. ULINE. ENDIF. ENDIF.
LOOP AT ftpost. AT NEW stype. FORMAT COLOR COL_HEADING. IF ftpost-stype='K'. WRITE: /1(1) sy-vline,text-104,80(1) sy-vline. ELSE. ULINE. WRITE: /. ULINE. WRITE: /1(1) sy-vline,text-105,80(1) sy-vline. ENDIF. ULINE. ENDAT.
AT NEW count. ULINE. ENDAT.
FORMAT COLOR COL_KEY. COMPUTE fldlen=strlen( ftpost-fnam ). WRITE: /1(1) sy-vline. WRITE AT (fldlen) ftpost-fnam. WRITE 20(1) sy-vline. FORMAT COLOR COL_NORMAL. COMPUTE fldlen=strlen( ftpost-fval ). WRITE AT (fldlen) ftpost-fval. WRITE 80(1) sy-vline. ENDLOOP.
ULINE.
*============
-
Form
*============
&---------------------------------------------------------------------
*& Form EXCEL_OPEN_WORKBOOK &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
<--P_XL_APPL text *
-
<--P_XL_WKBKS text *
-
<--P_XL_SHEET text * ----------------------------------------------------------------------
FORM excel_open_workbook CHANGING xlapp TYPE ole2_object xlwkbks TYPE ole2_object xlsheet TYPE ole2_object.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage=0 text =text-102.
CREATE OBJECT xlapp 'EXCEL.APPLICATION'. SET PROPERTY OF xlapp 'Visible'=0. CALL METHOD OF xlapp 'Workbooks'=xlwkbks. CALL METHOD OF xlwkbks 'Open' EXPORTING #1=p_xlfil. CALL METHOD OF xlapp 'Worksheets'=xlsheet EXPORTING #1=p_xlsht. CALL METHOD OF xlsheet 'Activate'. FREE OBJECT xlwkbks. GET PROPERTY OF xlapp 'ActiveWorkbook'=xlwkbks.
ENDFORM. " EXCEL_OPEN_WORKBOOK
&---------------------------------------------------------------------
*& Form EXCEL_READ_SHEET &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
-->P_XL_SHEET text * ----------------------------------------------------------------------
FORM excel_read_sheet USING xlsheet TYPE ole2_object. DATA: end_of_data TYPE i, xl_curr_row TYPE i, col_count TYPE i, indx TYPE i, fval(50) TYPE c, count TYPE i VALUE 1.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage=0 text =text-103.
CLEAR: end_of_data, col_count.
PERFORM excel_read_row USING xlsheet xl_dtl_row
CHANGING col_count.
WHILE end_of_data IS INITIAL. indx=xl_max_col * ( xl_dtl_row + sy-index + 1 ) + 1. DO col_count TIMES. PERFORM excel_read_cell USING xlsheet indx
CHANGING fval. IF sy-index <= xl_reservd. CASE sy-index. WHEN 1. IF fval IS INITIAL. end_of_data=1. EXIT. ENDIF. IF fval=1. PERFORM excel_read_header USING xlsheet xl_hdr_row. ENDIF. WHEN 2. IF NOT ( fval IS INITIAL ). EXIT. ENDIF. ENDCASE. ELSE. IF NOT ( fval IS INITIAL ). READ TABLE flds INDEX sy-index. PERFORM xl_convert CHANGING fval. ftpost-count=count. ftpost-stype='P'. MOVE-CORRESPONDING flds TO ftpost. MOVE fval TO ftpost-fval. APPEND ftpost. ENDIF. ENDIF. indx=indx + 1. ENDDO. xl_curr_row=xl_curr_row + 1. count=count + 1. ENDWHILE.
ENDFORM. " EXCEL_READ_SHEET
&---------------------------------------------------------------------
*& Form EXCEL_SAVE_SHEET &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
-->P_XL_APPL text *
-
-->P_XL_WKBK text * ----------------------------------------------------------------------
FORM excel_save_sheet USING xlapp TYPE ole2_object xlwkbks TYPE ole2_object.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING percentage=0 text =text-107.
CALL METHOD OF xlwkbks 'Save'. CALL METHOD OF xlapp 'Quit'.
ENDFORM. " EXCEL_SAVE_SHEET
&---------------------------------------------------------------------
*& Form WS_GET_FILENAME &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
--> p1 text
-
<-- p2 text ----------------------------------------------------------------------
FORM ws_get_filename.
CALL FUNCTION 'WS_FILENAME_GET' EXPORTING def_path ='C:' mask =text-100 mode ='O' title =text-101 IMPORTING filename =p_xlfil EXCEPTIONS inv_winsys =1 no_batch =2 selection_cancel=3 selection_error=4 OTHERS =5.
IF sy-subrc NE 0. CLEAR p_xlfil. ENDIF.
ENDFORM. " WS_GET_FILENAME
&---------------------------------------------------------------------
*& Form EXCEL_READ_HEADER &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
-->XLS text *
-
<--CURR text *
-
<--COL text * ----------------------------------------------------------------------
FORM excel_read_header USING xls TYPE ole2_object curr TYPE i. DATA: cell TYPE ole2_object, indx TYPE i, fnam LIKE ftpost-fnam, col LIKE sy-index, fval(50) TYPE c.
CLEAR col. CLEAR ftpost.
ftpost-count=1. ftpost-stype='K'. REFRESH hdr_flds. indx=xl_max_col * ( curr - 1 ) + 1.
DO. CLEAR fnam. CALL METHOD OF xls 'Cells'=cell EXPORTING #1=indx. GET PROPERTY OF cell 'Value'=fnam. CONDENSE fnam NO-GAPS. IF NOT ( fnam IS INITIAL ). MOVE fnam TO hdr_flds-fnam. APPEND hdr_flds. indx=indx + 1. col=col + 1. ELSE. EXIT. ENDIF. ENDDO.
indx=xl_max_col * ( xl_hdr_row + 2 ) + 1.
DO col TIMES. PERFORM excel_read_cell USING xls indx CHANGING fval. IF NOT ( fval IS INITIAL ). READ TABLE hdr_flds INDEX sy-index. MOVE hdr_flds-fnam TO ftpost-fnam. MOVE fval TO ftpost-fval. APPEND ftpost. ENDIF. indx=indx + 1. ENDDO.
FREE: cell.
ENDFORM. " EXCEL_READ_ROW
&---------------------------------------------------------------------
*& Form EXCEL_READ_CELL &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
-->P_XLSHEET text *
-
-->P_INDX text *
-
<--P_FVAL text * ----------------------------------------------------------------------
FORM excel_read_cell USING xls TYPE ole2_object indx TYPE i CHANGING fval.
DATA: cell TYPE ole2_object.
CALL METHOD OF xls 'Cells'=cell EXPORTING #1=indx. GET PROPERTY OF cell 'Value'=fval.
ENDFORM. " EXCEL_READ_CELL
&---------------------------------------------------------------------
*& Form EXCEL_READ_ROW &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
-->P_XLSHEET text *
-
-->P_XL_DTL_ROW text *
-
<--P_COL_COUNT text * ----------------------------------------------------------------------
FORM excel_read_row USING xls TYPE ole2_object curr TYPE i CHANGING col TYPE i.
DATA: cell TYPE ole2_object, indx TYPE i, fnam LIKE ftpost-fnam.
REFRESH flds. indx=xl_max_col * ( curr - 1 ) + 1.
DO. CLEAR fnam. CALL METHOD OF xls 'Cells'=cell EXPORTING #1=indx. GET PROPERTY OF cell 'Value'=fnam. CONDENSE fnam NO-GAPS. IF NOT ( fnam IS INITIAL ). IF sy-index > xl_reservd. MOVE fnam TO flds-fnam. ELSE. MOVE 'RESERVED' TO flds-fnam. ENDIF. APPEND flds. indx=indx + 1. col=col + 1. ELSE. EXIT. ENDIF. ENDDO.
FREE: cell.
ENDFORM. " EXCEL_READ_ROW
&---------------------------------------------------------------------
*& Form XL_CONVERT &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
<--P_FVAL text * ----------------------------------------------------------------------
FORM xl_convert CHANGING val.
IF val CS '.'. WRITE val TO val RIGHT-JUSTIFIED. SHIFT val RIGHT DELETING TRAILING '0'. SHIFT val RIGHT DELETING TRAILING '.'. CONDENSE val NO-GAPS. ENDIF.
ENDFORM. " XL_CONVERT
&---------------------------------------------------------------------
*& Form POSTING_INTERFACE_START &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
--> p1 text
-
<-- p2 text ----------------------------------------------------------------------
FORM posting_interface_start.
DATA: groupname LIKE apqi-groupid.
IF function=calltrans. groupname=group. groupname+8(4)='-ERR'. CONDENSE groupname NO-GAPS. ELSE. groupname=group. groupname+8(3)='-OK'. CONDENSE groupname NO-GAPS. ENDIF.
CALL FUNCTION 'POSTING_INTERFACE_START' EXPORTING i_function=function i_mode =mode i_group =groupname i_user =sy-uname i_xbdcc =xbdcc keep ='X'.
ENDFORM. " POSTING_INTERFACE_START
&---------------------------------------------------------------------
*& Form POSTING_INTERFACE_DOCUMENT &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
--> p1 text
-
<-- p2 text ----------------------------------------------------------------------
FORM posting_interface_document.
DATA: subrc LIKE sy-subrc, msgid LIKE sy-msgid, msgty LIKE sy-msgty, msgno LIKE sy-msgno, msgv1 LIKE sy-msgv1, msgv2 LIKE sy-msgv2, msgv3 LIKE sy-msgv3, msgv4 LIKE sy-msgv4.
CALL FUNCTION 'POSTING_INTERFACE_DOCUMENT' EXPORTING i_tcode='FB01' IMPORTING e_subrc=subrc e_msgid=msgid e_msgty=msgty e_msgno=msgno e_msgv1=msgv1 e_msgv2=msgv2 e_msgv3=msgv3 e_msgv4=msgv4 TABLES t_ftpost=ftpost t_fttax=fttax t_blntab=xblntab.
ENDFORM. " POSTING_INTERFACE_DOCUMENT
&---------------------------------------------------------------------
*& Form POSTING_INTERFACE_CLOSE &---------------------------------------------------------------------
-
text ----------------------------------------------------------------------
-
--> p1 text
-
<-- p2 text ----------------------------------------------------------------------
FORM posting_interface_close.
CALL FUNCTION 'POSTING_INTERFACE_END'.
ENDFORM. " POSTING_INTERFACE_CLOSE }}}