ABAP-FB01创建会计凭证BAPI

发布时间 2023-07-11 15:52:02作者: TigerMan
  1 FUNCTION zfm_fi_0003.
  2 *"----------------------------------------------------------------------
  3 *"*"本地接口:
  4 *"  IMPORTING
  5 *"     VALUE(IS_BKPF) TYPE  ZSFI_0005 OPTIONAL
  6 *"     VALUE(IV_TEST) TYPE  CHAR1 OPTIONAL
  7 *"  EXPORTING
  8 *"     VALUE(EV_TYPE) TYPE  CHAR1
  9 *"     VALUE(EV_MESSAGE) TYPE  CHAR255
 10 *"     VALUE(EV_BELNR) TYPE  BELNR_D
 11 *"  TABLES
 12 *"      TI_BSEG STRUCTURE  ZSFI_0006 OPTIONAL
 13 *"----------------------------------------------------------------------
 14 
 15   DATA:ls_documentheader    TYPE bapiache09,
 16        lt_currencyamount    TYPE TABLE OF bapiaccr09,
 17        ls_currencyamount    TYPE bapiaccr09,
 18        lt_accountgl         TYPE TABLE OF bapiacgl09,
 19        ls_accountgl         TYPE bapiacgl09,
 20        lt_accountreceivable TYPE TABLE OF bapiacar09,
 21        ls_accountreceivable TYPE bapiacar09,
 22        lt_accountpayable    TYPE TABLE OF bapiacap09,
 23        ls_accountpayable    TYPE bapiacap09,
 24        lt_return            TYPE TABLE OF bapiret2,
 25        lt_extension2        TYPE TABLE OF bapiparex,
 26        ls_extension2        TYPE bapiparex,
 27        ls_zsfi_0001         TYPE zsfi_0001,
 28        ls_return            TYPE bapiret2,
 29        lv_poper             TYPE t009b-poper,
 30        lv_waers             TYPE bkpf-waers.
 31 
 32   CLEAR ls_documentheader .
 33   REFRESH lt_currencyamount .
 34   CLEAR ls_currencyamount .
 35   REFRESH lt_accountgl .
 36   CLEAR ls_accountgl .
 37   REFRESH lt_accountreceivable .
 38   CLEAR ls_accountreceivable .
 39   REFRESH lt_accountpayable .
 40   CLEAR ls_accountpayable .
 41   REFRESH lt_return .
 42   CLEAR ls_return .
 43   CLEAR lv_poper .
 44   CLEAR lv_waers .
 45 
 46   LOOP AT ti_bseg ASSIGNING FIELD-SYMBOL(<fs_bseg>) .
 47 
 48     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
 49       EXPORTING
 50         input  = <fs_bseg>-hkont
 51       IMPORTING
 52         output = <fs_bseg>-hkont.
 53 
 54     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
 55       EXPORTING
 56         input  = <fs_bseg>-kostl
 57       IMPORTING
 58         output = <fs_bseg>-kostl.
 59 
 60     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
 61       EXPORTING
 62         input  = <fs_bseg>-prctr
 63       IMPORTING
 64         output = <fs_bseg>-prctr.
 65 
 66     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
 67       EXPORTING
 68         input  = <fs_bseg>-aufnr
 69       IMPORTING
 70         output = <fs_bseg>-aufnr.
 71 
 72     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
 73       EXPORTING
 74         input  = <fs_bseg>-anln1
 75       IMPORTING
 76         output = <fs_bseg>-anln1.
 77 
 78     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
 79       EXPORTING
 80         input  = <fs_bseg>-lifnr
 81       IMPORTING
 82         output = <fs_bseg>-lifnr.
 83 
 84     CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
 85       EXPORTING
 86         input  = <fs_bseg>-kunnr
 87       IMPORTING
 88         output = <fs_bseg>-kunnr.
 89 
 90   ENDLOOP .
 91 
 92   IF is_bkpf-monat IS INITIAL .
 93 
 94     CALL FUNCTION 'G_PERIOD_GET'
 95       EXPORTING
 96         company                        = is_bkpf-bukrs
 97         date                           = is_bkpf-budat
 98 *       GLOBAL_COMPANY                 = ' '
 99 *       LEDGER                         = ' '
