首页 > 数字化转型 > ERP > SAP内部清账函数测试二
在先行者测试的基础上修改,非等额清账。
REPORT ZTESTCLEARING
.
TABLES
: BSEG
.
DATA
: LT_BLNTAB
TYPE
TABLE
OF BLNTAB
WITH
HEADER
LINE
,
LT_FTCLEAR
TYPE
TABLE
OF FTCLEAR
WITH
HEADER
LINE
,
LT_FTPOST
TYPE
TABLE
OF FTPOST
WITH
HEADER
LINE
,
LT_FTTAX
TYPE
TABLE
OF FTTAX
WITH
HEADER
LINE
.
DATA
:LS_SYST
TYPE SYST
.
DATA
:LV_MONAT
TYPE BKPF
-MONAT
.
DATA
:LV_GJAHR
TYPE BKPF
-GJAHR
.
DATA
:LV_POSNR
TYPE
I
.
DATA
:LV_WRBTR
TYPE CHAR20
.
DATA
:LV_DATUM
TYPE STRING
.
DATA
:LV_BELNR
TYPE STRING
.
DATA
: E_BELNR
TYPE BKPF
-BELNR
,
E_BUKRS
TYPE BKPF
-BUKRS
,
E_GJAHR
TYPE BKPF
-GJAHR
.
DATA
:
BEGIN
OF T_FPITEM
OCCURS
0
, "非等额差额表
BSCHL
TYPE BSEG
-BSCHL
,
HKONT
TYPE BSEG
-HKONT
,
GSBER
TYPE BSEG
-GSBER
,
WRBTR
TYPE BSEG
-WRBTR
,
RSTGR
TYPE BSEG
-RSTGR
,
SGTXT
TYPE BSEG
-SGTXT
,
END
OF T_FPITEM
.
DATA
:
BEGIN
OF T_FCITEM
OCCURS
0
,
KUNNR
TYPE BSEG
-KUNNR
,
BELNR
TYPE BSEG
-BELNR
,
GJAHR
TYPE BSEG
-GJAHR
,
BUZEI
TYPE BSEG
-BUZEI
,
LIFNR
TYPE BSEG
-LIFNR
,
END
OF T_FCITEM
.
DATA
:
BEGIN
OF I_HEADER
OCCURS
0
,
KOART
TYPE BSEG
-KOART
,
BUKRS
TYPE BSEG
-BUKRS
,
LIFNR
TYPE BSEG
-LIFNR
,
END
OF I_HEADER
.
DATA
:
BEGIN
OF E_MESSAGE
OCCURS
0
,
TYPE
TYPE
C
,
MESSAGE
TYPE STRING
,
END
OF E_MESSAGE
.
DEFINE POPULATE_FTPOST
.
lt_ftpost
-stype
= &1
.
lt_ftpost
-
count
= &2
.
lt_ftpost
-fnam
= &3
.
lt_ftpost
-fval
= &4
.
APPEND lt_ftpost
.
END-OF-DEFINITION
.
DEFINE POPULATE_FTCLEAR
.
lt_ftclear
-agkoa
= i_header
-koart
.
"K for vender,D for custmor, S for GL
lt_ftclear
-agbuk
= i_header
-bukrs
.
"公司代码
lt_ftclear
-xnops
=
'X'
.
"标准未清项目
lt_ftclear
-agkon
= &1
.
"科目
lt_ftclear
-selfd
= &2
.
"BELNR 字段固定
lt_ftclear
-selvon
= &3
.
"会计凭证搜索--开始上限值
* lt_ftclear-selbis = '2'. "会计凭证搜索--开始下限值
APPEND lt_ftclear
.
END-OF-DEFINITION
.
**********************************************************************
*过账创建凭证
**********************************************************************
*---初始化
LV_MONAT
= SY
-DATUM+4
(
2
)
.
LV_GJAHR
= SY
-DATUM+0
(
4
)
.
*IF I_HEADER-WAERS IS INITIAL.
* I_HEADER-WAERS = 'CNY'.
*ENDIF.
CALL
FUNCTION
'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
DATE_INTERNAL
= SY
-DATUM
IMPORTING
DATE_EXTERNAL
= LV_DATUM
EXCEPTIONS
DATE_INTERNAL_IS_INVALID
=
1
OTHERS
=
2
.
*K-->Header,P-->Item
POPULATE_FTPOST
:
'K'
1
'BKPF-BUKRS'
'1010'
,
"公司代码
'K'
1
'BKPF-BLART'
'Z3'
,
"凭证类型
'K'
1
'BKPF-BLDAT' LV_DATUM
,
"凭证日期
'K'
1
'BKPF-BUDAT' LV_DATUM
,
"过帐日期
'K'
1
'BKPF-MONAT' LV_MONAT
,
"过帐期间
'K'
1
'BKPF-WAERS'
'CNY'
,
'K'
1
'BKPF-XBLNR'
''
,
'K'
1
'BKPF-BKTXT'
'清账测试'
.
*
T_FPITEM
-BSCHL
=
'14'
. "记账码为清账凭证的后台设置
T_FPITEM
-HKONT
=
'100005'
.
T_FPITEM
-GSBER
=
'1010'
.
T_FPITEM
-WRBTR
=
'16'
.
*T_FPITEM-RSTGR = ''.
T_FPITEM
-SGTXT
=
'TEST'
.
APPEND T_FPITEM
.
*
LOOP
AT T_FPITEM
.
LV_POSNR
= SY
-TABIX
.
LV_WRBTR
=
ABS
( T_FPITEM
-WRBTR
)
.
"必须都是正值
CONDENSE LV_WRBTR
.
POPULATE_FTPOST
:
'P' LV_POSNR
'RF05A-NEWBS' T_FPITEM
-BSCHL
,
"记账码
'P' LV_POSNR
'RF05A-NEWKO' T_FPITEM
-HKONT
,
"记账科目
'P' LV_POSNR
'COBL-GSBER' T_FPITEM
-GSBER
,
"业务范围
'P' LV_POSNR
'BSEG-WRBTR' LV_WRBTR
,
"金额
* 'P' LV_POSNR 'BSEG-RSTGR' T_FPITEM-RSTGR, "原因代码
'P' LV_POSNR
'BSEG-SGTXT' T_FPITEM
-SGTXT
.
"行项目文本
ENDLOOP
.
**********************************************************************
*清账凭证
**********************************************************************
T_FCITEM
-BELNR
=
'0100001102'
.
"注意不足10位补前导零
T_FCITEM
-GJAHR
=
'2018'
.
T_FCITEM
-BUZEI
=
'0002'
.
"注意前导零
T_FCITEM
-KUNNR
=
'0000100005'
.
APPEND T_FCITEM
.
T_FCITEM
-BELNR
=
'0090000096'
.
T_FCITEM
-GJAHR
=
'2018'
.
T_FCITEM
-BUZEI
=
'0001'
.
T_FCITEM
-KUNNR
=
'0000100005'
.
APPEND T_FCITEM
.
I_HEADER
-KOART
=
'D'
.
APPEND I_HEADER
.
LOOP
AT T_FCITEM
.
CLEAR
:LV_BELNR
.
LV_BELNR
= T_FCITEM
-BELNR && T_FCITEM
-GJAHR && T_FCITEM
-BUZEI
.
* LV_BELNR = T_FCITEM-BELNR.
CASE I_HEADER
-KOART
.
WHEN
'D'
.
"客户
POPULATE_FTCLEAR
: T_FCITEM
-KUNNR
'BELNR' LV_BELNR
.
WHEN
'K'
.
"供应商
POPULATE_FTCLEAR
: T_FCITEM
-LIFNR
'BELNR' LV_BELNR
.
WHEN
OTHERS
.
ENDCASE
.
ENDLOOP
.
**********************************************************************
*清账开始----采用剩余清帐
**********************************************************************
CALL
FUNCTION
'POSTING_INTERFACE_START'
EXPORTING
I_CLIENT
= SY
-MANDT
I_FUNCTION
=
'C'
"B (batch input processing) ,C (processing with Call Transaction .. Using..)
I_KEEP
=
'X'
"用于已处理会话的队列删除标志.
I_MODE
=
'A'
"I_MODE "A for step by step,N default,for background,正式用N
I_UPDATE
=
'S'
"同步
I_USER
= SY
-UNAME
EXCEPTIONS
CLIENT_INCORRECT
=
1
FUNCTION_INVALID
=
2
GROUP_NAME_MISSING
=
3
MODE_INVALID
=
4
UPDATE_INVALID
=
5
OTHERS
=
6
.
CALL
FUNCTION
'POSTING_INTERFACE_CLEARING'
EXPORTING
I_AUGLV
=
'UMBUCHNG'
I_TCODE
=
'FB05'
"只支持FB05
I_SGFUNCT
=
'C'
IMPORTING
E_MSGID
= LS_SYST
-MSGID
E_MSGNO
= LS_SYST
-MSGNO
E_MSGTY
= LS_SYST
-MSGTY
E_MSGV1
= LS_SYST
-MSGV1
E_MSGV2
= LS_SYST
-MSGV2
E_MSGV3
= LS_SYST
-MSGV3
E_MSGV4
= LS_SYST
-MSGV4
TABLES
T_BLNTAB
= LT_BLNTAB
T_FTCLEAR
= LT_FTCLEAR
T_FTPOST
= LT_FTPOST
T_FTTAX
= LT_FTTAX
EXCEPTIONS
CLEARING_PROCEDURE_INVALID
=
1
CLEARING_PROCEDURE_MISSING
=
2
TABLE_T041A_EMPTY
=
3
TRANSACTION_CODE_INVALID
=
4
AMOUNT_FORMAT_ERROR
=
5
TOO_MANY_LINE_ITEMS
=
6
COMPANY_CODE_INVALID
=
7
SCREEN_NOT_FOUND
=
8
NO_AUTHORIZATION
=
9
OTHERS
=
10
.
* IF sy-subrc = 0. "判断不准
IF LS_SYST
-MSGTY
CA
'AEX'
.
E_MESSAGE
-
TYPE
=
'E'
.
MESSAGE
ID LS_SYST
-MSGID
TYPE LS_SYST
-MSGTY
NUMBER LS_SYST
-MSGNO
WITH LS_SYST
-MSGV1 LS_SYST
-MSGV2 LS_SYST
-MSGV3 LS_SYST
-MSGV4
INTO E_MESSAGE
-
MESSAGE
.
ELSE
.
E_MESSAGE
-
TYPE
=
'S'
.
E_MESSAGE
-
MESSAGE
=
'过账并清账成功!'
.
READ
TABLE LT_BLNTAB
INDEX
1
.
IF SY
-SUBRC
=
0
.
E_BELNR
= LT_BLNTAB
-BELNR
.
E_BUKRS
= LT_BLNTAB
-BUKRS
.
E_GJAHR
= LT_BLNTAB
-GJAHR
.
ENDIF
.
ENDIF
.
"清账结束
CALL
FUNCTION
'POSTING_INTERFACE_END'
EXCEPTIONS
SESSION_NOT_PROCESSABLE
=
1
OTHERS
=
2
.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9859323/viewspace-2703749/ ,如需转载,请注明出处,否则将追究法律责任。