应付票据管理平台

*&---------------------------------------------------------------------*
*&功能名称/Function Name        : ZFI_031
*&描述/Des.                     : 应付票据管理平台
*&申请单位/Applicant            : 
*&申请人/Applicant              : 
*&申请日期/Date of App          : 
*&开发单位/Development Company  : SJ
*&作者/Author                   : 
*&完成日期/Completion Date      :
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&变更记录:
*&Date         Developer           ReqNo       Descriptions
*& ==========  ==================  ==========  ========================*
*& 2017-10-27  HANDSJ              ED1K900435  初始开发
*&---------------------------------------------------------------------*
REPORT ZFI_031 MESSAGE-ID ZFI_MSG.
*&---------------------------------------------------------------------*
*          声明表和类型池
*&---------------------------------------------------------------------*
TYPE-POOLS: SLIS,ICON.
TABLES: ZAPPJ,BKPF.
TABLES: ZTFI_BZJZH,ZTFI_LCJZH.
*&---------------------------------------------------------------------*
*          定义结构
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TY_ALV.
    INCLUDE STRUCTURE ZAPPJ.
TYPES:
  BOX         TYPE  C,            "选择
  LIGHT       TYPE  STRING,       "指示灯
  KNAME       TYPE KNA1-NAME1, "客户描述
  LNAME       TYPE LFA1-NAME1, "供应商描述
  TPJLX       TYPE T074T-LTEXT, "票据类型描述
  LSBH1       TYPE ZARPJ-ZLSBH, "删除的票据流水编号
  TYPE        TYPE BAPI_MTYPE, "消息类型
  MESSAGE     TYPE BAPI_MSG,   "消息文本
  BELNR       TYPE BSEG-BELNR, "会计凭证
  BLART       TYPE BKPF-BLART, "凭证类型
  HKONT       TYPE BSEG-HKONT, "资金总账科目
  RSTGR       TYPE BSEG-RSTGR, "原因代码
  CJTRANSCLAS TYPE ZTFI_CJTRANS-CJTRANSCLAS, "业务类型
  CJTRANSNUMB TYPE ZTFI_CJTRANS-CJTRANSNUMB, "业务交易
  CNAME       TYPE TCJ_CJ_NAMES-CAJO_NAME,   "现金日记账名称
  ZLSBH_YS    TYPE ZARPJ-ZLSBH, "应收票据的流水号
  PERSON1     TYPE TCJ_C_JOURNALS-PERSON1, "账户分类
  ZJKJE       TYPE BSEG-DMBTR, "借款金额
  HKONT_BZ    TYPE BSEG-HKONT, "保证金总账科目
  HKONT_LC    TYPE BSEG-HKONT, "理财户总账科目
  ZBZJJE_BC   TYPE ZAPPJ-ZBZJJE, "本次保证金
  ZLCJE_BC    TYPE ZAPPJ-ZLCJE,  "本次理财户

  CJBELNR_AP1 TYPE ZTFI_031_HEAD-CJBELNR_AP1,
  CJBELNR_AP2 TYPE ZTFI_031_HEAD-CJBELNR_AP2,
  CJBELNR_AP3 TYPE ZTFI_031_HEAD-CJBELNR_AP3,
  CJBELNR_AP4 TYPE ZTFI_031_HEAD-CJBELNR_AP4,
  CJBELNR_AP5 TYPE ZTFI_031_HEAD-CJBELNR_AP5,
  ZBZZH       TYPE ZAPPJ-ZZJZH, "保证金账户
  ZLCZH       TYPE ZAPPJ-ZZJZH, "理财账户
  BELNR_ZC    TYPE ZTFI_031_HEAD-BELNR_ZC,

  STYLE       TYPE  LVC_T_STYL,
  END OF TY_ALV.

TYPES: BEGIN OF TY_EXCEL,
         BUKRS TYPE ZAPPJ-BUKRS, "  公司代码
         ZPJBH TYPE ZAPPJ-ZPJBH, "  票据号
         ZCPRQ TYPE ZAPPJ-ZCPRQ, "  出票日期
         ZDQRQ TYPE ZAPPJ-ZDQRQ, "  到期日期
         ZGZRQ TYPE ZAPPJ-ZGZRQ, "  过账日期
         ZHPJE TYPE ZAPPJ-ZHPJE, "  汇票金额
         ZPJLX TYPE ZAPPJ-ZPJLX, "  票据类型
         LIFNR TYPE ZAPPJ-LIFNR, "  供应商编码
         ZZJZH TYPE ZAPPJ-ZZJZH, "  资金帐号编码
         SGTXT TYPE ZAPPJ-SGTXT, "  摘要
       END OF TY_EXCEL.

TYPES: BEGIN OF TY_KNA1,
         KUNNR TYPE KNA1-KUNNR,
         NAME1 TYPE KNA1-NAME1,
       END OF TY_KNA1.

TYPES: BEGIN OF TY_LFA1,
         LIFNR TYPE LFA1-LIFNR,
         NAME1 TYPE LFA1-NAME1,
       END OF TY_LFA1.

TYPES: BEGIN OF TY_NAME,
         CAJO_NUMBER TYPE TCJ_CJ_NAMES-CAJO_NUMBER,
         CAJO_NAME   TYPE TCJ_CJ_NAMES-CAJO_NAME,
       END OF TY_NAME.
*&---------------------------------------------------------------------*
*          定义内表和工作区
*&---------------------------------------------------------------------*
DATA: GT_ALV     TYPE STANDARD TABLE OF TY_ALV,
      GS_ALV     TYPE TY_ALV,
      GT_ZAPPJ   TYPE STANDARD TABLE OF ZAPPJ,
      GS_ZAPPJ   TYPE ZAPPJ,
      GT_CJTRANS TYPE STANDARD TABLE OF ZTFI_CJTRANS,
      GT_BZJZH   TYPE STANDARD TABLE OF ZTFI_BZJZH,
      GT_LCJZH   TYPE STANDARD TABLE OF ZTFI_LCJZH,
      GT_EXCEL   TYPE STANDARD TABLE OF TY_EXCEL.
TYPES: TY_ALV_TAB TYPE STANDARD TABLE OF TY_ALV.
TYPES: TY_BAPI_CJ_ITEMS TYPE STANDARD TABLE OF BAPI_CJ_ITEMS.
DATA: I_GROUP TYPE APQI-GROUPID,
      E_MSGID TYPE SY-MSGID,
      E_MSGNO TYPE SY-MSGNO,
      E_MSGTY TYPE SY-MSGTY,
      E_MSGV1 TYPE SY-MSGV1,
      E_MSGV2 TYPE SY-MSGV2,
      E_MSGV3 TYPE SY-MSGV3,
      E_MSGV4 TYPE SY-MSGV4,
      E_SUBRC TYPE SY-SUBRC.
DATA: GS_FTPOST TYPE FTPOST,
      GT_BLNTAB TYPE STANDARD TABLE OF BLNTAB,
      GT_FTPOST TYPE STANDARD TABLE OF FTPOST,
      GT_FTTAX  TYPE STANDARD TABLE OF FTTAX.
*&---------------------------------------------------------------------*
*          定义变量
*&---------------------------------------------------------------------*
DATA: GV_UPDATE TYPE C,
      GV_CANCEL TYPE C.

FIELD-SYMBOLS: <FS_EXCEL> TYPE TY_EXCEL,
               <FS_KNA1>  TYPE TY_KNA1,
               <FS_LFA1>  TYPE TY_LFA1,
               <FS_ZAPPJ> TYPE ZAPPJ,
               <FS_BZJZH> TYPE ZTFI_BZJZH,
               <FS_LCJZH> TYPE ZTFI_LCJZH,
               <FS_ALV>   TYPE TY_ALV.

DATA: GV_STGRD     TYPE BKPF-STGRD VALUE '03',
      GV_BUDAT     TYPE BKPF-BUDAT,
      GV_ZBZZH     TYPE TCJ_C_JOURNALS-CAJO_NUMBER, "保证金账户
      GV_ZLCZH     TYPE TCJ_C_JOURNALS-CAJO_NUMBER, "理财账户
      GV_ZZJZH     TYPE TCJ_C_JOURNALS-CAJO_NUMBER, "资金账户
      GV_ZHPJE     TYPE ZAPPJ-ZHPJE,  "汇票总额
      GV_ZJKJE     TYPE ZAPPJ-ZHPJE,  "借款余额
      GV_ZBZJJE    TYPE ZAPPJ-ZBZJJE, "保证金金额
      GV_ZLCJE     TYPE ZAPPJ-ZLCJE,  "理财户金额
      GV_ZBZJJE_BC TYPE ZAPPJ-ZBZJJE, "本次保证金金额
      GV_ZLCJE_BC  TYPE ZAPPJ-ZLCJE,  "本次理财户金额
      GV_ZFYJE_BC  TYPE ZAPPJ-ZLCJE.  "本次费用

DATA: SAVE_OK TYPE SY-UCOMM,
      OK_CODE TYPE SY-UCOMM.

RANGES: R_ZZJZH FOR  ZAPPJ-ZZJZH."资金账户

*&---------------------------------------------------------------------*
*          定义常量
*&---------------------------------------------------------------------*
CONSTANTS: GC_OBJID  TYPE WWWDATATAB-OBJID VALUE 'ZFI_002'. "上传的模板名
CONSTANTS: GC_OBJECT_YS TYPE TNRO-OBJECT VALUE 'ZFI_YSPJ',
           GC_OBJECT_YF TYPE TNRO-OBJECT VALUE 'ZFI_YFPJ',
           GC_OBJECT_ZC TYPE TNRO-OBJECT VALUE 'ZFI_ZNUMB',
           GC_RANGE_NR  TYPE INRI-NRRANGENR VALUE '00'.
CONSTANTS: GC_AR TYPE C LENGTH 2  VALUE 'AR',
           GC_AP TYPE C LENGTH 2  VALUE 'AP'.
CONSTANTS: GC_ZDJLX      TYPE ZARPJ-ZDJLX VALUE '手工增加', "单据类型
           GC_ZDJLX_OA   TYPE ZARPJ-ZDJLX VALUE 'OA集成',   "单据类型
           GC_ZDJLX_PJBS TYPE ZARPJ-ZDJLX VALUE '票据背书', "单据类型
           GC_ZPJZT_CP   TYPE ZARPJ-ZPJZT VALUE '出票',     "票据状态
           GC_ZPJZT_TP   TYPE ZARPJ-ZPJZT VALUE '退票',     "票据状态
           GC_ZPJZT_DF   TYPE ZARPJ-ZPJZT VALUE '兑付',     "票据状态
           GC_ZPJZT_BS   TYPE ZARPJ-ZPJZT VALUE '背书',     "票据状态
           GC_ZPJZT_SC   TYPE ZARPJ-ZPJZT VALUE '作废',     "票据状态
           GC_ZPJZT_DJBS TYPE ZARPJ-ZPJZT VALUE '登记背书', "票据状态
           GC_ZPJZT_DJ   TYPE ZARPJ-ZPJZT VALUE '登记'.     "票据状态
CONSTANTS: GC_WAERS    TYPE BKPF-WAERS VALUE 'CNY',
           GC_HKONT_QC TYPE BSEG-HKONT VALUE '9999010300',
           GC_HKONT    TYPE BSEG-HKONT VALUE '6603050100'.
*&---------------------------------------------------------------------*
*          定义选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN:BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS:     P_BUKRS TYPE BKPF-BUKRS MODIF ID M1.
SELECT-OPTIONS: S_BUDAT FOR ZAPPJ-ZGZRQ MODIF ID M1.
SELECT-OPTIONS: S_ZZJZH FOR ZAPPJ-ZZJZH NO-EXTENSION NO INTERVALS MODIF ID M1.
SELECT-OPTIONS: S_ZPJBH FOR ZAPPJ-ZPJBH MODIF ID M1.

PARAMETERS: P_FILE LIKE RLGRAP-FILENAME MODIF ID M2. "文件路径
PARAMETERS: P_UP   RADIOBUTTON GROUP GRP2 DEFAULT 'X' MODIF ID M2,
            P_DOWN RADIOBUTTON GROUP GRP2 MODIF ID M2.
SELECTION-SCREEN:END OF BLOCK B1.

SELECTION-SCREEN:BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.
PARAMETERS: P_UPLOAD RADIOBUTTON GROUP GRP1 DEFAULT 'X' USER-COMMAND SINGLE, "上传文件
            P_CHANGE RADIOBUTTON GROUP GRP1, "修改&作废
            P_CHUP   RADIOBUTTON GROUP GRP1, "出票&退票
            P_BZJLC  RADIOBUTTON GROUP GRP1, "转保证金/理财户
            P_DUIFU  RADIOBUTTON GROUP GRP1, "兑付&取消兑付
            P_POST   RADIOBUTTON GROUP GRP1, "过账/冲销
            P_SHOW   RADIOBUTTON GROUP GRP1, "显示清单
            P_LOG    RADIOBUTTON GROUP GRP1. "更改记录
SELECTION-SCREEN:END OF BLOCK B2.

*&---------------------------------------------------------------------*
*          定义ALV参数
*&---------------------------------------------------------------------*
DATA: GT_FIELDCAT   TYPE LVC_T_FCAT,
      GS_FIELDCAT   TYPE LVC_S_FCAT,
      GS_LAYOUT     TYPE LVC_S_LAYO,
      GV_REPID      TYPE SY-REPID,
      GT_EVENTS     TYPE SLIS_T_EVENT,
      GS_EVENT      TYPE SLIS_ALV_EVENT,
      GT_LISTHEADER TYPE SLIS_T_LISTHEADER,
      GS_SETTINGS   TYPE LVC_S_GLAY.
*&---------------------------------------------------------------------*
*          DEFINE OO ALV
*&---------------------------------------------------------------------*
CLASS CL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.
    METHODS:
      HANDLE_MODIFY
                    FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
        IMPORTING E_MODIFIED ET_GOOD_CELLS,

      HANDLE_DATA_CHANGED " Data was Changed
                    FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
        IMPORTING ER_DATA_CHANGED E_ONF4 E_ONF4_BEFORE E_ONF4_AFTER E_UCOMM.

ENDCLASS.

*&---------------------------------------------------------------------*
*        实现事件内借口
*&---------------------------------------------------------------------*
CLASS CL_EVENT_RECEIVER IMPLEMENTATION.
  "Data in the Output Table was Updated
  METHOD HANDLE_MODIFY.
    PERFORM DATA_MODIFY USING E_MODIFIED ET_GOOD_CELLS.
  ENDMETHOD.                    "handle_modify
  "Data was changed
  METHOD HANDLE_DATA_CHANGED.
    PERFORM DATA_CHANGED USING ER_DATA_CHANGED.
  ENDMETHOD.                    "handle_data

ENDCLASS.


*&---------------------------------------------------------------------*
*           实例化点击事件类
*---------------------------------------------------------------------*
DATA: G_ALV_GRID          TYPE REF TO CL_GUI_ALV_GRID,
      G_CL_EVENT_RECEIVER TYPE REF TO CL_EVENT_RECEIVER,
      G_CL_ALV_CHANGED    TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
*&---------------------------------------------------------------------*
*          定义宏
*&---------------------------------------------------------------------*
DEFINE MACRO_FCAT.
  GS_FIELDCAT-FIELDNAME  = &1.  "字段名
  GS_FIELDCAT-REF_FIELD  = &3.  "参考字段名
  GS_FIELDCAT-REF_TABLE  = &2.  "参考表名
  GS_FIELDCAT-COLTEXT    = &4.  "列标题
  GS_FIELDCAT-ICON       = &5.  "图标
  GS_FIELDCAT-EDIT_MASK  = &6.  "转换例程
  GS_FIELDCAT-EDIT       = &7.  "可编辑
  GS_FIELDCAT-QFIELDNAME = &8.  "数量参考字段
  GS_FIELDCAT-FIX_COLUMN = &9.  "固定列
  APPEND GS_FIELDCAT TO GT_FIELDCAT.
  CLEAR GS_FIELDCAT.
END-OF-DEFINITION.

DEFINE  FILL_FTPOST.
  CLEAR GS_FTPOST.
  GS_FTPOST-stype = &1.
  GS_FTPOST-count = &2.
  GS_FTPOST-fnam  = &3.
  GS_FTPOST-fval  = &4.
  APPEND GS_FTPOST TO GT_FTPOST.
END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*        INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.


*&---------------------------------------------------------------------*
*        AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
  PERFORM FRM_CHECK_AUTHORITY."权限检查

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  PERFORM F4_PATH CHANGING P_FILE.

*&---------------------------------------------------------------------*
*        AT SELECTION-SCREEN OUTPUT
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  PERFORM FRM_MODIFY_SCREEN.  "动态修改选择屏幕

*&---------------------------------------------------------------------*
*        START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.


*&---------------------------------------------------------------------*
*        END-OF-SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.

  PERFORM FRM_CHECK_SCREEN.          "检查选择屏幕字段

  IF P_UPLOAD IS NOT INITIAL.

    IF P_UP IS NOT INITIAL.       "上传文件

      PERFORM FRM_UPLOAD_DATA.

    ELSEIF P_DOWN IS NOT INITIAL."下载模板

      PERFORM FRM_DOWNLOAD_FILE.

    ENDIF.

  ELSE.

    PERFORM FRM_OUTPUT_DATA.     "其他操作,展示ALV

  ENDIF.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_AUTHORITY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_AUTHORITY .
  DATA: LV_ROLE TYPE ZEPJ_ROLE.

  "检查公司代码权限
  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
                  ID 'BUKRS' FIELD P_BUKRS.
  IF SY-SUBRC <> 0 .
    MESSAGE ID SY-MSGID
            TYPE SY-MSGTY
            NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  "检查操作权限
  IF P_UPLOAD = ABAP_TRUE.
    LV_ROLE = 'AP1'.
  ELSEIF P_CHANGE = ABAP_TRUE.
    LV_ROLE = 'AP2'.
  ELSEIF P_CHUP   = ABAP_TRUE.
    LV_ROLE = 'AP3'.
  ELSEIF P_BZJLC  = ABAP_TRUE.
    LV_ROLE = 'AP4'.
  ELSEIF P_DUIFU  = ABAP_TRUE.
    LV_ROLE = 'AP5'.
  ELSEIF P_POST   = ABAP_TRUE.
    LV_ROLE = 'AP6'.
  ELSEIF P_SHOW   = ABAP_TRUE.
    LV_ROLE = 'AP7'.
  ELSEIF P_LOG    = ABAP_TRUE.
    LV_ROLE = 'AP7'.
  ENDIF.

  AUTHORITY-CHECK OBJECT 'ZFI_PJ'
   ID 'ZPJ_ROLE' FIELD LV_ROLE.
  IF SY-SUBRC <> 0.
    MESSAGE E003 WITH TEXT-072.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F4_PATH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      <--P_P_FILE  text
*&---------------------------------------------------------------------*
FORM F4_PATH   CHANGING P_FILE.
  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    CHANGING
      FILE_NAME = P_FILE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_MODIFY_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_MODIFY_SCREEN .
  LOOP AT SCREEN.
    IF P_UPLOAD IS NOT INITIAL.

      IF SCREEN-GROUP1 = 'M1'.
        SCREEN-ACTIVE = 0.
        MODIFY SCREEN.
      ENDIF.

    ELSE.

      IF SCREEN-GROUP1 = 'M2'.
        SCREEN-ACTIVE = 0.
        MODIFY SCREEN.
      ENDIF.

    ENDIF.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_SCREEN .
  IF P_UPLOAD IS INITIAL.

    "检查公司代码是否输入
    IF P_BUKRS IS INITIAL.
      SET CURSOR FIELD P_BUKRS.
      MESSAGE S004 WITH TEXT-003 DISPLAY LIKE 'E'.
      STOP.
    ENDIF.

  ELSE.

    IF P_UP IS NOT INITIAL.
      "检查文件路径是否输入
      IF P_FILE IS INITIAL.
        SET CURSOR FIELD P_FILE.
        MESSAGE S004 WITH TEXT-004 DISPLAY LIKE 'E'.
        STOP.
      ENDIF.
    ENDIF.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .
  PERFORM FRM_UPLOAD_FILE.           "EXCEL文件内容转换至内表
  PERFORM FRM_DEAL_DATA.             "处理内表数据
  PERFORM FRM_SET_LAYOUT.            "设置输出格式
  PERFORM FRM_SET_FIELDCAT.          "设置输出字段
  PERFORM FRM_DISPLAY_ALV.           "输出ALV
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DOWNLOAD_FILE .
  DATA: LV_FILENAME TYPE STRING,
        LV_PATH     TYPE STRING.
  DATA: LS_OBJDATA     TYPE WWWDATATAB,
        LV_DESTINATION TYPE RLGRAP-FILENAME,
        LV_ERRTXT      TYPE STRING,
        LV_RESULT      TYPE C,
        LV_SUBRC       TYPE SY-SUBRC.
  DATA: LV_DOWNLOAD_PATH TYPE STRING.

* 用户选择名称、路径
  CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG(
    EXPORTING
*      default_file_name    = lv_init_fname
*      initial_directory    = lv_init_path
      DEFAULT_FILE_NAME = '应付票据导入模板.xlsx'
      PROMPT_ON_OVERWRITE  = 'X'
    CHANGING
      FILENAME             = LV_FILENAME
      PATH                 = LV_PATH
      FULLPATH             = LV_DOWNLOAD_PATH
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4 ).


  "查找文件是否存在。
  SELECT SINGLE RELID OBJID
    FROM WWWDATA
    INTO CORRESPONDING FIELDS OF LS_OBJDATA
    WHERE SRTF2 = 0
      AND RELID = 'MI'
      AND OBJID = GC_OBJID.

  "判断模版不存在则报错
  IF SY-SUBRC <> 0 OR LS_OBJDATA-OBJID EQ SPACE.
    CONCATENATE '模板文件:' GC_OBJID '不存在,请用TCODE:SMW0进行加载'
                INTO LV_ERRTXT.
    MESSAGE E000(SU) WITH LV_ERRTXT.
  ENDIF.

  "判断本地地址是否已经存在此文件。
  CL_GUI_FRONTEND_SERVICES=>FILE_EXIST(
    EXPORTING
      FILE                 = LV_DOWNLOAD_PATH
    RECEIVING
      RESULT               = LV_RESULT
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      WRONG_PARAMETER      = 3
      NOT_SUPPORTED_BY_GUI = 4
      OTHERS               = 5 ).

  IF LV_RESULT EQ 'X'.  "如果存在则删除原始文件,重新覆盖

    CL_GUI_FRONTEND_SERVICES=>FILE_DELETE(
      EXPORTING
        FILENAME             = LV_DOWNLOAD_PATH
      CHANGING
        RC                   = LV_SUBRC
      EXCEPTIONS
        FILE_DELETE_FAILED   = 1
        CNTL_ERROR           = 2
        ERROR_NO_GUI         = 3
        FILE_NOT_FOUND       = 4
        ACCESS_DENIED        = 5
        UNKNOWN_ERROR        = 6
        NOT_SUPPORTED_BY_GUI = 7
        WRONG_PARAMETER      = 8
        OTHERS               = 9 ).
    IF LV_SUBRC <> 0. "如果删除失败,则报错。
      CONCATENATE '同名EXCEL文件已打开' '请关闭该EXCEL后重试。'
                  INTO LV_ERRTXT.
      MESSAGE E000(SU) WITH LV_ERRTXT.
    ENDIF.

  ENDIF.

  LV_DESTINATION = LV_DOWNLOAD_PATH.

  "下载模版。
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         = LS_OBJDATA
      DESTINATION = LV_DESTINATION
    IMPORTING
      RC          = LV_SUBRC.
  IF LV_SUBRC <> 0.
    CONCATENATE '模板文件' '下载失败' INTO LV_ERRTXT.
    MESSAGE E000(SU) WITH LV_ERRTXT.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_OUTPUT_DATA .
  PERFORM FRM_SET_FIELDCAT.          "设置输出字段
  PERFORM FRM_SET_LAYOUT.            "设置输出格式
  PERFORM FRM_PROCESS_DATA.          "获取数据
  PERFORM FRM_DISPLAY_ALV.           "输出ALV
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DATA_MODIFY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_E_MODIFIED  text
*      -->P_ET_GOOD_CELLS  text
*&---------------------------------------------------------------------*
FORM DATA_MODIFY  USING    PV_MODIFIED
                           PT_GOOD_CELLS TYPE LVC_T_MODI.
  DATA: LS_LVC_MODI TYPE LVC_S_MODI.
  DATA: LV_ERROR TYPE C.

  IF PV_MODIFIED = SPACE.
    EXIT.
  ENDIF.

  LOOP AT PT_GOOD_CELLS INTO LS_LVC_MODI.

    READ TABLE GT_ALV ASSIGNING <FS_ALV> INDEX LS_LVC_MODI-ROW_ID.
    IF SY-SUBRC <> 0.
      CONTINUE.
    ENDIF.

    "标记当前界面已经有数据变化
    GV_UPDATE = ABAP_TRUE.

    "修改供应商描述
    IF LS_LVC_MODI-FIELDNAME = 'LIFNR'.

      IF <FS_ALV>-LIFNR IS NOT INITIAL.
        SELECT SINGLE NAME1
          FROM LFA1
          INTO <FS_ALV>-LNAME
          WHERE LIFNR = <FS_ALV>-LIFNR.

        IF <FS_ALV>-LNAME IS INITIAL.
          <FS_ALV>-LIGHT = ICON_RED_LIGHT.
          <FS_ALV>-MESSAGE = TEXT-016 && <FS_ALV>-LIFNR && TEXT-025.
          LV_ERROR = ABAP_TRUE.
        ELSE.
          IF LV_ERROR IS INITIAL.
            <FS_ALV>-LIGHT = ICON_YELLOW_LIGHT.
            CLEAR <FS_ALV>-MESSAGE.
          ENDIF.
        ENDIF.
      ELSE.
        <FS_ALV>-LIGHT = ICON_RED_LIGHT.
        <FS_ALV>-MESSAGE = TEXT-016 && TEXT-033.
        LV_ERROR = ABAP_TRUE.
      ENDIF.

    ENDIF.

    "修改票据类型描述
    IF LS_LVC_MODI-FIELDNAME = 'ZPJLX'.

      IF <FS_ALV>-ZPJLX IS NOT INITIAL.

        <FS_ALV>-ZPJLX = |{ <FS_ALV>-ZPJLX CASE = UPPER }|.

        IF <FS_ALV>-ZPJLX <> 'X' AND <FS_ALV>-ZPJLX <> 'W'.
          <FS_ALV>-LIGHT = ICON_RED_LIGHT.
          <FS_ALV>-MESSAGE = TEXT-014 && <FS_ALV>-ZPJLX && TEXT-035.
          LV_ERROR = ABAP_TRUE.
        ELSE.
          SELECT SINGLE LTEXT
            FROM T074T
            INTO <FS_ALV>-TPJLX
            WHERE SPRAS = SY-LANGU
              AND SHBKZ = <FS_ALV>-ZPJLX.

          IF LV_ERROR IS INITIAL.
            <FS_ALV>-LIGHT = ICON_YELLOW_LIGHT.
            CLEAR <FS_ALV>-MESSAGE.
          ENDIF.
        ENDIF.

      ELSE.
        <FS_ALV>-LIGHT = ICON_RED_LIGHT.

        <FS_ALV>-MESSAGE = TEXT-014 && TEXT-033.
        LV_ERROR = ABAP_TRUE.
      ENDIF.
    ENDIF.

    "修改资金账号描述
    IF LS_LVC_MODI-FIELDNAME = 'ZZJZH'.

      IF <FS_ALV>-ZZJZH IS NOT INITIAL.

        SELECT SINGLE CAJO_NAME
          FROM TCJ_CJ_NAMES
          INTO <FS_ALV>-CNAME
          WHERE LANGU = SY-LANGU
            AND COMP_CODE = <FS_ALV>-BUKRS
            AND CAJO_NUMBER = <FS_ALV>-ZZJZH.

        IF <FS_ALV>-CNAME IS INITIAL.
          <FS_ALV>-LIGHT = ICON_RED_LIGHT.
          <FS_ALV>-MESSAGE = TEXT-027 && <FS_ALV>-ZZJZH && TEXT-025.
          LV_ERROR = ABAP_TRUE.
        ELSE.
          IF LV_ERROR IS INITIAL.
            <FS_ALV>-LIGHT = ICON_YELLOW_LIGHT.
            CLEAR <FS_ALV>-MESSAGE.
          ENDIF.
        ENDIF.

        "修改银行科目
        SELECT SINGLE GL_ACCOUNT
          FROM TCJ_C_JOURNALS
          INTO <FS_ALV>-HKONT
          WHERE COMP_CODE   = <FS_ALV>-BUKRS
            AND CAJO_NUMBER = <FS_ALV>-ZZJZH.

        IF <FS_ALV>-HKONT IS INITIAL.
          <FS_ALV>-LIGHT = ICON_RED_LIGHT.
          <FS_ALV>-MESSAGE = TEXT-027 && <FS_ALV>-ZZJZH && TEXT-051 && TEXT-050.
          LV_ERROR = ABAP_TRUE.
        ELSE.
          IF LV_ERROR IS INITIAL.
            <FS_ALV>-LIGHT = ICON_YELLOW_LIGHT.
            CLEAR <FS_ALV>-MESSAGE.
          ENDIF.
        ENDIF.

      ELSE.
        <FS_ALV>-LIGHT = ICON_RED_LIGHT.

        <FS_ALV>-MESSAGE = TEXT-027 && TEXT-033.
        LV_ERROR = ABAP_TRUE.
      ENDIF.
    ENDIF.
*
*    "借款金额=汇票金额-已过账保证金金额-本次过账保证金金额-已过账理财金额-本次过账理财金额
*    <FS_ALV>-ZJKJE = <FS_ALV>-ZHPJE - <FS_ALV>-ZBZJJE - <FS_ALV>-ZLCJE - <FS_ALV>-ZBZJJE_BC - <FS_ALV>-ZLCJE_BC.

  ENDLOOP.

  PERFORM FRM_REFRESH_ALV.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DATA_CHANGED
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_ER_DATA_CHANGED  text
*&---------------------------------------------------------------------*
FORM DATA_CHANGED  USING    PR_DATA_CHANGED.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_FILE .
  DATA: LT_EXCEL TYPE STANDARD TABLE OF TY_EXCEL.

  CALL FUNCTION 'Z_UPLOAD_FILE'
    EXPORTING
      I_FILENAME = P_FILE
      I_SKIP     = 'X'   " X -> 删除第一行数据
    TABLES
      T_DATA     = GT_EXCEL.

  IF LINES( GT_EXCEL ) = 0.
    MESSAGE S003 WITH TEXT-005 DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  "检查是否有重复行
  LT_EXCEL[] = GT_EXCEL[].
  SORT LT_EXCEL BY BUKRS ZPJBH.
  DELETE ADJACENT DUPLICATES FROM LT_EXCEL COMPARING BUKRS ZPJBH.
  IF LINES( LT_EXCEL ) <> LINES( GT_EXCEL ).
    MESSAGE S015.
    STOP.
  ENDIF.

  FREE: LT_EXCEL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DEAL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DEAL_DATA .
  DATA: LV_ERROR TYPE C.

  "根据票据号和公司代码获取应付票据
  SELECT *
    FROM ZAPPJ
    INTO TABLE GT_ZAPPJ
    FOR ALL ENTRIES IN GT_EXCEL
    WHERE ZPJBH = GT_EXCEL-ZPJBH
      AND ZZTBS = ABAP_TRUE.
  SORT GT_ZAPPJ BY ZPJBH.

  "资金账户描述
  SELECT *
    FROM TCJ_CJ_NAMES
    INTO TABLE @DATA(LT_NAMES)
    WHERE LANGU     = @SY-LANGU.
  SORT LT_NAMES BY COMP_CODE CAJO_NUMBER.

  LOOP AT GT_EXCEL ASSIGNING <FS_EXCEL>.

    "添加至内表
    MOVE-CORRESPONDING <FS_EXCEL> TO GS_ALV.

    "指示灯
    GS_ALV-LIGHT = ICON_YELLOW_LIGHT.

    "检查数据完整性和有效性
    "公司代码
    IF GS_ALV-BUKRS IS INITIAL.
      GS_ALV-MESSAGE = TEXT-008 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ELSE.
      "检查公司代码权限
      AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
                      ID 'BUKRS' FIELD GS_ALV-BUKRS.
      IF SY-SUBRC <> 0 .
        GS_ALV-MESSAGE = TEXT-072.
        LV_ERROR = ABAP_TRUE.
      ENDIF.
    ENDIF.

    "票据号
    IF GS_ALV-ZPJBH IS INITIAL.
      GS_ALV-MESSAGE = TEXT-009 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ENDIF.

    "出票日期
    IF GS_ALV-ZCPRQ IS INITIAL OR GS_ALV-ZCPRQ = SPACE.
      GS_ALV-MESSAGE = TEXT-010 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ENDIF.

    "到期日期
    IF GS_ALV-ZDQRQ IS INITIAL OR GS_ALV-ZDQRQ = SPACE.
      GS_ALV-MESSAGE = TEXT-011 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ENDIF.

    "过账日期
    IF GS_ALV-ZGZRQ IS INITIAL OR GS_ALV-ZGZRQ = SPACE.
      GS_ALV-MESSAGE = TEXT-012 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ENDIF.

    "汇票金额
    IF GS_ALV-ZHPJE IS INITIAL OR GS_ALV-ZHPJE = 0.
      GS_ALV-MESSAGE = TEXT-013 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ENDIF.

    "票据类型
    IF GS_ALV-ZPJLX IS INITIAL.
      GS_ALV-MESSAGE = TEXT-014 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ELSE.

      GS_ALV-ZPJLX  =  |{ GS_ALV-ZPJLX   CASE  = UPPER }|.

      IF GS_ALV-ZPJLX <> 'X' AND GS_ALV-ZPJLX <> 'W'.
        GS_ALV-MESSAGE = TEXT-014 && <FS_EXCEL>-ZPJLX && TEXT-035.

        LV_ERROR = ABAP_TRUE.
      ENDIF.

    ENDIF.

    "资金账号编码
    IF GS_ALV-ZZJZH IS INITIAL.
      GS_ALV-MESSAGE = TEXT-027 && TEXT-033.

      LV_ERROR = ABAP_TRUE.

    ELSE.

      "资金账户描述
      READ TABLE LT_NAMES INTO DATA(LS_NAMES) WITH KEY COMP_CODE = GS_ALV-BUKRS
                                                       CAJO_NUMBER = GS_ALV-ZZJZH BINARY SEARCH.
      IF SY-SUBRC = 0.
        GS_ALV-CNAME = LS_NAMES-CAJO_NAME.
      ENDIF.

      IF GS_ALV-CNAME IS INITIAL.
        GS_ALV-MESSAGE = TEXT-027 && <FS_EXCEL>-ZZJZH && TEXT-025.

        LV_ERROR = ABAP_TRUE.
      ENDIF.
    ENDIF.

    "供应商编码
    IF GS_ALV-LIFNR IS INITIAL.
      GS_ALV-MESSAGE = TEXT-016 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ENDIF.

    "摘要
    IF GS_ALV-SGTXT IS INITIAL.
      GS_ALV-MESSAGE = TEXT-017 && TEXT-033.

      LV_ERROR = ABAP_TRUE.
    ENDIF.

    "检查票据号是否已经导入
    READ TABLE GT_ZAPPJ ASSIGNING <FS_ZAPPJ> WITH KEY ZPJBH = GS_ALV-ZPJBH.
    IF SY-SUBRC = 0.

      IF <FS_ZAPPJ>-ZPJZT = GC_ZPJZT_SC OR <FS_ZAPPJ>-ZPJZT = GC_ZPJZT_TP."作废和退票可以重新导入
        GS_ALV-LSBH1 = <FS_ZAPPJ>-ZLSBH."票据的原流水号
      ELSE.
        GS_ALV-MESSAGE = TEXT-009 && GS_ALV-ZPJBH && TEXT-034.

        LV_ERROR = ABAP_TRUE.
      ENDIF.

    ENDIF.

    "供应商编码补前导零
    IF GS_ALV-LIFNR IS NOT INITIAL.
      GS_ALV-LIFNR =  |{ GS_ALV-LIFNR  ALPHA = IN }|.

      SELECT SINGLE NAME1
        FROM LFA1
        INTO GS_ALV-LNAME
        WHERE LIFNR = GS_ALV-LIFNR.
      IF SY-SUBRC <> 0 .
        GS_ALV-MESSAGE = TEXT-016 && <FS_EXCEL>-LIFNR && TEXT-025.

        LV_ERROR = ABAP_TRUE.
      ENDIF.
    ENDIF.

    "单据类型
    GS_ALV-ZDJLX = GC_ZDJLX.

    "票据状态
    GS_ALV-ZPJZT = GC_ZPJZT_DJ.

    IF LV_ERROR IS NOT INITIAL.
      "指示灯
      GS_ALV-LIGHT = ICON_RED_LIGHT.
    ENDIF.

    APPEND GS_ALV TO GT_ALV.
    CLEAR:LV_ERROR, GS_ALV.
  ENDLOOP.

  FREE: GT_EXCEL,GT_ZAPPJ.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_LAYOUT.

  GS_LAYOUT-CWIDTH_OPT    = 'X'. "自适应宽度
  GS_LAYOUT-ZEBRA         = 'X'. "斑马线
  GS_LAYOUT-BOX_FNAME     = 'BOX'. "选择框
  GS_LAYOUT-STYLEFNAME    = 'STYLE'.

  GS_SETTINGS-EDT_CLL_CB  = 'X'.  "回写

  GV_REPID = SY-REPID.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .
  DATA: LV_EDIT TYPE C.

  IF P_CHANGE IS NOT INITIAL.
    LV_EDIT = ABAP_TRUE.
  ENDIF.

  MACRO_FCAT 'LIGHT' ''      ''      TEXT-006 'X' '' ''      '' ''. "指示灯
  MACRO_FCAT 'MESSAGE' ''      ''    TEXT-021 ' ' '' ''      '' ''. "消息
  MACRO_FCAT 'ZPJZT' 'ZAPPJ' 'ZPJZT' TEXT-019 ' ' '' ''      '' ''. "票据状态
  MACRO_FCAT 'ZLSBH' 'ZAPPJ' 'ZLSBH' TEXT-007 ' ' '' ''      '' ''. "流水号
  MACRO_FCAT 'BUKRS' 'ZAPPJ' 'BUKRS' TEXT-008 ' ' '' ''      '' ''. "公司代码
  MACRO_FCAT 'ZPJBH' 'ZAPPJ' 'ZPJBH' TEXT-009 ' ' '' ''      '' ''. "票据号
  MACRO_FCAT 'ZCKBH' 'ZAPPJ' 'ZCKBH' TEXT-020 ' ' '' ''      '' ''. "参考号
  MACRO_FCAT 'ZCPRQ' 'ZAPPJ' 'ZCPRQ' TEXT-010 ' ' '' LV_EDIT '' ''. "出票日期
  MACRO_FCAT 'ZDQRQ' 'ZAPPJ' 'ZDQRQ' TEXT-011 ' ' '' LV_EDIT '' ''. "到期日期
  MACRO_FCAT 'ZGZRQ' 'ZAPPJ' 'ZGZRQ' TEXT-012 ' ' '' LV_EDIT '' ''. "过账日期
  MACRO_FCAT 'ZHPJE' 'ZAPPJ' 'ZHPJE' TEXT-013 ' ' '' LV_EDIT '' ''. "汇票金额
  MACRO_FCAT 'ZBZJJE' 'ZAPPJ' 'ZBZJJE' TEXT-055 ' ' '' ''    '' ''. "保证金金额
  MACRO_FCAT 'ZBZJJE_BC' 'ZAPPJ' 'ZBZJJE' TEXT-061 ' ' '' ''    '' ''. "本次保证金金额
  MACRO_FCAT 'ZLCJE' 'ZAPPJ' 'ZLCJE' TEXT-056 ' ' '' ''      '' ''. "理财金额
  MACRO_FCAT 'ZLCJE_BC'  'ZAPPJ' 'ZLCJE'  TEXT-062 ' ' '' ''      '' ''. "本次理财金额
  MACRO_FCAT 'ZJKJE' 'ZAPPJ' 'ZLCJE' TEXT-058 ' ' '' ''      '' ''. "借款金额
  MACRO_FCAT 'ZPJLX' 'ZAPPJ' 'ZPJLX' TEXT-014 ' ' '' LV_EDIT '' ''. "票据类型
  MACRO_FCAT 'TPJLX' ''      ''      TEXT-022 ' ' '' ''      '' ''. "票据类型描述
  MACRO_FCAT 'ZZJZH' 'ZAPPJ' 'ZZJZH' TEXT-027 ' ' '' LV_EDIT '' ''. "资金账号编码
  MACRO_FCAT 'CNAME' 'TCJ_CJ_NAMES'  'CAJO_NAME' TEXT-052 ' ' '' ''      '' ''. "资金账号描述
  MACRO_FCAT 'HKONT' 'BSEG'  'HKONT' TEXT-050 ' ' '' ''      '' ''. "银行科目
  MACRO_FCAT 'KUNNR' 'ZARPJ' 'KUNNR' TEXT-015 ' ' '' ''      '' ''. "客户编码
  MACRO_FCAT 'KNAME' 'KNA1'  'NAME1' TEXT-023 ' ' '' ''      '' ''. "客户描述
  MACRO_FCAT 'LIFNR' 'ZARPJ' 'LIFNR' TEXT-016 ' ' '' LV_EDIT '' ''. "供应商编码
  MACRO_FCAT 'LNAME' 'LFA1'  'NAME1' TEXT-024 ' ' '' ''      '' ''. "供应商描述
  MACRO_FCAT 'SGTXT' 'ZAPPJ' 'SGTXT' TEXT-017 ' ' '' LV_EDIT '' ''. "摘要
  MACRO_FCAT 'ZDJLX' 'ZAPPJ' 'ZDJLX' TEXT-018 ' ' '' ''      '' ''. "源单据类型
  MACRO_FCAT 'CJBELNR_FK' 'ZARPJ' 'CJBELNR_FK' TEXT-053 ' ' '' ''      '' ''. "日记账凭证1
  MACRO_FCAT 'CJBELNR_BZ' 'ZARPJ' 'CJBELNR_BZ' TEXT-054 ' ' '' ''      '' ''. "日记账凭证2
  MACRO_FCAT 'CJBELNR_LC' 'ZARPJ' 'CJBELNR_LC' TEXT-059 ' ' '' ''      '' ''. "日记账凭证3
  MACRO_FCAT 'CJBELNR_ZC' 'ZARPJ' 'CJBELNR_ZC' TEXT-060 ' ' '' ''      '' ''. "日记账凭证4
  MACRO_FCAT 'CJBELNR_AP1' 'ZARPJ' 'CJBELNR_FK' TEXT-063 ' ' '' ''      '' ''. "日记账凭证1
  MACRO_FCAT 'CJBELNR_AP2' 'ZARPJ' 'CJBELNR_BZ' TEXT-064 ' ' '' ''      '' ''. "日记账凭证2
  MACRO_FCAT 'CJBELNR_AP3' 'ZARPJ' 'CJBELNR_LC' TEXT-065 ' ' '' ''      '' ''. "日记账凭证3
  MACRO_FCAT 'CJBELNR_AP4' 'ZARPJ' 'CJBELNR_ZC' TEXT-066 ' ' '' ''      '' ''. "日记账凭证4
  MACRO_FCAT 'CJBELNR_AP5' 'ZARPJ' 'CJBELNR_ZC' TEXT-067 ' ' '' ''      '' ''. "日记账凭证5
  MACRO_FCAT 'ZNUMB' 'ZTFI_031_HEAD' 'ZNUMB' TEXT-071 ' ' '' ''      '' ''. "流水号
  MACRO_FCAT 'ZGZZT' 'ZARPJ' 'ZGZZT' TEXT-041 ' ' '' ''      '' ''. "过账状态
  MACRO_FCAT 'BELNR' 'BKPF'  'BELNR' TEXT-048 ' ' '' ''      '' ''. "会计凭证
  MACRO_FCAT 'ERDAT' 'ZARPJ' 'ERDAT' TEXT-042 ' ' '' ''      '' ''. "创建日期
  MACRO_FCAT 'ERZET' 'ZARPJ' 'ERZET' TEXT-043 ' ' '' ''      '' ''. "创建时间
  MACRO_FCAT 'ERNAM' 'ZARPJ' 'ERNAM' TEXT-044 ' ' '' ''      '' ''. "创建人员
  MACRO_FCAT 'ZZTBS' 'ZARPJ' 'ZZTBS' TEXT-038 ' ' '' ''      '' ''. "最新状态

  IF P_SHOW IS NOT INITIAL OR P_LOG IS NOT INITIAL..

    GT_FIELDCAT[ FIELDNAME = 'LIGHT' ]-NO_OUT   = 'X'."指示灯
    GT_FIELDCAT[ FIELDNAME = 'MESSAGE' ]-NO_OUT = 'X'."消息

  ENDIF.

  IF P_UPLOAD IS NOT INITIAL.

    GT_FIELDCAT[ FIELDNAME = 'TPJLX' ]-NO_OUT = 'X'."票据类型描述
    GT_FIELDCAT[ FIELDNAME = 'KNAME' ]-NO_OUT = 'X'."客户描述
    GT_FIELDCAT[ FIELDNAME = 'KUNNR' ]-NO_OUT = 'X'."客户编号
*    GT_FIELDCAT[ FIELDNAME = 'LNAME' ]-NO_OUT = 'X'."供应商描述
    GT_FIELDCAT[ FIELDNAME = 'ZBZJJE' ]-NO_OUT = 'X'."保证金金额
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_FK' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_LC' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_BZ' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_ZC' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP1' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP2' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP3' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP4' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP5' ]-NO_OUT = 'X'."日记账凭证
    GT_FIELDCAT[ FIELDNAME = 'HKONT' ]-NO_OUT = 'X'."银行科目
    GT_FIELDCAT[ FIELDNAME = 'ZLCJE' ]-NO_OUT = 'X'."理财金额
    GT_FIELDCAT[ FIELDNAME = 'ZJKJE' ]-NO_OUT = 'X'."借款金额
    GT_FIELDCAT[ FIELDNAME = 'ZBZJJE_BC' ]-NO_OUT = 'X'."本次保证金金额
    GT_FIELDCAT[ FIELDNAME = 'ZLCJE_BC' ]-NO_OUT = 'X'."本次理财金额
    GT_FIELDCAT[ FIELDNAME = 'ZZTBS' ]-NO_OUT = 'X'."状态标识
    GT_FIELDCAT[ FIELDNAME = 'ZNUMB' ]-NO_OUT = 'X'."流水号批次
    GT_FIELDCAT[ FIELDNAME = 'ZCKBH' ]-NO_OUT = 'X'."参考编号
    GT_FIELDCAT[ FIELDNAME = 'ZGZZT' ]-NO_OUT = 'X'."过账状态
    GT_FIELDCAT[ FIELDNAME = 'BELNR' ]-NO_OUT = 'X'."会计凭证
    GT_FIELDCAT[ FIELDNAME = 'ERDAT' ]-NO_OUT = 'X'."创建日期
    GT_FIELDCAT[ FIELDNAME = 'ERZET' ]-NO_OUT = 'X'."创建时间
    GT_FIELDCAT[ FIELDNAME = 'ERNAM' ]-NO_OUT = 'X'."创建人员
  ENDIF.

  IF P_CHANGE IS NOT INITIAL OR P_CHUP IS NOT INITIAL.
    GT_FIELDCAT[ FIELDNAME = 'ZBZJJE' ]-NO_OUT = 'X'."保证金金额
    GT_FIELDCAT[ FIELDNAME = 'ZLCJE' ]-NO_OUT = 'X'. "理财金额
    GT_FIELDCAT[ FIELDNAME = 'ZJKJE' ]-NO_OUT = 'X'. "借款金额
    GT_FIELDCAT[ FIELDNAME = 'HKONT' ]-NO_OUT = 'X'."银行科目
    GT_FIELDCAT[ FIELDNAME = 'ZNUMB' ]-NO_OUT = 'X'."流水号批次
  ENDIF.

  IF P_CHANGE IS NOT INITIAL OR
      P_CHUP IS NOT INITIAL OR
      P_BZJLC IS NOT INITIAL OR
      P_DUIFU IS NOT INITIAL OR
      P_POST IS NOT INITIAL.

    IF P_POST IS INITIAL.
      GT_FIELDCAT[ FIELDNAME = 'BELNR' ]-NO_OUT = 'X'."会计凭证
    ENDIF.

    IF P_DUIFU IS INITIAL AND P_POST IS INITIAL.
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_FK' ]-NO_OUT = 'X'."日记账凭证
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_LC' ]-NO_OUT = 'X'."日记账凭证
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_BZ' ]-NO_OUT = 'X'."日记账凭证
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_ZC' ]-NO_OUT = 'X'."日记账凭证
    ENDIF.

    IF P_BZJLC IS INITIAL AND P_POST IS INITIAL.
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP1' ]-NO_OUT = 'X'."日记账凭证
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP2' ]-NO_OUT = 'X'."日记账凭证
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP3' ]-NO_OUT = 'X'."日记账凭证
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP4' ]-NO_OUT = 'X'."日记账凭证
      GT_FIELDCAT[ FIELDNAME = 'CJBELNR_AP5' ]-NO_OUT = 'X'."日记账凭证
    ENDIF.

    IF P_CHUP IS INITIAL AND P_POST IS INITIAL.
      GT_FIELDCAT[ FIELDNAME = 'KNAME' ]-NO_OUT = 'X'."客户描述
      GT_FIELDCAT[ FIELDNAME = 'KUNNR' ]-NO_OUT = 'X'."客户编号
    ENDIF.
  ENDIF.

  IF P_BZJLC IS INITIAL.
    GT_FIELDCAT[ FIELDNAME = 'ZBZJJE_BC' ]-NO_OUT = 'X'."本次保证金金额
    GT_FIELDCAT[ FIELDNAME = 'ZLCJE_BC' ]-NO_OUT = 'X'."本次理财金额
  ENDIF.

  IF P_POST IS NOT INITIAL.
    GT_FIELDCAT[ FIELDNAME = 'ZGZRQ' ]-EDIT = 'X'."过账日期
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
  GS_EVENT-NAME = 'CALLER_EXIT'.
  GS_EVENT-FORM = 'FRM_REGISTER_EVENTS'.
  APPEND GS_EVENT TO GT_EVENTS.
  CLEAR GS_EVENT.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
*     I_INTERFACE_CHECK        = ' '
*     I_BYPASSING_BUFFER       =
*     I_BUFFER_ACTIVE          =
      I_CALLBACK_PROGRAM       = GV_REPID
      I_CALLBACK_PF_STATUS_SET = 'FRM_SET_STATUS'
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE   = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE = 'HTML_TOP_OF_PAGE '
*     I_CALLBACK_HTML_END_OF_LIST = ' '
*     I_STRUCTURE_NAME         =
*     I_BACKGROUND_ID          = ' '
*     I_GRID_TITLE             =
      I_GRID_SETTINGS          = GS_SETTINGS
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT[]
*     IT_EXCLUDING             =
*     IT_SPECIAL_GROUPS_LVC    =
*     IT_SORT_LVC              =
*     IT_FILTER_LVC            =
*     IT_HYPERLINK             =
*     IS_SEL_HIDE              =
      I_DEFAULT                = 'X'
      I_SAVE                   = 'X'
*     IS_VARIANT               =
      IT_EVENTS                = GT_EVENTS
*     IT_EVENT_EXIT            =
*     IS_PRINT_LVC             =
*     IS_REPREP_ID_LVC         =
*     I_SCREEN_START_COLUMN    = 0
*     I_SCREEN_START_LINE      = 0
*     I_SCREEN_END_COLUMN      = 0
*     I_SCREEN_END_LINE        = 0
*     I_HTML_HEIGHT_TOP        =
*     I_HTML_HEIGHT_END        =
*     IT_ALV_GRAPHICS          =
*     IT_EXCEPT_QINFO_LVC      =
*     IR_SALV_FULLSCREEN_ADAPTER  =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER  =
*     ES_EXIT_CAUSED_BY_USER   =
    TABLES
      T_OUTTAB                 = GT_ALV
    EXCEPTIONS
      PROGRAM_ERROR            = 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.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_EXTAB    text
*----------------------------------------------------------------------*
FORM FRM_SET_STATUS USING PT_EXTAB TYPE SLIS_T_EXTAB.
  DATA: LS_EXTAB TYPE SLIS_EXTAB.

  LS_EXTAB-FCODE = 'UPLOAD'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'SAVE'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'DELETE'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'DUIFU'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'FDUIFU'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'BZJLC'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'TUIHUI'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'CHUP'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'TUIP'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'POST'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  LS_EXTAB-FCODE = 'CANCEL'.
  APPEND LS_EXTAB TO PT_EXTAB.
  CLEAR LS_EXTAB.

  "动态显示状态的按钮
  IF P_UPLOAD = 'X'."上传
    DELETE PT_EXTAB WHERE FCODE = 'UPLOAD'.
  ENDIF.

  IF P_CHANGE = 'X'."修改票据
    DELETE PT_EXTAB WHERE FCODE = 'SAVE'.
    DELETE PT_EXTAB WHERE FCODE = 'DELETE'.
  ENDIF.

  IF P_DUIFU = 'X'."兑付
    DELETE PT_EXTAB WHERE FCODE = 'DUIFU'.
    DELETE PT_EXTAB WHERE FCODE = 'FDUIFU'.
  ENDIF.

  IF P_CHUP = 'X'."出票/退票
    DELETE PT_EXTAB WHERE FCODE = 'CHUP'.
    DELETE PT_EXTAB WHERE FCODE = 'TUIP'.
  ENDIF.

  IF P_BZJLC = 'X'."转保证金/理财
    DELETE PT_EXTAB WHERE FCODE = 'BZJLC'.
    DELETE PT_EXTAB WHERE FCODE = 'TUIHUI'.
  ENDIF.

  IF P_POST = 'X'."过账/冲销
    DELETE PT_EXTAB WHERE FCODE = 'POST'.
    DELETE PT_EXTAB WHERE FCODE = 'CANCEL'.
  ENDIF.

  SET PF-STATUS 'STANDARD' EXCLUDING PT_EXTAB.
