应付票据管理平台
*&---------------------------------------------------------------------*
*&功能名称/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.