程序片:
程序片:ZTRR0090
report ztrr0090.
include ztri00090_top. "类型及内表申明
include ztri_popmesag. "错误信息
include ztri00090_con. "主程序流
include ztri00090_pbo. "PBO
include ztri00090_pai. "PAI
include ztri00090_tra. "通信日志
include ztri_tranmseg. "展示报文
include ztri00090_rpy. "重新付款处理
include ztri_down_line. "检查线下未清项处理
include ztri00090_frms. "调用forms
程序片:ZTRI00090_CON:
*&---------------------------------------------------------------------*
*& 包含 ZTRI00090_CON
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& 选择屏幕 *
*&---------------------------------------------------------------------*
selection-screen begin of block block1 with frame title t1.
parameters : p_bukrs like t001-bukrs obligatory default ''.
select-options: s_zappn for zcm_t_008-zappn,
s_zapps for zcm_t_008-zapps,
s_zcomu for zcm_t_008-zcomu,
s_erdat for zcm_t_008-erdat.
selection-screen skip.
select-options: s_zoaid for zcm_t_001-zoaid.
select-options: s_zstat for zcm_t_001-zstat .
"用于排除部分状态
select-options : r_zstat for zcm_t_001-zstat no-display,
r_zshst for zcm_t_001-zstat no-display, "可以选择的
r_delst for zcm_t_001-zstat no-display, "可以删除状态
r_locks for zcm_t_001-zstat no-display, "需要加锁状态
r_zappn for zcm_t_008-zappn no-display. "OA-审批编号
selection-screen end of block block1.
*&---------------------------------------------------------------------*
*& 初始化选择屏幕 *
*&---------------------------------------------------------------------*
initialization.
t1 = text-001.
*&---------------------------------------------------------------------*
*& 开始选择屏幕 *
*&---------------------------------------------------------------------*
start-of-selection.
clear gv_subrc.
"权限检查
perform frm_authority_check.
check gv_subrc is initial.
"检查是否有线下付款的数据清账
perform check_down_all.
"获得查询数据
perform get_show_data.
*&---------------------------------------------------------------------*
*& 结束选择屏幕 *
*&---------------------------------------------------------------------*
end-of-selection.
*&---------------------------------------------------------------------*
*& Form GET_SHOW_DATA
*&---------------------------------------------------------------------*
* text 获得查询数据展示
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_show_data .
"得到审批批次数据
perform frm_get_appdata.
"调用功能屏幕
if gt_zapps is not initial.
sort gt_zapps by zappn descending.
"调用主功能屏幕
call screen 9000.
else.
message s018(zcm_m001) with text-002 display like 'E'.
"调用主功能屏幕,可以进行查询等操作
call screen 9000.
endif.
endform. " GET_SHOW_DATA
*&---------------------------------------------------------------------*
*& Form FRM_GET_ZSTATX
*&---------------------------------------------------------------------*
* text 得到项目状态描述
*----------------------------------------------------------------------*
* -->P_ZSTAT text
* <--P_ZSTAX text
*----------------------------------------------------------------------*
form frm_get_zstatx using p_zstat changing p_zstax.
"得到域值
if gt_ddv1 is initial.
g_domname = 'ZSTAT_D'.
call function 'DD_DOMA_GET'
exporting
domain_name = g_domname
tables
dd07v_tab_a = gt_ddv1
dd07v_tab_n = gt_ddv2
exceptions
illegal_value = 1
op_failure = 2
others = 3.
endif.
"得到项目状态描述
read table gt_ddv1 into gw_ddv1 with key
domvalue_l = p_zstat.
if sy-subrc = 0.
p_zstax = gw_ddv1-ddtext. "状态描述
clear : gw_ddv1.
endif.
endform. " FRM_GET_ZSTATX
*&---------------------------------------------------------------------*
*& Form FRM_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
* text 权限检查
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_authority_check .
"检查公司代码权限对象
authority-check object 'F_BKPF_BUK' id 'BUKRS' field p_bukrs
id 'ACTVT' dummy.
if sy-subrc <> 0.
"您没有当前公司代码权限
message s061(ztrm001) display like 'E'.
gv_subrc = 4.
exit.
endif.
endform. " FRM_AUTHORITY_CHECK
*----------以下为FORM调用----------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_SELECT
*&---------------------------------------------------------------------*
* text 处理付款申请勾选和取消勾选事件
*----------------------------------------------------------------------*
* -->P_VALUE text
*----------------------------------------------------------------------*
form frm_handle_select using p_index changing pw_zapps like gw_zapps.
data : e_flag type c.
data : lw_apps type ty_zapps.
data : e_index like sy-tabix.
clear : e_flag.
"锁机制
perform frm_addorre_lock using pw_zapps p_index
changing e_flag.
"加锁/解锁成功
if e_flag is not initial.
"展示加锁不成功报错消息
perform frm_show_mseg.
"恢复勾选/取消勾选状态
if pw_zapps-zchbx = 'X'. "勾选
pw_zapps-zchbx = ''.
else. "取消勾选
pw_zapps-zchbx = 'X'.
endif.
endif.
endform. " FRM_HANDLE_SELECT
*&---------------------------------------------------------------------*
*& Form FRM_ADD_ORRELOCK
*&---------------------------------------------------------------------*
* text 加锁或者解锁
*----------------------------------------------------------------------*
* -->PW_PAYRE text
* <--P_FLAG text
*----------------------------------------------------------------------*
form frm_addorre_lock using pw_zapps like gw_zapps p_index
changing p_flag.
data : lt_zmseg type table of ty_zmesg.
clear : gw_zmseg,lt_zmseg.
"需要加锁的状态
perform frm_add_lockstat.
if pw_zapps-zchbx = 'X'.
"针对需要加锁的状态加锁
if pw_zapps-zapps in r_locks.
"加锁
call function 'ENQUEUE_EZ_TCM_008'
exporting
mode_zcm_t_008 = 'E'
zappn = pw_zapps-zappn
_scope = '1'
exceptions
foreign_lock = 1
system_failure = 2
others = 3.
if sy-subrc <> 0.
gw_zmseg-tabix = p_index.
gw_zmseg-ztype = 'E'.
"消息
concatenate text-005 pw_zapps-zappn ','
text-012 sy-msgv1
text-031 into gw_zmseg-zmesg.
append gw_zmseg to lt_zmseg.
clear : gw_zmseg.
endif.
endif.
elseif pw_zapps-zchbx is initial.
do 20 times.
call function 'DEQUEUE_EZ_TCM_008'
exporting
mode_zcm_t_008 = 'E'
mandt = sy-mandt
zappn = pw_zapps-zappn
_scope = '1'.
if sy-subrc = 0.
exit.
else.
wait up to '0.2' seconds.
endif.
enddo.
endif.
"加锁或解锁不成功
if lt_zmseg is not initial.
append lines of lt_zmseg to gt_zmseg.
p_flag = 'F'.
clear : lt_zmseg.
endif.
endform. " FRM_ADD_LOCK
*&---------------------------------------------------------------------*
*& Form FRM_AFTER_PAYSELCT
*&---------------------------------------------------------------------*
* text 勾选之后的数据处理
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_after_payselct .
"得到付款申请数据
perform frm_get_payask_data using ''.
"刷新ALV
perform refresh_table_display using pay_alv_grid.
"刷新ALV
perform refresh_table_display using app_alv_grid.
endform. " FRM_AFTER_PAYSELCT
*&---------------------------------------------------------------------*
*& Form FRM_GET_PAYASK_DATA
*&---------------------------------------------------------------------*
* text 得到付款申请数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_get_payask_data using p_flag .
data : e_exist_pay type c.
data : e_index like sy-tabix.
data : e_lines type i.
clear : gt_payre,gw_payre,gt_zmseg,gt_s008.
"检查是否有线下付款的数据清账
* perform check_down_data.
"得到付款申请数据
perform frm_get_paydata.
"付款申请行数
e_lines = lines( it_payre ).
"针对勾选的数据
loop at gt_zapps into gw_zapps where zchbx = 'X'.
clear : e_exist_pay.
e_index = sy-tabix.
loop at it_payre into gw_payre where zappn = gw_zapps-zappn.
"得到项目状态描述
perform frm_get_zstatx using gw_payre-zstat
changing gw_payre-zstax.
if p_flag <> 'BK'. "付款失败数据返回时不计算账面余额
"获得供应商/客户账面余额
perform frm_get_bbalance changing gw_payre.
endif.
append gw_payre to gt_payre.
clear : gw_payre.
e_exist_pay = 'X'.
endloop.
"没有符合付款的数据
if e_exist_pay is initial.
"记录错误
gw_zmseg-ztype = 'E'.
concatenate text-005 gw_zapps-zappn ','
text-032 into gw_zmseg-zmesg.
append gw_zmseg to gt_zmseg.
clear : gw_zmseg.
"解锁
perform frm_remove_lock using gw_zapps.
"当前界面删除此行
delete gt_zapps index e_index.
move-corresponding gw_zapps to gw_s008.
gw_s008-zdelf = 'X'.
append gw_s008 to gt_s008.
endif.
clear : gw_zapps,e_exist_pay.
endloop.
"更新审批流数据
if gt_s008 is not initial.
do 10 times.
modify zcm_t_008 from table gt_s008.
if sy-subrc = 0.
commit work.
exit.
else.
wait up to '0.2' seconds.
endif.
enddo.
endif.
"展示消息,刷新界面
if gt_zmseg is not initial.
perform frm_show_mseg.
endif.
endform. " FRM_GET_PAYASK_DATA
*&---------------------------------------------------------------------*
*& Form FRM_WRITE_OPLOG
*&---------------------------------------------------------------------*
* text 记录操作日志
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_write_oplog using p_option.
data : lt_paylg type table of zcm_t_003,
lw_paylg like line of lt_paylg.
data : e_task type string.
clear : lw_paylg,lt_paylg.
"得到操作数据
loop at gt_payre into gw_payre.
lw_paylg-bukrs = gw_payre-bukrs.
lw_paylg-gjahr = gw_payre-gjahr.
lw_paylg-zoaid = gw_payre-zoaid.
lw_paylg-belnr = gw_payre-zpayv.
* lw_paylg-buzei = gw_payre-buzei.
lw_paylg-znewv = gw_payre-zstat. "新状态
lw_paylg-zoldv = gw_payre-zolds. "旧状态
lw_paylg-zappn = gw_payre-zappn. "审批编号
lw_paylg-zactn = p_option. "操作
lw_paylg-erdat = sy-datum.
lw_paylg-cputm = sy-uzeit.
lw_paylg-ernam = sy-uname.
append lw_paylg to lt_paylg.
clear : gw_payre,lw_paylg.
endloop.
"保存日志数据
if lt_paylg is not initial.
* "启用多线程保存日志
* PERFORM frm_save_optlog TABLES lt_paylg.
concatenate sy-uname sy-uzeit into e_task.
call function 'ZCM_EHQ00110'
starting new task e_task
destination in group default
tables
t_logtab = lt_paylg.
clear : lt_paylg.
endif.
endform. " FRM_WRITE_OPLOG
*&---------------------------------------------------------------------*
*& Form FRM_SET_TAB_ATTR
*&---------------------------------------------------------------------*
* text 设计弹框字段
*----------------------------------------------------------------------*
* <--P_GT_FLDS text
*----------------------------------------------------------------------*
form frm_set_tab_attr changing p_budat p_recode.
data : lt_flds type ty_t_sval.
data : lw_sval type sval.
data : cn_dlg_tit type string .
cn_dlg_tit = text-008.
* set each field's attribute
define set_fld_attr.
lw_sval-tabname = 'BKPF'.
lw_sval-fieldname = &1.
lw_sval-field_obl = 'X'.
APPEND lw_sval TO lt_flds.
CLEAR lw_sval.
end-of-definition.
set_fld_attr: 'BUDAT'.
"调用对话框
call function 'POPUP_GET_VALUES'
exporting
popup_title = cn_dlg_tit
importing
returncode = p_recode
tables
fields = lt_flds
exceptions
error_in_fields = 1
others = 2.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
"得到输入的过账日期
loop at lt_flds into lw_sval.
if lw_sval-fieldname = 'BUDAT'.
p_budat = lw_sval-value.
endif..
endloop.
endform. " FRM_SET_TAB_ATTR
*&---------------------------------------------------------------------*
*& Form FRM_SET_TAB_ATTR
*&---------------------------------------------------------------------*
* text 得到签名时间,测试使用
*----------------------------------------------------------------------*
* <--P_GT_FLDS text
*----------------------------------------------------------------------*
form frm_get_sign_date changing p_date p_recode.
data : lt_flds type ty_t_sval.
data : lw_sval type sval.
data : cn_dlg_tit type string .
* cn_dlg_tit = text-008.
* set each field's attribute
define set_fld_attr.
lw_sval-tabname = 'BKPF'.
lw_sval-fieldname = &1.
lw_sval-field_obl = 'X'.
APPEND lw_sval TO lt_flds.
CLEAR lw_sval.
end-of-definition.
set_fld_attr: 'BUDAT'.
"调用对话框
call function 'POPUP_GET_VALUES'
exporting
popup_title = cn_dlg_tit
importing
returncode = p_recode
tables
fields = lt_flds
exceptions
error_in_fields = 1
others = 2.
if sy-subrc <> 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.
"得到输入的过账日期
loop at lt_flds into lw_sval.
if lw_sval-fieldname = 'BUDAT'.
p_date = lw_sval-value.
endif.
endloop.
endform. " FRM_SET_TAB_ATTR
*&---------------------------------------------------------------------*
*& Form FRM_POST_BASE_DATA
*&---------------------------------------------------------------------*
* text 得到过账基础数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_post_base_data .
data: begin of lt_zuonr occurs 0,
zuonr type bsid-zuonr,
end of lt_zuonr.
if gt_payre is not initial.
"得到未清项数据,用来取BSIK,BSID
select
*
into corresponding fields of table gt_uncle
from zcm_t_002
for all entries in gt_payre "当前付款对应的所有OA申请
where zoaid = gt_payre-zoaid and zdelf = '' .
"客户名称
select
kunnr as zfknn
name1
into corresponding fields of table gt_fknam
from kna1
for all entries in gt_payre
where kunnr = gt_payre-kunnr.
"应商名称
select
lifnr as zfknn
name1
appending corresponding fields of table gt_fknam
from lfa1
for all entries in gt_payre
where lifnr = gt_payre-lifnr.
endif.
"得到供应商和客户编号
loop at gt_uncle into gw_uncle.
if gw_uncle-lifnr is not initial.
gw_uncle-zlknn = gw_uncle-lifnr.
elseif gw_uncle-kunnr is not initial.
gw_uncle-zlknn = gw_uncle-kunnr.
endif.
"客户或者供应商名称
read table gt_fknam into gw_fknam with key zfknn = gw_uncle-zlknn.
if sy-subrc = 0.
gw_uncle-name1 = gw_fknam-name1.
endif.
modify gt_uncle from gw_uncle.
clear gw_uncle.
endloop.
"得到过账所需基础数据
if gt_uncle is not initial.
"bsik
select
bukrs belnr gjahr budat blart
buzei bschl lifnr as zlknn
hkont wrbtr
waers dmbtr rebzg rebzj rebzz
rstgr shkzg umskz zuonr zfbdt
into corresponding fields of table gt_post
from bsik
for all entries in gt_uncle
where bukrs = gt_uncle-bukrs and gjahr = gt_uncle-gjahr
and belnr = gt_uncle-belnr and buzei = gt_uncle-buzei
and lifnr = gt_uncle-lifnr.
"供应商标识
gw_post-zlkfg = 'K'.
modify gt_post from gw_post transporting zlkfg where zlkfg is initial.
"bsid
select
bukrs belnr gjahr budat blart
buzei bschl kunnr as zlknn
hkont wrbtr
waers dmbtr rebzg rebzj rebzz
rstgr shkzg umskz zuonr zfbdt
appending corresponding fields of table gt_post
from bsid
for all entries in gt_uncle
where bukrs = gt_uncle-bukrs and gjahr = gt_uncle-gjahr
and belnr = gt_uncle-belnr and buzei = gt_uncle-buzei
and kunnr = gt_uncle-kunnr.
"客户标识
gw_post-zlkfg = 'D'.
modify gt_post from gw_post transporting zlkfg where zlkfg is initial.
sort gt_post by bukrs gjahr zlknn belnr buzei .
if gt_post is not initial.
" TBSL
select
bschl shkzg koart xsonu
into corresponding fields of table gt_tbsl
from tbsl
for all entries in gt_post
where bschl = gt_post-bschl.
sort gt_tbsl by bschl shkzg koart.
delete adjacent duplicates from gt_tbsl comparing all fields.
"整合数据
loop at gt_post into gw_post.
read table gt_tbsl into gw_tbsl with key bschl = gw_post-bschl.
if sy-subrc = 0.
gw_post-koart = gw_tbsl-koart.
gw_post-bshkzg = gw_tbsl-shkzg.
gw_post-xsonu = gw_tbsl-xsonu.
modify gt_post from gw_post.
clear : gw_tbsl.
endif.
clear : gw_post.
endloop.
"表t074u
select
koart umskz umsks
into corresponding fields of table gt_t074u
from t074u
for all entries in gt_post
where koart = gt_post-koart and umskz = gt_post-umskz.
sort gt_t074u by koart umskz umsks.
delete adjacent duplicates from gt_t074u comparing all fields.
endif.
endif.
if gt_s019 is initial.
"记账码配置表
select
*
into corresponding fields of table gt_s019
from zcm_t_019 .
endif.
"得到资金安排数据
select
a~bukrs a~gjahr a~zoaid a~zsnro a~zlsch a~lifnr
a~kunnr a~zboen a~zpayn a~waers a~hbkid a~banka
a~hktid a~bankn a~refzl a~zstat a~zsort
b~zlsmk
into corresponding fields of table gt_cplan
from zcm_t_004 as a
join zcm_t_007 as b on b~zlsch = a~zlsch
for all entries in gt_payre
where bukrs = gt_payre-bukrs and zoaid = gt_payre-zoaid
and zdelf = ''.
sort it_payre by zoaid.
sort gt_cplan by zoaid zsnro.
if gt_cplan is not initial.
"得到对应的科目表:电付
select
zbukr hbkid zlsch waers hktid
ukont zsort
into corresponding fields of table gt_t042i
from zcm_zt042i
for all entries in gt_cplan
where zbukr = gt_cplan-bukrs and hbkid = gt_cplan-hbkid
and zlsch = gt_cplan-zlsch and waers = gt_cplan-waers
and hktid = gt_cplan-hktid and zsort = gt_cplan-zsort.
* 取GT_CPLAN-ZBOEN后18位用于取BSID数据
clear lt_zuonr[].
loop at gt_cplan into gw_cplan.
gv_len = 18.
gv_len1 = strlen( gw_cplan-zboen ).
if gv_len1 > gv_len.
gv_len2 = gv_len1 - gv_len.
lt_zuonr-zuonr = gw_cplan-zboen+gv_len2(gv_len).
else.
lt_zuonr-zuonr = gw_cplan-zboen.
endif.
append lt_zuonr.
clear: gw_cplan,lt_zuonr.
endloop.
sort lt_zuonr.
delete adjacent duplicates from lt_zuonr.
"得到对应的科目表:票付
select
zuonr kunnr belnr buzei gjahr zfbdt
into corresponding fields of table gt_bsidh
from bsid
for all entries in lt_zuonr "gt_cplan
where zuonr = lt_zuonr-zuonr "gt_cplan-zboen
and zuonr <> '' and shkzg = 'S'
.
endif.
endform. " FRM_POST_BASE_DATA
*&---------------------------------------------------------------------*
*& Form buchen_feld
*&---------------------------------------------------------------------*
* text 组织过账数据
*----------------------------------------------------------------------*
* -->FNAM text
* -->FVAL text
*----------------------------------------------------------------------*
form buchen_feld using fnam fval.
check fval ne space.
gt_ftpost-fnam = fnam.
write fval to gt_ftpost-fval.
append gt_ftpost.
endform. "buchen_feld
*&---------------------------------------------------------------------*
*& Form FRM_SET_I_FIELD
*&---------------------------------------------------------------------*
* text 电汇确定科目等
*----------------------------------------------------------------------*
* -->PW_CPLAN text
* <--P_HKONT text
*----------------------------------------------------------------------*
form frm_set_i_field using pw_cplan like gw_cplan p_rstgr.
read table gt_t042i into gw_t042i with key zbukr = pw_cplan-bukrs
hbkid = pw_cplan-hbkid zlsch = pw_cplan-zlsch
waers = pw_cplan-waers hktid = pw_cplan-hktid
zsort = pw_cplan-zsort.
if sy-subrc = 0.
perform buchen_feld using 'RF05A-NEWKO' gw_t042i-ukont. "总账科目
if gw_t042i-ukont between '1001000000' and '1022999999'.
perform buchen_feld using 'BSEG-RSTGR' p_rstgr. "原因代码
endif.
clear : gw_t042i.
endif.
perform buchen_feld using 'RF05A-NEWBS' '50'. "记账码
perform buchen_feld using 'BSEG-ZUONR' '0000'. "分配
* PERFORM buchen_feld USING 'BSEG-SGTXT' '银行项目'. "文本
perform buchen_feld using 'COBL-PRCTR' '9999'. "利润中心
* PERFORM buchen_feld USING 'COBL-GSBER' '0001'."业务范围
endform. " FRM_SET_I_FIELD
*&---------------------------------------------------------------------*
*& Form FRM_SET_B_FIELD
*&---------------------------------------------------------------------*
* text 票据确定科目等
*----------------------------------------------------------------------*
* -->PW_CPLAN text
* <--P_HKONT text
*----------------------------------------------------------------------*
form frm_set_b_field using pw_cplan like gw_cplan p_rstgr.
read table gt_bsidh into gw_bsidh with key zuonr = gw_cplan-zboen.
if sy-subrc = 0.
perform buchen_feld using 'RF05A-NEWKO' gw_bsidh-kunnr.
perform buchen_feld using 'BSEG-ZFBDT' gw_bsidh-zfbdt. "到期日
clear : gw_bsidh.
endif.
perform buchen_feld using 'BSEG-ZUONR' pw_cplan-zboen."分配
perform buchen_feld using 'RF05A-NEWUM' 'A'. "特别总账
perform buchen_feld using 'RF05A-NEWBS' '19'. "记账码
* PERFORM buchen_feld USING 'BSEG-GSBER' '0001'. "业务范围
perform buchen_feld using 'BSEG-FISTL' '7900900097'. "基金中心
endform. " FRM_SET_B_FIELD
*&---------------------------------------------------------------------*
*& Form FRM_BSCHL_ZUMSK
*&---------------------------------------------------------------------*
* text 得到记账码和特别总账标识
*----------------------------------------------------------------------*
* -->PW_PAYRE text
* -->PW_POST text
* <--P_BSCHL text
* <--P_ZUMSK text
*----------------------------------------------------------------------*
form frm_bschl_zumsk using pw_post like gw_post
changing p_bschl p_isaw.
"根据配置表获得记账码
read table gt_s019 into gw_s019 with key zywtp = 'PAP' "付款
koart = pw_post-koart
shkzg = pw_post-bshkzg
xsonu = pw_post-xsonu.
if sy-subrc = 0.
p_bschl = gw_s019-bschl.
clear : gw_s019.
endif.
p_isaw = 'N'.
"特别总账
if pw_post-xsonu = 'X'.
read table gt_t074u into gw_t074u with key koart = pw_post-koart
umskz = pw_post-umskz.
if sy-subrc = 0.
if gw_t074u-umsks = 'A' or gw_t074u-umsks = 'W'.
p_isaw = 'Y'.
endif.
endif.
endif.
endform. " FRM_BSCHL_ZUMSK
*&---------------------------------------------------------------------*
*& Form FRM_PAY_MONEY_BANK_NEW
*&---------------------------------------------------------------------*
* text 发送付款申请到银行付款
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_pay_money_bank_new tables pt_payre like it_payre using p_signd .
data : e_payno type string.
data : e_recno type string.
data : e_ioflg type string.
data : e_prop type string.
data : e_rcity type string.
data : e_pamt type string.
data : e_pamtl type string.
data : e_pamtr type string.
data : e_summ type string.
data : e_rbno type string.
data : e_rbna type string.
data : e_bukrs type string.
data : e_hbkid type string.
data : e_hktid type string.
data : e_zoaid type string.
data : e_text1 type string.
data : e_koinh type string.
data : e_zpscr type string.
data : e_signd type string.
data : e_usecd type string.
data : e_usecn type string.
data : e_index like sy-tabix.
data : e_manid(2) type c.
data : e_ztcyd type string.
data : e_belnr type string.
data : e_payment type zcm_s_payment. "银企直连付款传输通用结构
data: lv_bukrs type t001-bukrs,
lv_hbkid type hbkid,
lv_hktid type hktid.
data : lt_return type table of zcm_s_007.
data : lw_return like line of lt_return.
data : e_anred like lfa1-anred. "判断对公对私
data : e_stras like bnka-stras. "街道
data : lv_gjahr type zcm_t_001-gjahr, "会计年度
lv_zpayv type zcm_t_001-zpayv. "付款凭证号
* CLEAR : gt_zmseg,gw_zmseg.
"得到付款所需字段
perform frm_pay_interface_data.
"签名日期
e_signd = p_signd.
clear : gt_s001,gw_s001.
"每一个付款申请单独付款
loop at pt_payre into gw_payre where zcanp = 'X'
and zlock is initial.
e_index = sy-tabix.
* gw_payre-zolds = gw_payre-zstat. "记录状态
"得到本方字段值
read table gt_cm04 into gw_cm04 with key bukrs = gw_payre-bukrs
zoaid = gw_payre-zoaid.
if sy-subrc = 0.
"本方账号
concatenate gw_cm04-bankn gw_cm04-refzl into e_payno.
"对方账号
concatenate gw_payre-bankn gw_payre-bkref into e_recno.
* "金额:分为单位
* e_pamt = gw_payre-zdhdm * 100.
* e_pamt = trunc( e_pamt ).
* condense e_pamt no-gaps.
"金额
e_pamt = gw_payre-zdhdm.
condense e_pamt no-gaps.
"系统内外标识
if gw_payre-bankl+0(3) = gw_cm04-bankl+0(3).
e_ioflg = '1'. "系统内
else.
e_ioflg = '2'. "系统外
endif.
"同城异地标识
if gw_payre-bankl+3(4) = gw_cm04-bankl+3(4).
e_ztcyd = '0'. "同城
else.
e_ztcyd = '1'. "异地
endif.
"收款方所在城市名称
read table gt_bnka into gw_bnka with key banks = gw_payre-banks
bankl = gw_payre-bankl.
if sy-subrc = 0.
e_rcity = gw_bnka-ort01.
e_rbna = gw_bnka-banka.
e_stras = gw_bnka-stras.
clear : gw_bnka.
endif.
"对方行行号
e_rbno = gw_payre-bankl.
"对公对私标识
select single
anred
into e_anred
from lfa1
where lifnr = gw_payre-lifnr.
if e_anred = '公司'.
e_prop = '0'.
e_usecn = '付款'.
else.
e_prop = '1'. "个人账户
e_usecd = '1'.
e_usecn = text-017.
endif.
* if gw_payre-zresu = 'ERP'.
* e_prop = '1'. "个人账户
* e_usecd = '1'.
* e_usecn = text-017.
* else.
* e_prop = '0'.
* endif.
*
clear : e_belnr ,e_manid.
"得到人员编号
perform frm_get_manid using gw_payre-bukrs gw_payre-zoaid
gw_payre-zpayv gw_payre-zresu
changing e_belnr e_manid.
"摘要
concatenate gw_payre-bukrs gw_payre-gjahr
e_belnr e_manid into e_summ.
clear : lt_return.
e_bukrs = gw_payre-bukrs. "公司代码
e_hbkid = gw_cm04-hbkid. "开户行
e_hktid = gw_cm04-hktid. "账户标识
e_zoaid = gw_payre-zoaid. "oa单号
e_text1 = gw_cm04-text1. "付款账户名称
e_koinh = gw_payre-koinh. "收款账户名称
e_zpscr = gw_payre-zpscr. "附言
clear : e_payment .
* e_payment-ZCISN = . " 集团CIS号,需要传输
* e_payment-zkhid = 'JKYQCS.Y.1502.Y.1512'. " 证书ID,配置获取
e_payment-zlsbm = gw_payre-zoaid. " ERP流水号
e_payment-zjyrq = sy-datum. " 交易日期
e_payment-zjysj = sy-uzeit. " 交易时间
e_payment-zbfzh = e_payno. " 本方账号
e_payment-zbfmc = e_text1. " 本方账号名称
e_payment-zdgds = e_prop. " 对公对私标识
e_payment-ztcyd = e_ztcyd. " 同城异地标识
e_payment-zxtnw = e_ioflg. " 系统内外标识
e_payment-banks = gw_payre-banks. " 银行国家代码
e_payment-zdfzh = e_recno. " 对方账号
e_payment-zdfhh = e_rbno. " 对方行号
e_payment-zdfhm = e_rbna. " 对方行名
e_payment-zdfmc = e_koinh. " 对方银行名称
e_payment-zskdz = e_stras. " 收款方地址
e_payment-zskcs = e_rcity. " 收款方城市
e_payment-zjyje = e_pamt. " 交易金额
e_payment-waers = gw_payre-waers. " 货币码
e_payment-zfuyn = e_zpscr. " 附言
e_payment-zytbm = e_usecd. " 用途编码
e_payment-zyntu = e_usecn. " 用途
e_payment-zsumm = e_summ. " 摘要
* e_payment-ZCHBZ = . " 钞汇标识
* e_payment-ZZHSX = . " 账户属性
e_payment-zqmsj = p_signd. " 签名时间
"调用付款函数
clear: lv_bukrs, lv_hbkid, lv_hktid, lv_gjahr, lv_zpayv.
lv_bukrs = e_bukrs.
lv_hbkid = e_hbkid.
lv_hktid = e_hktid.
lv_gjahr = gw_payre-gjahr.
lv_zpayv = gw_payre-zpayv.
* break-point.
call function 'ZCM_EHQ00051'
exporting
i_bukrs = lv_bukrs "e_bukrs "公司代码
i_hbkid = lv_hbkid "e_hbkid "开户行
i_hktid = lv_hktid "e_hktid "账户标识
i_zcont = '010' "通信类型
i_payment = e_payment "付款传输字段
tables
t_return = lt_return.
clear : lw_return.
"得到返回消息
read table lt_return into lw_return with key node = 'Result'.
if sy-subrc = 0.
case lw_return-content.
* when '6' .
when 'F' .
gw_payre-zstat = '10'.
* when '7'.
when 'S'.
gw_payre-zstat = '09'.
when others.
gw_payre-zstat = '08'.
endcase.
else.
gw_payre-zstat = '20'. "付款凭证已创建
endif.
"得到返回信息
perform frm_get_return_mseg tables lt_return
changing gw_payre.
"得到项目状态描述
perform frm_get_zstatx using gw_payre-zstat
changing gw_payre-zstax.
* gw_payre-zpayd = sy-datum. "付款日期
gw_payre-zcanp = ''. "不能再付款
"记录需要更新的数据
move-corresponding gw_payre to gw_s001.
append gw_s001 to gt_s001.
modify pt_payre from gw_payre.
"得到返回消息
if gw_payre-zstat = '10' or gw_payre-zstat = '20'.
gw_zmseg-ztype = 'E'.
else.
gw_zmseg-ztype = 'S'.
endif.
gw_zmseg-tabix = e_index.
concatenate text-009 gw_payre-zoaid ','
gw_payre-zrmsg into gw_zmseg-zmesg.
append gw_zmseg to gt_zmseg.
"存表(单条付款申请,要求考虑安全)
perform frm_save_ssline using gw_payre.
clear : gw_payre,gw_s001,gw_zmseg.
endif.
endloop.
endform. " FRM_PAY_MONEY_BANK_NEW
*&---------------------------------------------------------------------*
*& Form FRM_PAY_MONEY_BANK
*&---------------------------------------------------------------------*
* text 发送付款申请到银行付款
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_pay_money_bank tables pt_payre like it_payre using p_signd .
data : e_payno type string.
data : e_recno type string.
data : e_ioflg type string.
data : e_prop type string.
data : e_rcity type string.
data : e_pamt type string.
data : e_pamtl type string.
data : e_pamtr type string.
data : e_summ type string.
data : e_rbno type string.
data : e_rbna type string.
data : e_bukrs type string.
data : e_hbkid type string.
data : e_hktid type string.
data : e_zoaid type string.
data : e_text1 type string.
data : e_koinh type string.
data : e_zpscr type string.
data : e_signd type string.
data : e_usecd type string.
data : e_usecn type string.
data : e_index like sy-tabix.
data : e_manid(2) type c.
data : e_belnr type string.
* DATA : lt_return TYPE TABLE OF zcm_s_0r2.
data : lt_return type table of zcm_s_007.
data : lw_return like line of lt_return.
* CLEAR : gt_zmseg,gw_zmseg.
"得到付款所需字段
perform frm_pay_interface_data.
"签名日期
e_signd = p_signd.
clear : gt_s001,gw_s001.
"每一个付款申请单独付款
loop at pt_payre into gw_payre where zcanp = 'X'
and zlock is initial.
e_index = sy-tabix.
* gw_payre-zolds = gw_payre-zstat. "记录状态
"得到本方字段值
read table gt_cm04 into gw_cm04 with key bukrs = gw_payre-bukrs
zoaid = gw_payre-zoaid.
if sy-subrc = 0.
"本方账号
concatenate gw_cm04-bankn gw_cm04-refzl into e_payno.
"对方账号
concatenate gw_payre-bankn gw_payre-bkref into e_recno.
"金额:分为单位
e_pamt = gw_payre-zdhdm * 100.
e_pamt = trunc( e_pamt ).
condense e_pamt no-gaps.
"系统内外标识
if gw_payre-bankl+0(3) = '102'.
e_ioflg = '1'. "系统内
else.
e_ioflg = '2'. "系统外
"收款方所在城市名称
read table gt_bnka into gw_bnka with key banks = gw_payre-banks
bankl = gw_payre-bankl.
if sy-subrc = 0.
e_rcity = gw_bnka-ort01.
e_rbna = gw_bnka-banka.
clear : gw_bnka.
endif.
"对方行行号
e_rbno = gw_payre-bankl.
endif.
"对公对私标识
if gw_payre-zresu = 'ERP'.
e_prop = '1'. "个人账户
e_usecd = '1'.
e_usecn = text-017.
else.
e_prop = '0'.
endif.
clear : e_belnr ,e_manid.
"得到人员编号
perform frm_get_manid using gw_payre-bukrs gw_payre-zoaid
gw_payre-zpayv gw_payre-zresu
changing e_belnr e_manid.
"摘要
concatenate gw_payre-bukrs gw_payre-gjahr
e_belnr e_manid into e_summ.
clear : lt_return.
e_bukrs = gw_payre-bukrs. "公司代码
e_hbkid = gw_cm04-hbkid. "开户行
e_hktid = gw_cm04-hktid. "账户标识
e_zoaid = gw_payre-zoaid. "oa单号
e_text1 = gw_cm04-text1. "付款账户名称
e_koinh = gw_payre-koinh. "收款账户名称
e_zpscr = gw_payre-zpscr. "附言
"调用付款函数
call function 'ZCM_EHQ00050'
exporting
* I_CIS = '030290002174509'
* i_id = 'SSTSCO-2016.y.0302'
i_fseqno = e_zoaid
i_payno = e_payno
i_payna = e_text1
i_recno = e_recno
i_recna = e_koinh
i_tamt = e_pamt
i_iofg = e_ioflg
i_prop = e_prop
i_rcity = e_rcity
i_rbno = e_rbno
i_rbna = e_rbna
i_pscr = e_zpscr "附言
i_summ = e_summ
* i_summ = e_zoaid
i_bukrs = e_bukrs
i_hbkid = e_hbkid
i_hktid = e_hktid
i_usecd = e_usecd
i_usecn = e_usecn
i_sign_date = e_signd
tables
t_return = lt_return.
clear : lw_return.
"得到返回消息
read table lt_return into lw_return with key node = 'Result'.
if sy-subrc = 0.
case lw_return-content.
when '6'.
gw_payre-zstat = '10'.
when '7'.
gw_payre-zstat = '09'.
when others.
gw_payre-zstat = '08'.
endcase.
else.
gw_payre-zstat = '20'. "付款凭证已创建
endif.
"得到返回信息
perform frm_get_return_mseg tables lt_return
changing gw_payre.
"得到项目状态描述
perform frm_get_zstatx using gw_payre-zstat
changing gw_payre-zstax.
* gw_payre-zpayd = sy-datum. "付款日期
gw_payre-zcanp = ''. "不能再付款
"记录需要更新的数据
move-corresponding gw_payre to gw_s001.
append gw_s001 to gt_s001.
modify pt_payre from gw_payre.
"得到返回消息
if gw_payre-zstat = '10' or gw_payre-zstat = '20'.
gw_zmseg-ztype = 'E'.
else.
gw_zmseg-ztype = 'S'.
endif.
gw_zmseg-tabix = e_index.
concatenate text-009 gw_payre-zoaid ','
gw_payre-zrmsg into gw_zmseg-zmesg.
append gw_zmseg to gt_zmseg.
"存表(单条付款申请,要求考虑安全)
perform frm_save_ssline using gw_payre.
clear : gw_payre,gw_s001,gw_zmseg.
endif.
endloop.
endform. " FRM_PAY_MONEY_BANK
*&---------------------------------------------------------------------*
*& Form FRM_DATE_RANGE
*&---------------------------------------------------------------------*
* text 得到向前N天日期
*----------------------------------------------------------------------*
* -->P_SDATE text
* -->P_DAYS text
* <--P_EDATE text
*----------------------------------------------------------------------*
form frm_date_range using p_edate p_days changing p_sdate.
call function 'RP_CALC_DATE_IN_INTERVAL'
exporting
date = p_edate
days = p_days
months = 0
signum = '-'
years = 0
importing
calc_date = p_sdate.
.
endform. " FRM_DATE_RANGE
*&---------------------------------------------------------------------*
*& Form FRM_PAY_INTERFACE_DATA
*&---------------------------------------------------------------------*
* text 得到付款所需字段
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_pay_interface_data .
if gt_cm04 is initial.
"付款接口所需本方数据
if it_payre is not initial.
select
a~bukrs a~zoaid a~gjahr a~bankn a~refzl
a~hbkid a~hktid a~banka
a~text1
b~bankl
into corresponding fields of table gt_cm04
from zcm_t_004 as a
left join t012 as b on b~bukrs = a~bukrs and b~hbkid = a~hbkid
for all entries in it_payre
where a~bukrs = it_payre-bukrs and a~zoaid = it_payre-zoaid
and a~zlsch = 'T' and a~zdelf = ''.
endif.
endif.
"对方银行所在城市
if gt_bnka is initial.
select
banks bankl banka ort01 stras
into corresponding fields of table gt_bnka
from bnka
for all entries in it_payre
where banks = it_payre-banks and bankl = it_payre-bankl.
endif.
"付款返回码状态描述
if gt_rcod1 is initial.
g_domname = 'ZRCOD_D'.
call function 'DD_DOMA_GET'
exporting
domain_name = g_domname
tables
dd07v_tab_a = gt_rcod1
dd07v_tab_n = gt_rcod1
exceptions
illegal_value = 1
op_failure = 2
others = 3.
endif.
endform. " FRM_PAY_INTERFACE_DATA
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE_ZCM001
*&---------------------------------------------------------------------*
* text 得到需要更新付款申请数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_update_zcm001.
data : e_flag type c.
clear : e_flag,gt_s008,gw_s008.
if gt_s001 is not initial.
"审批相关数据
loop at gt_zapps into gw_zapps where zchbx = 'X'.
e_flag = 'F'.
"有没有过账失败,或者被锁定的数据
loop at gt_payre into gw_payre where zappn = gw_zapps-zappn
and ( zstat = '06' or zlock = 'X' ).
e_flag = 'P'. "部分支付
clear : gw_s001.
exit.
endloop.
"付款数据状态
if e_flag = 'F'.
gw_zapps-zapps = '05'. "已支付
elseif e_flag = 'P'.
gw_zapps-zapps = '04'. "部分支付
endif.
"得到审批状态
perform frm_get_zapps using gw_zapps-zapps
changing gw_zapps-zappx.
modify gt_zapps from gw_zapps.
"更新付款相关数据
move-corresponding gw_zapps to gw_s008.
append gw_s008 to gt_s008.
clear : gw_zapps,gw_s008.
endloop.
* DO 10 TIMES .
* MODIFY zcm_t_001 FROM TABLE gt_s001.
* IF sy-subrc = 0.
* COMMIT WORK.
* EXIT.
* ELSE.
* WAIT UP TO '0.2' SECONDS.
* ENDIF.
* ENDDO.
* "同步未清项状态
* PERFORM frm_syn_uncstat TABLES gt_s001.
if gt_s008 is not initial.
do 10 times .
modify zcm_t_008 from table gt_s008.
if sy-subrc = 0.
commit work.
exit.
else.
wait up to '0.2' seconds.
endif.
enddo.
endif.
clear : gt_s001,gt_s008.
endif.
endform. " FRM_UPDATE_ZCM001
*&---------------------------------------------------------------------*
*& Form FRM_POST_DATA
*&---------------------------------------------------------------------*
* text 付款前过账
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_post_data using p_budat.
"过账变量声明
data : i_tcode like sy-tcode value 'FB01'.
data : e_msgid like sy-msgid,
e_msgno like sy-msgno,
e_msgty like sy-msgty,
e_msgv1 like sy-msgv1,
e_msgv2 like sy-msgv2,
e_msgv3 like sy-msgv3,
e_msgv4 like sy-msgv4,
e_subrc like sy-subrc.
data : e_blart like bkpf-blart. "凭证类型
data : e_rstgr like bseg-rstgr. "原因代码
data : e_hitem type i value 1.
data : e_citem type i value 1.
data : e_mseg type string.
data : e_index like sy-tabix.
data : e_flag type c.
"提示信息
call function 'SAPGUI_PROGRESS_INDICATOR'
exporting
percentage = 0
text = text-043.
"得到过账基础数据
perform frm_post_base_data.
refresh : gt_ftpost.
"打开录屏
perform frm_open_close_bdc using 'O'.
clear : gw_zmseg,gt_zmseg.
"组织过账数据
loop at gt_payre into gw_payre where zstat = '06'
and zlock is initial.
e_index = sy-tabix.
clear : e_flag.
"判断是否撤回
perform frm_check_is_back using gw_payre changing e_flag.
if e_flag is not initial.
"删除当前行
delete gt_payre index e_index.
continue.
endif.
"记录旧状态
gw_payre-zolds = gw_payre-zstat.
clear : e_blart,gt_ftpost,gt_ftpost[].
if gw_payre-zresu <> 'TR-CM-BT'.
"非账户间互转
perform frm_add_except_hz using gw_payre p_budat.
else.
"账户间互转
perform frm_add_acchz using gw_payre p_budat.
endif.
clear : gt_blntab[],gw_payre-zpayv.
"调用函数过账
call function 'POSTING_INTERFACE_DOCUMENT'
exporting
i_tcode = i_tcode
importing
e_msgid = e_msgid
e_msgno = e_msgno
e_msgty = e_msgty
e_msgv1 = e_msgv1
e_msgv2 = e_msgv2
e_msgv3 = e_msgv3
e_msgv4 = e_msgv4
e_subrc = e_subrc
tables
t_blntab = gt_blntab
t_ftpost = gt_ftpost
t_fttax = gt_fttax
exceptions
account_missing = 1
company_code_missing = 2
posting_key_invalid = 3
posting_key_missing = 4
record_type_invalid = 5
transaction_code_invalid = 6
amount_format_error = 7
too_many_line_items = 8
company_code_invalid = 9
screen_not_found = 10
no_authorization = 11
others = 12.
if sy-subrc <> 0.
rollback work.
"获得过账消息
perform frm_get_post_mesg using e_msgid e_msgno e_msgv1
e_msgv2 e_msgv3 e_msgv4
'E' gw_payre.
else.
commit work and wait.
read table gt_blntab index 1.
if sy-subrc = 0.
gw_payre-zstat = '20'. "付款凭证已创建
gw_payre-zcanp = 'X'. "可以付款标识
gw_payre-budat = p_budat. "过账日期
gw_payre-gjahr = p_budat+0(4). "会计年度
gw_payre-zpayv = gt_blntab-belnr.
"得到项目状态
perform frm_get_zstatx using gw_payre-zstat
changing gw_payre-zstax.
"获得过账消息
perform frm_get_post_mesg using e_msgid e_msgno e_msgv1
e_msgv2 e_msgv3 e_msgv4 'S' gw_payre.
"存表(单条付款申请,要求考虑安全)
perform frm_save_ssline using gw_payre.
else.
"获得过账消息
perform frm_get_post_mesg using e_msgid e_msgno e_msgv1
e_msgv2 e_msgv3 e_msgv4 'E' gw_payre.
endif.
endif.
modify gt_payre from gw_payre.
clear : gw_payre.
endloop.
"关闭录屏
perform frm_open_close_bdc using 'C'.
endform. " FRM_POST_DATA
*&---------------------------------------------------------------------*
*& Form FRM_ADDORREPAYLOCK
*&---------------------------------------------------------------------*
* text 加锁或者解锁
*----------------------------------------------------------------------*
* -->PW_PAYRE text
* <--P_FLAG text
*----------------------------------------------------------------------*
form frm_addorre_paylock using pw_fail like gw_fail p_index p_mod
changing p_flag.
data : lt_zmseg type table of ty_zmesg.
clear : lt_zmseg,gw_zmseg.
if p_mod = 'X'.
"加锁
call function 'ENQUEUE_EZ_TCM_001'
exporting
mode_zcm_t_001 = 'E'
zoaid = pw_fail-zoaid
_scope = '1'
exceptions
foreign_lock = 1
system_failure = 2
others = 3.
if sy-subrc <> 0.
gw_zmseg-tabix = p_index.
gw_zmseg-ztype = 'E'.
"消息
concatenate text-009 pw_fail-zoaid ','
text-012 sy-msgv1
text-031 into gw_zmseg-zmesg.
append gw_zmseg to lt_zmseg.
clear : gw_zmseg.
endif.
else.
do 5 times.
call function 'DEQUEUE_EZ_TCM_001'
exporting
mode_zcm_t_001 = 'E'
mandt = sy-mandt
zoaid = pw_fail-zoaid
_scope = '1'.
if sy-subrc = 0.
exit.
else.
wait up to '0.2' seconds.
endif.
enddo.
endif.
"加锁或解锁不成功
if lt_zmseg is not initial.
p_flag = 'F'.
append lines of lt_zmseg to gt_zmseg.
clear : lt_zmseg.
endif.
endform. " FRM_ADDORR_PAYLOCK
*&---------------------------------------------------------------------*
*& Form FRM_OPEN_CLOSE_BDC
*&---------------------------------------------------------------------*
* text 打开录屏
*----------------------------------------------------------------------*
* -->P_2107 text
*----------------------------------------------------------------------*
form frm_open_close_bdc using p_mode.
if p_mode = 'O'.
call function 'POSTING_INTERFACE_START'
exporting
i_client = sy-mandt
i_function = 'C'
exceptions
client_incorrect = 1
function_invalid = 2
group_name_missing = 3
mode_invalid = 4
update_invalid = 5
others = 6.
elseif p_mode = 'C'.
call function 'POSTING_INTERFACE_END'
exceptions
session_not_processable = 1
others = 2.
endif.
endform. " FRM_OPEN_CLOSE_BDC
*&---------------------------------------------------------------------*
*& Form FRM_GET_POST_MESG
*&---------------------------------------------------------------------*
* text 得到过账消息
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_get_post_mesg using p_msgid p_msgno p_msgv1 p_msgv2 p_msgv3
p_msgv4 p_type pw_payre like gw_payre.
data : e_mseg type string.
"获得消息
call function 'MESSAGE_TEXT_BUILD'
exporting
msgid = p_msgid
msgnr = p_msgno
msgv1 = p_msgv1
msgv2 = p_msgv2
msgv3 = p_msgv3
msgv4 = p_msgv4
importing
message_text_output = e_mseg.
gw_zmseg-ztype = p_type. "消息类型
concatenate text-009 pw_payre-zoaid e_mseg
into gw_zmseg-zmesg.
append gw_zmseg to gt_zmseg.
clear : e_mseg,gw_zmseg.
endform. " FRM_GET_POST_MESG
*&---------------------------------------------------------------------*
*& Form FRM_GET_UNAME
*&---------------------------------------------------------------------*
* text 得到用户ID对应的名称
*----------------------------------------------------------------------*
* -->P_NAMEID text
* <--P_NAMETX text
*----------------------------------------------------------------------*
form frm_get_uname using p_nameid changing p_nametx.
data: l_department type ad_dprtmnt,
l_addrnumber type ad_addrnum,
l_persnumber type ad_persnum,
l_uname type sy-uname,
l_name_first type ad_namefir,
l_name_last type ad_namelas.
select single
persnumber
addrnumber
into (l_persnumber, l_addrnumber)
from usr21
where bname = p_nameid.
if sy-subrc = 0.
select single
name_first
name_last
into (l_name_first,l_name_last)
from adrp
where persnumber = l_persnumber.
if sy-subrc = 0.
concatenate l_name_last l_name_first into p_nametx.
condense p_nametx no-gaps.
endif.
endif.
endform. " FRM_GET_UNAME
*&---------------------------------------------------------------------*
*& Form FRM_GET_RETURN_MSEG
*&---------------------------------------------------------------------*
* text 得到返回信息
*----------------------------------------------------------------------*
* -->PT_RETURN text
* <--PW_PAYRE text
*----------------------------------------------------------------------*
form frm_get_return_mseg tables pt_return structure zcm_s_007
changing pw_payre like gw_payre.
"返回信息
read table pt_return with key node = 'RetMsg'.
if sy-subrc = 0.
concatenate text-018 pt_return-content
into pw_payre-zrmsg. "返回消息
endif.
"返回信息
read table pt_return with key node = 'iRetMsg'.
if sy-subrc = 0.
if pt_return-content is not initial.
concatenate pw_payre-zrmsg ',' text-019
pt_return-content into pw_payre-zrmsg. "返回消息
else.
case pw_payre-zstat .
when '10'.
concatenate pw_payre-zrmsg ',' text-019 text-020
into pw_payre-zrmsg. "返回消息
when '09'.
concatenate pw_payre-zrmsg ',' text-019 text-021
into pw_payre-zrmsg. "返回消息
when '08'.
concatenate pw_payre-zrmsg ',' text-019 text-022
into pw_payre-zrmsg. "返回消息
endcase.
endif.
else.
if pw_payre-zstat = '20'.
concatenate pw_payre-zrmsg ',' text-023
into pw_payre-zrmsg. "返回消息
endif.
endif.
endform. " FRM_GET_RETURN_MSEG
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_AUTHORITY
*&---------------------------------------------------------------------*
* text 检查权限
*----------------------------------------------------------------------*
* -->P_FUNC text
* <--P_FLAG text
*----------------------------------------------------------------------*
form frm_check_authority using p_func changing p_flag.
data : e_index1 like sy-tabix.
data : e_index2 like sy-tabix.
clear : p_flag.
"同一包下付款申请
loop at gt_payre into gw_payre .
e_index1 = sy-tabix.
loop at gt_cplan into gw_cplan where bukrs = gw_payre-bukrs
and zoaid = gw_payre-zoaid.
"检查权限字段
authority-check object 'Z_CM_PAY'
id 'BUKRS' field gw_payre-bukrs
id 'ZCMKUNNR' field gw_payre-kunnr
id 'ZCMLIFNR' field gw_payre-lifnr
id 'ZCMSTAT' field gw_payre-zstat
id 'ZCMHBKID' field gw_cplan-hbkid
id 'ZCMHKTID' field gw_cplan-hktid
id 'ZCMGJAHR' field gw_payre-gjahr
id 'ZCMFUN4' field p_func."付款/查询等
if sy-subrc <> 0.
gw_zmseg-tabix = e_index1.
gw_zmseg-ztype = 'E'.
"拼接报错信息
concatenate text-005 gw_payre-zappn ','
text-009 gw_payre-zoaid ','
text-010 into gw_zmseg-zmesg.
"记录报错消息
append gw_zmseg to gt_zmseg.
clear : gw_zmseg.
continue.
endif.
clear : gw_cplan.
endloop.
if gw_payre-waers <> 'CNY'. "记录错误
concatenate text-005 gw_payre-zappn ','
text-009 gw_payre-zoaid ','
text-011 into gw_zmseg-zmesg .
gw_zmseg-ztype = 'E'.
gw_zmseg-tabix = e_index1.
append gw_zmseg to gt_zmseg.
clear : gw_zmseg.
continue.
endif.
clear : gw_payre.
endloop.
"展示错误消息
if gt_zmseg is not initial.
perform frm_show_mseg.
p_flag = 'F'.
endif.
endform. " FRM_CHECK_AUTHORITY
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_LOCK_AUT
*&---------------------------------------------------------------------*
* text 检查权限
*----------------------------------------------------------------------*
* -->P_FUNC text
* <--P_FLAG text
*----------------------------------------------------------------------*
form frm_check_lock_aut changing p_flag.
data : lt_selected_rows type lvc_t_roid,
ls_selected_row type lvc_s_roid.
data : e_index like sy-tabix.
"得到标准选择行
call method pay_alv_grid->get_selected_rows
importing
et_row_no = lt_selected_rows.
clear : p_flag.
"得到选择行
loop at lt_selected_rows into ls_selected_row.
e_index = ls_selected_row-row_id. "当前行
read table gt_payre into gw_payre index e_index.
loop at gt_cplan into gw_cplan where bukrs = gw_payre-bukrs
and zoaid = gw_payre-zoaid.
"检查权限字段
authority-check object 'Z_CM_PAY'
id 'BUKRS' field gw_payre-bukrs
id 'ZCMKUNNR' field gw_payre-kunnr
id 'ZCMLIFNR' field gw_payre-lifnr
id 'ZCMSTAT' field gw_payre-zstat
id 'ZCMHBKID' field gw_cplan-hbkid
id 'ZCMHKTID' field gw_cplan-hktid
id 'ZCMGJAHR' field gw_payre-gjahr
id 'ZCMFUN4' field '05'."锁定
if sy-subrc <> 0.
gw_zmseg-tabix = sy-tabix.
gw_zmseg-ztype = 'E'.
"拼接报错信息
concatenate text-005 gw_payre-zappn ','
text-009 gw_payre-zoaid ','
text-010 into gw_zmseg-zmesg.
"记录报错消息
append gw_zmseg to gt_zmseg.
clear : gw_zmseg.
continue.
endif.
clear : gw_cplan.
endloop.
clear : ls_selected_row,gw_payre.
endloop.
"展示错误消息
if gt_zmseg is not initial.
perform frm_show_mseg.
p_flag = 'F'.
endif.
endform. " FRM_CHECK_LOCK_AUT
*&---------------------------------------------------------------------*
*& Form FRM_GET_SHOWSTAT
*&---------------------------------------------------------------------*
* text 得到可以展示的付款申请状态
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_get_showstat .
if r_zshst[] is initial.
r_zshst-low = '06'.
r_zshst-sign = 'I'.
r_zshst-option = 'EQ'.
append r_zshst.
clear : r_zshst.
r_zshst-low = '08'.
r_zshst-high = '16'.
r_zshst-sign = 'I'.
r_zshst-option = 'BT'.
append r_zshst.
clear : r_zshst.
r_zshst-low = '20'.
r_zshst-sign = 'I'.
r_zshst-option = 'EQ'.
append r_zshst.
clear : r_zshst.
clear : r_zshst.
endif.
endform. " FRM_GET_SHOWSTAT
*&---------------------------------------------------------------------*
*& Form FRM_GET_APPDATA
*&---------------------------------------------------------------------*
* text 得到审批批次数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_get_appdata .
data : e_zflow like zcm_t_006-zflow.
"得到OA单号查询条件对应的审批编号
perform frm_get_oa_appn.
select single
zflow
into e_zflow
from zcm_t_006
where ztext = p_bukrs.
"得到审批流数据
select
*
into corresponding fields of table gt_zapps
from zcm_t_008
where zapps in ('02','04','05') "审批通过
and zappn in s_zappn and zapps in s_zapps
and zcomu in s_zcomu and zdelf = ''
and erdat in s_erdat and zflow = e_zflow.
"删除没有在OA单号选择的范围内的数据
delete gt_zapps where zappn not in r_zappn.
clear e_zflow.
if gt_zapps is not initial.
* "得到付款申请数据
* PERFORM frm_get_paydata.
"得到付款申请用于判断付款包状态(避免过账时系统中断)
perform frm_spec_paydata.
* IF it_payre IS INITIAL.
* MESSAGE s000(zcm_m001) DISPLAY LIKE 'E'.
* RETURN.
* ENDIF.
else.
message s018(zcm_m001) with text-002 display like 'E'.
return.
endif.
"组织数据
loop at gt_zapps into gw_zapps.
"得到审批状态
perform frm_get_zapps using gw_zapps-zapps
changing gw_zapps-zappx.
"得到审批人
perform frm_get_uname using gw_zapps-zauth
changing gw_zapps-name1.
"得到提交人名称
perform frm_get_uname using gw_zapps-zcomu
changing gw_zapps-name2.
"得到审批流描述
perform frm_get_zflox using gw_zapps-zflow
changing gw_zapps-zflox.
modify gt_zapps from gw_zapps.
clear : gw_zapps.
endloop.
endform. " FRM_GET_APPDATA
*&---------------------------------------------------------------------*
*& Form FRM_GET_OA_APPN
*&---------------------------------------------------------------------*
* text 得到OA单号查询条件对应的审批编号
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_get_oa_appn .
refresh : r_zappn.
"为空不产生条件
if s_zoaid[] is initial and s_zstat[] is initial.
return.
else.
r_zappn-sign = 'I'.
r_zappn-option = 'EQ'.
"得到OA单号对应的审批编号
select
zappn into r_zappn-low
from zcm_t_001 where zoaid in s_zoaid and zstat in s_zstat.
"得到查询条件
append r_zappn.
endselect.
sort r_zappn by low .
delete adjacent duplicates from r_zappn comparing low.
endif.
endform.
*&---------------------------------------------------------------------*
*& Form FRM_SPEC_PAYDATA
*&---------------------------------------------------------------------*
* text 得到付款申请用于判断付款包状态(避免过账时系统中断)
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form frm_spec_paydata .
data : e_flag type c.
data : lt_s001 type table of zcm_t_001,
it_s001 type table of zcm_t_001,
lw_s001 like line of lt_s001.
clear : lt_s001,it_s001.
"获得付款包下所有的付款申请
if gt_zapps is not initial.
"获得存在不是审批通过的付款包下的付款申请
select
*
into corresponding fields of table it_s001
from zcm_t_001
for all entries in gt_zapps
where zappn = gt_zapps-zappn and zstat <> '06'.
endif.
if it_s001 is not initial.
"根据审批编号去重
sort it_s001 by zappn .
delete adjacent duplicates from it_s001 comparing zappn.
"得到判断所用的付款申请
select
*
into corresponding fields of table lt_s001
from zcm_t_001
for all entries in it_s001
where zappn = it_s001-zappn.
else.
return.
endif.
"审批相关数据
loop at gt_zapps into gw_zapps where zapps = '02' or zapps = '04'.
clear : e_fl