ENDFORM. "SET_STATUS
*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*      捕捉用户的动作
*----------------------------------------------------------------------*
*      -->P_UCOMM        text
*      -->P_RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING PV_UCOMM TYPE SY-UCOMM
                            PS_SELFIELD TYPE SLIS_SELFIELD.

  "对话框返回值
  DATA : LV_ANSWER TYPE C.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = G_ALV_GRID.

  CALL METHOD G_ALV_GRID->CHECK_CHANGED_DATA.


  CASE PV_UCOMM.

    WHEN 'UPLOAD'."上传数据

      PERFORM FRM_UPLOAD_DBDATA.               "将数据导入自建表ZAPPJ

    WHEN 'SAVE'.  "修改票据

      PERFORM FRM_SAVE_DBDATA USING PV_UCOMM.  "将票据内容更新

    WHEN 'DELETE'."作废票据

      PERFORM FRM_SAVE_DBDATA USING PV_UCOMM.  "将票据更新为作废

    WHEN 'CHUP'.  "出票
      PERFORM FRM_SAVE_DBDATA USING PV_UCOMM.  "将票据更新为出票

    WHEN 'TUIP'.  "退票

      PERFORM FRM_SAVE_DBDATA USING PV_UCOMM.  "将票据更新为退票

    WHEN 'BZJLC'. "转保证金/理财

      PERFORM FRM_BZJLC_DATA.                  "将票据转保证金/理财户

    WHEN 'TUIHUI'."退回

      PERFORM FRM_FDUIFU_DATA USING  PV_UCOMM. "将保证金/理财户退回

    WHEN 'DUIFU'. "兑付

      PERFORM FRM_DUIFU_DATA.                  "兑付

    WHEN 'FDUIFU'."反兑付

      PERFORM FRM_FDUIFU_DATA USING  PV_UCOMM. "反向兑付

    WHEN 'POST'.  "过账会计凭证

      PERFORM FRM_POST_DATA.                   "生成会计凭证

    WHEN 'CANCEL'."冲销

      PERFORM FRM_CANCEL_DATA.                 "冲销

    WHEN '&IC1'.

      "跳转至FB03显示会计凭证
      IF PS_SELFIELD-FIELDNAME EQ 'BELNR'.
        PERFORM FRM_CALL_TRANSACTION_FB03 USING   PS_SELFIELD .
      ENDIF.

    WHEN 'ZBACK' OR 'ZEXIT' OR 'ZCANCEL'.

      IF GV_UPDATE IS INITIAL.

        CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
          EXPORTING
            TITEL       = '对话框'
            TEXT_BEFORE = '是否确认退出'
            OBJECTVALUE = '应付票据管理平台'
            TEXT_AFTER  = '?'
          IMPORTING
            ANSWER      = LV_ANSWER.
        IF LV_ANSWER <> 'J'.
          RETURN.
        ENDIF.

        LEAVE TO SCREEN 0.
      ELSE.
        CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
          EXPORTING
            TITEL       = '对话框'
            TEXT_BEFORE = '已做更改未保存,是否确认退出'
            OBJECTVALUE = '应付票据管理平台'
            TEXT_AFTER  = '?'
          IMPORTING
            ANSWER      = LV_ANSWER.
        IF LV_ANSWER <> 'J'.
          RETURN.
        ENDIF.

        LEAVE TO SCREEN 0.
      ENDIF.
    WHEN OTHERS.

  ENDCASE.

  PERFORM FRM_REFRESH_ALV.
*  PS_SELFIELD-REFRESH = 'X' .
*  PS_SELFIELD-COL_STABLE = 'X'.
*  PS_SELFIELD-ROW_STABLE = 'X'.
  "当用户在显式界面上对数据进行修改时,同时内表中的数据也随之刷新
ENDFORM. "FRM_USER_COMMAND

*&---------------------------------------------------------------------*
*&      Form  FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_REFRESH_ALV .

  DATA LS_STABLE TYPE LVC_S_STBL.
  LS_STABLE-ROW = 'X'.
  LS_STABLE-COL = 'X'.

  CALL METHOD G_ALV_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      I_SOFT_REFRESH = 'X'
      IS_STABLE      = LS_STABLE
    EXCEPTIONS
      FINISHED       = 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.
ENDFORM. " FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*&      Form  FRM_REGISTER_EVENTS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_REGISTER_EVENTS USING FU_GRID TYPE SLIS_DATA_CALLER_EXIT.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = G_ALV_GRID.

  CALL METHOD G_ALV_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
    EXCEPTIONS
      ERROR      = 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.
  CALL METHOD G_ALV_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
    EXCEPTIONS
      ERROR      = 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.

  CREATE OBJECT G_CL_EVENT_RECEIVER.

  SET HANDLER G_CL_EVENT_RECEIVER->HANDLE_MODIFY FOR G_ALV_GRID.
  SET HANDLER G_CL_EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR G_ALV_GRID.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_ERROR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_GT_ALV  text
*      <--P_LV_ERROR  text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_ERROR  USING    PT_ALV TYPE TY_ALV_TAB
                      CHANGING PV_ERROR.
  READ TABLE PT_ALV ASSIGNING <FS_ALV> WITH KEY LIGHT = ICON_RED_LIGHT.
  IF SY-SUBRC = 0.
    PV_ERROR = ABAP_TRUE.

    MESSAGE I006.
    RETURN.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_REPEAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_GT_ALV  text
*      <--P_LV_ERROR  text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_REPEAT  USING    PT_ALV TYPE TY_ALV_TAB
                      CHANGING PV_ERROR.
  READ TABLE PT_ALV ASSIGNING <FS_ALV> WITH KEY LIGHT = ICON_GREEN_LIGHT.
  IF SY-SUBRC = 0.
    PV_ERROR = ABAP_TRUE.
    MESSAGE I011 WITH <FS_ALV>-ZPJBH.
    RETURN.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_NUMBER_RANGE
*&---------------------------------------------------------------------*
*&  PV_OBJECT        号码段名称
*&  PV_NR_RANGE_NR   号码段序列号
*&  PV_SUBOBJECT     子对象的值
*&  PV_TOYEAR        财年
*----------------------------------------------------------------------*
*      <--P_LW_HEADER_ZZSRFQNUMC  text
*----------------------------------------------------------------------*
FORM GET_NUMBER_RANGE USING PV_OBJECT TYPE TNRO-OBJECT
                             PV_NR_RANGE_NR TYPE INRI-NRRANGENR
                             PV_SUBOBJECT
                             PV_TOYEAR TYPE INRI-TOYEAR
                      CHANGING PV_ERROR TYPE C
                               PV_MESSAGE TYPE BAPI_MSG
                               PV_ZLSBH .
*&----------加锁
  CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
    EXPORTING
      OBJECT           = PV_OBJECT
    EXCEPTIONS
      FOREIGN_LOCK     = 1
      OBJECT_NOT_FOUND = 2
      SYSTEM_FAILURE   = 3
      OTHERS           = 4.
  IF SY-SUBRC <> 0.

    PV_ERROR = ABAP_TRUE.

    MESSAGE ID     SY-MSGID
            TYPE   SY-MSGTY
            NUMBER SY-MSGNO
            WITH   SY-MSGV1
                   SY-MSGV2
                   SY-MSGV3
                   SY-MSGV4
            INTO PV_MESSAGE.

  ENDIF.
*&---------获取号码
  CALL FUNCTION 'NUMBER_GET_NEXT'
    EXPORTING
      NR_RANGE_NR             = PV_NR_RANGE_NR
      OBJECT                  = PV_OBJECT
      SUBOBJECT               = PV_SUBOBJECT
      TOYEAR                  = PV_TOYEAR
    IMPORTING
      NUMBER                  = PV_ZLSBH
    EXCEPTIONS
      INTERVAL_NOT_FOUND      = 1
      NUMBER_RANGE_NOT_INTERN = 2
      OBJECT_NOT_FOUND        = 3
      QUANTITY_IS_0           = 4
      QUANTITY_IS_NOT_1       = 5
      INTERVAL_OVERFLOW       = 6
      BUFFER_OVERFLOW         = 7
      OTHERS                  = 8.
  IF SY-SUBRC <> 0.
    PV_ERROR = ABAP_TRUE.

    MESSAGE ID     SY-MSGID
            TYPE   SY-MSGTY
            NUMBER SY-MSGNO
            WITH   SY-MSGV1
                   SY-MSGV2
                   SY-MSGV3
                   SY-MSGV4
            INTO PV_MESSAGE.

  ENDIF.
*&---------解锁
  CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
    EXPORTING
      OBJECT           = PV_OBJECT
    EXCEPTIONS
      OBJECT_NOT_FOUND = 1
      OTHERS           = 2.
  IF SY-SUBRC <> 0.
    PV_ERROR = ABAP_TRUE.

    MESSAGE ID     SY-MSGID
            TYPE   SY-MSGTY
            NUMBER SY-MSGNO
            WITH   SY-MSGV1
                   SY-MSGV2
                   SY-MSGV3
                   SY-MSGV4
            INTO PV_MESSAGE.

  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DBDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_DBDATA .
  DATA: LS_DB_ZAPPJ TYPE ZAPPJ.
  DATA: LV_ERROR   TYPE C,
        LV_MESSAGE TYPE BAPI_MSG,
        LV_ZLSBH   TYPE ZAPPJ-ZLSBH.
  "对话框返回值
  DATA : LV_ANSWER TYPE C.

  "检查是否有错误数据
  PERFORM FRM_CHECK_ERROR USING GT_ALV CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否重复操作
  PERFORM FRM_CHECK_REPEAT USING GT_ALV CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
    EXPORTING
      TITEL       = '对话框'
      TEXT_BEFORE = '是否需要导入'
      OBJECTVALUE = '应付票据'
      TEXT_AFTER  = '?'
    IMPORTING
      ANSWER      = LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    RETURN.
  ENDIF.

  "将内表数据复制给待更新的数据库内表
  LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE LIGHT = ICON_YELLOW_LIGHT
                                       OR LIGHT = ICON_CANCEL.

    IF LV_ZLSBH IS INITIAL.
      "获取流水号
      PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YF GC_RANGE_NR ' ' SY-DATUM+0(4)
                               CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH.
    ENDIF.

    IF LV_ERROR IS INITIAL.

      "拼接流水号
      SHIFT LV_ZLSBH LEFT DELETING LEADING ''.
      <FS_ALV>-ZLSBH = GC_AP && SY-DATUM+2(2) && LV_ZLSBH.

      MOVE-CORRESPONDING <FS_ALV> TO LS_DB_ZAPPJ.
      LS_DB_ZAPPJ-ZZTBS = ABAP_TRUE."最新状态
      LS_DB_ZAPPJ-ERDAT = SY-DATUM. "创建日期
      LS_DB_ZAPPJ-ERZET = SY-UZEIT. "创建时间
      LS_DB_ZAPPJ-ERNAM = SY-UNAME. "创建人员

      "更新至数据库
      TRY .
          INSERT ZAPPJ FROM LS_DB_ZAPPJ.
          IF SY-SUBRC <> 0.
            LV_ERROR = ABAP_TRUE.
          ENDIF.
        CATCH CX_SY_OPEN_SQL_DB.
          LV_ERROR = ABAP_TRUE.
      ENDTRY.

      "将删除行的最新状态标识为空
      IF <FS_ALV>-LSBH1 IS NOT INITIAL.
        "更新原数据的最新状态为空;
        UPDATE ZAPPJ SET ZZTBS = SPACE WHERE ZLSBH = <FS_ALV>-LSBH1
                                         AND BUKRS = <FS_ALV>-BUKRS
                                         AND ZPJBH = <FS_ALV>-ZPJBH.
        IF SY-SUBRC <> 0.
          LV_ERROR = ABAP_TRUE.
        ENDIF.
      ENDIF.

      IF LV_ERROR IS INITIAL.
        COMMIT WORK AND WAIT.

        "指示灯
        <FS_ALV>-LIGHT = ICON_GREEN_LIGHT.
        "消息
        <FS_ALV>-MESSAGE = TEXT-031.

        CLEAR LV_ZLSBH.

      ELSE.

        ROLLBACK WORK.
        "指示灯
        <FS_ALV>-LIGHT = ICON_CANCEL.
        "消息
        <FS_ALV>-MESSAGE = TEXT-032.

        CLEAR <FS_ALV>-ZLSBH.
      ENDIF.

    ELSE.

      "指示灯
      <FS_ALV>-LIGHT = ICON_CANCEL.
      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.

      CLEAR <FS_ALV>-ZLSBH.
    ENDIF.

    CLEAR:LV_ERROR,LV_MESSAGE, LS_DB_ZAPPJ.

  ENDLOOP.


  FREE: LS_DB_ZAPPJ,
        LV_ERROR,
        LV_MESSAGE,
        LV_ZLSBH.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .
  DATA: LT_DEAL TYPE STANDARD TABLE OF TY_ALV,
        LT_KNA1 TYPE STANDARD TABLE OF TY_KNA1,
        LT_LFA1 TYPE STANDARD TABLE OF TY_LFA1.

  CLEAR GT_ALV.

  "根据筛选条件获取应收票据的数据
  SELECT *
  FROM ZAPPJ
  INTO CORRESPONDING FIELDS OF TABLE GT_ALV
  WHERE BUKRS = P_BUKRS
    AND ZGZRQ IN S_BUDAT
    AND ZZJZH IN S_ZZJZH
    AND ZPJBH IN S_ZPJBH.


  "根据操作类型删除数据
  IF P_LOG IS INITIAL.
    "删除非最新状态的数据
    DELETE GT_ALV WHERE ZZTBS IS INITIAL.

    IF P_SHOW IS INITIAL.

      "删除票据状态为‘作废’或者'退票'
      DELETE GT_ALV WHERE ZPJZT = GC_ZPJZT_SC OR ZPJZT = GC_ZPJZT_TP.


      IF P_CHANGE IS NOT INITIAL.
        "修改作废时,删除票据状态不为‘登记’或者过账状态不为空或者源单据类型不为‘手工增加’
        DELETE GT_ALV WHERE ZPJZT <> GC_ZPJZT_DJ OR ZGZZT IS NOT INITIAL OR ZDJLX <> GC_ZDJLX.
      ENDIF.

      IF P_CHUP IS NOT INITIAL.
        "出票退票时,删除过账状态不为空或者票据状态为‘兑付’或者源单据来源为‘OA集成’或者已经转保证金
        DELETE GT_ALV WHERE ZGZZT IS NOT INITIAL OR ZPJZT = GC_ZPJZT_DF  OR ZDJLX = GC_ZDJLX_OA OR ZBZLC IS NOT INITIAL.
      ENDIF.

      IF P_DUIFU IS NOT INITIAL.
        "兑付反兑付时,删除状态不为出票和兑付,或者不为出票已过账,或者不为兑付未过账
        DELETE GT_ALV WHERE ZPJZT <> GC_ZPJZT_DF AND ZPJZT <> GC_ZPJZT_CP.
        DELETE GT_ALV WHERE ZPJZT = GC_ZPJZT_CP AND ZGZZT IS INITIAL.
        DELETE GT_ALV WHERE ZPJZT = GC_ZPJZT_DF AND ZGZZT IS NOT INITIAL.
      ENDIF.

      IF P_POST IS NOT INITIAL.
        "删除登记状态的数据
        DELETE GT_ALV WHERE ZPJZT = GC_ZPJZT_DJ.
        "删除登记背书未过账数据
        DELETE GT_ALV WHERE ZPJZT = GC_ZPJZT_DJBS AND ZGZZT IS INITIAL.
      ENDIF.

      IF P_BZJLC IS NOT INITIAL.
        "删除票据状态不为出票的数据
        DELETE GT_ALV WHERE ZPJZT <> GC_ZPJZT_CP.
        "删除未过账没转保证理财金的数据
        DELETE GT_ALV WHERE ZGZZT IS INITIAL AND ZBZLC IS INITIAL.
*        "删除已过账已转保证金的数据
*        DELETE GT_ALV WHERE ZGZZT IS NOT INITIAL AND ZBZLC IS NOT INITIAL.
      ENDIF.
    ENDIF.

  ENDIF.

  IF GT_ALV IS NOT INITIAL.

    "获取客户描述
    LT_DEAL[] = GT_ALV[].
    DELETE LT_DEAL WHERE KUNNR IS INITIAL.
    SORT LT_DEAL BY KUNNR.
    DELETE ADJACENT DUPLICATES FROM LT_DEAL COMPARING KUNNR.
    IF LT_DEAL IS NOT INITIAL.
      SELECT KUNNR
             NAME1
        FROM KNA1
        INTO CORRESPONDING FIELDS OF TABLE LT_KNA1
        FOR ALL ENTRIES IN LT_DEAL
        WHERE KUNNR = LT_DEAL-KUNNR.
      SORT LT_KNA1 BY KUNNR.
    ENDIF.

    "获取供应商描述
    LT_DEAL[] = GT_ALV[].
    DELETE LT_DEAL WHERE LIFNR IS INITIAL.
    SORT LT_DEAL BY LIFNR.
    DELETE ADJACENT DUPLICATES FROM LT_DEAL COMPARING LIFNR.
    IF LT_DEAL IS NOT INITIAL.
      SELECT LIFNR
             NAME1
        FROM LFA1
        INTO CORRESPONDING FIELDS OF TABLE LT_LFA1
        FOR ALL ENTRIES IN LT_DEAL
        WHERE LIFNR = LT_DEAL-LIFNR.
      SORT LT_LFA1 BY LIFNR.
    ENDIF.

    "票据类型描述
    SELECT *
      FROM T074T
      INTO TABLE @DATA(LT_T074T)
      WHERE SPRAS = @SY-LANGU.
    SORT LT_T074T BY SHBKZ.

    "资金账户描述
    SELECT *
      FROM TCJ_CJ_NAMES
      INTO TABLE @DATA(LT_NAMES)
      WHERE LANGU     = @SY-LANGU
        AND COMP_CODE = @P_BUKRS.
    SORT LT_NAMES BY CAJO_NUMBER.

    "现金日记账分类
    SELECT *
      FROM TCJ_C_JOURNALS
      INTO TABLE @DATA(LT_JOURNALS)
      WHERE COMP_CODE = @P_BUKRS.
    SORT LT_JOURNALS BY CAJO_NUMBER.

    "转保证金/理财户记录
    LT_DEAL[] = GT_ALV[].
    DELETE LT_DEAL WHERE ZNUMB IS INITIAL.
    SORT LT_DEAL BY ZNUMB.
    DELETE ADJACENT DUPLICATES FROM LT_DEAL COMPARING ZNUMB.
    IF LT_DEAL IS NOT INITIAL.
      SELECT *
        FROM ZTFI_031_HEAD
        INTO TABLE @DATA(LT_HEAD)
        FOR ALL ENTRIES IN @LT_DEAL
        WHERE ZNUMB = @LT_DEAL-ZNUMB.
      SORT LT_HEAD BY ZNUMB.
    ENDIF.

    "保证金账户
    SELECT *
      FROM ZTFI_BZJZH
      INTO TABLE GT_BZJZH
      WHERE BUKRS = P_BUKRS.
    SORT GT_BZJZH BY ZZJZH BZJZH.

    "理财金账户
    SELECT *
      FROM ZTFI_LCJZH
      INTO TABLE GT_LCJZH
      WHERE BUKRS = P_BUKRS.
    SORT GT_LCJZH BY ZZJZH LCJZH.

    "业务配置表
    SELECT *
      FROM ZTFI_CJTRANS
      INTO TABLE GT_CJTRANS
      WHERE BUKRS = P_BUKRS.
    SORT GT_CJTRANS BY CJTRANS.

    LOOP AT GT_ALV ASSIGNING <FS_ALV>.

      "指示灯
      <FS_ALV>-LIGHT = ICON_YELLOW_LIGHT.

      "客户描述
      READ TABLE LT_KNA1 ASSIGNING <FS_KNA1> WITH KEY KUNNR = <FS_ALV>-KUNNR BINARY SEARCH.
      IF SY-SUBRC = 0.
        <FS_ALV>-KNAME = <FS_KNA1>-NAME1.
      ENDIF.

      "供应商描述
      READ TABLE LT_LFA1 ASSIGNING <FS_LFA1> WITH KEY LIFNR = <FS_ALV>-LIFNR BINARY SEARCH.
      IF SY-SUBRC = 0.
        <FS_ALV>-LNAME = <FS_LFA1>-NAME1.
      ENDIF.

      "票据类型描述
      READ TABLE LT_T074T INTO DATA(LS_T074T) WITH KEY SHBKZ = <FS_ALV>-ZPJLX BINARY SEARCH.
      IF SY-SUBRC = 0.
        <FS_ALV>-TPJLX = LS_T074T-LTEXT.
      ENDIF.

      "资金账户描述
      READ TABLE LT_NAMES INTO DATA(LS_NAMES) WITH KEY CAJO_NUMBER = <FS_ALV>-ZZJZH BINARY SEARCH.
      IF SY-SUBRC = 0.
        <FS_ALV>-CNAME = LS_NAMES-CAJO_NAME.
      ENDIF.


      READ TABLE LT_JOURNALS INTO DATA(LS_JOURNALS) WITH KEY CAJO_NUMBER = <FS_ALV>-ZZJZH BINARY SEARCH.
      IF SY-SUBRC = 0.
        "资金账户分类
        <FS_ALV>-PERSON1 = LS_JOURNALS-PERSON1.
        "资金账户总账科目
        <FS_ALV>-HKONT = LS_JOURNALS-GL_ACCOUNT.
      ENDIF.

      READ TABLE LT_HEAD INTO DATA(LS_HEAD) WITH KEY ZNUMB = <FS_ALV>-ZNUMB BINARY SEARCH.
      IF SY-SUBRC = 0.
        "保证金账户
        <FS_ALV>-ZBZZH = LS_HEAD-ZBZZH.

        CLEAR LS_JOURNALS.
        READ TABLE LT_JOURNALS INTO LS_JOURNALS WITH KEY CAJO_NUMBER = <FS_ALV>-ZBZZH BINARY SEARCH.
        IF SY-SUBRC = 0.
          "保证金账户总账科目
          <FS_ALV>-HKONT_BZ = LS_JOURNALS-GL_ACCOUNT.
        ENDIF.

        "理财户账户
        <FS_ALV>-ZLCZH = LS_HEAD-ZLCZH.
        CLEAR LS_JOURNALS.
        READ TABLE LT_JOURNALS INTO LS_JOURNALS WITH KEY CAJO_NUMBER = <FS_ALV>-ZLCZH BINARY SEARCH.
        IF SY-SUBRC = 0.
          "理财户账户总账科目
          <FS_ALV>-HKONT_LC = LS_JOURNALS-GL_ACCOUNT.
        ENDIF.

        "
        <FS_ALV>-CJBELNR_AP1 = LS_HEAD-CJBELNR_AP1.
        <FS_ALV>-CJBELNR_AP2 = LS_HEAD-CJBELNR_AP2.
        <FS_ALV>-CJBELNR_AP3 = LS_HEAD-CJBELNR_AP3.
        <FS_ALV>-CJBELNR_AP4 = LS_HEAD-CJBELNR_AP4.
        <FS_ALV>-CJBELNR_AP5 = LS_HEAD-CJBELNR_AP5.
        <FS_ALV>-BELNR       = LS_HEAD-BELNR_ZC.
      ENDIF.

      "会计凭证
      IF <FS_ALV>-ZPJZT = GC_ZPJZT_CP.

        IF <FS_ALV>-ZBZLC IS INITIAL.
          <FS_ALV>-BELNR = <FS_ALV>-BELNR_CP.      "出票过账凭证
        ELSE.
*          <FS_ALV>-BELNR = <FS_ALV>-BELNR_ZC.      "保证/理财金过账凭证
        ENDIF.

      ELSEIF <FS_ALV>-ZPJZT = GC_ZPJZT_DF.

        <FS_ALV>-BELNR = <FS_ALV>-BELNR_DF.        "兑付过账凭证

      ELSEIF <FS_ALV>-ZPJZT = GC_ZPJZT_DJBS.
        <FS_ALV>-BELNR = <FS_ALV>-BELNR_BS.        "背书过账凭证
      ENDIF.

      "借款金额=汇票金额-已过账保证金金额-本次过账保证金金额-已过账理财金额-本次过账理财金额
      <FS_ALV>-ZJKJE = <FS_ALV>-ZHPJE - <FS_ALV>-ZBZJJE - <FS_ALV>-ZLCJE - <FS_ALV>-ZBZJJE_BC - <FS_ALV>-ZLCJE_BC.

      IF <FS_ALV>-ZGZZT IS NOT INITIAL.

        "设置字段不可编辑
        PERFORM FRM_SET_DISABLED CHANGING <FS_ALV>-STYLE.

      ENDIF.

      "应收票据的流水编号
      SELECT SINGLE ZLSBH
              FROM ZARPJ
              INTO <FS_ALV>-ZLSBH_YS
              WHERE ZPJBH = <FS_ALV>-ZPJBH
                AND ZZTBS = ABAP_TRUE.

      IF P_SHOW IS INITIAL OR P_LOG IS INITIAL.
        "应付票据加锁
        CALL FUNCTION 'ENQUEUE_EZ_ZAPPJ'
          EXPORTING
            MODE_ZAPPJ     = 'E'
            MANDT          = SY-MANDT
            ZLSBH          = <FS_ALV>-ZLSBH
            X_ZLSBH        = ' '
            _SCOPE         = '2'
            _WAIT          = ' '
            _COLLECT       = ' '
          EXCEPTIONS
            FOREIGN_LOCK   = 1
            SYSTEM_FAILURE = 2
            OTHERS         = 3.
        IF SY-SUBRC <> 0.
          <FS_ALV>-LIGHT = ICON_RED_LIGHT.

          CONCATENATE TEXT-009 <FS_ALV>-ZPJBH TEXT-036 SY-MSGV1 TEXT-037 INTO <FS_ALV>-MESSAGE.
        ENDIF.

        "若是票据背书的票据,则需要对应收票据加锁
        IF <FS_ALV>-ZLSBH_YS IS NOT INITIAL.
          CALL FUNCTION 'ENQUEUE_EZ_ZARPJ'
            EXPORTING
              MODE_ZARPJ     = 'E'
              MANDT          = SY-MANDT
              ZLSBH          = <FS_ALV>-ZLSBH_YS
              X_ZLSBH        = ' '
              _SCOPE         = '2'
              _WAIT          = ' '
              _COLLECT       = ' '
            EXCEPTIONS
              FOREIGN_LOCK   = 1
              SYSTEM_FAILURE = 2
              OTHERS         = 3.
          IF SY-SUBRC <> 0.
            <FS_ALV>-LIGHT = ICON_RED_LIGHT.

            CONCATENATE TEXT-009 <FS_ALV>-ZPJBH TEXT-036 SY-MSGV1 TEXT-037 INTO <FS_ALV>-MESSAGE.

          ENDIF.

        ENDIF.
      ENDIF.

    ENDLOOP.
  ENDIF.

  SORT GT_ALV BY ZLSBH.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CASHJOURNALDOC_CREATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LS_HEADER  text
