sap 部分清账+调用替代更新bseg凭证


文章中 “*&”可能被替换成“&”了,使用时请注意。

&---------------------------------------------------------------------
*& 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.


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM