1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318 | *&---------------------------------------------------------------------*
*& Form frm_post
*&---------------------------------------------------------------------*
*& 创建财务凭证
*&---------------------------------------------------------------------*
FORM frm_post USING i_test TYPE xfeld.
DATA l_mtype TYPE bapi_mtype.
DATA l_msg TYPE bapi_msg.
*&---------------------------------------------------------------------*
*& 记账码配置
*&---------------------------------------------------------------------*
SELECT
bschl,
shkzg,
koart,
stbsl,
xsonu
FROM tbsl
INTO TABLE @DATA(lt_bschl).
SORT lt_bschl BY bschl.
*&---------------------------------------------------------------------*
*& BAPI数据声明
*&---------------------------------------------------------------------*
DATA: ls_documentheader TYPE bapiache09, "Header
lt_accountgl TYPE STANDARD TABLE OF bapiacgl09,
ls_accountgl TYPE bapiacgl09, "G/L account item
lt_accountreceivable TYPE STANDARD TABLE OF bapiacar09,
ls_accountreceivable TYPE bapiacar09, "Customer Item
lt_accountpayable TYPE STANDARD TABLE OF bapiacap09,
ls_accountpayable TYPE bapiacap09, "Vendor Item
lt_currencyamount TYPE STANDARD TABLE OF bapiaccr09,
ls_currencyamount TYPE bapiaccr09, "Currency Items
lt_criteria TYPE STANDARD TABLE OF bapiackec9,
ls_criteria TYPE bapiackec9, " CO-PA
lt_extension2 TYPE STANDARD TABLE OF bapiparex,
ls_extension2 TYPE bapiparex, "Reference Structure for BAPI Parameters EXTENSIONIN/EXTENSIONOUT
lt_return TYPE STANDARD TABLE OF bapiret2,
ls_return TYPE bapiret2, "Return parameter
l_obj_key TYPE bapiache09-obj_key.
LOOP AT gt_data INTO DATA(ls_data)
WHERE zsel = 'X' " 取勾选项进行处理
AND mtype <> 'E' " 校验无误的
AND belnr = '' " 还没创建的
GROUP BY (
bldat = ls_data-bldat
budat = ls_data-budat
blart = ls_data-blart
bukrs = ls_data-bukrs
monat = ls_data-monat
waers = ls_data-waers
xblnr = ls_data-xblnr
bktxt = ls_data-bktxt
) INTO DATA(ls_data_grp).
CLEAR: ls_documentheader ,
lt_accountgl ,
ls_accountgl ,
lt_accountreceivable,
ls_accountreceivable,
lt_accountpayable ,
ls_accountpayable ,
lt_currencyamount ,
ls_currencyamount ,
lt_criteria ,
ls_criteria ,
lt_extension2 ,
ls_extension2 ,
lt_return ,
ls_return ,
l_obj_key .
" 任取一行作为抬头
LOOP AT GROUP ls_data_grp INTO DATA(ls_head). EXIT. ENDLOOP.
CLEAR ls_documentheader.
ls_documentheader-comp_code = ls_head-bukrs. " 公司代码
ls_documentheader-header_txt = ls_head-bktxt. " 凭证抬头文本
ls_documentheader-doc_date = ls_head-bldat. " 凭证日期
ls_documentheader-pstng_date = ls_head-budat. " 过账日期
ls_documentheader-doc_type = ls_head-blart. " 凭证类型
ls_documentheader-username = sy-uname. " 用户名
ls_documentheader-bus_act = 'RFBU'. " 业务事务
ls_documentheader-obj_type = 'BKPFF'. " 参考交易
ls_documentheader-fis_period = ls_head-monat. " 会计期间
ls_documentheader-fisc_year = ls_head-budat+0(4). " 会计年度
ls_documentheader-ref_doc_no = ls_head-xblnr. " 参考凭证
" 任取一行作为抬头
DATA l_itemno_acc TYPE posnr_acc.
DATA l_gl_acount TYPE hkont.
CLEAR l_itemno_acc.
LOOP AT GROUP ls_data_grp INTO ls_data.
l_itemno_acc = l_itemno_acc + 1.
READ TABLE lt_bschl INTO DATA(ls_bschl) WITH KEY bschl = ls_data-bschl BINARY SEARCH.
CASE ls_bschl-koart.
WHEN 'D'. " 客户
" 总帐科目
CLEAR l_gl_acount.
IF ls_data-hkont IS NOT INITIAL.
l_gl_acount = ls_data-hkont.
ELSE.
SELECT SINGLE akont FROM knb1
WHERE kunnr = @ls_data-kunnr
AND bukrs = @ls_data-bukrs
INTO @l_gl_acount.
" 特别总账
IF ls_data-umskz IS NOT INITIAL.
SELECT SINGLE skont FROM t074
WHERE ktopl = @l_ktopl
AND koart = @ls_bschl-koart
AND umskz = @ls_data-umskz
AND hkont = @l_gl_acount
INTO @l_gl_acount.
ENDIF.
ENDIF.
ls_accountreceivable-itemno_acc = l_itemno_acc . " 会计凭证行项目编号
ls_accountreceivable-gl_account = l_gl_acount. " 总账科目
ls_accountreceivable-customer = ls_data-kunnr. " 客户号
ls_accountreceivable-sp_gl_ind = ls_data-umskz. " 特殊总账标识
ls_accountreceivable-tax_code = ls_data-mwskz. " 税码
ls_accountreceivable-item_text = ls_data-sgtxt. " 项目文本
ls_accountreceivable-alloc_nmbr = ls_data-zuonr. " 分配
ls_accountreceivable-profit_ctr = ls_data-prctr. " 利润中心
ls_accountreceivable-pmnttrms = ls_data-zterm. " 付款条件
ls_accountreceivable-bline_date = ls_data-zfbdt. " 付款起算日期
ls_accountreceivable-bus_area = ls_data-gsber. " 业务范围
INSERT ls_accountreceivable INTO TABLE lt_accountreceivable.
WHEN 'K'. " 供应商
" 总帐科目
CLEAR l_gl_acount.
IF ls_data-hkont IS NOT INITIAL.
l_gl_acount = ls_data-hkont.
ELSE.
SELECT SINGLE akont FROM lfb1
WHERE lifnr = @ls_data-lifnr
AND bukrs = @ls_data-bukrs
INTO @l_gl_acount.
" 特别总账
IF ls_data-umskz IS NOT INITIAL.
SELECT SINGLE skont FROM t074
WHERE ktopl = @l_ktopl
AND koart = @ls_bschl-koart
AND umskz = @ls_data-umskz
AND hkont = @l_gl_acount
INTO @l_gl_acount.
ENDIF.
ENDIF.
ls_accountpayable-itemno_acc = l_itemno_acc. " 会计凭证行项目编号
ls_accountpayable-gl_account = l_gl_acount. " 总账科目
ls_accountpayable-item_text = ls_data-sgtxt. " 项目文本
ls_accountpayable-vendor_no = ls_data-lifnr. " 供应商编号
ls_accountpayable-sp_gl_ind = ls_data-umskz. " 特殊总账标识
ls_accountpayable-alloc_nmbr = ls_data-zuonr. " 分配
ls_accountpayable-profit_ctr = ls_data-prctr. " 利润中心
ls_accountpayable-tax_code = ls_data-mwskz. " 税码
ls_accountpayable-pmnttrms = ls_data-zterm. " 付款条件
ls_accountpayable-bline_date = ls_data-zfbdt. " 付款起算日期
ls_accountpayable-bus_area = ls_data-gsber. " 业务范围
INSERT ls_accountpayable INTO TABLE lt_accountpayable.
WHEN 'S'. " 总分类帐科目
l_gl_acount = ls_data-hkont.
ls_accountgl-itemno_acc = l_itemno_acc. " 会计凭证行项目编号
ls_accountgl-item_text = ls_data-sgtxt. " 项目文本
ls_accountgl-gl_account = l_gl_acount. " 总分类帐帐目
ls_accountgl-costcenter = ls_data-kostl. " 成本中心
ls_accountgl-alloc_nmbr = ls_data-zuonr. " 分配编号
ls_accountgl-orderid = ls_data-aufnr. " 内部订单号
ls_accountgl-tax_code = ls_data-mwskz. " 税号
ls_accountgl-po_number = ls_data-ebeln. " 采购凭证号
ls_accountgl-po_item = ls_data-ebelp. " 采购凭证行项目号
ls_accountgl-profit_ctr = ls_data-prctr. " 利润中心
ls_accountgl-material_long = ls_data-matnr. " 物料
INSERT ls_accountgl INTO TABLE lt_accountgl.
WHEN 'A'. " 资产
" 资产统御科目
CLEAR l_gl_acount.
IF ls_data-hkont IS NOT INITIAL.
l_gl_acount = ls_data-hkont.
ELSE.
SELECT SINGLE ktogr FROM anla
WHERE bukrs = @ls_data-bukrs
AND anln1 = @ls_data-anln1
INTO @l_gl_acount.
IF sy-subrc = 0.
SELECT SINGLE ktansw FROM t095
WHERE ktopl = @l_ktopl
AND ktogr = @l_gl_acount
INTO @l_gl_acount.
ENDIF.
ENDIF.
ls_accountgl-itemno_acc = l_itemno_acc. " 会计凭证行项目编号
ls_accountgl-item_text = ls_data-sgtxt. " 项目文本
ls_accountgl-gl_account = l_gl_acount. " 统御科目
ls_accountgl-acct_type = ls_bschl-koart. " 业务类型
ls_accountgl-asset_no = ls_data-anln1. " 主资产号
ls_accountgl-sub_number = '0000'. "次资产号
ls_accountgl-costcenter = ls_data-kostl. " 成本中心
ls_accountgl-alloc_nmbr = ls_data-zuonr. " 分配编号
ls_accountgl-orderid = ls_data-aufnr. " 内部订单号
ls_accountgl-tax_code = ls_data-mwskz. " 税号
ls_accountgl-po_number = ls_data-ebeln. " 采购凭证号
ls_accountgl-po_item = ls_data-ebelp. " 采购凭证行项目号
ls_accountgl-profit_ctr = ls_data-prctr. " 利润中心
ls_accountgl-material_long = ls_data-matnr. " 物料
ls_accountgl-bus_area = ls_data-gsber. " 业务范围
INSERT ls_accountgl INTO TABLE lt_accountgl.
WHEN 'M'. " 物料
WHEN OTHERS.
ENDCASE.
" 货币项目
ls_currencyamount-itemno_acc = l_itemno_acc. "行项目编号
IF ls_bschl-shkzg = 'S'.
ls_currencyamount-amt_doccur = ls_data-wrbtr. " 金额
ls_currencyamount-tax_amt = ls_data-xmwst. " 税额
ELSE.
ls_currencyamount-amt_doccur = ls_data-wrbtr * -1. " 金额
ls_currencyamount-tax_amt = ls_data-xmwst * -1. " 税额
ENDIF.
ls_currencyamount-currency = ls_head-waers. "货币
INSERT ls_currencyamount INTO TABLE lt_currencyamount.
" 增强字段
DATA ls_ext TYPE zsfi0001.
ls_ext-posnr = l_itemno_acc. " 会计凭证行项目编号
ls_ext-bschl = ls_data-bschl. " 记帐代码
ls_ext-rstgr = ls_data-rstgr. " 付款原因代码
CLEAR ls_extension2.
ls_extension2-structure = 'ZSFI0001'.
MOVE ls_ext TO ls_extension2+30.
INSERT ls_extension2 INTO TABLE lt_extension2.
ENDLOOP.
IF i_test = 'X'.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
EXPORTING
documentheader = ls_documentheader
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
accountpayable = lt_accountpayable
currencyamount = lt_currencyamount
criteria = lt_criteria
return = lt_return
extension2 = lt_extension2.
ELSE.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_documentheader
IMPORTING
obj_key = l_obj_key
TABLES
accountgl = lt_accountgl
accountreceivable = lt_accountreceivable
accountpayable = lt_accountpayable
currencyamount = lt_currencyamount
criteria = lt_criteria
return = lt_return
extension2 = lt_extension2.
ENDIF.
" 整理BAPI消息
CLEAR l_msg.
LOOP AT lt_return INTO ls_return WHERE type CA 'AEX'.
MESSAGE ID ls_return-id TYPE ls_return-type NUMBER ls_return-number
WITH ls_return-message_v1 ls_return-message_v2 ls_return-message_v3 ls_return-message_v4
INTO ls_return-message.
l_mtype = 'E'.
l_msg = |{ l_msg }{ ls_return-message };|.
ENDLOOP.
IF sy-subrc <> 0.
l_mtype = 'S'.
IF i_test = 'X'.
l_msg = |测试运行成功|.
ELSE.
l_msg = |会计凭证{ l_obj_key(10) }已处理|.
ENDIF.
ENDIF.
" 回写报表
LOOP AT GROUP ls_data_grp REFERENCE INTO DATA(lr_data).
lr_data->mtype = l_mtype.
lr_data->msg = l_msg.
lr_data->belnr = l_obj_key(10).
ENDLOOP.
IF i_test = 'X'.
" 测试运行结束
CONTINUE.
ELSE.
" 提交数据库
IF l_mtype = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDIF.
ENDLOOP. " LOOP AT gt_data GROUP BY
ENDFORM.
|