*      -->P_ABAP_TRUE  text
*      -->P_LT_ITEMS1  text
*      <--P_LV_CASH_JOURNAL_DOC_NO1  text
*      <--P_LV_ERROR  text
*      <--P_LV_MESSAGE  text
*&---------------------------------------------------------------------*
FORM FRM_CASHJOURNALDOC_CREATE  USING    PS_HEADER
                                         PV_TEST
                                         PT_ITEMS TYPE TY_BAPI_CJ_ITEMS
                                CHANGING PV_CASH_JOURNAL_DOC_NO
                                         PV_ERROR
                                         PV_MESSAGE.
  DATA: LT_RETURN TYPE TABLE OF BAPIRET2,
        LS_RETURN TYPE BAPIRET2.

  "调用函数测试运行
  CALL FUNCTION 'BAPI_CASHJOURNALDOC_CREATE'
    EXPORTING
      HEADER              = PS_HEADER
      TESTRUN             = PV_TEST
    IMPORTING
      CASH_JOURNAL_DOC_NO = PV_CASH_JOURNAL_DOC_NO
    TABLES
      ITEMS               = PT_ITEMS
      RETURN              = LT_RETURN
    EXCEPTIONS
      OTHERS              = 1.

  IF PV_TEST IS NOT INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.

  DELETE LT_RETURN WHERE ID = 'FCJ' AND NUMBER = '023'.
  CLEAR LS_RETURN.
  READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.
  IF SY-SUBRC = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

    PV_ERROR = ABAP_TRUE.

    PV_MESSAGE = LS_RETURN-MESSAGE.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FCJ_DELETE_DOC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>  text
*      -->P_<FS_ALV>_CJBELNR1  text
*      <--P_LV_ERROR  text
*      <--P_LV_MESSAGE  text
*&---------------------------------------------------------------------*
FORM FRM_FCJ_DELETE_DOC  USING    PS_ALV TYPE TY_ALV
                                  PV_CJBELNR
                         CHANGING PV_ERROR
                                  PV_MESSAGE.
  DATA: LT_POSTINGS TYPE STANDARD TABLE OF ISCJ_POSTINGS,
        LT_ITEMS    TYPE STANDARD TABLE OF TCJ_WTAX_ITEMS,
        LS_POSTING  TYPE ISCJ_POSTINGS,
        LV_BALANCE  TYPE CJAMOUNT.



  "根据选中的日记账编号获取日记账明细
  SELECT *
    FROM TCJ_DOCUMENTS
    INTO CORRESPONDING FIELDS OF TABLE LT_POSTINGS
    WHERE COMP_CODE   = PS_ALV-BUKRS
      AND CAJO_NUMBER = PS_ALV-ZZJZH
      AND FISC_YEAR   = PS_ALV-ZGZRQ+0(4)
      AND POSTING_NUMBER = PV_CJBELNR
      AND DOCUMENT_STATUS <> 'D'.

  READ TABLE LT_POSTINGS INTO LS_POSTING INDEX 1.
  IF SY-SUBRC = 0.
    LV_BALANCE = LS_POSTING-H_NET_AMOUNT.
    CALL FUNCTION 'FCJ_DELETE_DOC'
      EXPORTING
        I_COMP_CODE     = PS_ALV-BUKRS
        I_CAJO_NUMBER   = PS_ALV-ZZJZH
        I_POSTING       = LS_POSTING
        I_RUN_BALANCE   = LV_BALANCE
      TABLES
        ITCJ_POSTINGS   = LT_POSTINGS[]
        ITCJ_WTAX_ITEMS = LT_ITEMS[].

    IF SY-SUBRC <> 0.
      PV_ERROR = ABAP_TRUE.

      "消息
      PV_MESSAGE = TEXT-056 && PV_CJBELNR && TEXT-055.

    ENDIF.
  ENDIF.

  FREE: LS_POSTING,LT_POSTINGS,LV_BALANCE,LT_ITEMS.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SAVE_DBDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SAVE_DBDATA USING PV_MODE TYPE SY-UCOMM.
  DATA: LS_DB_ZAPPJ TYPE ZAPPJ,
        LS_DB_ZARPJ TYPE ZARPJ,
        LT_DB_ZARPJ TYPE STANDARD TABLE OF ZARPJ.
  DATA: LT_DEAL    TYPE STANDARD TABLE OF TY_ALV.
  DATA: LV_ERROR    TYPE C,
        LV_MESSAGE  TYPE BAPI_MSG,
        LV_AMOUNT   TYPE ZAPPJ-ZHPJE,
        LV_ZLSBH_YF TYPE ZARPJ-ZLSBH,
        LV_ZLSBH_YS TYPE ZARPJ-ZLSBH,
        LV_ZLSBH    TYPE ZARPJ-ZLSBH.


  "对话框返回值
  DATA : LV_ANSWER TYPE C.

  "保留更新的行项目
  LT_DEAL[] = GT_ALV[].
  DELETE LT_DEAL WHERE BOX IS INITIAL.

  "检查是否有选中行
  PERFORM FRM_CHECK_SELECT USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否有错误数据
  PERFORM FRM_CHECK_ERROR USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否已经删除
  PERFORM FRM_CHECK_DELETE USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查数据是否完整
  PERFORM FRM_CHECK_DATA USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
    EXPORTING
      TITEL       = '对话框'
      TEXT_BEFORE = '是否确认对选中票据'
      OBJECTVALUE = '进行操作'
      TEXT_AFTER  = '?'
    IMPORTING
      ANSWER      = LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    RETURN.
  ENDIF.

  LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BOX = ABAP_TRUE.

    CLEAR:LV_ERROR,
          LV_MESSAGE.


    IF LV_ZLSBH_YF IS INITIAL.
      "获取流水号
      PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YF GC_RANGE_NR ' ' SY-DATUM+0(4)
                               CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH_YF.
    ENDIF.

    "当票据背书做退票时,生成应收流水号
    IF PV_MODE = 'TUIP' AND <FS_ALV>-ZPJZT = GC_ZPJZT_DJBS.

      IF LV_ZLSBH_YS IS INITIAL.
        "获取流水号
        PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YS GC_RANGE_NR ' ' SY-DATUM+0(4)
                                 CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH_YS.
      ENDIF.

      "根据票据号获取应收票据的最新数据
      SELECT SINGLE *
        FROM ZARPJ
        INTO LS_DB_ZARPJ
        WHERE ZPJBH = <FS_ALV>-ZPJBH
          AND ZZTBS = ABAP_TRUE.

      "原数据最新状态标识为空
      LS_DB_ZARPJ-ZZTBS = SPACE.
      APPEND LS_DB_ZARPJ TO LT_DB_ZARPJ.

      "新增应收票据状态为登记已过账
      "拼接应收流水号
      SHIFT LV_ZLSBH_YS LEFT DELETING LEADING ''.
      LV_ZLSBH = GC_AR && SY-DATUM+2(2) && LV_ZLSBH_YS.
      LS_DB_ZARPJ-ZZTBS = ABAP_TRUE.
      LS_DB_ZARPJ-ZLSBH = LV_ZLSBH.
      LS_DB_ZARPJ-ZPJZT = GC_ZPJZT_DJ. "票据状态登记
      LS_DB_ZARPJ-LIFNR = SPACE.       "供应商为空
      LS_DB_ZARPJ-ZGZZT = ABAP_TRUE.   "过账状态
      LS_DB_ZARPJ-ERDAT = SY-DATUM.    "创建日期
      LS_DB_ZARPJ-ERZET = SY-UZEIT.    "创建时间
      LS_DB_ZARPJ-ERNAM = SY-UNAME.    "创建人员
      APPEND LS_DB_ZARPJ TO LT_DB_ZARPJ.

    ENDIF.

    CHECK LV_ERROR IS INITIAL.

    IF LV_ERROR IS INITIAL.

      "拼接应付流水号
      SHIFT LV_ZLSBH_YF LEFT DELETING LEADING ''.
      LV_ZLSBH = GC_AP && SY-DATUM+2(2) && LV_ZLSBH_YF.

      MOVE-CORRESPONDING <FS_ALV> TO LS_DB_ZAPPJ.
      LS_DB_ZAPPJ-ZLSBH = LV_ZLSBH.    "流水编号
      LS_DB_ZAPPJ-ZGZZT = SPACE.       "过账状态
      LS_DB_ZAPPJ-ZZTBS = ABAP_TRUE.   "最新状态
      IF PV_MODE = 'DELETE'.
        LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_SC. "票据状态作废
        LS_DB_ZAPPJ-ZGZZT = SPACE.       "过账状态
      ENDIF.
      IF PV_MODE = 'CHUP'.
        LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_CP. "票据状态出票
        LS_DB_ZAPPJ-ZGZZT = SPACE.       "过账状态
      ENDIF.
      IF PV_MODE = 'TUIP'.
        LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_TP. "票据状态退票
        LS_DB_ZAPPJ-ZGZZT = SPACE.       "过账状态
      ENDIF.
      LS_DB_ZAPPJ-ERDAT = SY-DATUM.    "创建日期
      LS_DB_ZAPPJ-ERZET = SY-UZEIT.    "创建时间
      LS_DB_ZAPPJ-ERNAM = SY-UNAME.    "创建人员

      "新增数据ZAPPJ记录最新数据
      TRY .
          INSERT ZAPPJ FROM LS_DB_ZAPPJ.
          IF SY-SUBRC <> 0.
            LV_ERROR = ABAP_TRUE.
          ENDIF.
        CATCH CX_SY_OPEN_SQL_DB.
          LV_ERROR = ABAP_TRUE.
      ENDTRY.

      "更新ZARPJ表数据
      IF LT_DB_ZARPJ IS NOT INITIAL.
        MODIFY ZARPJ FROM TABLE LT_DB_ZARPJ.
        IF SY-SUBRC <> 0.
          LV_ERROR = ABAP_TRUE.
        ENDIF.
      ENDIF.

      "更新原数据的最新状态为空;
      UPDATE ZAPPJ SET ZZTBS = SPACE WHERE ZLSBH = <FS_ALV>-ZLSBH
                                       AND BUKRS = <FS_ALV>-BUKRS
                                       AND ZPJBH = <FS_ALV>-ZPJBH.
      IF SY-SUBRC <> 0.
        LV_ERROR = ABAP_TRUE.
      ENDIF.

      IF LV_ERROR IS INITIAL.

        COMMIT WORK AND WAIT.

        "解锁应付原流水
        PERFORM FRM_DEQUEUE_EZ_ZAPPJ USING <FS_ALV>-ZLSBH.

        IF PV_MODE <> 'DELETE' AND PV_MODE <> 'TUIP'.
          "加锁应付新流水
          PERFORM FRM_ENQUEUE_EZ_ZAPPJ USING LS_DB_ZAPPJ-ZLSBH.
        ENDIF.

        "解锁应收原流水
        IF <FS_ALV>-ZLSBH_YS IS NOT INITIAL.
          PERFORM FRM_DEQUEUE_EZ_ZARPJ USING <FS_ALV>-ZLSBH_YS.
        ENDIF.

        "加锁应收新流水
        IF LS_DB_ZARPJ-ZLSBH IS NOT INITIAL.
          PERFORM FRM_ENQUEUE_EZ_ZARPJ USING LS_DB_ZARPJ-ZLSBH.
        ENDIF.

        "更新ALV的指示灯,流水号,消息,最新状态,创建信息;
        PERFORM FRM_CHANGE_ALV USING LS_DB_ZAPPJ
                               CHANGING <FS_ALV>.

        IF PV_MODE = 'DELETE'.
          "设置字段不可编辑
          PERFORM FRM_SET_DISABLED CHANGING <FS_ALV>-STYLE.
        ENDIF.

        CLEAR: LV_ZLSBH_YF,LV_ZLSBH_YS.

        "更新标记设置为空
        GV_UPDATE = SPACE.

      ELSE.

        ROLLBACK WORK.
        "指示灯
        <FS_ALV>-LIGHT = ICON_CANCEL.
        "消息
        <FS_ALV>-MESSAGE = TEXT-032.
      ENDIF.

    ELSE.

      "指示灯
      <FS_ALV>-LIGHT = ICON_CANCEL.
      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.
    ENDIF.

    CLEAR:LV_ERROR,LV_MESSAGE,LS_DB_ZAPPJ,LV_ZLSBH,LS_DB_ZARPJ,LT_DB_ZARPJ.
  ENDLOOP.

  FREE: LV_ERROR,
        LV_MESSAGE,
        LV_ZLSBH,
        LV_ZLSBH_YF,
        LV_ZLSBH_YS,
        LS_DB_ZAPPJ,
        LT_DB_ZARPJ,
        LS_DB_ZARPJ,
        LT_DEAL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_SELECT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LT_DEAL  text
*      <--P_LV_ERROR  text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_SELECT  USING      PT_ALV TYPE TY_ALV_TAB
                      CHANGING PV_ERROR.
  IF PT_ALV IS INITIAL.
    PV_ERROR = ABAP_TRUE.
    MESSAGE I005.
    RETURN.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LT_DEAL  text
*      <--P_LV_ERROR  text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_DATA  USING   PT_ALV TYPE TY_ALV_TAB
                      CHANGING PV_ERROR.

  DATA: LS_CJTRANS TYPE ZTFI_CJTRANS.

  LOOP AT PT_ALV ASSIGNING <FS_ALV>.

    IF P_CHUP IS NOT INITIAL AND SY-UCOMM = 'CHUP'.
      "出票时,票据状态必须为‘登记'
      IF <FS_ALV>-ZPJZT <> GC_ZPJZT_DJ.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I010 WITH <FS_ALV>-ZPJBH TEXT-028.
        RETURN.
      ENDIF.
    ENDIF.


    IF P_CHUP IS NOT INITIAL AND SY-UCOMM = 'TUIP'.
      "退票时,票据状态必须为‘出票’或者’登记背书’
      IF <FS_ALV>-ZPJZT = GC_ZPJZT_DJ OR <FS_ALV>-ZPJZT = GC_ZPJZT_DF.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I010 WITH  <FS_ALV>-ZPJBH TEXT-057.
        RETURN.
      ENDIF.

      "过账状态必须为未过账
      IF <FS_ALV>-ZGZZT IS NOT INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I001 WITH TEXT-009 <FS_ALV>-ZPJBH TEXT-046.
        RETURN.
      ENDIF.
    ENDIF.

    IF P_DUIFU IS NOT INITIAL AND SY-UCOMM = 'DUIFU'.
      "兑付时,票据状态不能为‘兑付’
      IF <FS_ALV>-ZPJZT = GC_ZPJZT_DF.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I011 WITH TEXT-009 <FS_ALV>-ZPJBH.
        RETURN.
      ENDIF.

      "过账状态必须为已过账
      IF <FS_ALV>-ZGZZT IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I001 WITH TEXT-009 <FS_ALV>-ZPJBH TEXT-045.
        RETURN.
      ENDIF.

      "过账日期不能大于当天
      IF <FS_ALV>-ZGZRQ > SY-DATUM.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I017 WITH <FS_ALV>-ZPJBH.
        RETURN.
      ENDIF.

      "资金账户分类不能为空
      IF <FS_ALV>-PERSON1 <> '01' AND <FS_ALV>-PERSON1 <> '02'.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I019 WITH <FS_ALV>-ZPJBH <FS_ALV>-ZZJZH.
        RETURN.
      ENDIF.

      "业务类型配置表不能为空
      IF GT_CJTRANS[] IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I014.
        RETURN.
      ENDIF.

      "检查配置
      READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP8'.
      IF SY-SUBRC <> 0.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I014.
        RETURN.
      ENDIF.

      IF <FS_ALV>-ZBZJJE > 0.
        READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP6'.
        IF SY-SUBRC <> 0.
          PV_ERROR = ABAP_TRUE.
          MESSAGE I014.
          RETURN.
        ENDIF.

        READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP9'.
        IF SY-SUBRC <> 0.
          PV_ERROR = ABAP_TRUE.
          MESSAGE I014.
          RETURN.
        ENDIF.
      ENDIF.

      IF <FS_ALV>-ZLCJE > 0.
        READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP7'.
        IF SY-SUBRC <> 0.
          PV_ERROR = ABAP_TRUE.
          MESSAGE I014.
          RETURN.
        ENDIF.
      ENDIF.
    ENDIF.

    IF P_DUIFU IS NOT INITIAL AND SY-UCOMM = 'FDUIFU'.
      "反兑付时,票据状态必须为‘兑付’
      IF <FS_ALV>-ZPJZT <> GC_ZPJZT_DF.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I010 WITH <FS_ALV>-ZPJBH TEXT-047.
        RETURN.
      ENDIF.

      "过账状态必须为未过账
      IF <FS_ALV>-ZGZZT IS NOT INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I001 WITH TEXT-009 <FS_ALV>-ZPJBH TEXT-046.
        RETURN.
      ENDIF.
    ENDIF.

    IF P_POST IS NOT INITIAL AND SY-UCOMM = 'POST'.
      "过账状态必须为未过账
      IF <FS_ALV>-ZGZZT IS NOT INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I001 WITH TEXT-009 <FS_ALV>-ZPJBH TEXT-046.
        RETURN.
      ENDIF.

      "资金账户分类不能为空
      IF <FS_ALV>-PERSON1 <> '01' AND <FS_ALV>-PERSON1 <> '02' AND <FS_ALV>-ZPJZT = GC_ZPJZT_DF.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I019 WITH <FS_ALV>-ZPJBH <FS_ALV>-ZZJZH.
        RETURN.
      ENDIF.

    ENDIF.

    IF P_POST IS NOT INITIAL AND SY-UCOMM = 'CANCEL'.
      "过账状态必须为已过账
      IF <FS_ALV>-ZGZZT IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I001 WITH TEXT-009 <FS_ALV>-ZPJBH TEXT-045.
        RETURN.
      ENDIF.
    ENDIF.

    IF SY-UCOMM = 'DELETE' OR SY-UCOMM = 'TUIP' OR SY-UCOMM = 'CANCEL'.

    ELSE.

      "出票日期
      IF <FS_ALV>-ZCPRQ IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I009 WITH <FS_ALV>-ZPJBH TEXT-010.
        RETURN.
      ENDIF.

      "到期日期
      IF <FS_ALV>-ZDQRQ IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I009 WITH <FS_ALV>-ZPJBH TEXT-011.
        RETURN.
      ENDIF.

      "过账日期
      IF <FS_ALV>-ZGZRQ IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I009 WITH <FS_ALV>-ZPJBH TEXT-012.
        RETURN.
      ENDIF.

      "汇票金额
      IF <FS_ALV>-ZHPJE IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I009 WITH <FS_ALV>-ZPJBH TEXT-013.
        RETURN.
      ENDIF.

      "供应商编码
      IF <FS_ALV>-LIFNR IS INITIAL .
        PV_ERROR = ABAP_TRUE.
        MESSAGE I009 WITH <FS_ALV>-ZPJBH TEXT-016.
        RETURN.
      ENDIF.

      "摘要
      IF <FS_ALV>-SGTXT IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I009 WITH <FS_ALV>-ZPJBH TEXT-017.
        RETURN.
      ENDIF.

      "资金账号
      IF <FS_ALV>-ZZJZH IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I009 WITH <FS_ALV>-ZPJBH TEXT-027.
        RETURN.
      ENDIF.

      "银行科目必须输入
      IF <FS_ALV>-HKONT IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I012 WITH <FS_ALV>-ZPJBH TEXT-050.
        RETURN.
      ENDIF.
    ENDIF.

    IF P_BZJLC IS NOT INITIAL.

      IF SY-UCOMM = 'BZJLC'.
        "过账状态必须为已过账
        IF <FS_ALV>-ZGZZT IS INITIAL.
          PV_ERROR = ABAP_TRUE.
          MESSAGE I001 WITH TEXT-009 <FS_ALV>-ZPJBH TEXT-045.
          RETURN.
        ENDIF.
      ENDIF.

      IF SY-UCOMM = 'TUIHUI'.
        "过账状态必须为未过账
        IF <FS_ALV>-ZGZZT IS NOT INITIAL.
          PV_ERROR = ABAP_TRUE.
          MESSAGE I001 WITH TEXT-009 <FS_ALV>-ZPJBH TEXT-046.
          RETURN.
        ENDIF.
      ENDIF.

      "不能重复确认
      IF <FS_ALV>-LIGHT = ICON_GREEN_LIGHT.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I011 WITH <FS_ALV>-ZPJBH.
        RETURN.
      ENDIF.

      "业务类型配置表不能为空
      IF GT_CJTRANS[] IS INITIAL.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I014.
        RETURN.
      ENDIF.

      "检查配置
      READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP1'.
      IF SY-SUBRC <> 0.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I014.
        RETURN.
      ENDIF.

      READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP2'.
      IF SY-SUBRC <> 0.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I014.
        RETURN.
      ENDIF.

      READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP3'.
      IF SY-SUBRC <> 0.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I014.
        RETURN.
      ENDIF.

      READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP4'.
      IF SY-SUBRC <> 0.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I014.
        RETURN.
      ENDIF.

      READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP5'.
      IF SY-SUBRC <> 0.
        PV_ERROR = ABAP_TRUE.
        MESSAGE I014.
        RETURN.
      ENDIF.

      CLEAR: <FS_ALV>-ZBZJJE_BC,<FS_ALV>-ZLCJE_BC.

      "借款金额=汇票金额-已过账保证金金额-本次过账保证金金额-已过账理财金额-本次过账理财金额
      <FS_ALV>-ZJKJE = <FS_ALV>-ZHPJE - <FS_ALV>-ZBZJJE - <FS_ALV>-ZLCJE - <FS_ALV>-ZBZJJE_BC - <FS_ALV>-ZLCJE_BC.

      "统计资金账户
      R_ZZJZH-LOW = <FS_ALV>-ZZJZH.
      R_ZZJZH-SIGN = 'I'.
      R_ZZJZH-OPTION = 'EQ'.
      APPEND R_ZZJZH.
      CLEAR R_ZZJZH.

      "统计汇票总额
      GV_ZHPJE = GV_ZHPJE + <FS_ALV>-ZHPJE.

      "统计已过账的保证金金额
      GV_ZBZJJE = GV_ZBZJJE + <FS_ALV>-ZBZJJE.

      "统计已过账的理财金金额
      GV_ZLCJE = GV_ZLCJE + <FS_ALV>-ZLCJE.

      "统计借款余额
      GV_ZJKJE = GV_ZJKJE + <FS_ALV>-ZJKJE.

    ENDIF.


  ENDLOOP.

  DATA: LV_LINES TYPE I.
  "检查选择的行项目是否都是同一个资金账户
  IF SY-UCOMM = 'BZJLC'.
    SORT R_ZZJZH BY LOW.
    DELETE ADJACENT DUPLICATES FROM R_ZZJZH COMPARING LOW.
    DESCRIBE TABLE R_ZZJZH LINES LV_LINES.
    IF LV_LINES > 1.
      PV_ERROR = ABAP_TRUE.
      MESSAGE I020.
      RETURN.
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DELETE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LT_DEAL  text
*      <--P_LV_ERROR  text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_DELETE  USING    PT_ALV TYPE TY_ALV_TAB
                       CHANGING PV_ERROR.
  READ TABLE PT_ALV ASSIGNING <FS_ALV> WITH KEY ZPJZT = GC_ZPJZT_SC.
  IF SY-SUBRC = 0.
    PV_ERROR = ABAP_TRUE.

    MESSAGE I018 WITH <FS_ALV>-ZPJBH.
    RETURN.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_ENABLED
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      <--P_<FS_ALV>_STYLE  text
*&---------------------------------------------------------------------*
FORM FRM_SET_ENABLED  CHANGING PV_STYLE TYPE LVC_T_STYL.
  DATA: LS_EDIT TYPE LVC_S_STYL,
        LT_EDIT TYPE LVC_T_STYL.
  CLEAR PV_STYLE.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_DISABLED
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      <--P_<FS_ALV>_STYLE  text
*&---------------------------------------------------------------------*
FORM FRM_SET_DISABLED  CHANGING PV_STYLE TYPE LVC_T_STYL.
  DATA: LS_EDIT TYPE LVC_S_STYL,
        LT_EDIT TYPE LVC_T_STYL.
  CLEAR PV_STYLE.

  LS_EDIT-FIELDNAME = 'ZDQRQ'.                        "到期日期
  LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "设置为不可编辑状态
  INSERT LS_EDIT INTO TABLE LT_EDIT.
  CLEAR LS_EDIT.

  LS_EDIT-FIELDNAME = 'ZCPRQ'.                        "出票日期
  LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "设置为不可编辑状态
  INSERT LS_EDIT INTO TABLE LT_EDIT.
  CLEAR LS_EDIT.

  LS_EDIT-FIELDNAME = 'ZGZRQ'.                        "过账日期
  LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "设置为不可编辑状态
  INSERT LS_EDIT INTO TABLE LT_EDIT.
  CLEAR LS_EDIT.

  LS_EDIT-FIELDNAME = 'ZHPJE'.                        "汇票金额
  LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "设置为不可编辑状态
  INSERT LS_EDIT INTO TABLE LT_EDIT.
  CLEAR LS_EDIT.

  LS_EDIT-FIELDNAME = 'LIFNR'.                        "供应商
  LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "设置为不可编辑状态
  INSERT LS_EDIT INTO TABLE LT_EDIT.
  CLEAR LS_EDIT.

  LS_EDIT-FIELDNAME = 'SGTXT'.                        "摘要
  LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "设置为不可编辑状态
  INSERT LS_EDIT INTO TABLE LT_EDIT.
  CLEAR LS_EDIT.

  LS_EDIT-FIELDNAME = 'ZPJLX'.                        "票据类型
  LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "设置为不可编辑状态
  INSERT LS_EDIT INTO TABLE LT_EDIT.
  CLEAR LS_EDIT.

  LS_EDIT-FIELDNAME = 'ZZJZH'.                        "资金账户
  LS_EDIT-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "设置为不可编辑状态
  INSERT LS_EDIT INTO TABLE LT_EDIT.
  CLEAR LS_EDIT.

  APPEND LINES OF LT_EDIT TO PV_STYLE.

  CLEAR LT_EDIT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALL_TRANSACTION_FB03
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_PS_SELFIELD  text
*&---------------------------------------------------------------------*
FORM FRM_CALL_TRANSACTION_FB03  USING  PS_SELFIELD TYPE SLIS_SELFIELD.
  READ TABLE GT_ALV ASSIGNING <FS_ALV> INDEX PS_SELFIELD-TABINDEX.
  IF SY-SUBRC = 0.
    "会计凭证
    IF <FS_ALV>-BELNR IS NOT INITIAL.
      SET PARAMETER ID 'BLN' FIELD <FS_ALV>-BELNR.
      SET PARAMETER ID 'BUK' FIELD <FS_ALV>-BUKRS.
      SET PARAMETER ID 'GJR' FIELD <FS_ALV>-ZGZRQ+0(4).
      CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN .
    ENDIF.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ENQUEUE_EZ_ZARPJ
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>_ZLSBH  text
*&---------------------------------------------------------------------*
FORM FRM_ENQUEUE_EZ_ZAPPJ  USING    PV_ZLSBH.
  "票据加锁
  CALL FUNCTION 'ENQUEUE_EZ_ZAPPJ'
    EXPORTING
      MODE_ZAPPJ     = 'E'
      MANDT          = SY-MANDT
      ZLSBH          = PV_ZLSBH
      X_ZLSBH        = ' '
      _SCOPE         = '2'
      _WAIT          = ' '
      _COLLECT       = ' '
    EXCEPTIONS
      FOREIGN_LOCK   = 1
      SYSTEM_FAILURE = 2
      OTHERS         = 3.
  IF SY-SUBRC <> 0.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DEQUEUE_EZ_ZARPJ
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>_ZLSBH  text
*&---------------------------------------------------------------------*
FORM FRM_DEQUEUE_EZ_ZAPPJ  USING    PV_ZLSBH.
  "解锁票据流水
  CALL FUNCTION 'DEQUEUE_EZ_ZAPPJ'
    EXPORTING
      MODE_ZAPPJ = 'E'
      MANDT      = SY-MANDT
      ZLSBH      = PV_ZLSBH
      X_ZLSBH    = ' '
      _SCOPE     = '3'
      _SYNCHRON  = ' '
      _COLLECT   = ' '.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ENQUEUE_EZ_ZARPJ
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>_ZLSBH  text
*&---------------------------------------------------------------------*
FORM FRM_ENQUEUE_EZ_ZARPJ  USING    PV_ZLSBH.
  "应收票据项目加锁
  CALL FUNCTION 'ENQUEUE_EZ_ZARPJ'
    EXPORTING
      MODE_ZARPJ     = 'E'
      MANDT          = SY-MANDT
      ZLSBH          = PV_ZLSBH
      X_ZLSBH        = ' '
      _SCOPE         = '2'
      _WAIT          = ' '
      _COLLECT       = ' '
    EXCEPTIONS
      FOREIGN_LOCK   = 1
      SYSTEM_FAILURE = 2
      OTHERS         = 3.
  IF SY-SUBRC <> 0.
  ENDIF.



ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DEQUEUE_EZ_ZARPJ
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>_ZLSBH  text
*&---------------------------------------------------------------------*
FORM FRM_DEQUEUE_EZ_ZARPJ  USING    PV_ZLSBH.
  "解锁票据流水
  CALL FUNCTION 'DEQUEUE_EZ_ZARPJ'
    EXPORTING
      MODE_ZARPJ = 'E'
      MANDT      = SY-MANDT
      ZLSBH      = PV_ZLSBH
      X_ZLSBH    = ' '
      _SCOPE     = '3'
      _SYNCHRON  = ' '
      _COLLECT   = ' '.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LS_DB_ZAPPJ  text