100         variant                        = 'Z1'
101       IMPORTING
102 *       ANZBP                          =
103 *       ANZSP                          =
104         period                         = lv_poper
105 *       YEAR                           =
106 *       VARIANT                        =
107       EXCEPTIONS
108         ledger_not_assigned_to_company = 1
109         period_not_defined             = 2
110         variant_not_defined            = 3
111         parameter_error                = 4
112         OTHERS                         = 5.
113 
114     is_bkpf-monat = lv_poper .
115 
116   ENDIF .
117 
118   ls_documentheader-header_txt = is_bkpf-bktxt.
119   ls_documentheader-comp_code = is_bkpf-bukrs.
120   ls_documentheader-doc_date = is_bkpf-bldat.
121   ls_documentheader-pstng_date = is_bkpf-budat.
122   ls_documentheader-fisc_year = is_bkpf-gjahr.
123   ls_documentheader-fis_period = is_bkpf-monat.
124   ls_documentheader-doc_type = is_bkpf-blart.
125   ls_documentheader-ref_doc_no = is_bkpf-xblnr.
126   ls_documentheader-bus_act = 'RFBU'.
127   ls_documentheader-username   = sy-uname.
128 
129   SELECT SINGLE waers INTO lv_waers FROM t001 WHERE bukrs = is_bkpf-bukrs.
130   IF lv_waers IS INITIAL.
131     lv_waers = 'CNY'.
132   ENDIF.
133 
134   LOOP AT ti_bseg.
135 
136     IF ti_bseg-lifnr IS NOT INITIAL.
137 
138       CLEAR ls_accountpayable .
139       ls_accountpayable-itemno_acc = ti_bseg-buzei .
140       ls_accountpayable-vendor_no = ti_bseg-lifnr.
141       ls_accountpayable-sp_gl_ind = ti_bseg-umskz.
142       ls_accountpayable-item_text = ti_bseg-sgtxt.
143       ls_accountpayable-profit_ctr = ti_bseg-prctr.
144       ls_accountpayable-alloc_nmbr = ti_bseg-zuonr.
145       ls_accountpayable-bline_date = ti_bseg-zfbdt.
146       ls_accountpayable-gl_account = ti_bseg-hkont .
147       ls_accountpayable-bus_area = ti_bseg-gsber .
148       APPEND ls_accountpayable TO lt_accountpayable .
149 
150     ELSEIF ti_bseg-kunnr IS NOT INITIAL.
151 
152       CLEAR ls_accountreceivable .
153       ls_accountreceivable-itemno_acc = ti_bseg-buzei.
154       ls_accountreceivable-customer = ti_bseg-kunnr.
155       ls_accountreceivable-sp_gl_ind = ti_bseg-umskz.
156       ls_accountreceivable-item_text = ti_bseg-sgtxt.
157       ls_accountreceivable-profit_ctr = ti_bseg-prctr.
158       ls_accountreceivable-alloc_nmbr = ti_bseg-zuonr.
159       ls_accountreceivable-bline_date = ti_bseg-zfbdt.
160       ls_accountreceivable-bus_area = ti_bseg-gsber .
161       ls_accountreceivable-gl_account = ti_bseg-hkont .
162       APPEND ls_accountreceivable TO lt_accountreceivable .
163 
164     ELSE .
165 
166       CLEAR ls_accountgl .
167       ls_accountgl-itemno_acc = ti_bseg-buzei.
168       IF ti_bseg-anln1 IS INITIAL.
169         ls_accountgl-acct_type = 'S'.
170         ls_accountgl-gl_account = ti_bseg-hkont.
171       ELSE.
172         ls_accountgl-acct_type = 'A'.
173         ls_accountgl-asset_no = ti_bseg-anln1.
174         ls_accountgl-sub_number = '0000'.
175         ls_accountgl-gl_account = ti_bseg-hkont.
176       ENDIF.
177       ls_accountgl-quantity = ti_bseg-menge.
178       ls_accountgl-costcenter = ti_bseg-kostl.
179       ls_accountgl-profit_ctr = ti_bseg-prctr.
180       ls_accountgl-orderid = ti_bseg-aufnr.
181       ls_accountgl-item_text = ti_bseg-sgtxt.
182       ls_accountgl-alloc_nmbr = ti_bseg-zuonr.
183       ls_accountgl-bus_area = ti_bseg-gsber.
184       ls_accountgl-orderid = ti_bseg-aufnr .
185       APPEND ls_accountgl TO lt_accountgl .
186 
187     ENDIF .
188 
189     IF is_bkpf-waers = lv_waers OR is_bkpf-waers = '' . "人民币
190 
191       CLEAR ls_currencyamount .
192       ls_currencyamount-itemno_acc = ti_bseg-buzei.
193       ls_currencyamount-currency = lv_waers.
194       IF ti_bseg-shkzg = 'H' AND ti_bseg-wrbtr > 0 .
195         ls_currencyamount-amt_doccur = 0 - ti_bseg-wrbtr .
196       ELSE .
197         ls_currencyamount-amt_doccur = ti_bseg-wrbtr.
198       ENDIF .
199       APPEND ls_currencyamount TO lt_currencyamount.
200 
201     ELSE.
202       CLEAR ls_currencyamount .
203       ls_currencyamount-itemno_acc = ti_bseg-buzei.
204       ls_currencyamount-curr_type  = '00'.  "凭证货币
205       ls_currencyamount-currency = is_bkpf-waers.
206       IF ti_bseg-shkzg = 'H' AND ti_bseg-wrbtr > 0 .
207         ls_currencyamount-amt_doccur = ti_bseg-wrbtr * - 1 .
208       ELSE .
209         ls_currencyamount-amt_doccur = ti_bseg-wrbtr.
210       ENDIF .
211       APPEND ls_currencyamount TO lt_currencyamount.
212       CLEAR ls_currencyamount.
213       ls_currencyamount-itemno_acc = ti_bseg-buzei.
214       ls_currencyamount-curr_type = '10'.  "本位币
215       ls_currencyamount-currency = lv_waers.
216       IF ti_bseg-shkzg = 'H' AND ti_bseg-dmbtr > 0 .
217         ls_currencyamount-amt_doccur = ti_bseg-dmbtr * - 1 .
218       ELSE .
219         ls_currencyamount-amt_doccur = ti_bseg-dmbtr.
220       ENDIF .
221       APPEND ls_currencyamount TO lt_currencyamount.
222     ENDIF.
223 
224     CLEAR ls_extension2 .
225     CLEAR ls_zsfi_0001 .
226     ls_zsfi_0001-posnr = ti_bseg-buzei."凭证行项目
227     ls_zsfi_0001-bschl = ti_bseg-bschl."凭证行项目过账码
228     ls_zsfi_0001-rstgr = ti_bseg-rstgr."原因代码增强
229     ls_zsfi_0001-umskz = ti_bseg-umskz. "凭证行项目特别总账标识
230     ls_zsfi_0001-zzxmhsbm = ti_bseg-zzxmhsbm.
231     ls_zsfi_0001-wdate = ti_bseg-wdate."签发日期
232     ls_zsfi_0001-anbwa = ti_bseg-anbwa .
233     ls_zsfi_0001-xnegp = ti_bseg-xnegp .
234     ls_extension2-structure  = 'ZSFI_0001'.
235     ls_extension2-valuepart1 = ls_zsfi_0001.
236     APPEND ls_extension2 TO lt_extension2 .
237 
238   ENDLOOP .
239 
240   IF iv_test IS INITIAL .
241 
242     CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
243       EXPORTING
244         documentheader    = ls_documentheader
245 *       CUSTOMERCPD       =
246 *       CONTRACTHEADER    =
247 *     IMPORTING
248 *       OBJ_TYPE          =
249 *       OBJ_KEY           =
250 *       OBJ_SYS           =
251       TABLES
252         accountgl         = lt_accountgl
253         accountreceivable = lt_accountreceivable
254         accountpayable    = lt_accountpayable
255 *       ACCOUNTTAX        =
256         currencyamount    = lt_currencyamount
257 *       CRITERIA          =
258 *       VALUEFIELD        =
259 *       EXTENSION1        =
260         return            = lt_return
261 *       PAYMENTCARD       =
262 *       CONTRACTITEM      =
263         extension2        = lt_extension2
264 *       REALESTATE        =
265 *       ACCOUNTWT         =
266       .
267 
268     DELETE lt_return WHERE type = 'S' AND message_v2 IS INITIAL.
269     READ TABLE lt_return INTO ls_return WITH KEY type = 'S'.
270     IF sy-subrc = 0.
271 
272       ev_type = 'S'.
273       ev_message = ls_return-message.
274       ev_belnr = ls_return-message_v2(10).
275       CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
276         EXPORTING
277           wait = 'X'.
278 
279     ENDIF .
280 
281     CHECK ev_belnr IS INITIAL.
282     ev_type = 'E'.
283     ev_message = '生成凭证时出错:'.
284     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
285 
286     DELETE lt_return WHERE id = 'RW' AND number = '609'.
287     DELETE lt_return WHERE type = 'W'.
288     CHECK  lt_return IS NOT INITIAL.
289 
290     SORT lt_return[] BY message.
291     DELETE ADJACENT DUPLICATES FROM lt_return COMPARING message.
292     LOOP AT lt_return INTO ls_return WHERE type = 'A' OR type = 'E' OR type = 'X'.
293       ev_type = 'E'.
294       ev_message = ev_message && ls_return-message && ';'.
295     ENDLOOP.
296 
297   ELSE .
298 
299     CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
300       EXPORTING
301         documentheader    = ls_documentheader
302 *       CUSTOMERCPD       =
303 *       CONTRACTHEADER    =
304       TABLES
305         accountgl         = lt_accountgl
306         accountreceivable = lt_accountreceivable
307         accountpayable    = lt_accountpayable
308 *       ACCOUNTTAX        =
309         currencyamount    = lt_currencyamount
310 *       CRITERIA          =
311 *       VALUEFIELD        =
312 *       EXTENSION1        =
313         return            = lt_return
314 *       PAYMENTCARD       =
315 *       CONTRACTITEM      =
316         extension2        = lt_extension2
317 *       REALESTATE        =
318 *       ACCOUNTWT         =
319       .
320 
321     ev_type = 'S'.
322     ev_message = '凭证检查成功'.
323     SORT lt_return BY message.
324     DELETE ADJACENT DUPLICATES FROM lt_return COMPARING message.
325     LOOP AT lt_return INTO ls_return WHERE type = 'A' OR type = 'E' OR type = 'X'.
326       ev_type = 'E'.
327       ev_message = ev_message && ls_return-message && ';'.
328     ENDLOOP.
329 
330   ENDIF .
331 
332 ENDFUNCTION.