以下是一个经典的SAP例程序,通过bdc技术生成fi凭证。
REPORT ZTEST_F65.
DATA: LSBL3(10) .
data HS1 TYPE I.
TYPES: BEGIN OF tp_out.
TYPES: YGMC TYPE KNA1-NAME1.
TYPES: BM TYPE CSKT-KTEXT. "部门
INCLUDE TYPE ZFIT_GZYSJ01.
TYPES: YFXJ TYPE ZFIT_GZYSJ01-SJ1. "应发小计
TYPES: END OF tp_out.
DATA:
gt_out TYPE TABLE OF tp_out WITH HEADER LINE.
DATA gt_wa like line of gt_out.
DATA: gt_outHB TYPE TABLE OF tp_out WITH HEADER LINE.
data wb type char20.
**********定义一个BDC内表***********************
DATA g_itb_bdcdata TYPE TABLE OF bdcdata.
DATA g_wa_bdcdata LIKE LINE OF g_itb_bdcdata.
data p_BUKRS LIKE ZFIT_GZYSJ02-BUKRS .
data p_GJAHR LIKE ZFIT_GZYSJ02-GJAHR .
data p_MONAT LIKE ZFIT_GZYSJ02-MONAT.
p_BUKRS = '1000'.
p_GJAHR = '2009'.
p_MONAT = '10'.
perFORM frm_post_fp.
*&---------------------------------------------------------------------*
*& Form frm_bdc_input
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P1 text
* -->P2 text
* -->P3 text
*----------------------------------------------------------------------*
FORM frm_bdc_input USING p1 p2 p3.
CLEAR g_wa_bdcdata.
IF p1 = 'X'.
g_wa_bdcdata-program = p2.
g_wa_bdcdata-dynpro = p3.
g_wa_bdcdata-dynbegin = p1.
APPEND g_wa_bdcdata TO g_itb_bdcdata.
ELSE.
g_wa_bdcdata-fnam = p2.
g_wa_bdcdata-fval = p3.
APPEND g_wa_bdcdata TO g_itb_bdcdata.
ENDIF.
ENDFORM. "frm_bdc_input
*&---------------------------------------------------------------------*
*& Form frm_post_fp
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_post_fp.
DATA l_itb_message TYPE TABLE OF bdcmsgcoll.
DATA l_wa_message LIKE LINE OF l_itb_message.
DATA l_message TYPE char100.
DATA l_date TYPE bkpf-budat.
DATA l_wrbtr TYPE char16.
DATA l_str TYPE string.
DATA l_mode TYPE c VALUE 'N'.
* DATA l_mode TYPE c VALUE 'A'.
* DATA l_mode TYPE c VALUE 'E'.
DATA: l_datum TYPE datum.
CONCATENATE '这是' p_MONAT '月的凭证' into wb.
l_datum+0(4) = p_GJAHR.
l_datum+4(2) = p_MONAT.
l_datum+6(2) = '15'.
IF GT_outhb[] IS INITIAL.
CLEAR:g_wa_bdcdata,g_itb_bdcdata.
*先设置科目编码
LSBL3 = '6601050000'."记住科目编码的状态变式非常重要
l_wrbtr = '100.00'.
PERFORM frm_bdc_input USING: 'X' 'SAPLF040' '0100',
'' 'BDC_OKCODE' '/00',
'' 'BKPF-BLDAT' l_datum,
'' 'BKPF-BLART' 'SA',
'' 'BKPF-BUKRS' p_BUKRS, "输入公司代码
'' 'BKPF-BUDAT' l_datum, "日期
'' 'BKPF-WAERS' 'RMB',
'' 'BKPF-BKTXT' wb , "文本抬头
'' 'VBKPF-XBWAE' 'X',
'' 'FS006-DOCID' '*'.
PERFORM frm_bdc_input USING: '' 'RF05V-NEWBS' '40'.
PERFORM frm_bdc_input USING: '' 'RF05V-NEWKO' LSBL3. "科目编码
PERFORM frm_bdc_input USING: 'X' 'SAPLF040' '0300',
'' 'BDC_OKCODE' '=ZK',
'' 'BSEG-WRBTR' l_wrbtr, "金额为文本格式
'X' 'SAPLKACB' '0002',
'' 'BDC_OKCODE' '/EESC',
'' 'BDC_CURSOR' 'COBL-KOSTL',
'X' 'SAPLF040' '0330',
'' 'BDC_CURSOR' 'BSEG-VBUND',
'' 'BDC_OKCODE' '=ZK',
'X' 'SAPLF040' '0300',
'' 'BDC_OKCODE' '=ZK',
'X' 'SAPLKACB' '0002',
'' 'BDC_OKCODE' '=ENTE',
'' 'COBL-KOSTL' '1000002' , "成本中心
'X' 'SAPLF040' '0330',
'' 'BDC_OKCODE' '=S+',
*按员工核算则BSEG-XREF2不为空
* '' 'BSEG-XREF2' gt_wa_out-kunnr.
'' 'BSEG-XREF2' ''.
PERFORM frm_bdc_input USING: '' 'RF05V-NEWBS' '50',
'' 'RF05V-NEWKO' '2211030101',
'X' 'SAPLF040' '0300',
'' 'BDC_OKCODE' '=AB',
'' 'BSEG-WRBTR' '*',
'X' 'SAPLKACB' '0002',
'' 'BDC_OKCODE' '=ENTE',
'X' 'SAPLF040' '0700',
'' 'BDC_CURSOR' 'BKPF-XBLNR',
'' 'BDC_OKCODE' '=PBBP'.
"break-point.
CALL TRANSACTION 'F-65' USING g_itb_bdcdata MODE l_mode MESSAGES INTO l_itb_message.
READ TABLE l_itb_message INTO l_wa_message WITH KEY msgtyp = 'S' msgid = 'FP' msgnr = '001'.
DATA: l_msg TYPE string.
IF sy-subrc = 0.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = l_wa_message-msgid
lang = '1'
no = l_wa_message-msgnr
v1 = l_wa_message-msgv1
v2 = l_wa_message-msgv2
v3 = l_wa_message-msgv3
v4 = l_wa_message-msgv4
IMPORTING
msg = l_msg
EXCEPTIONS
not_found = 1
OTHERS = 2.
WRITE:/ l_msg.
ELSE.
LOOP AT l_itb_message INTO l_wa_message WHERE msgtyp = 'E' OR msgtyp = 'A'.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = l_wa_message-msgid
lang = '1'
no = l_wa_message-msgnr
v1 = l_wa_message-msgv1
v2 = l_wa_message-msgv2
v3 = l_wa_message-msgv3
v4 = l_wa_message-msgv4
IMPORTING
msg = l_msg
EXCEPTIONS
not_found = 1
OTHERS = 2.
WRITE:/ l_msg.
ENDLOOP.
ENDIF.
ELSE.
WRITE:/ '没有需要结转的数据'.
ENDIF.