*      <--P_<FS_ALV>  text
*&---------------------------------------------------------------------*
FORM FRM_CHANGE_ALV  USING   PS_DB_ZAPPJ TYPE ZAPPJ
                     CHANGING PS_ALV TYPE TY_ALV.
  "流水号
  PS_ALV-ZLSBH   = PS_DB_ZAPPJ-ZLSBH.
  "指示灯
  PS_ALV-LIGHT   = ICON_GREEN_LIGHT.
  "消息
  PS_ALV-MESSAGE = TEXT-031.
  "票据状态
  PS_ALV-ZPJZT   = PS_DB_ZAPPJ-ZPJZT.
  "过账状态
  PS_ALV-ZGZZT   = PS_DB_ZAPPJ-ZGZZT.
  "创建日期
  PS_ALV-ERDAT   = SY-DATUM.
  "创建时间
  PS_ALV-ERZET   = SY-UZEIT.
  "创建人员
  PS_ALV-ERNAM   = SY-UNAME.
  "最新状态
  PS_ALV-ZZTBS   = ABAP_TRUE.
  "转出
  PS_ALV-ZBZLC = PS_DB_ZAPPJ-ZBZLC.
  PS_ALV-ZNUMB = PS_DB_ZAPPJ-ZNUMB.

  IF PS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_CP.

    IF PS_DB_ZAPPJ-ZBZLC IS INITIAL.
      PS_ALV-BELNR = PS_DB_ZAPPJ-BELNR_CP.      "出票过账凭证
    ELSE.
*      PS_ALV-BELNR = PS_DB_ZAPPJ-BELNR_ZC.      "保证/理财金过账凭证
    ENDIF.

  ELSEIF PS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_DF.

    PS_ALV-BELNR = PS_DB_ZAPPJ-BELNR_DF.      "兑付过账凭证

  ELSEIF PS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_DJBS.
    PS_ALV-BELNR = PS_DB_ZAPPJ-BELNR_BS.      "背书过账凭证
  ENDIF.

  PS_ALV-CJBELNR_FK = PS_DB_ZAPPJ-CJBELNR_FK."付款账户
  PS_ALV-CJBELNR_BZ = PS_DB_ZAPPJ-CJBELNR_BZ."保证金账户
  PS_ALV-CJBELNR_LC = PS_DB_ZAPPJ-CJBELNR_LC."理财账户
  PS_ALV-CJBELNR_ZC = PS_DB_ZAPPJ-CJBELNR_ZC."转出保证金账户
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CANCEL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CANCEL_DATA .
  DATA: LS_DB_ZAPPJ TYPE ZAPPJ,
        LS_DB_ZARPJ TYPE ZARPJ,
        LT_DB_ZARPJ TYPE STANDARD TABLE OF ZARPJ,
        LT_DEAL     TYPE STANDARD TABLE OF TY_ALV.

  "对话框返回值
  DATA: LV_ANSWER TYPE C.

  DATA: LV_ERROR    TYPE C,
        LV_ZLSBH    TYPE ZAPPJ-ZLSBH,
        LV_ZLSBH_YF TYPE ZAPPJ-ZLSBH,
        LV_ZLSBH_YS TYPE ZARPJ-ZLSBH,
        LV_MESSAGE  TYPE BAPIRET2-MESSAGE,
        LV_BELNR    TYPE BKPF-BELNR.

  LT_DEAL[] = GT_ALV[].
  DELETE LT_DEAL WHERE BOX IS INITIAL.

  "检查是否有选中行
  PERFORM FRM_CHECK_SELECT USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否有错误数据
  PERFORM FRM_CHECK_ERROR USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查选中行数据
  PERFORM FRM_CHECK_DATA USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "删除不是转保证金/理财户的数据
  DELETE LT_DEAL WHERE ( ZNUMB IS INITIAL AND ZPJZT = GC_ZPJZT_CP ) OR ZPJZT <> GC_ZPJZT_CP.
  SORT LT_DEAL BY ZNUMB.
  DELETE ADJACENT DUPLICATES FROM LT_DEAL COMPARING ZNUMB.
  IF LT_DEAL IS NOT INITIAL.
    SELECT *
      FROM ZTFI_031_HEAD
      INTO TABLE @DATA(LT_HEAD)
      FOR ALL ENTRIES IN @LT_DEAL
      WHERE ZNUMB = @LT_DEAL-ZNUMB.

    SELECT *
      FROM ZTFI_031_ITEM
      INTO TABLE @DATA(LT_ITEM)
      FOR ALL ENTRIES IN @LT_DEAL
      WHERE ZNUMB = @LT_DEAL-ZNUMB.

    "检查其他转出行是否被选中
    LOOP AT LT_ITEM INTO DATA(LS_ITEM).
      READ TABLE GT_ALV ASSIGNING <FS_ALV> WITH KEY BOX = ABAP_TRUE ZPJBH = LS_ITEM-ZPJBH.
      IF SY-SUBRC <> 0.
        LV_ERROR = ABAP_TRUE.
        MESSAGE I030.
        RETURN.
      ENDIF.
    ENDLOOP.
  ENDIF.

  CHECK LV_ERROR IS INITIAL.

  CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
    EXPORTING
      TITEL       = '对话框'
      TEXT_BEFORE = '选中票据将进行冲销,'
      OBJECTVALUE = '是否确认'
      TEXT_AFTER  = '?'
    IMPORTING
      ANSWER      = LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    RETURN.
  ENDIF.

  CLEAR: GV_CANCEL,GV_BUDAT.
  GV_STGRD  = '03'.
  CALL SCREEN 9002 STARTING AT 30 10
                     ENDING AT 60 18.

  CHECK GV_CANCEL IS NOT INITIAL.

  LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BOX = ABAP_TRUE.

    CLEAR: LV_ERROR,
           LV_MESSAGE,
           LV_BELNR.

    IF LV_ZLSBH_YF IS INITIAL.
      "获取流水号
      PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YF GC_RANGE_NR ' ' SY-DATUM+0(4)
                               CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH_YF.

    ENDIF.

    "当票据背书做冲销时,生成应收流水号
    IF <FS_ALV>-ZPJZT = GC_ZPJZT_DJBS.

      IF LV_ZLSBH_YS IS INITIAL.
        "获取流水号
        PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YS GC_RANGE_NR ' ' SY-DATUM+0(4)
                                 CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH_YS.
      ENDIF.

    ENDIF.

    IF LV_ERROR IS INITIAL.

      "检查会计凭证是否已经冲销
      SELECT SINGLE AWREF_REV
        FROM BKPF
        INTO LV_BELNR
        WHERE BUKRS = <FS_ALV>-BUKRS
          AND BELNR = <FS_ALV>-BELNR
          AND GJAHR = <FS_ALV>-ZGZRQ+0(4)
          AND XREVERSED = ABAP_TRUE.

      IF LV_BELNR IS INITIAL.
        "冲销会计凭证
        PERFORM FRM_ACC_DOCUMENT_CANCEL USING <FS_ALV>-BELNR <FS_ALV>-BUKRS <FS_ALV>-ZGZRQ
              CHANGING LV_ERROR LV_MESSAGE LV_BELNR.
      ENDIF.


      IF LV_ERROR IS INITIAL.

        LV_BELNR  =  |{ LV_BELNR   ALPHA = IN  }|.

        IF <FS_ALV>-ZPJZT = GC_ZPJZT_DJBS.

          "根据票据号获取应收票据的最新数据
          SELECT SINGLE *
            FROM ZARPJ
            INTO LS_DB_ZARPJ
            WHERE ZPJBH = <FS_ALV>-ZPJBH
              AND ZZTBS = ABAP_TRUE.

          "原数据最新状态标识为空
          LS_DB_ZARPJ-ZZTBS = SPACE.
          APPEND LS_DB_ZARPJ TO LT_DB_ZARPJ.

          "新增应收票据状态为登记已过账
          "拼接应收流水号
          SHIFT LV_ZLSBH_YS LEFT DELETING LEADING ''.
          LV_ZLSBH = GC_AR && SY-DATUM+2(2) && LV_ZLSBH_YS.
          LS_DB_ZARPJ-ZZTBS = ABAP_TRUE.
          LS_DB_ZARPJ-ZLSBH = LV_ZLSBH.
          LS_DB_ZARPJ-ZPJZT = GC_ZPJZT_BS. "票据状态背书
          LS_DB_ZARPJ-ZGZZT = SPACE.       "过账状态
          LS_DB_ZARPJ-BELNR_BS = LV_BELNR.
          LS_DB_ZARPJ-ERDAT = SY-DATUM.    "创建日期
          LS_DB_ZARPJ-ERZET = SY-UZEIT.    "创建时间
          LS_DB_ZARPJ-ERNAM = SY-UNAME.    "创建人员
          APPEND LS_DB_ZARPJ TO LT_DB_ZARPJ.

        ENDIF.

        "新增数据记录最新数据;
        SHIFT LV_ZLSBH_YF LEFT DELETING LEADING ''.
        LV_ZLSBH = GC_AP && SY-DATUM+2(2) && LV_ZLSBH_YF. "拼接流水号
        MOVE-CORRESPONDING <FS_ALV> TO LS_DB_ZAPPJ.
        LS_DB_ZAPPJ-ZLSBH = LV_ZLSBH   .   "流水编号
        LS_DB_ZAPPJ-ZGZZT = SPACE.         "过账状态
        IF LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_CP.

          IF LS_DB_ZAPPJ-ZBZLC IS INITIAL.
            LS_DB_ZAPPJ-BELNR_CP = LV_BELNR.      "出票过账凭证
          ELSE.
*            LS_DB_ZAPPJ-BELNR_ZC = LV_BELNR.      "保证/理财金过账凭证
            LOOP AT LT_ITEM INTO LS_ITEM WHERE ZNUMB = LS_DB_ZAPPJ-ZNUMB AND ZPJBH = LS_DB_ZAPPJ-ZPJBH.
              "保证金累加
              LS_DB_ZAPPJ-ZBZJJE = LS_DB_ZAPPJ-ZBZJJE - LS_ITEM-ZBZJJE.
              "理财户累加
              LS_DB_ZAPPJ-ZLCJE  = LS_DB_ZAPPJ-ZLCJE  - LS_ITEM-ZLCJE.
            ENDLOOP.
          ENDIF.

        ELSEIF LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_DF.

          LS_DB_ZAPPJ-BELNR_DF = LV_BELNR.        "兑付过账凭证

        ELSEIF LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_DJBS.

          LS_DB_ZAPPJ-BELNR_BS = LV_BELNR.        "背书过账凭证

        ENDIF.

        LS_DB_ZAPPJ-ZZTBS = ABAP_TRUE.     "最新状态
        LS_DB_ZAPPJ-ERDAT = SY-DATUM.      "创建日期
        LS_DB_ZAPPJ-ERZET = SY-UZEIT.      "创建时间
        LS_DB_ZAPPJ-ERNAM = SY-UNAME.      "创建人员

        TRY .
            INSERT ZAPPJ FROM LS_DB_ZAPPJ.
            IF SY-SUBRC <> 0.
              LV_ERROR = ABAP_TRUE.
            ENDIF.
          CATCH CX_SY_OPEN_SQL_DB.
            LV_ERROR = ABAP_TRUE.
        ENDTRY.

        IF <FS_ALV>-ZNUMB IS NOT INITIAL.
          "更新原数据的过账状态和冲销会计凭证;
          UPDATE ZTFI_031_HEAD SET ZGZZT = SPACE
                                   BELNR_ZC = LV_BELNR
                               WHERE ZNUMB = <FS_ALV>-ZNUMB.
          IF SY-SUBRC <> 0.
            LV_ERROR = ABAP_TRUE.
          ENDIF.
        ENDIF.

        "更新ZARPJ表数据
        IF LT_DB_ZARPJ IS NOT INITIAL.
          MODIFY ZARPJ FROM TABLE LT_DB_ZARPJ.
          IF SY-SUBRC <> 0.
            LV_ERROR = ABAP_TRUE.
          ENDIF.
        ENDIF.

        "更新原数据的最新状态为空;
        UPDATE ZAPPJ SET ZZTBS = SPACE WHERE ZLSBH = <FS_ALV>-ZLSBH
                                         AND BUKRS = <FS_ALV>-BUKRS
                                         AND ZPJBH = <FS_ALV>-ZPJBH.
        IF SY-SUBRC <> 0.
          LV_ERROR = ABAP_TRUE.
        ENDIF.

        IF LV_ERROR IS INITIAL.

          COMMIT WORK AND WAIT.

          "解锁原流水
          PERFORM FRM_DEQUEUE_EZ_ZAPPJ USING <FS_ALV>-ZLSBH.

          "加锁新流水
          PERFORM FRM_ENQUEUE_EZ_ZAPPJ USING LS_DB_ZAPPJ-ZLSBH.

          "解锁应收原流水
          IF <FS_ALV>-ZLSBH_YS IS NOT INITIAL.
            PERFORM FRM_DEQUEUE_EZ_ZAPPJ USING <FS_ALV>-ZLSBH_YS.
          ENDIF.

          "加锁应收新流水
          IF LS_DB_ZARPJ-ZLSBH IS NOT INITIAL.
            PERFORM FRM_ENQUEUE_EZ_ZAPPJ USING LS_DB_ZARPJ-ZLSBH.
          ENDIF.

          "更新ALV的指示灯,流水号,状态,消息;
          PERFORM FRM_CHANGE_ALV USING LS_DB_ZAPPJ
                                 CHANGING <FS_ALV>.

          <FS_ALV>-BELNR = LV_BELNR.

          CLEAR: LV_ZLSBH_YF,LV_ZLSBH_YS.

          GV_UPDATE = SPACE.

        ELSE.

          ROLLBACK WORK.

          "指示灯
          <FS_ALV>-LIGHT = ICON_CANCEL.

          "消息
          <FS_ALV>-MESSAGE = TEXT-032.
        ENDIF.

      ELSE.
        "指示灯
        <FS_ALV>-LIGHT = ICON_CANCEL.

        "消息
        <FS_ALV>-MESSAGE = LV_MESSAGE.
      ENDIF.

    ELSE.

      "指示灯
      <FS_ALV>-LIGHT   = ICON_CANCEL.
      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.

    ENDIF.

    CLEAR:LV_ERROR,LV_MESSAGE, LS_DB_ZAPPJ,LV_BELNR,LV_ZLSBH,LS_DB_ZARPJ,LT_DB_ZARPJ.

  ENDLOOP.

  FREE: LV_ERROR,
        LV_MESSAGE,
        LV_ZLSBH,
        LV_ZLSBH_YF,
        LV_ZLSBH_YS,
        LS_DB_ZAPPJ,
        LT_DB_ZARPJ,
        LS_DB_ZARPJ,
        LT_DEAL.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_POST_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_POST_DATA .
  DATA: LS_DB_ZAPPJ TYPE ZAPPJ,
        LS_CJTRANS  TYPE ZTFI_CJTRANS,
        LT_DEAL     TYPE STANDARD TABLE OF TY_ALV.

  "对话框返回值
  DATA: LV_ANSWER TYPE C.

  DATA: LV_ERROR    TYPE C,
        LV_BUZEI    TYPE BSEG-BUZEI,
        LV_DMBTR    TYPE ZAPPJ-ZHPJE,
        LV_ZLSBH    TYPE ZAPPJ-ZLSBH,
        LV_ZLSBH_YF TYPE ZAPPJ-ZLSBH,
        LV_MESSAGE  TYPE BAPIRET2-MESSAGE,
        LV_BELNR    TYPE BKPF-BELNR.

  LT_DEAL[] = GT_ALV[].
  DELETE LT_DEAL WHERE BOX IS INITIAL.

  "检查是否有选中行
  PERFORM FRM_CHECK_SELECT USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否有错误数据
  PERFORM FRM_CHECK_ERROR USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查选中行是否存在错误
  PERFORM FRM_CHECK_DATA USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "删除不是转保证金/理财户的数据
  DELETE LT_DEAL WHERE ( ZNUMB IS INITIAL AND ZPJZT = GC_ZPJZT_CP ) OR ZPJZT <> GC_ZPJZT_CP.
  SORT LT_DEAL BY ZNUMB.
  DELETE ADJACENT DUPLICATES FROM LT_DEAL COMPARING ZNUMB.
  IF LT_DEAL IS NOT INITIAL.
    SELECT *
      FROM ZTFI_031_HEAD
      INTO TABLE @DATA(LT_HEAD)
      FOR ALL ENTRIES IN @LT_DEAL
      WHERE ZNUMB = @LT_DEAL-ZNUMB.

    SELECT *
      FROM ZTFI_031_ITEM
      INTO TABLE @DATA(LT_ITEM)
      FOR ALL ENTRIES IN @LT_DEAL
      WHERE ZNUMB = @LT_DEAL-ZNUMB.

    "检查其他转出行是否被选中
    LOOP AT LT_ITEM INTO DATA(LS_ITEM).
      READ TABLE GT_ALV ASSIGNING <FS_ALV> WITH KEY BOX = ABAP_TRUE ZPJBH = LS_ITEM-ZPJBH.
      IF SY-SUBRC <> 0.
        LV_ERROR = ABAP_TRUE.
        MESSAGE I030.
        RETURN.
      ENDIF.
    ENDLOOP.
  ENDIF.

  CHECK LV_ERROR IS INITIAL.

  CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
    EXPORTING
      TITEL       = '对话框'
      TEXT_BEFORE = '选中票据将进行过账,'
      OBJECTVALUE = '是否确认'
      TEXT_AFTER  = '?'
    IMPORTING
      ANSWER      = LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    RETURN.
  ENDIF.

  LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BOX = ABAP_TRUE.

    CLEAR: LV_ERROR,
           LV_MESSAGE,
           LV_ZLSBH,
           LV_BUZEI,
           LV_DMBTR,
           LV_BELNR.

    IF LV_ZLSBH_YF IS INITIAL.
      "获取应付票据流水号
      PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YF GC_RANGE_NR ' ' SY-DATUM+0(4)
                               CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH_YF.

    ENDIF.

    IF LV_ERROR IS INITIAL.

      <FS_ALV>-BLART = 'SA'.

      "会计凭证明细参数填充
      IF <FS_ALV>-ZPJZT = GC_ZPJZT_CP.
        "状态为‘出票’,源单据类型为‘手工增加’或者‘OA集成’
        IF <FS_ALV>-ZBZLC IS INITIAL.

          IF <FS_ALV>-ZGZRQ < '20171201'.
            "期初业务
            <FS_ALV>-BLART = 'UE'.
            PERFORM FRM_FILL_BSEG USING <FS_ALV> '40' '001' <FS_ALV>-ZHPJE GC_HKONT_QC SPACE SPACE.
          ELSE.
            PERFORM FRM_FILL_BSEG USING <FS_ALV> '21' '001' <FS_ALV>-ZHPJE SPACE SPACE SPACE.
          ENDIF.

          PERFORM FRM_FILL_BSEG USING <FS_ALV> '39' '002' <FS_ALV>-ZHPJE SPACE SPACE SPACE.

        ELSE.

          "检查是否已经创建会计凭证
          SELECT SINGLE BELNR_ZC
            FROM ZTFI_031_HEAD
            INTO LV_BELNR
            WHERE ZNUMB = <FS_ALV>-ZNUMB.


          IF LV_ERROR IS INITIAL.

            READ TABLE LT_HEAD INTO DATA(LS_HEAD) WITH KEY ZNUMB = <FS_ALV>-ZNUMB.
            IF SY-SUBRC = 0.

              IF LS_HEAD-ZBZJJE > 0.
                LV_BUZEI = LV_BUZEI + 1.
                READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP1'.
                IF SY-SUBRC = 0.
                  <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
                ENDIF.
                PERFORM FRM_FILL_BSEG USING <FS_ALV> '40' LV_BUZEI LS_HEAD-ZBZJJE <FS_ALV>-HKONT_BZ LS_HEAD-CJBELNR_AP1 <FS_ALV>-RSTGR.

                LV_BUZEI = LV_BUZEI + 1.
                READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP2'.
                IF SY-SUBRC = 0.
                  <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
                ENDIF.
                PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI LS_HEAD-ZBZJJE <FS_ALV>-HKONT LS_HEAD-CJBELNR_AP2 <FS_ALV>-RSTGR.
              ENDIF.

              IF LS_HEAD-ZLCJE > 0.
                LV_BUZEI = LV_BUZEI + 1.
                READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP3'.
                IF SY-SUBRC = 0.
                  <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
                ENDIF.
                PERFORM FRM_FILL_BSEG USING <FS_ALV> '40' LV_BUZEI LS_HEAD-ZLCJE <FS_ALV>-HKONT_LC LS_HEAD-CJBELNR_AP3 <FS_ALV>-RSTGR.

                LV_BUZEI = LV_BUZEI + 1.
                READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP4'.
                IF SY-SUBRC = 0.
                  <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
                ENDIF.
                PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI LS_HEAD-ZLCJE <FS_ALV>-HKONT LS_HEAD-CJBELNR_AP4 <FS_ALV>-RSTGR.
              ENDIF.

              IF LS_HEAD-ZFYJE > 0.
                LV_BUZEI = LV_BUZEI + 1.
                PERFORM FRM_FILL_BSEG USING <FS_ALV> '40' LV_BUZEI LS_HEAD-ZFYJE GC_HKONT SPACE SPACE.

                LV_BUZEI = LV_BUZEI + 1.
                READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP5'.
                IF SY-SUBRC = 0.
                  <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
                ENDIF.
                PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI LS_HEAD-ZFYJE <FS_ALV>-HKONT LS_HEAD-CJBELNR_AP5 <FS_ALV>-RSTGR.
              ENDIF.
            ENDIF.
          ENDIF.

        ENDIF.


      ELSEIF <FS_ALV>-ZPJZT = GC_ZPJZT_DF.

        IF <FS_ALV>-ZBZLC IS INITIAL.

          PERFORM FRM_FILL_BSEG USING <FS_ALV> '29' '001' <FS_ALV>-ZHPJE SPACE SPACE SPACE.
          READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP8'.
          IF SY-SUBRC = 0.
            <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
          ENDIF.
          PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' '002' <FS_ALV>-ZHPJE <FS_ALV>-HKONT <FS_ALV>-CJBELNR_FK <FS_ALV>-RSTGR.

        ELSE.

          IF <FS_ALV>-PERSON1 = '01'.

            "如果TCJ_C_JOURNALS-PERSON1="01",表示该账户不需要将保证金账户金额转至资金账户后再兑付
            LV_DMBTR = <FS_ALV>-ZBZJJE + <FS_ALV>-ZLCJE + <FS_ALV>-ZJKJE.

            LV_BUZEI = LV_BUZEI + 1.
            IF LV_DMBTR > 0.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '29' LV_BUZEI LV_DMBTR SPACE SPACE SPACE.
            ENDIF.

            IF <FS_ALV>-ZBZJJE > 0.
              LV_BUZEI = LV_BUZEI + 1.
              READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP6'.
              IF SY-SUBRC = 0.
                <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
              ENDIF.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI <FS_ALV>-ZBZJJE <FS_ALV>-HKONT_BZ <FS_ALV>-CJBELNR_BZ <FS_ALV>-RSTGR.
            ENDIF.

            IF <FS_ALV>-ZLCJE > 0.
              LV_BUZEI = LV_BUZEI + 1.
              READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP7'.
              IF SY-SUBRC = 0.
                <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
              ENDIF.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI <FS_ALV>-ZLCJE <FS_ALV>-HKONT_LC <FS_ALV>-CJBELNR_LC <FS_ALV>-RSTGR.

            ENDIF.

            IF <FS_ALV>-ZJKJE > 0.
              LV_BUZEI = LV_BUZEI + 1.
              READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP8'.
              IF SY-SUBRC = 0.
                <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
              ENDIF.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI <FS_ALV>-ZJKJE <FS_ALV>-HKONT <FS_ALV>-CJBELNR_FK <FS_ALV>-RSTGR.
            ENDIF.


          ELSEIF <FS_ALV>-PERSON1 = '02'.
            "如果TCJ_C_JOURNALS-PERSON1="02",表示该账户需要将保证金账户金额转至资金账户后再兑付

            LV_DMBTR = <FS_ALV>-ZBZJJE + <FS_ALV>-ZLCJE + <FS_ALV>-ZJKJE.

            LV_BUZEI = LV_BUZEI + 1.
            IF LV_DMBTR > 0.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '29' LV_BUZEI LV_DMBTR SPACE SPACE SPACE.
            ENDIF.

            IF <FS_ALV>-ZBZJJE > 0.
              LV_BUZEI = LV_BUZEI + 1.
              READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP6'.
              IF SY-SUBRC = 0.
                <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
              ENDIF.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI <FS_ALV>-ZBZJJE <FS_ALV>-HKONT_BZ <FS_ALV>-CJBELNR_BZ <FS_ALV>-RSTGR.

              LV_BUZEI = LV_BUZEI + 1.
              READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP9'.
              IF SY-SUBRC = 0.
                <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
              ENDIF.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '40' LV_BUZEI <FS_ALV>-ZBZJJE <FS_ALV>-HKONT_BZ <FS_ALV>-CJBELNR_ZC <FS_ALV>-RSTGR.
            ENDIF.

            IF <FS_ALV>-ZLCJE > 0.
              LV_BUZEI = LV_BUZEI + 1.
              READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP7'.
              IF SY-SUBRC = 0.
                <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
              ENDIF.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI <FS_ALV>-ZLCJE <FS_ALV>-HKONT_LC <FS_ALV>-CJBELNR_LC <FS_ALV>-RSTGR.

            ENDIF.

            IF <FS_ALV>-ZJKJE > 0.
              LV_BUZEI = LV_BUZEI + 1.
              READ TABLE GT_CJTRANS INTO LS_CJTRANS WITH KEY CJTRANS = 'AP8'.
              IF SY-SUBRC = 0.
                <FS_ALV>-RSTGR = LS_CJTRANS-RSTGR.
              ENDIF.
              PERFORM FRM_FILL_BSEG USING <FS_ALV> '50' LV_BUZEI <FS_ALV>-ZJKJE <FS_ALV>-HKONT <FS_ALV>-CJBELNR_FK <FS_ALV>-RSTGR.
            ENDIF.
          ENDIF.


        ENDIF.

      ENDIF.

      IF LV_BELNR IS INITIAL.

        "会计凭证抬头参数填充
        PERFORM FRM_FILL_BKPF USING <FS_ALV>.

        SORT GT_FTPOST BY STYPE COUNT.

        "调用函数生成会计凭证
        PERFORM FRM_ACC_DOCUMENT_POST CHANGING LV_ERROR LV_BELNR LV_MESSAGE.
      ENDIF.

      IF LV_BELNR IS NOT INITIAL."凭证创建成功

        LV_BELNR  =  |{ LV_BELNR   ALPHA = IN  }|.

        "ZAPPJ新增数据记录最新数据;
        SHIFT LV_ZLSBH_YF LEFT DELETING LEADING ''.
        LV_ZLSBH = GC_AP && SY-DATUM+2(2) && LV_ZLSBH_YF. "拼接流水号
        MOVE-CORRESPONDING <FS_ALV> TO LS_DB_ZAPPJ.
        LS_DB_ZAPPJ-ZLSBH = LV_ZLSBH.           "流水编号
        LS_DB_ZAPPJ-ZGZZT = ABAP_TRUE.          "过账状态
        IF LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_CP.

          IF LS_DB_ZAPPJ-ZBZLC IS INITIAL.
            LS_DB_ZAPPJ-BELNR_CP = LV_BELNR.      "出票过账凭证
          ELSE.
