文章中 “*&”可能被替換成“&”了,使用時請注意。
&---------------------------------------------------------------------
*& Report ZFIE007
&---------------------------------------------------------------------
*& 規則憑證批量部分自動清賬
*& author yuchun 2020-7-14
&---------------------------------------------------------------------
REPORT zfie007_2.
TABLES:bseg,bsegz,bkpf,sscrfields.
DATA:
gt_ftpost TYPE STANDARD TABLE OF ftpost INITIAL SIZE 0,
gt_ftclear TYPE STANDARD TABLE OF ftclear INITIAL SIZE 0,
gt_blntab TYPE STANDARD TABLE OF blntab INITIAL SIZE 0,
gt_bsid_clearing TYPE STANDARD TABLE OF bsid INITIAL SIZE 0,
gt_bkpf TYPE TABLE OF bkpf,
gt_bseg TYPE STANDARD TABLE OF bseg,
gt_fttax TYPE STANDARD TABLE OF fttax INITIAL SIZE 0,
gt_msg TYPE TABLE OF string. " 返回的清賬消息
DATA:gs_ftpost LIKE LINE OF gt_ftpost,
gs_ftclear LIKE LINE OF gt_ftclear,
gs_blntab LIKE LINE OF gt_blntab,
gs_bkpf LIKE LINE OF gt_bkpf,
gs_bseg LIKE LINE OF gt_bseg,
lc_count TYPE i VALUE '001',
gs_msg_type TYPE char1 VALUE 'E',
gs_msg LIKE LINE OF gt_msg .
&---------------待清公司、客戶、金額 的列表 的結構-------------------------
DATA: BEGIN OF ty_b_kunnr,
bukrs TYPE bseg-bukrs, "公司
kunnr TYPE bseg-kunnr, "客戶
saknr TYPE bseg-saknr, "科目
zuonr TYPE bseg-zuonr, "分配字段
dmbtr_s TYPE bseg-dmbtr, "S方 總金額
dmbtr_h TYPE bseg-dmbtr, "H方 總金額
dmbtr_jz TYPE bseg-dmbtr, "本次結轉金額
END OF ty_b_kunnr.
DATA:
gt_b_kunnr LIKE TABLE OF ty_b_kunnr,
gs_b_kunnr LIKE LINE OF gt_b_kunnr
.
SELECTION-SCREEN: FUNCTION KEY 1.
&---------------------------------------------------------------------
*& 構建搜索條件
&---------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE TEXT-002.
SELECT-OPTIONS:
s_bukrs FOR bseg-bukrs,
s_kunnr FOR bseg-kunnr,
s_zuonr FOR bseg-zuonr.
SELECTION-SCREEN END OF BLOCK a1.
&---------------------------------------------------------------------
*& 構建文字幫助描述
&---------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK a2 WITH FRAME TITLE text_101.
SELECTION-SCREEN COMMENT /1(79) text_102.
SELECTION-SCREEN COMMENT /1(79) text_103.
SELECTION-SCREEN END OF BLOCK a2.
INITIALIZATION.
text_101 = '特別注意:'.
text_102 = '>手工執行請選擇公司' .
text_103 = '>可選擇輸入客戶、分配字段'.
AT SELECTION-SCREEN OUTPUT.
START-OF-SELECTION.
IF s_bukrs IS INITIAL.
MESSAGE i208(00) WITH '請選擇-公司'
DISPLAY LIKE 'E'.
RETURN.
ENDIF.
&---------------------------------------------------------------------
*& 根據輸入參數獲取對應的待清客戶數據列表
&---------------------------------------------------------------------
PERFORM frm_get_data.
&---------------------------------------------------------------------
*& 根據待清客戶數據列表去組裝數據並執行兩清
&---------------------------------------------------------------------
PERFORM frm_do_clear.
*--全部成功就輸出憑證編碼等信息
LOOP AT gt_msg INTO gs_msg.
WRITE : gs_msg .
ENDLOOP.
END-OF-SELECTION.
INCLUDE zfie007_2_frm."" 接 下文 ,去創建這個名字的文件
&---------------------------------------------------------------------
*&**INCLUDE ZFIE007_2_FRM.
&---------------------------------------------------------------------
&---------------------------------------------------------------------
*& Form frm_get_data
&---------------------------------------------------------------------
*& 獲取根據 公司、客戶、科目、分配字段、 借匯總金額、貸匯總金額
&---------------------------------------------------------------------
FORM frm_get_data.
SELECT
main~bukrs
main~kunnr
main~saknr
main~zuonr
SUM( main_s~dmbtr ) AS dmbtr_s
SUM( main_h~dmbtr ) AS dmbtr_h
INTO CORRESPONDING FIELDS OF TABLE gt_b_kunnr
FROM bseg AS main
INNER JOIN but000 AS k_tab ON main~kunnr = k_tab~partner
AND k_tab~bu_group = 'C001'
LEFT JOIN bseg AS main_s ON main~bukrs = main_s~bukrs
AND main~belnr = main_s~belnr
AND main~gjahr = main_s~gjahr
AND main~buzei = main_s~buzei
AND main_s~shkzg = 'S'
LEFT JOIN bseg AS main_h ON main~bukrs = main_h~bukrs
AND main~belnr = main_h~belnr
AND main~gjahr = main_h~gjahr
AND main~buzei = main_h~buzei
AND main_h~shkzg = 'H'
WHERE
"沒有清賬憑證
main~augbl = ''
" 分配字段不允許為空
AND main~zuonr <> ''
"僅選這兩個科目
AND main~saknr IN ( '1122011000','1122010000' )
AND main~bukrs IN s_bukrs
AND main~kunnr IN s_kunnr
AND main~zuonr IN s_zuonr
GROUP BY main~bukrs main~kunnr main~saknr main~zuonr
"k_tab~bu_group
HAVING SUM( main_s~dmbtr ) <> 0 AND SUM( main_h~dmbtr ) <> 0.
IF gt_b_kunnr IS INITIAL.
MESSAGE i208(00) WITH '未獲取到 bseg 中可兩清的公司與客戶的數據' DISPLAY LIKE 'E'.
RETURN.
ELSE.
SORT gt_b_kunnr BY bukrs kunnr.
ENDIF.
ENDFORM.
&---------------------------------------------------------------------
*& Form frm_get_bseg_item
&---------------------------------------------------------------------
*& 獲取根據 公司、客戶、科目、分配字段、借|貸方向、金額 獲取金額數據
&---------------------------------------------------------------------
FORM frm_get_bseg_item USING ls_p_bukrs TYPE bseg-bukrs
ls_p_kunnr TYPE bseg-kunnr
ls_p_saknr TYPE bseg-saknr
ls_p_zuonr TYPE bseg-zuonr
ls_p_shkzg TYPE bseg-shkzg
ls_p_dmbtr TYPE bseg-dmbtr
CHANGING ls_p_1 LIKE ty_b_kunnr.
DATA: ls_total_dmbtr TYPE bseg-dmbtr, "累加的總金額
ls_now_dmbtr TYPE bseg-dmbtr, "當前計算的臨時金額
ls_reverse_dmbtr TYPE bseg-dmbtr, "對向分錄的總金額
ls_bkf_map_str TYPE string VALUE '',
ls_shkzg TYPE bseg-shkzg VALUE '',
lt_bseg TYPE TABLE OF bseg.
CLEAR:lt_bseg[],gs_bseg.
IF ls_p_shkzg EQ 'S'.
ls_shkzg = 'H'.
ELSE .
ls_shkzg = 'S'.
ENDIF.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_bseg
FROM bseg AS main
WHERE
main~augbl = '' "沒有清賬憑證
AND main~saknr = ls_p_saknr "科目
AND main~bukrs = ls_p_bukrs "公司賬套
AND main~kunnr = ls_p_kunnr "客戶
AND ( main~shkzg = ls_p_shkzg OR main~shkzg = ls_shkzg ) "借貸
AND main~zuonr = ls_p_zuonr "分配字段
ORDER BY h_budat ASCENDING belnr ASCENDING buzei ASCENDING.
ls_total_dmbtr = 0.
*--按照先進先出 從臨時 bseg 中篩選符合的數據到 待清BAPI表中
LOOP AT lt_bseg INTO gs_bseg.
ls_now_dmbtr = 0."當前計算可金額
IF gs_bseg-shkzg = ls_p_shkzg.
"如果是同向的bseg行項目,則全部寫入到待清BAPI表
APPEND gs_bseg TO gt_bseg.
ELSE.
"如果不是同向的bseg行項目,則計算金額再寫入到待清BAPI表
IF ls_total_dmbtr GE ls_p_dmbtr.
CONTINUE.
ENDIF.
"保存對向總金額,用於計算兩清剩余金額
ls_reverse_dmbtr = ls_reverse_dmbtr + gs_bseg-dmbtr .
IF ls_total_dmbtr + gs_bseg-dmbtr LE ls_p_dmbtr.
"當加上 當前baeg的金額 小於等於 待清總額 就直接取 bseg金額
ls_now_dmbtr = gs_bseg-dmbtr.
ELSE .
"當加上 當前baeg的金額 大於 待清總額 就直接取 (待清金額-已計算待清金額的差額)
ls_now_dmbtr = ls_p_dmbtr - ls_total_dmbtr.
ENDIF.
"gs_bseg-dmbtr = ls_now_dmbtr.
"gs_bseg-wrbtr = ls_now_dmbtr.
ls_total_dmbtr = ls_total_dmbtr + ls_now_dmbtr.
APPEND gs_bseg TO gt_bseg.
ENDIF.
*--追加 bkpf 憑證編號查詢條件
ls_bkf_map_str = ls_bkf_map_str
&& ' ( BELNR = ''' && gs_bseg-belnr && ''''
&& ' AND GJAHR = ''' && gs_bseg-gjahr && ''') OR ' .
CLEAR : gs_bseg,ls_now_dmbtr.
ENDLOOP.
IF gt_bseg IS INITIAL.
MESSAGE i208(00) WITH '未獲取到指定公司、客戶下的 bseg 中可兩清的數據' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
"將傳入的金額與對向總金額相減,得到兩清剩余金額
ls_p_1-dmbtr_jz = abs( ls_p_dmbtr - ls_reverse_dmbtr ).
ls_bkf_map_str = '(' && condense( val = ls_bkf_map_str
del = 'OR') && ')'.
SELECT *
INTO TABLE gt_bkpf
FROM bkpf
WHERE
bukrs = ls_p_bukrs
AND (ls_bkf_map_str).
ENDFORM.
&---------------------------------------------------------------------
*& Form frm_do_clear
&---------------------------------------------------------------------
*& 根據待清客戶數據列表循環對客戶進行兩清
&---------------------------------------------------------------------
FORM frm_do_clear.
DATA:
ls_shkzg TYPE bseg-shkzg,
ls_wrbtr TYPE bseg-wrbtr.
*--循環客戶編碼
LOOP AT gt_b_kunnr INTO gs_b_kunnr.
CLEAR:gt_bseg[],gs_bseg,gt_bkpf[],gs_bkpf.
IF gs_b_kunnr-dmbtr_s GT gs_b_kunnr-dmbtr_h.
"當 S方 > H方 則沖銷 H方的金額
ls_shkzg = 'H'.
ls_wrbtr = gs_b_kunnr-dmbtr_s - gs_b_kunnr-dmbtr_h.
PERFORM frm_get_bseg_item USING gs_b_kunnr-bukrs
gs_b_kunnr-kunnr
gs_b_kunnr-saknr
gs_b_kunnr-zuonr
ls_shkzg
gs_b_kunnr-dmbtr_h
CHANGING gs_b_kunnr.
ELSEIF gs_b_kunnr-dmbtr_s LT gs_b_kunnr-dmbtr_h.
"當 S方 < H方 則沖銷 S方的金額
ls_shkzg = 'S'.
ls_wrbtr = gs_b_kunnr-dmbtr_h - gs_b_kunnr-dmbtr_s.
PERFORM frm_get_bseg_item USING gs_b_kunnr-bukrs
gs_b_kunnr-kunnr
gs_b_kunnr-saknr
gs_b_kunnr-zuonr
ls_shkzg
gs_b_kunnr-dmbtr_s
CHANGING gs_b_kunnr.
ENDIF.
&---------------------------------------------------------------------
*& 准備好的數據開始-執行兩清
&---------------------------------------------------------------------
PERFORM frm_clear_data TABLES gt_bseg
gt_bkpf
USING gs_b_kunnr-dmbtr_jz
ls_shkzg.
CLEAR:gs_b_kunnr,ls_shkzg.
ENDLOOP.
ENDFORM.
&---------------------------------------------------------------------
*& Form frm_clear_data
&---------------------------------------------------------------------
*& 執行兩清
&---------------------------------------------------------------------
*& tables tab_bseg 被清項的bseg
*& tab_bkpf 被清項的bkpf
*& using ls_wrbtr 剩余項金額
*& ls_shkzg 當前清的是“S||H ”
&---------------------------------------------------------------------
FORM frm_clear_data TABLES tab_bseg STRUCTURE bseg
tab_bkpf STRUCTURE bkpf
USING ls_p_wrbtr TYPE bseg-wrbtr
ls_p_shkzg TYPE bseg-shkzg.
DATA: ls_shkzg TYPE bseg-shkzg.
CONSTANTS: lc_header TYPE c VALUE 'K', "Header
lc_item TYPE c VALUE 'P' "Item
.
CLEAR:gt_ftpost[],gt_ftclear[],gt_blntab[],
gt_fttax[],gs_ftpost,gs_ftclear,
gs_msg,gs_bseg,gs_bkpf.
DEFINE populate_ftpost.
gs_ftpost-stype = &1. "K為header,P為item.
gs_ftpost-count = &2. "憑證抬頭或行項目的計數器(記帳界面).
gs_ftpost-fnam = &3. "BDC 字段名.
gs_ftpost-fval = &4. "BDC 字段值.
IF gs_ftpost-fnam EQ 'BSEG-WRBTR' ."當是金額字段時,去掉左邊的 空格
SHIFT gs_ftpost-fval LEFT DELETING LEADING space.
ENDIF.
APPEND gs_ftpost TO gt_ftpost.
CLEAR gs_ftpost.
END-OF-DEFINITION.
DEFINE populate_ftclear.
gs_ftclear-agkoa = &1. "清賬條件:科目類型
gs_ftclear-agbuk = &2. "清賬條件:公司代碼
gs_ftclear-xnops = &3. "清賬條件:標准未清項目
gs_ftclear-agums = &4. "用於選擇的特殊總帳標識符
gs_ftclear-selfd = &5. "附加字段:BELNR 憑證編號
CONCATENATE &6 &7 &8
INTO gs_ftclear-selvon."選擇未清項目的搜索標准的輸入字段
gs_ftclear-agkon = &9. "清賬條件:科目
APPEND gs_ftclear TO gt_ftclear.
CLEAR gs_ftclear.
END-OF-DEFINITION.
-----組裝post & clear---------------------------------------------------
lc_count = 0.
LOOP AT tab_bkpf INTO gs_bkpf.
"不同的憑證不同的頭
lc_count = lc_count + 1.
populate_ftpost lc_header lc_count 'BKPF-BUKRS' gs_bkpf-bukrs.
populate_ftpost lc_header lc_count 'BKPF-BLART' 'Z4'.
populate_ftpost lc_header lc_count 'BKPF-BLDAT' sy-datum.
populate_ftpost lc_header lc_count 'BKPF-BUDAT' sy-datum.
populate_ftpost lc_header lc_count 'BKPF-WAERS' gs_bkpf-waers.
populate_ftpost lc_header lc_count 'BKPF-XBLNR' gs_bkpf-belnr."憑證號
populate_ftpost lc_header lc_count 'BKPF-BKTXT' '系統部分清賬'.
CLEAR gs_bkpf.
ENDLOOP.
lc_count = 0.
LOOP AT tab_bseg INTO gs_bseg.
*----clear item data----
populate_ftclear 'D'
gs_bseg-bukrs
'X'
''
'belnr'
gs_bseg-belnr
gs_bseg-gjahr
gs_bseg-buzei
gs_bseg-kunnr.
*-----post item Data-----
lc_count = lc_count + 1.
populate_ftpost lc_item lc_count 'RF05A-NEWBS' '07'."bseg-BSCHL 記賬碼
populate_ftpost lc_item lc_count 'RF05A-NEWUM' ''. "SGL標識
populate_ftpost lc_item lc_count 'RF05A-NEWBW' ''. "資產業務類型
"使用客戶代替科目 下一 行項目所過賬到的科目。可以輸入匹配代碼而非科目號。
populate_ftpost lc_item lc_count 'BSEG-KUNNR' gs_bseg-kunnr.
populate_ftpost lc_item lc_count 'BSEG-GSBER' gs_bseg-bukrs."業務范圍
populate_ftpost lc_item lc_count 'BSEG-SGTXT' '自動部分清賬'. "文本
"populate_ftpost lc_item lc_count 'BSEG-WRBTR' gs_bseg-wrbtr. "金額
populate_ftpost lc_item lc_count 'BSEG-ZUONR' gs_bseg-zuonr. "分配
populate_ftpost lc_item lc_count 'BSEG-ZFBDT' gs_bseg-zfbdt. "付款起算日期
populate_ftpost lc_item lc_count 'BSEG-ZLSCH' ''. "付款方式
CLEAR gs_bseg.
ENDLOOP.
*--增加剩余項金額的行
IF ls_p_wrbtr GT 0.
CLEAR :gs_bseg.
SORT tab_bseg BY shkzg ASCENDING h_budat DESCENDING belnr DESCENDING buzei DESCENDING.
IF ls_p_shkzg EQ 'H'.
ls_shkzg = 'S'.
ELSE.
ls_shkzg = 'H'.
ENDIF.
READ TABLE tab_bseg WITH KEY shkzg = ls_shkzg INTO gs_bseg.
IF gs_bseg IS INITIAL.
MESSAGE i208(00) WITH '生成bseg 兩清剩余項失敗' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
*-----post item Data-----
lc_count = lc_count + 1.
IF ls_shkzg EQ 'S' .
populate_ftpost lc_item lc_count 'RF05A-NEWBS' '07'."bseg-BSCHL 記賬碼 S
ELSE.
populate_ftpost lc_item lc_count 'RF05A-NEWBS' '15'."bseg-BSCHL 記賬碼 H
ENDIF.
populate_ftpost lc_item lc_count 'RF05A-NEWUM' ''. "SGL標識
populate_ftpost lc_item lc_count 'RF05A-NEWBW' ''. "資產業務類型
"使用客戶代替科目 下一 行項目所過賬到的科目。可以輸入匹配代碼而非科目號。
populate_ftpost lc_item lc_count 'BSEG-KUNNR' gs_bseg-kunnr.
populate_ftpost lc_item lc_count 'BSEG-GSBER' gs_bseg-bukrs."業務范圍
populate_ftpost lc_item lc_count 'BSEG-SGTXT' '自動部分清賬'. "文本
populate_ftpost lc_item lc_count 'BSEG-WRBTR' ls_p_wrbtr. "金額
populate_ftpost lc_item lc_count 'BSEG-ZUONR' gs_bseg-zuonr. "分配
populate_ftpost lc_item lc_count 'BSEG-ZFBDT' gs_bseg-zfbdt. "付款起算日期
populate_ftpost lc_item lc_count 'BSEG-ZLSCH' ''. "付款方式
ENDIF.
CALL FUNCTION 'POSTING_INTERFACE_START'
EXPORTING
i_function = 'C'
i_keep = 'X'
i_mode = 'N' "A for step by step,N default,for background
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'
i_sgfunct = 'C'
IMPORTING
e_msgid = sy-msgid
e_msgno = sy-msgno
e_msgty = sy-msgty
e_msgv1 = sy-msgv1
e_msgv2 = sy-msgv2
e_msgv3 = sy-msgv3
e_msgv4 = sy-msgv4
TABLES
t_blntab = gt_blntab
t_ftclear = gt_ftclear
t_ftpost = gt_ftpost
t_fttax = gt_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.
CALL FUNCTION 'POSTING_INTERFACE_END'
EXPORTING
i_bdcimmed = 'X'
EXCEPTIONS
session_not_processable = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'POSTING_INTERFACE_END-ERROR:type:'
&& sy-subrc && ';msg:'
&& sy-msgty
&& sy-msgno
&& sy-msgv1
&& sy-msgv2
&& sy-msgv3
&& sy-msgv4 TYPE 'S'.
ENDIF.
READ TABLE gt_blntab INTO gs_blntab INDEX 1.
IF gs_blntab-belnr IS INITIAL.
gs_msg_type = 'E'.
IF sy-msgty IS INITIAL.
gs_msg = '未知異常.'.
ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO gs_msg WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ELSE.
*修改 bseg 中行 bg bu 信息
PERFORM frm_up_bseg TABLES tab_bseg
gt_blntab .
gs_msg_type = 'S'.
CONCATENATE '憑證號碼' gs_blntab-belnr '在公司代碼'
gs_blntab-bukrs '下記賬成功' INTO gs_msg.
ENDIF.
APPEND gs_msg TO gt_msg.
IF gs_msg_type EQ 'E'.
MESSAGE i208(00) WITH gs_msg DISPLAY LIKE 'E'.
RETURN.
ENDIF.
ENDFORM.
&---------------------------------------------------------------------
*& Form frm_up_bseg
&---------------------------------------------------------------------
*& 兩清后 修改 新憑證的 bg bu 字段
&---------------------------------------------------------------------
*& tables tab_bseg 被清項的bseg
*& using gs_blntab 兩清后的憑證信息
&---------------------------------------------------------------------
FORM frm_up_bseg TABLES tab_bseg STRUCTURE bseg
tab_blntab STRUCTURE blntab.
DATA :
lt_errtab TYPE tpit_t_errdoc WITH HEADER LINE,
lt_fldtab TYPE tpit_t_fname WITH HEADER LINE,
lt_buztab TYPE tpit_t_buztab WITH HEADER LINE.
DATA:
lv_message TYPE t100-text,
wa_bseg TYPE bseg, "傳入到FI_ITEMS_MASS_CHANGE中的工作區
wa_data TYPE bseg, "傳入到替代中的工作區
wa_key TYPE c,
wa_total_line TYPE i.
CLEAR:gs_blntab,gs_bseg,lt_buztab[].
READ TABLE tab_blntab INDEX 1 INTO gs_blntab.
DESCRIBE TABLE tab_bseg LINES wa_total_line.
" 取最后一行
READ TABLE tab_bseg INDEX wa_total_line INTO gs_bseg.
IF gs_bseg IS INITIAL OR gs_blntab IS INITIAL.
CLEAR gs_msg.
gs_msg = '獲取gs_bseg或者gs_blntab失敗,無法修改BG BU,但兩清已執行成功'.
APPEND gs_msg TO gt_msg.
RETURN.
ENDIF.
""當不存在 BG BU 業務類型時,也需要執行分配字段的補充
lt_fldtab[] = VALUE #(
( fname = 'ZUONR')
*--這里不能修改 起算日期--
*-- ( fname = 'ZFBDT')
( fname = 'ZZCFBG') " 這是自有的擴展字段
( fname = 'ZZCFBU') " 這是自有的擴展字段
( fname = 'ZZTYPENO') " 這是自有的擴展字段
).
*--修改的對應字段值 Field value
wa_bseg-zuonr = gs_bseg-zuonr.
*--這里不能修改 起算日期
- "wa_bseg-zfbdt = gs_bseg-zfbdt.
wa_bseg-zzcfbg = gs_bseg-zzcfbg.
wa_bseg-zzcfbu = gs_bseg-zzcfbu.
wa_bseg-zztypeno = gs_bseg-zztypeno.
*--獲取清賬的剩余項憑證編號獲取bseg
SELECT *
FROM bseg
INTO CORRESPONDING FIELDS OF TABLE lt_buztab
WHERE belnr = gs_blntab-belnr
AND gjahr = gs_blntab-gjahr
AND bukrs = gs_blntab-bukrs.
IF lt_buztab[] IS INITIAL.
CLEAR gs_msg.
gs_msg = gs_blntab-bukrs
&& gs_blntab-belnr
&& '根據兩清數據獲取bseg失敗,無法修改BG BU,但兩清已執行成功'.
APPEND gs_msg TO gt_msg.
RETURN.
ENDIF.
READ TABLE lt_buztab INDEX 1 INTO lt_buztab.
CLEAR wa_data.
"組裝 wa_data
wa_data-bukrs = lt_buztab-bukrs."被修改的憑證數據
wa_data-belnr = lt_buztab-belnr."被修改的憑證數據
wa_data-gjahr = lt_buztab-gjahr."被修改的憑證數據
wa_data-zuonr = gs_bseg-zuonr.
wa_data-zfbdt = gs_bseg-zfbdt.
wa_data-zzcfbg = gs_bseg-zzcfbg.
wa_data-zzcfbu = gs_bseg-zzcfbu.
wa_data-zztypeno = gs_bseg-zztypeno.
--------------------------------------------------------------------
-- ZRGGBR000 - u9005 里面使用的標志,用於區分系統與該程序-----------
-- ZRGGBR000 - u9005 里面使用的session key,用於區分系統與該程序----
--------------------------------------------------------------------
wa_key = 'K'.
----import 的地方需要引用相同的變量名(wa_key || wa_data)。-----
EXPORT wa_key TO MEMORY ID 'ZFIE007_2_key'.
EXPORT wa_data TO MEMORY ID 'ZFIE007_2'.
CALL FUNCTION 'FI_ITEMS_MASS_CHANGE'
EXPORTING
s_bseg = wa_bseg " 要修改的字段對應的值
IMPORTING
errtab = lt_errtab[]
TABLES
it_buztab = lt_buztab[] " bseg 表的數據內表
it_fldtab = lt_fldtab " 要修改的字段內表
EXCEPTIONS
bdc_errors = 1
OTHERS = 2.
IF sy-subrc NE 0.
READ TABLE lt_errtab INDEX 1.
IF sy-subrc EQ 0.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = lt_errtab-err-msgid
lang = sy-langu
no = lt_errtab-err-msgnr
v1 = lt_errtab-err-msgv1
v2 = lt_errtab-err-msgv2
v3 = lt_errtab-err-msgv3
v4 = lt_errtab-err-msgv4
IMPORTING
msg = lv_message
EXCEPTIONS
not_found = 1
OTHERS = 2.
APPEND lt_buztab-belnr && lv_message TO gt_msg.
RETURN.
ENDIF.
ENDIF.
FREE MEMORY ID 'ZFIE007_2_key'.
FREE MEMORY ID 'ZFIE007_2'.
ENDFORM.