【EPIC】自建平台付款建议程序EPIC





程序片:

程序片: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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值