*            LS_DB_ZAPPJ-BELNR_ZC = LV_BELNR.      "保证/理财金过账凭证

            LOOP AT LT_ITEM INTO LS_ITEM WHERE ZNUMB = LS_DB_ZAPPJ-ZNUMB AND ZPJBH = LS_DB_ZAPPJ-ZPJBH.
              "保证金累加
              LS_DB_ZAPPJ-ZBZJJE = LS_DB_ZAPPJ-ZBZJJE + LS_ITEM-ZBZJJE.
              "理财户累加
              LS_DB_ZAPPJ-ZLCJE  = LS_DB_ZAPPJ-ZLCJE  + LS_ITEM-ZLCJE.
            ENDLOOP.
          ENDIF.

        ELSEIF LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_DF.

          LS_DB_ZAPPJ-BELNR_DF = LV_BELNR.        "兑付过账凭证

        ELSEIF LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_DJBS.

        ENDIF.
        LS_DB_ZAPPJ-ZZTBS = ABAP_TRUE.     "最新状态
        LS_DB_ZAPPJ-ERDAT = SY-DATUM.      "创建日期
        LS_DB_ZAPPJ-ERZET = SY-UZEIT.      "创建时间
        LS_DB_ZAPPJ-ERNAM = SY-UNAME.      "创建人员

        TRY .
            INSERT ZAPPJ FROM LS_DB_ZAPPJ.
            IF SY-SUBRC <> 0.
              LV_ERROR = ABAP_TRUE.
            ENDIF.
          CATCH CX_SY_OPEN_SQL_DB.
            LV_ERROR = ABAP_TRUE.
        ENDTRY.

        "ZTFI_031_HEAD更新数据
        IF LS_HEAD IS NOT INITIAL.
          LS_HEAD-BELNR_ZC = LV_BELNR.
          LS_HEAD-ZGZZT    = ABAP_TRUE.
          MODIFY ZTFI_031_HEAD FROM LS_HEAD.
          IF SY-SUBRC <> 0.
            LV_ERROR = ABAP_TRUE.
          ENDIF.
        ENDIF.

        "更新原数据的最新状态为空;
        UPDATE ZAPPJ SET ZZTBS = SPACE WHERE ZLSBH = <FS_ALV>-ZLSBH
                                         AND BUKRS = <FS_ALV>-BUKRS
                                         AND ZPJBH = <FS_ALV>-ZPJBH.
        IF SY-SUBRC <> 0.
          LV_ERROR = ABAP_TRUE.
        ENDIF.

        IF LV_ERROR IS INITIAL.

          COMMIT WORK AND WAIT.

          "解锁原流水
          PERFORM FRM_DEQUEUE_EZ_ZAPPJ USING <FS_ALV>-ZLSBH.

          "加锁新流水
          PERFORM FRM_ENQUEUE_EZ_ZAPPJ USING LS_DB_ZAPPJ-ZLSBH.

          "更新ALV的指示灯,流水号,状态,消息;
          PERFORM FRM_CHANGE_ALV USING LS_DB_ZAPPJ
                                 CHANGING <FS_ALV>.

          "设置字段不可编辑
          PERFORM FRM_SET_DISABLED CHANGING <FS_ALV>-STYLE.

          <FS_ALV>-BELNR = LV_BELNR.

          CLEAR: LV_ZLSBH_YF.

          GV_UPDATE = SPACE.

        ELSE.

          ROLLBACK WORK.

          "指示灯
          <FS_ALV>-LIGHT = ICON_CANCEL.

          "消息
          <FS_ALV>-MESSAGE = TEXT-032.

          "创建会计凭证成功时,冲销会计凭证
          IF LV_BELNR IS NOT INITIAL.

            PERFORM FRM_ACC_DOCUMENT_CANCEL USING LV_BELNR
                                                  LS_DB_ZAPPJ-BUKRS
                                                  LS_DB_ZAPPJ-ZGZRQ
                                                  CHANGING LV_ERROR LV_MESSAGE LV_BELNR.

            CLEAR: LV_ERROR,LV_MESSAGE,LV_BELNR.
          ENDIF.

        ENDIF.

      ELSE.                  "凭证创建失败

        "指示灯
        <FS_ALV>-LIGHT = ICON_CANCEL.

        "消息
        <FS_ALV>-MESSAGE = LV_MESSAGE.

      ENDIF.

    ELSE.

      "指示灯
      <FS_ALV>-LIGHT   = ICON_CANCEL.
      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.

    ENDIF.

    CLEAR:LV_ERROR,LV_MESSAGE, LS_DB_ZAPPJ,LV_BELNR,LV_ZLSBH.

  ENDLOOP.


  FREE:LV_ERROR,
       LV_MESSAGE,
       LV_ZLSBH,
       LT_DEAL,
       LS_DB_ZAPPJ.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ACC_DOCUMENT_CANCEL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LV_BELNR  text
*&---------------------------------------------------------------------*
FORM FRM_ACC_DOCUMENT_CANCEL  USING PV_BELNR PV_BUKRS PV_ZGZRQ
                              CHANGING PV_ERROR PV_MESSAGE PV_BELNR2.
  DATA: LT_RETURN TYPE STANDARD TABLE OF BAPIRET2.

*&-----------将选中行的数据进行冲销
  IF GV_BUDAT IS NOT INITIAL.
    CALL FUNCTION 'CALL_FB08'
      EXPORTING
        I_BUKRS      = PV_BUKRS
        I_BELNR      = PV_BELNR
        I_GJAHR      = GV_BUDAT+0(4)
        I_STGRD      = GV_STGRD
        I_BUDAT      = GV_BUDAT
      EXCEPTIONS
        NOT_POSSIBLE = 1
        OTHERS       = 2.
  ELSE.
    CALL FUNCTION 'CALL_FB08'
      EXPORTING
        I_BUKRS      = PV_BUKRS
        I_BELNR      = PV_BELNR
        I_GJAHR      = PV_ZGZRQ+0(4)
        I_STGRD      = GV_STGRD
      EXCEPTIONS
        NOT_POSSIBLE = 1
        OTHERS       = 2.
  ENDIF.


  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            INTO PV_MESSAGE
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    PV_ERROR = ABAP_TRUE.
    IF SY-MSGNO EQ '361' AND SY-MSGID EQ 'F5'.

      PV_ERROR = SPACE.

      SELECT SINGLE AWREF_REV
             FROM BKPF
             INTO PV_BELNR2
             WHERE BUKRS = PV_BUKRS
               AND BELNR = PV_BELNR
               AND GJAHR = PV_ZGZRQ+0(4)
               AND XREVERSED = ABAP_TRUE.
    ENDIF.

  ELSE.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
          INTO PV_MESSAGE
          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    PV_ERROR = SPACE.
    "冲销成功
    PV_BELNR2 = SY-MSGV1.
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ACC_DOCUMENT_POST
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>  text
*      <--P_LV_ERROR  text
*      <--P_LV_BELNR  text
*&---------------------------------------------------------------------*
FORM FRM_ACC_DOCUMENT_POST  CHANGING PV_ERROR
                                     PV_BELNR
                                     PV_MESSAGE.

  "产生会计凭证正式运行
  CALL FUNCTION 'POSTING_INTERFACE_START'
    EXPORTING
      I_FUNCTION         = 'C'  "C: Call Transaction
      I_KEEP             = 'X'  "X: 用于已处理会话的队列删除标志
      I_MODE             = 'N'  "A:显示录屏 N:后台执行
      I_USER             = SY-UNAME
*     I_XBDCC            = 'X'
    EXCEPTIONS
      CLIENT_INCORRECT   = 1
      FUNCTION_INVALID   = 2
      GROUP_NAME_MISSING = 3
      MODE_INVALID       = 4
      UPDATE_INVALID     = 5
      OTHERS             = 6.
  IF SY-SUBRC <> 0.
    "更新消息
    MESSAGE ID     SY-MSGID
            TYPE   SY-MSGTY
            NUMBER SY-MSGNO
            WITH   SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
            INTO   PV_MESSAGE.

    PV_ERROR = ABAP_TRUE.

  ENDIF.

  CHECK PV_ERROR IS INITIAL.

  CALL FUNCTION 'POSTING_INTERFACE_DOCUMENT'
    EXPORTING
      I_TCODE                  = 'FB01'
    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 E_MSGID = 'F5' AND E_MSGNO = '312'.

    "更新消息
    PV_MESSAGE = PV_BELNR = E_MSGV1.

  ELSE.

    PV_ERROR = ABAP_TRUE.

    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        MSGID               = E_MSGID
        MSGNR               = E_MSGNO
        MSGV1               = E_MSGV1
        MSGV2               = E_MSGV2
        MSGV3               = E_MSGV3
        MSGV4               = E_MSGV4
      IMPORTING
        MESSAGE_TEXT_OUTPUT = PV_MESSAGE.

  ENDIF.

  CALL FUNCTION 'POSTING_INTERFACE_END'
    EXPORTING
      I_BDCIMMED              = 'X'
    EXCEPTIONS
      SESSION_NOT_PROCESSABLE = 0
      OTHERS                  = 0.

  FREE:  E_MSGID,
         E_MSGNO,
         E_MSGTY,
         E_MSGV1,
         E_MSGV2,
         E_MSGV3,
         E_MSGV4,
         E_SUBRC,
         I_GROUP.

  FREE: GT_BLNTAB,
        GT_FTPOST,
        GT_FTTAX.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_BKPF
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>  text
*&---------------------------------------------------------------------*
FORM FRM_FILL_BKPF  USING  PS_ALV TYPE TY_ALV.
  DATA: LV_DATE(10) TYPE C,
        LV_ZGZRQ(8) TYPE C.

  "填充抬头
  FILL_FTPOST 'K' '001' 'BKPF-BUKRS' PS_ALV-BUKRS.   " 公司代码
  FILL_FTPOST 'K' '001' 'BKPF-BLART' PS_ALV-BLART.   " 凭证类型
  FILL_FTPOST 'K' '001' 'BKPF-WAERS' GC_WAERS.       " 货币码
  IF PS_ALV-ZGZRQ IS NOT INITIAL.
    CLEAR LV_DATE.
    LV_ZGZRQ = PS_ALV-ZGZRQ.
    PERFORM FRM_CONVERT_DATE USING LV_ZGZRQ  CHANGING LV_DATE.
    FILL_FTPOST 'K' '001' 'BKPF-BLDAT' LV_DATE.   " 凭证日期
    FILL_FTPOST 'K' '001' 'BKPF-BUDAT' LV_DATE.   " 过账日期
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_BSEG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>  text
*      -->P_       text
*&---------------------------------------------------------------------*
FORM FRM_FILL_BSEG  USING  PS_ALV TYPE TY_ALV
                           PV_BSCHL TYPE BSEG-BSCHL
                           PV_BUZEI TYPE BSEG-BUZEI
                           PV_ZHPJE TYPE ZARPJ-ZHPJE
                           PV_HKONT TYPE BSEG-HKONT
                           PV_CJBELNR TYPE ZARPJ-CJBELNR1
                           PV_RSTGR TYPE BSEG-RSTGR.
  DATA: LV_DATE(10)  TYPE C,
        LV_ZGZRQ(8)  TYPE C,
        LV_WRBTR(13) TYPE C,
        LV_SGTXT     TYPE BSEG-SGTXT,
        LV_XREF2     TYPE BSEG-XREF2.

  "填充行项目
  FILL_FTPOST 'P' PV_BUZEI 'RF05A-NEWBS' PV_BSCHL.               " 记账码
  CLEAR LV_WRBTR.
  LV_WRBTR = PV_ZHPJE.
  CONDENSE LV_WRBTR.
  FILL_FTPOST 'P' PV_BUZEI 'BSEG-WRBTR'  LV_WRBTR.               " 交易货币金额

  LV_SGTXT = TEXT-009 && PS_ALV-ZPJBH && PS_ALV-ZPJZT.
  FILL_FTPOST 'P' PV_BUZEI 'BSEG-SGTXT'  LV_SGTXT.               " 凭证行文本

  IF PV_BSCHL = '21' OR PV_BSCHL = '39' OR PV_BSCHL = '29'.
    FILL_FTPOST 'P' PV_BUZEI 'RF05A-NEWKO' PS_ALV-LIFNR.         " 供应商
  ENDIF.

  IF PV_BSCHL = '39' OR PV_BSCHL = '29'.
    FILL_FTPOST 'P' PV_BUZEI 'RF05A-NEWUM' PS_ALV-ZPJLX.         " 特别总账标识
    IF PS_ALV-ZDQRQ IS NOT INITIAL.
      CLEAR LV_DATE.
      LV_ZGZRQ = PS_ALV-ZDQRQ.
      PERFORM FRM_CONVERT_DATE USING LV_ZGZRQ  CHANGING LV_DATE.
      FILL_FTPOST 'P' PV_BUZEI 'BSEG-ZFBDT' LV_DATE. " 到期日
    ENDIF.

    IF PS_ALV-ZCPRQ IS NOT INITIAL.
      CLEAR LV_DATE.
      LV_ZGZRQ = PS_ALV-ZCPRQ.
      PERFORM FRM_CONVERT_DATE USING LV_ZGZRQ  CHANGING LV_DATE.
      FILL_FTPOST 'P' PV_BUZEI 'BSED-WDATE' LV_DATE. " 起息日
    ENDIF.
  ENDIF.

  FILL_FTPOST 'P' PV_BUZEI 'BSEG-XREF3' PS_ALV-ZPJBH."参考代码3

  LV_XREF2 = GC_AP && PS_ALV-ZPJZT.
  FILL_FTPOST 'P' PV_BUZEI 'BSEG-XREF2' LV_XREF2.    "参考代码2

  IF PV_HKONT IS NOT INITIAL.
    FILL_FTPOST 'P' PV_BUZEI 'RF05A-NEWKO' PV_HKONT." 科目代码
  ENDIF.

  IF PV_CJBELNR IS NOT INITIAL.
    FILL_FTPOST 'P' PV_BUZEI 'BSEG-XREF1' PV_CJBELNR."参考代码1
  ENDIF.

  IF PV_RSTGR IS NOT INITIAL.
    FILL_FTPOST 'P' PV_BUZEI 'BSEG-RSTGR' PV_RSTGR. " 原因代码
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  frm_convert_date
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->p_<fs_alv>_budat  text
*      <--p_lv_date  text
*----------------------------------------------------------------------*
FORM FRM_CONVERT_DATE USING PV_BUDAT TYPE CHAR8
                       CHANGING PV_DATE TYPE CHAR10.
  DATA: LV_DATUM TYPE SY-DATUM.

  MOVE PV_BUDAT TO LV_DATUM.

  "日期格式转换为外部输入格式
  CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
    EXPORTING
      DATE_INTERNAL            = LV_DATUM
    IMPORTING
      DATE_EXTERNAL            = PV_DATE
    EXCEPTIONS
      DATE_INTERNAL_IS_INVALID = 0
      OTHERS                   = 0.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_CJITEM
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_<FS_ALV>  text
*      -->P_       text
*      <--P_LT_ITEMS1  text
*&---------------------------------------------------------------------*
FORM FRM_FILL_CJITEM  USING    PS_ALV TYPE TY_ALV
                               PV_AR
                               PV_AMOUNT TYPE ZARPJ-ZLXJE
                               PV_CAJO_NUMBER TYPE ZAPPJ-ZZJZH
                      CHANGING PT_ITEMS TYPE TY_BAPI_CJ_ITEMS
                               PS_HEADER TYPE BAPI_CJ_HEADER.
  DATA: LS_ITEMS           TYPE BAPI_CJ_ITEMS,
        LV_POSITION_NUMBER TYPE CJBUZEI.

  "抬头参数赋值
  PS_HEADER-COMP_CODE   = PS_ALV-BUKRS.
  PS_HEADER-PSTNG_DATE  = PS_ALV-ZDQRQ.
  PS_HEADER-DOC_DATE    = PS_ALV-ZDQRQ.
  PS_HEADER-CAJO_NUMBER = PV_CAJO_NUMBER.
  PS_HEADER-CURRENCY    = GC_WAERS.

  CLEAR:LV_POSITION_NUMBER, LS_ITEMS.
  LV_POSITION_NUMBER       = LV_POSITION_NUMBER + 1.
  LS_ITEMS-POSITION_NUMBER = LV_POSITION_NUMBER.
  READ TABLE GT_CJTRANS INTO DATA(LS_CJTRANS) WITH KEY CJTRANS = PV_AR.
  IF SY-SUBRC = 0.
    PS_ALV-CJTRANSNUMB = LS_CJTRANS-CJTRANSNUMB.
    PS_ALV-CJTRANSCLAS = LS_CJTRANS-CJTRANSCLAS.
  ENDIF.
  LS_ITEMS-TRANSACT_NUMBER = PS_ALV-CJTRANSNUMB.
  LS_ITEMS-POSITION_TEXT   = TEXT-009 && PS_ALV-ZPJBH && TEXT-047.

  CASE PS_ALV-CJTRANSCLAS.
    WHEN '1'.
      LS_ITEMS-P_PAYMENTS = PV_AMOUNT.
    WHEN '2'.
      LS_ITEMS-P_RECEIPTS = PV_AMOUNT.
  ENDCASE.
  LS_ITEMS-P_NET_AMOUNT   = PV_AMOUNT.
  APPEND LS_ITEMS TO PT_ITEMS.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BZJLC_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_BZJLC_DATA .

  DATA: LT_DEAL    TYPE STANDARD TABLE OF TY_ALV.
  DATA: LV_ERROR    TYPE C.
  DATA: LT_BZJZH TYPE STANDARD TABLE OF ZTFI_BZJZH,
        LT_LCJZH TYPE STANDARD TABLE OF ZTFI_LCJZH.

  "对话框返回值
  DATA : LV_ANSWER TYPE C.

  "清空全局变量
  CLEAR: GV_ZBZZH,
         GV_ZLCZH,
         GV_ZZJZH,
         GV_ZLCJE,
         GV_ZLCJE_BC,
         GV_ZFYJE_BC,
         GV_ZBZJJE,
         GV_ZBZJJE_BC,
         GV_ZHPJE,
         R_ZZJZH[].

  "保留更新的行项目
  LT_DEAL[] = GT_ALV[].
  DELETE LT_DEAL WHERE BOX IS INITIAL.

  "检查是否有选中行
  PERFORM FRM_CHECK_SELECT USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否有错误数据
  PERFORM FRM_CHECK_ERROR USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否已经删除
  PERFORM FRM_CHECK_DELETE USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查数据是否完整
  PERFORM FRM_CHECK_DATA USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "借款余额不能为0
  IF GV_ZJKJE <= 0.
    LV_ERROR = ABAP_TRUE.
    MESSAGE I027.
    RETURN.
  ENDIF.

  "保证金账户默认值
  LT_BZJZH[] = GT_BZJZH[].
  DELETE LT_BZJZH WHERE ZZJZH NOT IN R_ZZJZH.
  READ TABLE LT_BZJZH ASSIGNING <FS_BZJZH> INDEX 1.
  IF SY-SUBRC = 0.
    GV_ZBZZH = <FS_BZJZH>-BZJZH.
    GV_ZZJZH = <FS_BZJZH>-ZZJZH.
  ELSE.
    LV_ERROR = ABAP_TRUE.
    MESSAGE I021.
    RETURN.
  ENDIF.

  "理财户账户默认值
  LT_LCJZH[] = GT_LCJZH[].
  DELETE LT_LCJZH WHERE ZZJZH NOT IN R_ZZJZH.
  READ TABLE LT_LCJZH ASSIGNING <FS_LCJZH> INDEX 1.
  IF SY-SUBRC = 0.
    GV_ZLCZH = <FS_LCJZH>-LCJZH.
    GV_ZZJZH = <FS_LCJZH>-ZZJZH.
  ELSE.
    LV_ERROR = ABAP_TRUE.
    MESSAGE I022.
    RETURN.
  ENDIF.

  CHECK LV_ERROR IS INITIAL.
*
*  CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
*    EXPORTING
*      TITEL       = '对话框'
*      TEXT_BEFORE = '是否确认对选中票据'
*      OBJECTVALUE = '进行操作'
*      TEXT_AFTER  = '?'
*    IMPORTING
*      ANSWER      = LV_ANSWER.
*  IF LV_ANSWER <> 'J'.
*    RETURN.
*  ENDIF.

  CALL SCREEN 9001 STARTING AT 30 10
                     ENDING AT 60 18.

  FREE: R_ZZJZH,
        GV_ZHPJE,
        LT_BZJZH,
        LT_LCJZH.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FDUIFU_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_FDUIFU_DATA USING PV_UCOMM TYPE SY-UCOMM.
  DATA: LS_DB_ZAPPJ TYPE ZAPPJ.
  DATA: LT_DEAL    TYPE STANDARD TABLE OF TY_ALV.
  DATA: LV_ERROR    TYPE C,
        LV_MESSAGE  TYPE BAPI_MSG,
        LV_AMOUNT   TYPE ZAPPJ-ZHPJE,
        LV_ZLSBH_YF TYPE ZARPJ-ZLSBH,
        LV_ZLSBH_YS TYPE ZARPJ-ZLSBH,
        LV_ZLSBH    TYPE ZARPJ-ZLSBH.


  "对话框返回值
  DATA : LV_ANSWER TYPE C.

  "保留更新的行项目
  LT_DEAL[] = GT_ALV[].
  DELETE LT_DEAL WHERE BOX IS INITIAL.

  "检查是否有选中行
  PERFORM FRM_CHECK_SELECT USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否有错误数据
  PERFORM FRM_CHECK_ERROR USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否已经删除
  PERFORM FRM_CHECK_DELETE USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查数据是否完整
  PERFORM FRM_CHECK_DATA USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "删除不是转保证金/理财户的数据
  DELETE LT_DEAL WHERE ( ZNUMB IS INITIAL AND ZPJZT = GC_ZPJZT_CP ) OR ZPJZT <> GC_ZPJZT_CP.
  SORT LT_DEAL BY ZNUMB.
  DELETE ADJACENT DUPLICATES FROM LT_DEAL COMPARING ZNUMB.
  IF LT_DEAL IS NOT INITIAL.
    SELECT *
      FROM ZTFI_031_HEAD
      INTO TABLE @DATA(LT_HEAD)
      FOR ALL ENTRIES IN @LT_DEAL
      WHERE ZNUMB = @LT_DEAL-ZNUMB.

    SELECT *
      FROM ZTFI_031_ITEM
      INTO TABLE @DATA(LT_ITEM)
      FOR ALL ENTRIES IN @LT_DEAL
      WHERE ZNUMB = @LT_DEAL-ZNUMB.

    "检查其他转出行是否被选中
    LOOP AT LT_ITEM INTO DATA(LS_ITEM).
      READ TABLE GT_ALV ASSIGNING <FS_ALV> WITH KEY BOX = ABAP_TRUE ZPJBH = LS_ITEM-ZPJBH.
      IF SY-SUBRC <> 0.
        LV_ERROR = ABAP_TRUE.
        MESSAGE I030.
        RETURN.
      ENDIF.
    ENDLOOP.
  ENDIF.

  CHECK LV_ERROR IS INITIAL.

  CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
    EXPORTING
      TITEL       = '对话框'
      TEXT_BEFORE = '是否确认对选中票据'
      OBJECTVALUE = '进行操作'
      TEXT_AFTER  = '?'
    IMPORTING
      ANSWER      = LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    RETURN.
  ENDIF.

  LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BOX = ABAP_TRUE.

    CLEAR:LV_ERROR,
          LV_MESSAGE.

    "反兑付的时候,删除日记账
    IF PV_UCOMM = 'FDUIFU'.
      "删除付款日记账
      IF <FS_ALV>-CJBELNR_FK IS NOT INITIAL AND LV_ERROR IS INITIAL.

        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_FK
                                   CHANGING LV_ERROR LV_MESSAGE.
      ENDIF.

      "删除保证金日记账
      IF <FS_ALV>-CJBELNR_BZ IS NOT INITIAL AND LV_ERROR IS INITIAL.
        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_BZ
                                   CHANGING LV_ERROR LV_MESSAGE.

      ENDIF.

      "删除理财日记账
      IF <FS_ALV>-CJBELNR_LC IS NOT INITIAL AND LV_ERROR IS INITIAL.
        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_LC
                                   CHANGING LV_ERROR LV_MESSAGE.

      ENDIF.

      "删除转出保证金日记账
      IF <FS_ALV>-CJBELNR_ZC IS NOT INITIAL AND LV_ERROR IS INITIAL.
        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_ZC
                                   CHANGING LV_ERROR LV_MESSAGE.

      ENDIF.
    ENDIF.

    "退回的时候,删除日记账
    IF PV_UCOMM = 'TUIHUI'.

      IF <FS_ALV>-CJBELNR_AP1 IS NOT INITIAL AND LV_ERROR IS INITIAL.

        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_AP1
                                   CHANGING LV_ERROR LV_MESSAGE.
      ENDIF.

      IF <FS_ALV>-CJBELNR_AP2 IS NOT INITIAL AND LV_ERROR IS INITIAL.

        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_AP2
                                   CHANGING LV_ERROR LV_MESSAGE.
      ENDIF.


      IF <FS_ALV>-CJBELNR_AP3 IS NOT INITIAL AND LV_ERROR IS INITIAL.

        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_AP3
                                   CHANGING LV_ERROR LV_MESSAGE.
      ENDIF.


      IF <FS_ALV>-CJBELNR_AP4 IS NOT INITIAL AND LV_ERROR IS INITIAL.

        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_AP4
                                   CHANGING LV_ERROR LV_MESSAGE.
      ENDIF.

      IF <FS_ALV>-CJBELNR_AP5 IS NOT INITIAL AND LV_ERROR IS INITIAL.

        PERFORM FRM_FCJ_DELETE_DOC USING <FS_ALV> <FS_ALV>-CJBELNR_AP5
                                   CHANGING LV_ERROR LV_MESSAGE.
      ENDIF.
    ENDIF.

    IF LV_ERROR IS NOT INITIAL.

      "指示灯
      <FS_ALV>-LIGHT = ICON_CANCEL.

      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.

    ENDIF.

    CHECK LV_ERROR IS INITIAL.

    IF LV_ZLSBH_YF IS INITIAL.
      "获取流水号
      PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YF GC_RANGE_NR ' ' SY-DATUM+0(4)
                               CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH_YF.
    ENDIF.


    IF LV_ERROR IS INITIAL.

      "拼接应付流水号
      SHIFT LV_ZLSBH_YF LEFT DELETING LEADING ''.
      LV_ZLSBH = GC_AP && SY-DATUM+2(2) && LV_ZLSBH_YF.

      MOVE-CORRESPONDING <FS_ALV> TO LS_DB_ZAPPJ.
      LS_DB_ZAPPJ-ZLSBH = LV_ZLSBH.    "流水编号
      LS_DB_ZAPPJ-ZZTBS = ABAP_TRUE.   "最新状态
      LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_CP. "票据状态出票
      LS_DB_ZAPPJ-ZGZZT = ABAP_TRUE.   "过账状态
      IF PV_UCOMM = 'FDUIFU'.
        LS_DB_ZAPPJ-CJBELNR_FK = SPACE.  "付款账户
        LS_DB_ZAPPJ-CJBELNR_BZ = SPACE.  "保证金账户
        LS_DB_ZAPPJ-CJBELNR_LC = SPACE.  "理财账户
        LS_DB_ZAPPJ-CJBELNR_ZC = SPACE.  "转出保证金账户
      ENDIF.
      IF PV_UCOMM = 'TUIHUI'.
        LS_DB_ZAPPJ-ZNUMB = SPACE."流水号
        LS_DB_ZAPPJ-ZBZLC = SPACE."转保证金/理财标识
      ENDIF.
      LS_DB_ZAPPJ-ERDAT = SY-DATUM.    "创建日期
      LS_DB_ZAPPJ-ERZET = SY-UZEIT.    "创建时间
      LS_DB_ZAPPJ-ERNAM = SY-UNAME.    "创建人员

      "新增数据ZAPPJ记录最新数据
      TRY .
          INSERT ZAPPJ FROM LS_DB_ZAPPJ.
          IF SY-SUBRC <> 0.
            LV_ERROR = ABAP_TRUE.
          ENDIF.
        CATCH CX_SY_OPEN_SQL_DB.
          LV_ERROR = ABAP_TRUE.
      ENDTRY.

      "更新原数据的最新状态为空;
      UPDATE ZAPPJ SET ZZTBS = SPACE WHERE ZLSBH = <FS_ALV>-ZLSBH
                                       AND BUKRS = <FS_ALV>-BUKRS
                                       AND ZPJBH = <FS_ALV>-ZPJBH.
      IF SY-SUBRC <> 0.
        LV_ERROR = ABAP_TRUE.
      ENDIF.

      IF LV_ERROR IS INITIAL.

        COMMIT WORK AND WAIT.

        "解锁应付原流水
        PERFORM FRM_DEQUEUE_EZ_ZAPPJ USING <FS_ALV>-ZLSBH.

        "加锁应付新流水
        PERFORM FRM_ENQUEUE_EZ_ZAPPJ USING LS_DB_ZAPPJ-ZLSBH.

        "解锁应收原流水
        IF <FS_ALV>-ZLSBH_YS IS NOT INITIAL.
          PERFORM FRM_DEQUEUE_EZ_ZARPJ USING <FS_ALV>-ZLSBH_YS.
        ENDIF.

        "更新ALV的指示灯,流水号,消息,最新状态,创建信息;
        PERFORM FRM_CHANGE_ALV USING LS_DB_ZAPPJ
                               CHANGING <FS_ALV>.

        IF PV_UCOMM = 'TUIHUI'.
          <FS_ALV>-CJBELNR_AP1 = SPACE.
          <FS_ALV>-CJBELNR_AP2 = SPACE.
          <FS_ALV>-CJBELNR_AP3 = SPACE.
          <FS_ALV>-CJBELNR_AP4 = SPACE.
          <FS_ALV>-CJBELNR_AP5 = SPACE.
        ENDIF.

        CLEAR: LV_ZLSBH_YF,LV_ZLSBH_YS.

        "更新标记设置为空
        GV_UPDATE = SPACE.

      ELSE.

        ROLLBACK WORK.
        "指示灯
        <FS_ALV>-LIGHT = ICON_CANCEL.
        "消息
        <FS_ALV>-MESSAGE = TEXT-032.
      ENDIF.

    ELSE.

      "指示灯
      <FS_ALV>-LIGHT = ICON_CANCEL.
      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.
    ENDIF.

    CLEAR:LV_ERROR,LV_MESSAGE,LS_DB_ZAPPJ,LV_ZLSBH.
  ENDLOOP.

  FREE: LV_ERROR,
        LV_MESSAGE,
        LV_ZLSBH,
        LV_ZLSBH_YF,
        LV_ZLSBH_YS,
        LS_DB_ZAPPJ,
        LT_DEAL.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DUIFU_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DUIFU_DATA .
  DATA: LS_DB_ZAPPJ TYPE ZAPPJ.
  DATA: LT_DEAL    TYPE STANDARD TABLE OF TY_ALV.
  DATA: LV_ERROR    TYPE C,
        LV_MESSAGE  TYPE BAPI_MSG,
        LV_AMOUNT   TYPE ZAPPJ-ZHPJE,
        LV_ZLSBH_YF TYPE ZARPJ-ZLSBH,
        LV_ZLSBH_YS TYPE ZARPJ-ZLSBH,
        LV_ZLSBH    TYPE ZARPJ-ZLSBH.
  DATA: LS_HEADER1              TYPE BAPI_CJ_HEADER,
        LS_HEADER2              TYPE BAPI_CJ_HEADER,
        LS_HEADER3              TYPE BAPI_CJ_HEADER,
        LS_HEADER4              TYPE BAPI_CJ_HEADER,
        LT_ITEMS1               TYPE TABLE OF BAPI_CJ_ITEMS,
        LT_ITEMS2               TYPE TABLE OF BAPI_CJ_ITEMS,
        LT_ITEMS3               TYPE TABLE OF BAPI_CJ_ITEMS,
        LT_ITEMS4               TYPE TABLE OF BAPI_CJ_ITEMS,
        LS_ITEMS                TYPE BAPI_CJ_ITEMS,
        LV_POSITION_NUMBER      TYPE CJBUZEI,
        LV_CASH_JOURNAL_DOC_NO1 TYPE BAPI_CJ_KEY-POSTING_NUMBER,
        LV_CASH_JOURNAL_DOC_NO2 TYPE BAPI_CJ_KEY-POSTING_NUMBER,
        LV_CASH_JOURNAL_DOC_NO3 TYPE BAPI_CJ_KEY-POSTING_NUMBER,
        LV_CASH_JOURNAL_DOC_NO4 TYPE BAPI_CJ_KEY-POSTING_NUMBER.

  "对话框返回值
  DATA : LV_ANSWER TYPE C.

  "保留更新的行项目
  LT_DEAL[] = GT_ALV[].
  DELETE LT_DEAL WHERE BOX IS INITIAL.

  "检查是否有选中行
  PERFORM FRM_CHECK_SELECT USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否有错误数据
  PERFORM FRM_CHECK_ERROR USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查是否已经删除
  PERFORM FRM_CHECK_DELETE USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  "检查数据是否完整
  PERFORM FRM_CHECK_DATA USING LT_DEAL CHANGING LV_ERROR.

  CHECK LV_ERROR IS INITIAL.

  CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
    EXPORTING
      TITEL       = '对话框'
      TEXT_BEFORE = '是否确认对选中票据'
      OBJECTVALUE = '进行操作'
      TEXT_AFTER  = '?'
    IMPORTING
      ANSWER      = LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    RETURN.
  ENDIF.

  LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BOX = ABAP_TRUE.

    CLEAR:LV_ERROR,
          LV_MESSAGE,
          LS_HEADER1,
          LS_HEADER2,
          LS_HEADER3,
          LS_HEADER4,
          LT_ITEMS1,
          LT_ITEMS2,
          LT_ITEMS3,
          LT_ITEMS4,
          LS_ITEMS,
          LV_POSITION_NUMBER,
          LV_CASH_JOURNAL_DOC_NO1,
          LV_CASH_JOURNAL_DOC_NO2,
          LV_CASH_JOURNAL_DOC_NO3,
          LV_CASH_JOURNAL_DOC_NO4.

    "当票据做兑付的时候,测试运行是否有误
    "行项目赋值
    IF <FS_ALV>-ZBZLC IS INITIAL.
      "没有转保证金/理财
      PERFORM FRM_FILL_CJITEM USING <FS_ALV> 'AP8' <FS_ALV>-ZHPJE <FS_ALV>-ZZJZH
                              CHANGING LT_ITEMS1 LS_HEADER1.

    ELSE.

      IF <FS_ALV>-PERSON1 = '01'.

        IF <FS_ALV>-ZJKJE > 0.
          "付款账户
          PERFORM FRM_FILL_CJITEM USING <FS_ALV> 'AP8' <FS_ALV>-ZJKJE <FS_ALV>-ZZJZH
                CHANGING LT_ITEMS1 LS_HEADER1.
        ENDIF.
        IF <FS_ALV>-ZBZJJE > 0.
          "保证金账户
          PERFORM FRM_FILL_CJITEM USING <FS_ALV> 'AP6' <FS_ALV>-ZBZJJE <FS_ALV>-ZBZZH
                CHANGING LT_ITEMS2 LS_HEADER2.
        ENDIF.
        IF <FS_ALV>-ZLCJE > 0.
          "理财账户
          PERFORM FRM_FILL_CJITEM USING <FS_ALV> 'AP7' <FS_ALV>-ZLCJE <FS_ALV>-ZLCZH
                CHANGING LT_ITEMS3 LS_HEADER3.
        ENDIF.

      ELSEIF <FS_ALV>-PERSON1 = '02'.

        LV_AMOUNT =  <FS_ALV>-ZJKJE + <FS_ALV>-ZBZJJE.
        IF LV_AMOUNT  > 0.
          "付款账户
          PERFORM FRM_FILL_CJITEM USING <FS_ALV> 'AP8' LV_AMOUNT <FS_ALV>-ZZJZH
                CHANGING LT_ITEMS1 LS_HEADER1.
        ENDIF.
        IF <FS_ALV>-ZBZJJE > 0.
          "保证金账户
          PERFORM FRM_FILL_CJITEM USING <FS_ALV> 'AP6' <FS_ALV>-ZBZJJE <FS_ALV>-ZBZZH
                CHANGING LT_ITEMS2 LS_HEADER2.
          "转出账户
          PERFORM FRM_FILL_CJITEM USING <FS_ALV> 'AP9' <FS_ALV>-ZBZJJE <FS_ALV>-ZZJZH
                CHANGING LT_ITEMS4 LS_HEADER4.
        ENDIF.
        IF <FS_ALV>-ZLCJE > 0.
          "理财账户
          PERFORM FRM_FILL_CJITEM USING <FS_ALV> 'AP7' <FS_ALV>-ZLCJE <FS_ALV>-ZLCZH
                CHANGING LT_ITEMS3 LS_HEADER3.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LT_ITEMS1[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "付款日记账调用函数测试
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER1 ABAP_TRUE LT_ITEMS1
            CHANGING LV_CASH_JOURNAL_DOC_NO1 LV_ERROR LV_MESSAGE.
      CLEAR: LV_CASH_JOURNAL_DOC_NO1.
    ENDIF.

    IF LT_ITEMS2[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "保证金日记账调用函数测试运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER2 ABAP_TRUE LT_ITEMS2
            CHANGING LV_CASH_JOURNAL_DOC_NO2 LV_ERROR LV_MESSAGE.
      CLEAR: LV_CASH_JOURNAL_DOC_NO2.
    ENDIF.

    IF LT_ITEMS3[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "理财日记账调用函数测试运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER3 ABAP_TRUE LT_ITEMS3
            CHANGING LV_CASH_JOURNAL_DOC_NO3 LV_ERROR LV_MESSAGE.
      CLEAR: LV_CASH_JOURNAL_DOC_NO3.
    ENDIF.

    IF LT_ITEMS4[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "保证金转出日记账调用函数测试运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER4 ABAP_TRUE LT_ITEMS4
            CHANGING LV_CASH_JOURNAL_DOC_NO4 LV_ERROR LV_MESSAGE.
      CLEAR: LV_CASH_JOURNAL_DOC_NO4.
    ENDIF.

    IF LV_ERROR IS NOT INITIAL.

      "指示灯
      <FS_ALV>-LIGHT = ICON_CANCEL.

      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.
    ENDIF.

    CHECK LV_ERROR IS INITIAL.

    IF LV_ZLSBH_YF IS INITIAL.
      "获取流水号
      PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YF GC_RANGE_NR ' ' SY-DATUM+0(4)
                               CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH_YF.
    ENDIF.


    "当票据做兑付的时候,正式运行
    IF LT_ITEMS1[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "付款日记账调用函数测试
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER1 SPACE LT_ITEMS1
            CHANGING LV_CASH_JOURNAL_DOC_NO1 LV_ERROR LV_MESSAGE.
    ENDIF.

    IF LT_ITEMS2[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "保证金日记账调用函数测试运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER2 SPACE LT_ITEMS2
            CHANGING LV_CASH_JOURNAL_DOC_NO2 LV_ERROR LV_MESSAGE.
    ENDIF.

    IF LT_ITEMS3[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "理财日记账调用函数测试运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER3 SPACE LT_ITEMS3
            CHANGING LV_CASH_JOURNAL_DOC_NO3 LV_ERROR LV_MESSAGE.
    ENDIF.

    IF LT_ITEMS4[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "保证金转出日记账调用函数测试运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER4 SPACE LT_ITEMS4
            CHANGING LV_CASH_JOURNAL_DOC_NO4 LV_ERROR LV_MESSAGE.
    ENDIF.


    IF LV_ERROR IS INITIAL.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

    ELSE.
      "指示灯
      <FS_ALV>-LIGHT = ICON_CANCEL.

      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.
    ENDIF.

    CHECK LV_ERROR IS INITIAL.

    IF LV_ERROR IS INITIAL.

      "拼接应付流水号
      SHIFT LV_ZLSBH_YF LEFT DELETING LEADING ''.
      LV_ZLSBH = GC_AP && SY-DATUM+2(2) && LV_ZLSBH_YF.

      MOVE-CORRESPONDING <FS_ALV> TO LS_DB_ZAPPJ.
      LS_DB_ZAPPJ-ZLSBH = LV_ZLSBH.    "流水编号
      LS_DB_ZAPPJ-ZZTBS = ABAP_TRUE.   "最新状态
      LS_DB_ZAPPJ-ZPJZT = GC_ZPJZT_DF. "票据状态兑付
      LS_DB_ZAPPJ-ZGZZT = SPACE.       "过账状态
      LS_DB_ZAPPJ-CJBELNR_FK = LV_CASH_JOURNAL_DOC_NO1."付款账户
      LS_DB_ZAPPJ-CJBELNR_BZ = LV_CASH_JOURNAL_DOC_NO2."保证金账户
      LS_DB_ZAPPJ-CJBELNR_LC = LV_CASH_JOURNAL_DOC_NO3."理财账户
      LS_DB_ZAPPJ-CJBELNR_ZC = LV_CASH_JOURNAL_DOC_NO4."转出保证金账户
      LS_DB_ZAPPJ-ERDAT = SY-DATUM.    "创建日期
      LS_DB_ZAPPJ-ERZET = SY-UZEIT.    "创建时间
      LS_DB_ZAPPJ-ERNAM = SY-UNAME.    "创建人员

      "新增数据ZAPPJ记录最新数据
      TRY .
          INSERT ZAPPJ FROM LS_DB_ZAPPJ.
          IF SY-SUBRC <> 0.
            LV_ERROR = ABAP_TRUE.
          ENDIF.
        CATCH CX_SY_OPEN_SQL_DB.
          LV_ERROR = ABAP_TRUE.
      ENDTRY.

      "更新原数据的最新状态为空;
      UPDATE ZAPPJ SET ZZTBS = SPACE WHERE ZLSBH = <FS_ALV>-ZLSBH
                                       AND BUKRS = <FS_ALV>-BUKRS
                                       AND ZPJBH = <FS_ALV>-ZPJBH.
      IF SY-SUBRC <> 0.
        LV_ERROR = ABAP_TRUE.
      ENDIF.

      IF LV_ERROR IS INITIAL.

        COMMIT WORK AND WAIT.

        "解锁应付原流水
        PERFORM FRM_DEQUEUE_EZ_ZAPPJ USING <FS_ALV>-ZLSBH.

        "加锁应付新流水
        PERFORM FRM_ENQUEUE_EZ_ZAPPJ USING LS_DB_ZAPPJ-ZLSBH.

        "解锁应收原流水
        IF <FS_ALV>-ZLSBH_YS IS NOT INITIAL.
          PERFORM FRM_DEQUEUE_EZ_ZARPJ USING <FS_ALV>-ZLSBH_YS.
        ENDIF.

        "更新ALV的指示灯,流水号,消息,最新状态,创建信息;
        PERFORM FRM_CHANGE_ALV USING LS_DB_ZAPPJ
                               CHANGING <FS_ALV>.

        CLEAR: LV_ZLSBH_YF,LV_ZLSBH_YS.

        "更新标记设置为空
        GV_UPDATE = SPACE.

      ELSE.

        ROLLBACK WORK.
        "指示灯
        <FS_ALV>-LIGHT = ICON_CANCEL.
        "消息
        <FS_ALV>-MESSAGE = TEXT-032.
      ENDIF.

    ELSE.

      "指示灯
      <FS_ALV>-LIGHT = ICON_CANCEL.
      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.
    ENDIF.

    CLEAR:LV_ERROR,LV_MESSAGE,LS_DB_ZAPPJ,LV_ZLSBH.
  ENDLOOP.

  FREE: LV_ERROR,
        LV_MESSAGE,
        LV_ZLSBH,
        LV_ZLSBH_YF,
        LV_ZLSBH_YS,
        LS_DB_ZAPPJ,
        LT_DEAL,
        LS_HEADER1,
        LS_HEADER2,
        LS_HEADER3,
        LS_HEADER4,
        LT_ITEMS1,
        LT_ITEMS2,
        LT_ITEMS3,
        LT_ITEMS4,
        LS_ITEMS,
        LV_POSITION_NUMBER,
        LV_CASH_JOURNAL_DOC_NO1,
        LV_CASH_JOURNAL_DOC_NO2,
        LV_CASH_JOURNAL_DOC_NO3,
        LV_CASH_JOURNAL_DOC_NO4 .
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_9001 OUTPUT.
  SET PF-STATUS 'ZFI_031'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9001 INPUT.
  CLEAR SAVE_OK.
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.

  CASE SAVE_OK.
    WHEN 'YES'.

      "将选中的行项目转至保证金/理财户
      PERFORM FRM_TRANSFER_DBDATA.

    WHEN 'NO'.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  F4_FOR_BZJZH  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE F4_FOR_BZJZH INPUT.
  DATA: LT_VALUE      TYPE STANDARD TABLE OF TY_NAME WITH HEADER LINE.
  DATA: LT_BZJZH TYPE STANDARD TABLE OF ZTFI_BZJZH.

  "获取保证金账户描述
  LT_BZJZH[] = GT_BZJZH[].
  DELETE LT_BZJZH WHERE ZZJZH NOT IN R_ZZJZH.

  IF LT_BZJZH IS NOT INITIAL.
    SELECT CAJO_NUMBER
           CAJO_NAME
      FROM TCJ_CJ_NAMES
      INTO CORRESPONDING FIELDS OF TABLE LT_VALUE
      FOR ALL ENTRIES IN LT_BZJZH
      WHERE LANGU       = SY-LANGU
        AND COMP_CODE   = LT_BZJZH-BUKRS
        AND CAJO_NUMBER = LT_BZJZH-BZJZH.
  ENDIF.


  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
*     DDIC_STRUCTURE  = ' '
      RETFIELD        = 'CAJO_NUMBER'
*     PVALKEY         = ' '
*     DYNPPROG        = ' '
*     DYNPNR          = ' '
*     DYNPROFIELD     = ' '
*     STEPL           = 0
*     WINDOW_TITLE    =
*     VALUE           = ' '
      VALUE_ORG       = 'S'
*     MULTIPLE_CHOICE = ' '
*     DISPLAY         = ' '
*     CALLBACK_PROGRAM       = ' '
*     CALLBACK_FORM   = ' '
*     CALLBACK_METHOD =
*     MARK_TAB        =
* IMPORTING
*     USER_RESET      =
    TABLES
      VALUE_TAB       = LT_VALUE
*     FIELD_TAB       =
*     RETURN_TAB      =
*     DYNPFLD_MAPPING =
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  F4_FOR_LCJZH  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE F4_FOR_LCJZH INPUT.
  DATA: LT_LCJZH TYPE STANDARD TABLE OF ZTFI_LCJZH.

  "获取保证金账户描述
  LT_LCJZH[] = GT_LCJZH[].
  DELETE LT_LCJZH WHERE ZZJZH NOT IN R_ZZJZH.
  IF LT_LCJZH IS NOT INITIAL.
    SELECT CAJO_NUMBER
           CAJO_NAME
      FROM TCJ_CJ_NAMES
      INTO CORRESPONDING FIELDS OF TABLE LT_VALUE
      FOR ALL ENTRIES IN LT_LCJZH
      WHERE LANGU       = SY-LANGU
        AND COMP_CODE   = LT_LCJZH-BUKRS
        AND CAJO_NUMBER = LT_LCJZH-LCJZH.
  ENDIF.


  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
*     DDIC_STRUCTURE  = ' '
      RETFIELD        = 'CAJO_NUMBER'
*     PVALKEY         = ' '
*     DYNPPROG        = ' '
*     DYNPNR          = ' '
*     DYNPROFIELD     = ' '
*     STEPL           = 0
*     WINDOW_TITLE    =
*     VALUE           = ' '
      VALUE_ORG       = 'S'
*     MULTIPLE_CHOICE = ' '
*     DISPLAY         = ' '
*     CALLBACK_PROGRAM       = ' '
*     CALLBACK_FORM   = ' '
*     CALLBACK_METHOD =
*     MARK_TAB        =
* IMPORTING
*     USER_RESET      =
    TABLES
      VALUE_TAB       = LT_VALUE
*     FIELD_TAB       =
*     RETURN_TAB      =
*     DYNPFLD_MAPPING =
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FRM_TRANSFER_DBDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_TRANSFER_DBDATA .
  DATA: LS_DB_ZAPPJ TYPE ZAPPJ,
        LT_DB_ZAPPJ TYPE STANDARD TABLE OF ZAPPJ,
        LS_DB_HEAD  TYPE ZTFI_031_HEAD,
        LS_DB_ITEM  TYPE ZTFI_031_ITEM,
        LT_DB_ITEM  TYPE STANDARD TABLE OF ZTFI_031_ITEM.

  DATA: LV_ZBZJJE  TYPE ZAPPJ-ZBZJJE,
        LV_ZLCJE   TYPE ZAPPJ-ZLCJE,
        LV_PERCENT TYPE KONV-KKURS,
        LV_ZNUMB   TYPE ZTFI_031_HEAD-ZNUMB,
        LV_LINES   TYPE I.

  DATA: LT_DEAL TYPE STANDARD TABLE OF TY_ALV,
        LS_DEAL TYPE TY_ALV.

  DATA: LV_ERROR    TYPE C,
        LV_ANSWER   TYPE C,
        LV_MESSAGE  TYPE BAPI_MSG,
        LV_AMOUNT   TYPE ZAPPJ-ZHPJE,
        LV_ZLSBH_YF TYPE ZARPJ-ZLSBH,
        LV_ZLSBH_YS TYPE ZARPJ-ZLSBH,
        LV_ZLSBH    TYPE ZARPJ-ZLSBH.
  DATA: LS_HEADER1              TYPE BAPI_CJ_HEADER,
        LS_HEADER2              TYPE BAPI_CJ_HEADER,
        LS_HEADER3              TYPE BAPI_CJ_HEADER,
        LS_HEADER4              TYPE BAPI_CJ_HEADER,
        LS_HEADER5              TYPE BAPI_CJ_HEADER,
        LT_ITEMS1               TYPE TABLE OF BAPI_CJ_ITEMS,
        LT_ITEMS2               TYPE TABLE OF BAPI_CJ_ITEMS,
        LT_ITEMS3               TYPE TABLE OF BAPI_CJ_ITEMS,
        LT_ITEMS4               TYPE TABLE OF BAPI_CJ_ITEMS,
        LT_ITEMS5               TYPE TABLE OF BAPI_CJ_ITEMS,
        LS_ITEMS                TYPE BAPI_CJ_ITEMS,
        LV_POSITION_NUMBER      TYPE CJBUZEI,
        LV_CASH_JOURNAL_DOC_NO1 TYPE BAPI_CJ_KEY-POSTING_NUMBER,
        LV_CASH_JOURNAL_DOC_NO2 TYPE BAPI_CJ_KEY-POSTING_NUMBER,
        LV_CASH_JOURNAL_DOC_NO3 TYPE BAPI_CJ_KEY-POSTING_NUMBER,
        LV_CASH_JOURNAL_DOC_NO4 TYPE BAPI_CJ_KEY-POSTING_NUMBER,
        LV_CASH_JOURNAL_DOC_NO5 TYPE BAPI_CJ_KEY-POSTING_NUMBER.


*&------------检查屏幕数据完整性
  IF GV_ZBZZH IS INITIAL AND GV_ZBZJJE_BC > 0.
    MESSAGE I023.
    RETURN.
  ENDIF.

  IF GV_ZLCZH IS INITIAL AND GV_ZLCJE_BC > 0.
    MESSAGE I024.
    RETURN.
  ENDIF.

  IF GV_ZBZJJE_BC <= 0 AND GV_ZLCJE_BC <= 0 AND GV_ZFYJE_BC <= 0.
    MESSAGE I025.
    RETURN.
  ENDIF.
*&------------检查屏幕数据完整性

*&------------检查屏幕数据准确性
  "0≤保证金金额+理财户金额+选择的行的已过账保证金金额+已过账的理财户金额≤汇票"
  IF GV_ZBZJJE_BC + GV_ZBZJJE + GV_ZLCJE_BC + GV_ZLCJE <= 0.
    MESSAGE I025.
    RETURN.
  ENDIF.

  IF GV_ZBZJJE_BC + GV_ZBZJJE + GV_ZLCJE_BC + GV_ZLCJE > GV_ZHPJE.
    MESSAGE I026.
    RETURN.
  ENDIF.

  "检查保证金账户是否在配置表中
  IF GV_ZBZZH IS NOT INITIAL.
    SELECT SINGLE *
      FROM ZTFI_BZJZH
      WHERE BUKRS = P_BUKRS
        AND ZZJZH = GV_ZZJZH
        AND BZJZH = GV_ZBZZH.
    IF SY-SUBRC <> 0.
      MESSAGE I028 WITH GV_ZBZZH.
      RETURN.
    ENDIF.
  ENDIF.

  "检查理财户是否在配置表中
  IF GV_ZLCZH IS NOT INITIAL.
    SELECT SINGLE *
      FROM ZTFI_LCJZH
      WHERE BUKRS = P_BUKRS
        AND ZZJZH = GV_ZZJZH
        AND LCJZH = GV_ZLCZH.
    IF SY-SUBRC <> 0.
      MESSAGE I029 WITH GV_ZLCZH.
      RETURN.
    ENDIF.
  ENDIF.

*&------------检查屏幕数据准确性

  CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_VALUE'
    EXPORTING
      TITEL       = '对话框'
      TEXT_BEFORE = '是否确认对选中票据'
      OBJECTVALUE = '进行操作'
      TEXT_AFTER  = '?'
    IMPORTING
      ANSWER      = LV_ANSWER.
  IF LV_ANSWER <> 'J'.
    RETURN.
  ENDIF.

*&------------将保证金&理财金分摊至选中行

  LT_DEAL[] = GT_ALV[].
  DELETE LT_DEAL WHERE BOX IS INITIAL.
  SORT LT_DEAL BY ZJKJE ZLSBH DESCENDING.
  DESCRIBE TABLE LT_DEAL LINES LV_LINES.

  LV_ZBZJJE = GV_ZBZJJE_BC.
  LV_ZLCJE  = GV_ZLCJE_BC.

  LOOP AT LT_DEAL ASSIGNING <FS_ALV>.

    "计算余额所占比例
    CLEAR LV_PERCENT.
    IF GV_ZJKJE > 0.
      LV_PERCENT = <FS_ALV>-ZJKJE / GV_ZJKJE.
    ENDIF.

    IF SY-TABIX = LV_LINES."最后一行
      "本次的保证金金额
      <FS_ALV>-ZBZJJE_BC = LV_ZBZJJE.

      "本次的理财金额
      <FS_ALV>-ZLCJE_BC  = LV_ZLCJE.

    ELSE.
      "本次的保证金金额
      <FS_ALV>-ZBZJJE_BC = GV_ZBZJJE_BC * LV_PERCENT.

      "本次的理财金额
      <FS_ALV>-ZLCJE_BC  = GV_ZLCJE_BC * LV_PERCENT.
    ENDIF.

    "借款金额=汇票金额-已过账保证金金额-本次过账保证金金额-已过账理财金额-本次过账理财金额
    <FS_ALV>-ZJKJE = <FS_ALV>-ZHPJE - <FS_ALV>-ZBZJJE - <FS_ALV>-ZLCJE - <FS_ALV>-ZBZJJE_BC - <FS_ALV>-ZLCJE_BC.

    "扣减已经转出的金额
    LV_ZBZJJE = LV_ZBZJJE - <FS_ALV>-ZBZJJE_BC.
    LV_ZLCJE  = LV_ZLCJE  - <FS_ALV>-ZLCJE_BC.


  ENDLOOP.

*&------------将保证金&理财金分摊至选中行

*&------------选中行生成日记账
  CLEAR:LV_ERROR,
        LV_MESSAGE,
        LS_HEADER1,
        LS_HEADER2,
        LS_HEADER3,
        LS_HEADER4,
        LS_HEADER5,
        LT_ITEMS1,
        LT_ITEMS2,
        LT_ITEMS3,
        LT_ITEMS4,
        LT_ITEMS5,
        LS_ITEMS,
        LV_POSITION_NUMBER,
        LV_CASH_JOURNAL_DOC_NO1,
        LV_CASH_JOURNAL_DOC_NO2,
        LV_CASH_JOURNAL_DOC_NO3,
        LV_CASH_JOURNAL_DOC_NO4,
        LV_CASH_JOURNAL_DOC_NO5.

  "保证金金额
  IF GV_ZBZJJE_BC > 0.

    PERFORM FRM_FILL_CJITEM_BZLC USING LT_DEAL 'AP1' 'GV_ZBZJJE_BC' GV_ZBZZH
          CHANGING LT_ITEMS1 LS_HEADER1.

    PERFORM FRM_FILL_CJITEM_BZLC USING LT_DEAL 'AP2' 'GV_ZBZJJE_BC' GV_ZZJZH
          CHANGING LT_ITEMS2 LS_HEADER2.
  ENDIF.

  "理财金额
  IF GV_ZLCJE_BC > 0.
    PERFORM FRM_FILL_CJITEM_BZLC USING LT_DEAL 'AP3' 'GV_ZLCJE_BC' GV_ZLCZH
          CHANGING LT_ITEMS3 LS_HEADER3.

    PERFORM FRM_FILL_CJITEM_BZLC USING LT_DEAL 'AP4' 'GV_ZLCJE_BC' GV_ZZJZH
          CHANGING LT_ITEMS4 LS_HEADER4.
  ENDIF.

  "费用
  IF GV_ZFYJE_BC > 0.

    "抬头参数赋值
    LS_HEADER5-COMP_CODE   = P_BUKRS.
    LS_HEADER5-PSTNG_DATE  = SY-DATUM.
    LS_HEADER5-DOC_DATE    = SY-DATUM.
    LS_HEADER5-CAJO_NUMBER = GV_ZZJZH.
    LS_HEADER5-CURRENCY    = GC_WAERS.

    CLEAR:LV_POSITION_NUMBER, LS_ITEMS.
    LV_POSITION_NUMBER       = LV_POSITION_NUMBER + 1.
    LS_ITEMS-POSITION_NUMBER = LV_POSITION_NUMBER.
    READ TABLE GT_CJTRANS INTO DATA(LS_CJTRANS) WITH KEY CJTRANS = 'AP5'.
    IF SY-SUBRC = 0.
      LS_ITEMS-TRANSACT_NUMBER = LS_CJTRANS-CJTRANSNUMB.
      LS_ITEMS-POSITION_TEXT   = TEXT-068 && GV_ZBZJJE_BC && ',' &&
                                 TEXT-069 && GV_ZLCJE_BC && ',' && TEXT-070.

      CASE LS_CJTRANS-CJTRANSCLAS.
        WHEN '1'.
          LS_ITEMS-P_PAYMENTS = GV_ZFYJE_BC.
        WHEN '2'.
          LS_ITEMS-P_RECEIPTS = GV_ZFYJE_BC.
      ENDCASE.
      LS_ITEMS-P_NET_AMOUNT   = GV_ZFYJE_BC.
      APPEND LS_ITEMS TO LT_ITEMS5.
    ENDIF.

  ENDIF.


  IF LT_ITEMS1[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
    "保证金日记账调用函数测试
    PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER1 ABAP_TRUE LT_ITEMS1
          CHANGING LV_CASH_JOURNAL_DOC_NO1 LV_ERROR LV_MESSAGE.
    CLEAR: LV_CASH_JOURNAL_DOC_NO1.
  ENDIF.

  IF LT_ITEMS2[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
    "保证金付款日记账调用函数测试运行
    PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER2 ABAP_TRUE LT_ITEMS2
          CHANGING LV_CASH_JOURNAL_DOC_NO2 LV_ERROR LV_MESSAGE.
    CLEAR: LV_CASH_JOURNAL_DOC_NO2.
  ENDIF.

  IF LT_ITEMS3[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
    "理财日记账调用函数测试运行
    PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER3 ABAP_TRUE LT_ITEMS3
          CHANGING LV_CASH_JOURNAL_DOC_NO3 LV_ERROR LV_MESSAGE.
    CLEAR: LV_CASH_JOURNAL_DOC_NO3.
  ENDIF.

  IF LT_ITEMS4[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
    "理财付款日记账调用函数测试运行
    PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER4 ABAP_TRUE LT_ITEMS4
          CHANGING LV_CASH_JOURNAL_DOC_NO4 LV_ERROR LV_MESSAGE.
    CLEAR: LV_CASH_JOURNAL_DOC_NO4.
  ENDIF.

  IF LT_ITEMS5[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
    "费用日记账调用函数测试运行
    PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER5 ABAP_TRUE LT_ITEMS5
          CHANGING LV_CASH_JOURNAL_DOC_NO5 LV_ERROR LV_MESSAGE.
    CLEAR: LV_CASH_JOURNAL_DOC_NO5.
  ENDIF.

  IF LV_ERROR IS INITIAL.

    "获取转保证金/理财的流水号
    PERFORM GET_NUMBER_RANGE USING GC_OBJECT_ZC GC_RANGE_NR ' ' SY-DATUM+0(4)
                             CHANGING LV_ERROR LV_MESSAGE LV_ZNUMB.

    IF LV_ERROR IS INITIAL.

      LOOP AT LT_DEAL ASSIGNING <FS_ALV>.

        "ZTFI_031_ITEM 插入多行
        LS_DB_ITEM-ZNUMB  = LV_ZNUMB.
        LS_DB_ITEM-ZPJBH  = <FS_ALV>-ZPJBH.
        LS_DB_ITEM-ZBZJJE = <FS_ALV>-ZBZJJE_BC.
        LS_DB_ITEM-ZLCJE  = <FS_ALV>-ZLCJE_BC.
        APPEND LS_DB_ITEM TO LT_DB_ITEM.
        CLEAR LS_DB_ITEM.


        <FS_ALV>-ZNUMB = LV_ZNUMB. "流水号
        <FS_ALV>-ZBZLC = ABAP_TRUE."转保证金/理财户标识
        <FS_ALV>-ZGZZT = SPACE.    "过账状态
        <FS_ALV>-ZZTBS = SPACE.    "最新状态

        "ZAPPJ更新多行
        "获取流水号
        PERFORM GET_NUMBER_RANGE USING GC_OBJECT_YF GC_RANGE_NR ' ' SY-DATUM+0(4)
                                 CHANGING LV_ERROR LV_MESSAGE LV_ZLSBH_YF.

        IF LV_ZLSBH_YF IS NOT INITIAL.
          "拼接应付流水号
          SHIFT LV_ZLSBH_YF LEFT DELETING LEADING ''.
          LV_ZLSBH = GC_AP && SY-DATUM+2(2) && LV_ZLSBH_YF.

          MOVE-CORRESPONDING <FS_ALV> TO LS_DB_ZAPPJ.
          LS_DB_ZAPPJ-ZLSBH = LV_ZLSBH.    "流水编号
          LS_DB_ZAPPJ-ZNUMB = LV_ZNUMB.    "流水号
          LS_DB_ZAPPJ-ZZTBS = ABAP_TRUE.   "最新状态
          LS_DB_ZAPPJ-ERDAT = SY-DATUM.    "创建日期
          LS_DB_ZAPPJ-ERZET = SY-UZEIT.    "创建时间
          LS_DB_ZAPPJ-ERNAM = SY-UNAME.    "创建人员
          APPEND LS_DB_ZAPPJ TO LT_DB_ZAPPJ.
          CLEAR:LV_ZLSBH, LS_DB_ZAPPJ,LV_ZLSBH_YF.
        ENDIF.

        "更新原数据的最新状态为空;
        UPDATE ZAPPJ SET ZZTBS = SPACE WHERE ZLSBH = <FS_ALV>-ZLSBH
                                         AND BUKRS = <FS_ALV>-BUKRS
                                         AND ZPJBH = <FS_ALV>-ZPJBH.
        IF SY-SUBRC <> 0.
          LV_ERROR = ABAP_TRUE.
        ENDIF.

      ENDLOOP.
    ENDIF.


  ENDIF.


  IF LV_ERROR IS INITIAL.

    IF LT_ITEMS1[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "保证金日记账调用函数
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER1 SPACE LT_ITEMS1
            CHANGING LV_CASH_JOURNAL_DOC_NO1 LV_ERROR LV_MESSAGE.
    ENDIF.

    IF LT_ITEMS2[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "保证金付款日记账调用函数运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER2 SPACE LT_ITEMS2
            CHANGING LV_CASH_JOURNAL_DOC_NO2 LV_ERROR LV_MESSAGE.
    ENDIF.

    IF LT_ITEMS3[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "理财日记账调用函数运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER3 SPACE LT_ITEMS3
            CHANGING LV_CASH_JOURNAL_DOC_NO3 LV_ERROR LV_MESSAGE.
    ENDIF.

    IF LT_ITEMS4[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "理财付款日记账调用函数运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER4 SPACE LT_ITEMS4
            CHANGING LV_CASH_JOURNAL_DOC_NO4 LV_ERROR LV_MESSAGE.
    ENDIF.

    IF LT_ITEMS5[] IS NOT INITIAL AND LV_ERROR IS INITIAL.
      "费用日记账调用函数运行
      PERFORM FRM_CASHJOURNALDOC_CREATE USING LS_HEADER5 SPACE LT_ITEMS5
            CHANGING LV_CASH_JOURNAL_DOC_NO5 LV_ERROR LV_MESSAGE.
    ENDIF.

    IF LV_ERROR IS INITIAL.

      "ZTFI_031_HEAD 插入行
      LS_DB_HEAD-ZNUMB  = LV_ZNUMB.
      LS_DB_HEAD-ZBZZH  = GV_ZBZZH.
      LS_DB_HEAD-ZLCZH  = GV_ZLCZH.
      LS_DB_HEAD-ZBZJJE = GV_ZBZJJE_BC.
      LS_DB_HEAD-ZLCJE  = GV_ZLCJE_BC.
      LS_DB_HEAD-ZFYJE  = GV_ZFYJE_BC.
      LS_DB_HEAD-CJBELNR_AP1 = LV_CASH_JOURNAL_DOC_NO1.
      LS_DB_HEAD-CJBELNR_AP2 = LV_CASH_JOURNAL_DOC_NO2.
      LS_DB_HEAD-CJBELNR_AP3 = LV_CASH_JOURNAL_DOC_NO3.
      LS_DB_HEAD-CJBELNR_AP4 = LV_CASH_JOURNAL_DOC_NO4.
      LS_DB_HEAD-CJBELNR_AP5 = LV_CASH_JOURNAL_DOC_NO5.
      LS_DB_HEAD-BELNR_ZC = SPACE.
      LS_DB_HEAD-ZGZZT = SPACE.
      TRY .
          INSERT ZTFI_031_HEAD FROM LS_DB_HEAD.
          IF SY-SUBRC <> 0.
            LV_ERROR = ABAP_TRUE.
          ENDIF.
        CATCH CX_SY_OPEN_SQL_DB.
          LV_ERROR = ABAP_TRUE.
      ENDTRY.

      "更新转保证金/理财户的明细表
      IF LT_DB_ITEM IS NOT INITIAL.
        MODIFY ZTFI_031_ITEM FROM TABLE LT_DB_ITEM.
        IF SY-SUBRC <> 0.
          LV_ERROR = ABAP_TRUE.
        ENDIF.
      ENDIF.

      "更新ZAPPJ
      IF LT_DB_ZAPPJ IS NOT INITIAL.
        MODIFY ZAPPJ FROM TABLE LT_DB_ZAPPJ.
        IF SY-SUBRC <> 0.
          LV_ERROR = ABAP_TRUE.
        ENDIF.
      ENDIF.

      IF LV_ERROR IS INITIAL.

        COMMIT WORK AND WAIT.

        LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BOX IS NOT INITIAL.

          READ TABLE LT_DB_ZAPPJ INTO LS_DB_ZAPPJ WITH KEY BUKRS = <FS_ALV>-BUKRS
                                                           ZPJBH = <FS_ALV>-ZPJBH.

          "解锁应付原流水
          PERFORM FRM_DEQUEUE_EZ_ZAPPJ USING <FS_ALV>-ZLSBH.

          "加锁应付新流水
          PERFORM FRM_ENQUEUE_EZ_ZAPPJ USING LS_DB_ZAPPJ-ZLSBH.

          "更新ALV的指示灯,流水号,消息,最新状态,创建信息;
          PERFORM FRM_CHANGE_ALV USING LS_DB_ZAPPJ
                                 CHANGING <FS_ALV>.
          <FS_ALV>-CJBELNR_AP1 = LV_CASH_JOURNAL_DOC_NO1.
          <FS_ALV>-CJBELNR_AP2 = LV_CASH_JOURNAL_DOC_NO2.
          <FS_ALV>-CJBELNR_AP3 = LV_CASH_JOURNAL_DOC_NO3.
          <FS_ALV>-CJBELNR_AP4 = LV_CASH_JOURNAL_DOC_NO4.
          <FS_ALV>-CJBELNR_AP5 = LV_CASH_JOURNAL_DOC_NO5.

          READ TABLE LT_DEAL INTO LS_DEAL WITH KEY BUKRS = <FS_ALV>-BUKRS
                                                   ZPJBH = <FS_ALV>-ZPJBH.
          IF SY-SUBRC = 0.
            <FS_ALV>-ZBZJJE_BC = LS_DEAL-ZBZJJE_BC.
            <FS_ALV>-ZLCJE_BC  = LS_DEAL-ZLCJE_BC.
          ENDIF.

          "借款金额=汇票金额-已过账保证金金额-本次过账保证金金额-已过账理财金额-本次过账理财金额
          <FS_ALV>-ZJKJE = <FS_ALV>-ZHPJE - <FS_ALV>-ZBZJJE - <FS_ALV>-ZLCJE - <FS_ALV>-ZBZJJE_BC - <FS_ALV>-ZLCJE_BC.

        ENDLOOP.

        "更新标记设置为空
        GV_UPDATE = SPACE.

      ELSE.

        ROLLBACK WORK.
        "指示灯
        <FS_ALV>-LIGHT = ICON_CANCEL.
        "消息
        <FS_ALV>-MESSAGE = TEXT-032.
      ENDIF.

    ENDIF.


  ENDIF.

  "如果测试运行出错,则更新ALV的消息和指示灯
  IF LV_ERROR IS NOT INITIAL.

    ROLLBACK WORK.

    LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE BOX IS NOT INITIAL.
      "指示灯
      <FS_ALV>-LIGHT = ICON_CANCEL.

      "消息
      <FS_ALV>-MESSAGE = LV_MESSAGE.
    ENDLOOP.

  ENDIF.
*&------------选中行生成日记账


  FREE: LV_ERROR,
        LV_MESSAGE,
        LS_HEADER1,
        LS_HEADER2,
        LS_HEADER3,
        LS_HEADER4,
        LS_HEADER5,
        LT_ITEMS1,
        LT_ITEMS2,
        LT_ITEMS3,
        LT_ITEMS4,
        LT_ITEMS5,
        LS_ITEMS,
        LV_POSITION_NUMBER,
        LV_CASH_JOURNAL_DOC_NO1,
        LV_CASH_JOURNAL_DOC_NO2,
        LV_CASH_JOURNAL_DOC_NO3,
        LV_CASH_JOURNAL_DOC_NO4,
        LV_CASH_JOURNAL_DOC_NO5,
        LS_DB_ZAPPJ,
        LT_DB_ZAPPJ,
        LS_DB_HEAD,
        LS_DB_ITEM,
        LT_DB_ITEM,
        LV_ZBZJJE,
        LV_ZLCJE,
        LV_PERCENT,
        LV_ZNUMB,
        LV_LINES

        .
  LEAVE TO SCREEN 0.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_CJITEM_BZLC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_LT_DEAL  text
*      -->P_       text
*      -->P_GV_ZBZJJE_BC  text
*      -->P_GV_ZBZZH  text
*      <--P_LT_ITEMS1  text
*      <--P_LS_HEADER1  text
*&---------------------------------------------------------------------*
FORM FRM_FILL_CJITEM_BZLC  USING    PT_DEAL TYPE TY_ALV_TAB
                                     PV_AR
                                     PV_TYPE
                                     PV_CAJO_NUMBER TYPE ZAPPJ-ZZJZH
                            CHANGING PT_ITEMS TYPE TY_BAPI_CJ_ITEMS
                                     PS_HEADER TYPE BAPI_CJ_HEADER.
  DATA: LS_ITEMS           TYPE BAPI_CJ_ITEMS,
        LV_POSITION_NUMBER TYPE CJBUZEI.

  "抬头参数赋值
  PS_HEADER-COMP_CODE   = P_BUKRS.
  PS_HEADER-PSTNG_DATE  = SY-DATUM.
  PS_HEADER-DOC_DATE    = SY-DATUM.
  PS_HEADER-CAJO_NUMBER = PV_CAJO_NUMBER.
  PS_HEADER-CURRENCY    = GC_WAERS.

  CLEAR:LV_POSITION_NUMBER, LS_ITEMS.
  LOOP AT PT_DEAL ASSIGNING <FS_ALV>.

    LV_POSITION_NUMBER       = LV_POSITION_NUMBER + 1.
    LS_ITEMS-POSITION_NUMBER = LV_POSITION_NUMBER.

    READ TABLE GT_CJTRANS INTO DATA(LS_CJTRANS) WITH KEY CJTRANS = PV_AR.
    IF SY-SUBRC = 0.
      <FS_ALV>-CJTRANSNUMB = LS_CJTRANS-CJTRANSNUMB.
      <FS_ALV>-CJTRANSCLAS = LS_CJTRANS-CJTRANSCLAS.
    ENDIF.

    LS_ITEMS-TRANSACT_NUMBER = <FS_ALV>-CJTRANSNUMB.
    IF PV_TYPE = 'GV_ZBZJJE_BC'.

      LS_ITEMS-POSITION_TEXT   = TEXT-009 && <FS_ALV>-ZPJBH && TEXT-068.
      CASE <FS_ALV>-CJTRANSCLAS.
        WHEN '1'.
          LS_ITEMS-P_PAYMENTS = <FS_ALV>-ZBZJJE_BC.
        WHEN '2'.
          LS_ITEMS-P_RECEIPTS = <FS_ALV>-ZBZJJE_BC.
      ENDCASE.
      LS_ITEMS-P_NET_AMOUNT   = <FS_ALV>-ZBZJJE_BC.

    ELSEIF PV_TYPE = 'GV_ZLCJE_BC'.

      LS_ITEMS-POSITION_TEXT   = TEXT-009 && <FS_ALV>-ZPJBH && TEXT-069.

      CASE <FS_ALV>-CJTRANSCLAS.
        WHEN '1'.
          LS_ITEMS-P_PAYMENTS = <FS_ALV>-ZLCJE_BC.
        WHEN '2'.
          LS_ITEMS-P_RECEIPTS = <FS_ALV>-ZLCJE_BC.
      ENDCASE.
      LS_ITEMS-P_NET_AMOUNT   = <FS_ALV>-ZLCJE_BC.
    ENDIF.

    APPEND LS_ITEMS TO PT_ITEMS.
    CLEAR LS_ITEMS.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9002 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_9002 OUTPUT.
  SET PF-STATUS 'ZFI_031'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9002  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9002 INPUT.
  CLEAR SAVE_OK.
  SAVE_OK = OK_CODE.
  CLEAR: OK_CODE,GV_CANCEL.

  CASE SAVE_OK.
    WHEN 'YES'.

      PERFORM FRM_CHECK_CANCEL_DATA.

    WHEN 'NO'.
      GV_CANCEL = SPACE.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_CANCEL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_CANCEL_DATA .

  IF GV_STGRD IS INITIAL.

    MESSAGE I032.
    RETURN.

    GV_CANCEL = SPACE.
  ENDIF.

  IF GV_STGRD > '03' AND GV_BUDAT IS INITIAL.

    MESSAGE I031.
    RETURN.

    GV_CANCEL = SPACE.
  ENDIF.

  GV_CANCEL = ABAP_TRUE.
  LEAVE TO SCREEN 0.
ENDFORM.



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值