FI-预收款(开发笔记)

*&---------------------------------------------------------------------*
*& Report ZFIR098
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2018-11-30
*& Program Type        :  Report
*& Description         :  预收款
*&---------------------------------------------------------------------*
REPORT ZFIR098.

*&---------------------------------------------------------------------*
*& 包含               ZFIR092_TOP
*&---------------------------------------------------------------------*

TABLES:ACDOCA,BKPF,EKKN,VBAP,KNA1,VBAK.

TYPE-POOLS:SLIS ,ICON .

"OOALV-DEFINITION
  DATA GO_ALV_GRID     TYPE REF TO CL_GUI_ALV_GRID.
  DATA GO_ALV_GRID_SUB TYPE REF TO CL_GUI_ALV_GRID.
  DATA LO_CONTAINER    TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
  DATA OK_CODE         TYPE SY-UCOMM.
  DATA OK_SAVE         TYPE SY-UCOMM.
  DATA CONTROLS_CREATED.
  DATAGT_RETURN   LIKE BAPIRET2 OCCURS WITH HEADER LINE.

TYPESBEGIN OF GTS_DATA,
        AFLAG         TYPE  C,                      "选择列
        BUKRS_VF      TYPE  VBAK-BUKRS_VF,          "公司代码
        KUNNR         TYPE  VBAK-KUNNR,             "客户
        NAME1         TYPE  KNA1-NAME1,             "客户名称
        VBELN         TYPE  VBAK-VBELN,             "销售订单
        WAERK         TYPE  VBAK-WAERK,             "货币
        UMSKZ         TYPE  T074-UMSKZ,             "SGL标志
        SKONT         TYPE  T074-SKONT,             "预收科目
        WRBYS         TYPE  BSEG-WRBTR,             "预收款
        SAKYH         TYPE  SKA1-SAKNR,             "银行科目
        TXT20         TYPE  SKAT-TXT20,             "银行科目描述
        FSFNS         TYPE  C,                      "是否缴税
        WRBXX         TYPE  BSEG-WRBTR,             "销项税
        SAKXX         TYPE  SKA1-SAKNR,             "销项税科目
        RACQT         TYPE  SKA1-SAKNR,             "其他应收科目
        GZDAT         TYPE  DATS,                   "过账日期
        GJAHR         TYPE  GJAHR,                  "会计年度
        ZKJQJ         TYPE  NUMC2,                  "期间
        BELNR         TYPE  ACDOCA-BELNR,           "会计凭证号码
        AWKEY         TYPE  AWKEY,                  "对象键值
      END OF GTS_DATA.
DATAGLAG_N     TYPE  C  .
DATAGLAG_E     TYPE  C  .
DATAGT_DATA    TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_A  TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_DATA_C  TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATAGT_ZTIR098 TYPE TABLE OF ZTIR098  WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME .
PARAMETERSP_BUKRS LIKE ACDOCA-RBUKRS MODIF ID P1 OBLIGATORY .              "公司代码
SELECT-OPTIONSS_KUNNR  FOR KNA1-KUNNR MODIF ID S1,                         "客户
                S_VBELN  FOR VBAK-VBELN MODIF ID S1.                         "销售订单
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME .
PARAMETERSP_CBOX1 AS CHECKBOX DEFAULT '' MODIF ID 01.                      "已预收SO
SELECTION-SCREEN END OF BLOCK B2.
*&---------------------------------------------------------------------*
*& 包含               ZFIR098_CLASS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*       CLASS DEMO DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS DEMO DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      MAIN.
ENDCLASS.

CLASS DEMO IMPLEMENTATION.
  METHOD MAIN.
    DATA(OUT) = CL_DEMO_OUTPUT=>NEW( ).

    OUT->BEGIN_SECTION`报错信息回执`
      )->WRITEGT_RETURN[] ).

    OUT->DISPLAY( ).
  ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------*
*       CLASS cl_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS CL_EVENT_RECEIVER DEFINITION.
  PUBLIC SECTION.
    声明单击事件的方法
    METHODS HANDLE_HOTSPOT_CLICK
                  
FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
        
IMPORTING E_ROW_ID E_COLUMN_ID.
    声明双击事件方法
    METHODS HANDLE_DOUBLE_CLICK
                  
FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
        
IMPORTING E_ROW E_COLUMN.
    声明TOOLBAR事件方法
    METHODS HANDLE_TOOLBAR
                  
FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
        
IMPORTING E_OBJECT E_INTERACTIVE.
    声明USER-COMMAND 事件方法
    METHODS HANDLE_COMMAND
                  
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
        
IMPORTING E_UCOMM.
    修改时触发
    METHODS HANDLE_DATA_CHANGED
                  
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
        
IMPORTING ER_DATA_CHANGED.
   " ENTE时触发
    METHODS HANDLE_ENTE
                  
FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
        
IMPORTING E_MODIFIED ET_GOOD_CELLS.

  PRIVATE SECTION.
ENDCLASS.                    "CL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*       CLASS cl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS CL_EVENT_RECEIVER IMPLEMENTATION.
  单击事件方法的实现
  METHOD HANDLE_HOTSPOT_CLICK.

  ENDMETHOD.                    "HANDLE_HOTSPOT_CLICK

  双击事件方法的实现
  METHOD HANDLE_DOUBLE_CLICK.
    GO_ALV_GRID_SUB->REFRESH_TABLE_DISPLAY( ).
  ENDMETHOD.                    "HANDLE_DOUBLE_CLICK

  实现TOOLBAR事件方法
  METHOD HANDLE_TOOLBAR.
    DATALS_TOOLBAR TYPE STB_BUTTON.
    DELETE E_OBJECT->MT_TOOLBAR WHERE FUNCTION '&PRINT_BACK'.
    CLEARLS_TOOLBAR.
    LS_TOOLBAR-BUTN_TYPE 3分隔符
    APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

    CLEARLS_TOOLBAR.
    LS_TOOLBAR-FUNCTION 'BT_4'.    "功能码
*    LS_TOOLBAR-ICON = ICON_SIMULATE.  " 图标名称
    LS_TOOLBAR-TEXT '全选'.    按钮上显示的文本
    LS_TOOLBAR-QUICKINFO '全选'.   图标的提示信息
    LS_TOOLBAR-BUTN_TYPE 0.        " 0表示正常按钮
    LS_TOOLBAR-DISABLED ''.        " X表示灰色,不可用
    APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

    CLEARLS_TOOLBAR.
    LS_TOOLBAR-FUNCTION 'BT_5'.    "功能码
*    LS_TOOLBAR-ICON = ICON_ACTIVITY.  " 图标名称
    LS_TOOLBAR-TEXT '取消全选'.    按钮上显示的文本
    LS_TOOLBAR-QUICKINFO '取消全选'.   图标的提示信息
    LS_TOOLBAR-BUTN_TYPE 0.        " 0表示正常按钮
    LS_TOOLBAR-DISABLED ''.        " X表示灰色,不可用
    APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

*    CLEAR: LS_TOOLBAR.
*    LS_TOOLBAR-FUNCTION = 'BT_3'.    "功能码
**    LS_TOOLBAR-ICON = ICON_ACTIVITY.  " 图标名称
*    LS_TOOLBAR-TEXT = '自动计算销项税'.    " 按钮上显示的文本
*    LS_TOOLBAR-QUICKINFO = '自动计算销项税'.   " 图标的提示信息
*    LS_TOOLBAR-BUTN_TYPE = 0.        " 0表示正常按钮
*    LS_TOOLBAR-DISABLED = ''.        " X表示灰色,不可用
*    APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

    CLEARLS_TOOLBAR.
    LS_TOOLBAR-FUNCTION 'BT_1'.    "功能码
    LS_TOOLBAR-ICON ICON_SIMULATE.  图标名称
    LS_TOOLBAR-TEXT '模拟过账'.    按钮上显示的文本
    LS_TOOLBAR-QUICKINFO '模拟过账'.   图标的提示信息
    LS_TOOLBAR-BUTN_TYPE 0.        " 0表示正常按钮
    LS_TOOLBAR-DISABLED ''.        " X表示灰色,不可用
    APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

    CLEARLS_TOOLBAR.
    LS_TOOLBAR-FUNCTION 'BT_2'.    "功能码
    LS_TOOLBAR-ICON ICON_ACTIVITY.  图标名称
    LS_TOOLBAR-TEXT '正式过账'.    按钮上显示的文本
    LS_TOOLBAR-QUICKINFO '正式过账'.   图标的提示信息
    LS_TOOLBAR-BUTN_TYPE 0.        " 0表示正常按钮
    LS_TOOLBAR-DISABLED ''.        " X表示灰色,不可用
    APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

  ENDMETHOD.                    "HANDLE_TOOLBAR

  实现USER-COMMAND 事件方法
  METHOD HANDLE_COMMAND.
    DATA LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性
    LV_STABLE-ROW '1'.
    LV_STABLE-COL '1'.
    CASE E_UCOMM.
      WHEN 'BT_1'.
        CLEAR GT_RETURN[] .
        PERFORM FRM_DATA_POST_T .
      WHEN 'BT_2'.
        IF GT_DATA_C[] IS NOT INITIAL .
          CLEAR GT_RETURN[] .
          PERFORM FRM_DATA_POST .
        ELSEIF GLAG_N IS NOT INITIAL .
          MESSAGE '模拟过账时出错!TYPE 'S' DISPLAY LIKE 'E' .
        ELSE .
          MESSAGE '请先进行模拟过账!TYPE 'S' DISPLAY LIKE 'E' .
        ENDIF.
*      WHEN 'BT_3'.

      WHEN 'BT_4'.
        PERFORM FRM_SELECT_ALL .
        CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
          
EXPORTING
            IS_STABLE LV_STABLE.
      WHEN 'BT_5'.
        PERFORM FRM_UNSELECT_ALL .
        CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
          
EXPORTING
            IS_STABLE LV_STABLE.
      WHEN OTHERS.
    ENDCASE.

  ENDMETHOD.                    "HANDLE_COMMAND

  实现DATA_CHANGED 事件方法
  METHOD HANDLE_DATA_CHANGED.

  ENDMETHOD.                    "handle_data_changed

  实现ENTE 事件方法
  METHOD HANDLE_ENTE.

    DATA GS_LAYOUT_ALV TYPE LVC_S_LAYO.
*    GO_ALV_GRID_SUB->REFRESH_TABLE_DISPLAY( ).
    DATA LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性

    PERFORM FOM_REFRESH .

    LV_STABLE-ROW '1'.
    LV_STABLE-COL '1'.

    GS_LAYOUT_ALV-CWIDTH_OPT 'X'.    "优化列宽

    CALL METHOD GO_ALV_GRID->SET_FRONTEND_LAYOUT
      
EXPORTING
        IS_LAYOUT GS_LAYOUT_ALV.

    CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
      
EXPORTING
        IS_STABLE LV_STABLE.

      CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
        
EXPORTING
          CONTROL GO_ALV_GRID.
      CALL METHOD CL_GUI_CFW=>FLUSH.

  ENDMETHOD.                    "HANDLE_MODIFY

ENDCLASS.                    "cl_event_receiver IMPLEMENTATION
**------------------------------------------------------------------------------*
**          类定义-定时刷新                                *
**------------------------------------------------------------------------------*
*CLASS LCL_RECEIVER DEFINITION.
*  PUBLIC SECTION.
*    METHODS:
*      HANDLE_FINISHED FOR EVENT FINISHED OF CL_GUI_TIMER.
*ENDCLASS.
* DATA:  RECEIVER   TYPE REF TO LCL_RECEIVER,
*        TIMER      TYPE REF TO CL_GUI_TIMER.
*CLASS LCL_RECEIVER IMPLEMENTATION.
*  METHOD HANDLE_FINISHED.
**    PERFORM FOM_REFRESH .
*    CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE "触发pai usercommand里有刷新alv的代码
*      EXPORTING
*        NEW_CODE = 'REFRESH'.
**    MESSAGE ID 'MO' TYPE 'S' NUMBER 429 .
*    CALL METHOD TIMER->RUN.
*  ENDMETHOD.
*ENDCLASS.
*
*CREATE OBJECT TIMER.
*CREATE OBJECT RECEIVER.
*SET HANDLER RECEIVER->HANDLE_FINISHED FOR TIMER.
*TIMER->INTERVAL = 600. "10分钟刷新一次
*CALL METHOD TIMER->RUN.
*
*PERFORM P_DISPLAY.
*
*CALL METHOD TIMER->RUN.
**------------------------------------------------------------------------------*
**          类定义-定时刷新                                *
**------------------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
 SET PF-STATUS 'PF_0100'.
 SET TITLEBAR  'TITLE_0100'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module CREATE_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE CREATE_ALV OUTPUT.
 CHECK CONTROLS_CREATED IS INITIAL.
 CALL METHOD CL_GUI_CFW=>FLUSH."触发SAP GUI更新界面
 PERFORM FORM_INIT_0101.  "实例化ALV_GRID
 CONTROLS_CREATED 'X'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  CANCEL  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE CANCEL INPUT.
  LEAVE PROGRAM .
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  OK_SAVE SY-UCOMM .
  CLEAR SY-UCOMM .
  CLEAR OK_CODE .
  CASE  OK_SAVE.
    WHEN 'BACK'  .
      LEAVE TO SCREEN .
*    WHEN 'DL'  .
*      PERFORM ole_fom .
    WHEN OTHERS .
  ENDCASE .
ENDMODULE.
*&---------------------------------------------------------------------*
*& 包含               ZFIR098_FOM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_EXCLUDE_OPTION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_EXCLUDE_OPTION .

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

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

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
  CLEAR GT_DATA[] .
  SELECT
    VBAK~BUKRS_VF
    VBAK
~KUNNR
    VBAK
~VBELN
    VBAK
~WAERK
  
INTO CORRESPONDING FIELDS OF TABLE GT_DATA[]
    
FROM VBAK
    
WHERE VBAK~BUKRS_VF  =  P_BUKRS
      
AND VBAK~KUNNR    IN  S_KUNNR
      
AND VBAK~VBELN    IN  S_VBELN
      
AND VBAK~ABSTK    <>  'C'
      AND VBAK~ZYSBS     =  'A'
      .

*如果屏幕没有勾选checkbox:根据公司代码、客户、销售订单取自建表数据,排除这些销售订单。
  IF P_CBOX1 IS INITIAL.
    CLEAR GT_ZTIR098[].
    SELECT INTO CORRESPONDING FIELDS OF TABLE GT_ZTIR098[] FROM ZTIR098
      
WHERE BUKRS_VF P_BUKRS
        
AND KUNNR   IN S_KUNNR
        
AND VBELN   IN S_VBELN
        
.
    LOOP AT GT_DATA.
      LOOP AT GT_ZTIR098 WHERE BUKRS_VF GT_DATA-BUKRS_VF AND KUNNR GT_DATA-KUNNR AND VBELN GT_DATA-VBELN.
        DELETE GT_DATA .
        EXIT .
      ENDLOOP.
    ENDLOOP.
  ENDIF.

  LOOP AT GT_DATA.

**------------------------------
*    GT_DATA-SAKYH = '6603010100' .
*    GT_DATA-WRBYS = '300' .
*    GT_DATA-WRBXX = '36' .
*    GT_DATA-GZDAT = '20181203' .
**------------------------------

    GT_DATA-FSFNS 'X' .
    GT_DATA-UMSKZ 'A' .
    GT_DATA-SAKXX '2221010300' .
    GT_DATA-RACQT '1221090000' .

    SELECT SINGLE
      T074~SKONT
      
INTO GT_DATA-SKONT
      
FROM T074
      INNER 
JOIN KNB1 ON T074~HKONT KNB1~AKONT
      
WHERE KNB1~KUNNR GT_DATA-KUNNR
        
AND KNB1~BUKRS GT_DATA-BUKRS_VF
        
AND T074~KTOPL 'CP11'
        AND T074~KOART 'D'
        AND T074~UMSKZ GT_DATA-UMSKZ
      
.

    SELECT SINGLE NAME1 INTO GT_DATA-NAME1 FROM KNA1
      
WHERE KUNNR GT_DATA-KUNNR
*      AND SPRAS = 1
      .

    MODIFY GT_DATA.
    CLEAR GT_DATA.
  ENDLOOP.

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

  DATA L_FCAT_CACHE    TYPE LVC_T_FCAT.
  DATA WA_LAYOUT_CACHE TYPE LVC_S_LAYO.
  DATA WA_FIELD        TYPE LVC_S_FCAT.
  DATA LO_EVENT        TYPE REF TO CL_EVENT_RECEIVER.

  CREATE OBJECT LO_CONTAINER
    
EXPORTING
      CONTAINER_NAME 'CONT01'.

  CREATE OBJECT GO_ALV_GRID
    
EXPORTING
      I_PARENT LO_CONTAINER.

  DEFINE FILL_FIELD.
    wa_field-fieldname &1.
    wa_field-coltext &2.

    IF wa_field-fieldname 'FSFNS'
      OR wa_field-fieldname 'AFLAG'
      .
      wa_field-checkbox 'X'.
      wa_field-edit 'X'.
    ENDIF.

    IF wa_field-fieldname 'UMSKZ'
     OR wa_field-fieldname 'WRBYS'
     OR wa_field-fieldname 'SAKYH'
     OR wa_field-fieldname 'WRBXX'
     OR wa_field-fieldname 'GZDAT'
      .
      wa_field-edit 'X'.
    ENDIF.

    IF wa_field-fieldname 'GZDAT'.
      wa_field-ref_table 'VBAK'.
      wa_field-ref_field 'ERDAT'.
    ENDIF.

    IF wa_field-fieldname 'SAKYH'.
      wa_field-ref_table 'SKA1'.
      wa_field-ref_field 'SAKNR'.
    ENDIF.

    IF wa_field-fieldname 'WRBYS'
     OR wa_field-fieldname 'WRBXX'.
      wa_field-ref_table 'BSEG'.
      wa_field-REF_FIELD 'WRBTR'.
    ENDIF.

*BSEG-WRBTR

    APPEND wa_field TO l_fcat_cache .
    CLEAR wa_field.
  END-OF-DEFINITION.
  FILL_FIELD :
        'AFLAG'    '选择',
        'BUKRS_VF' '公司代码',
        'KUNNR'    '客户',
        'NAME1'    '客户名称',
        'VBELN'    '销售订单',
        'WAERK'    '货币',
        'UMSKZ'    'SGL标志',
        'SKONT'    '预收科目',
        'WRBYS'    '预收款',
        'SAKYH'    '银行科目',
        'TXT20'    '银行科目描述',
        'FSFNS'    '是否缴税',
        'WRBXX'    '销项税',
        'SAKXX'    '销项税科目',
        'RACQT'    '其他应收科目',
        'GZDAT'    '过账日期',
        'GJAHR'    '会计年度',
        'ZKJQJ'    '期间',
        'BELNR'    '会计凭证号码'.

设置enter事件
  CALL METHOD GO_ALV_GRID->REGISTER_EDIT_EVENT
    
EXPORTING
      I_EVENT_ID CL_GUI_ALV_GRID=>MC_EVT_ENTER
    
EXCEPTIONS
      ERROR      1
      OTHERS     2.

  CREATE OBJECT LO_EVENT.
  SET HANDLER LO_EVENT->HANDLE_TOOLBAR FOR GO_ALV_GRID.
  SET HANDLER LO_EVENT->HANDLE_COMMAND FOR GO_ALV_GRID.
  SET HANDLER LO_EVENT->HANDLE_ENTE    FOR GO_ALV_GRID.
*  SET HANDLER LO_EVENT->HANDLE_DATA_CHANGED  FOR GO_ALV_GRID.

  WA_LAYOUT_CACHE-CWIDTH_OPT 'X'.      "优化列宽

  CALL METHOD GO_ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
    
EXPORTING
      IS_LAYOUT       WA_LAYOUT_CACHE
    
CHANGING
      IT_FIELDCATALOG L_FCAT_CACHE
      IT_OUTTAB       
GT_DATA[].

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_REFRESH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_REFRESH .
    LOOP AT GT_DATA.
      SELECT SINGLE
        T074~SKONT
        
INTO GT_DATA-SKONT
        
FROM T074
        INNER 
JOIN KNB1 ON T074~HKONT KNB1~AKONT
        
WHERE KNB1~KUNNR GT_DATA-KUNNR
          
AND KNB1~BUKRS GT_DATA-BUKRS_VF
          
AND T074~KTOPL 'CP11'
          AND T074~KOART 'D'
          AND T074~UMSKZ GT_DATA-UMSKZ
        
.

      IF SY-SUBRC <> 0.
        CLEAR GT_DATA-SKONT .
      ENDIF.

*根据银行科目自动更新:语言=ZH、账目表=CP11
      SELECT SINGLE TXT20 INTO GT_DATA-TXT20 FROM SKAT
        
WHERE SAKNR GT_DATA-SAKYH
        
AND KTOPL 'CP11'
        AND SPRAS '1'
        .

      IF SY-SUBRC <> 0.
        CLEAR GT_DATA-TXT20 .
      ENDIF.

      GT_DATA-GJAHR GT_DATA-GZDAT(4).
      GT_DATA-ZKJQJ GT_DATA-GZDAT+4(2).

      MODIFY GT_DATA.
      CLEAR GT_DATA.
    ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_POST_T
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST_T .

  DATA:
    TEMP_MONTH(2),            "输入月份
    HEADER_TXT(25),           "取会计年月+固定文本制费及研发费分摊
    TEMP_AUT_MSG(30),
    LAST_DATA          LIKE SY-DATUM"一个月的最后一天
    TEMP_OBJ_KEY       TYPE AWKEY,  "是否生成
    HEADER             LIKE BAPIACHE09  OCCURS WITH HEADER LINE,
    WA_ACCOUNTGL       LIKE BAPIACGL09  OCCURS WITH HEADER LINE,
    LT_ACCOUNTGL       TYPE STANDARD TABLE OF BAPIACGL09,
    WA_CURRENCY_AMOUNT LIKE BAPIACCR09  OCCURS WITH HEADER LINE,
    LT_CURRENCY_AMOUNT TYPE STANDARD TABLE OF BAPIACCR09 WITH HEADER LINE,
    IT_EXTENSION2      TYPE STANDARD TABLE OF BAPIPAREX WITH HEADER LINE,
    LT_RETURN          LIKE BAPIRET2 OCCURS WITH HEADER LINE,
    GST_RETURN         LIKE BAPIRET2 OCCURS WITH HEADER LINE,
    LS_ZFI002          TYPE ZFI002,
    FT_FLAG   ,                                                      "= ‘X'表示分摊过
    LV_ANSWER(1),
    TEMP_BWTAR_AUFNR   LIKE AFPO-AUFNR.
  DATAGS_EXTENSION2  TYPE ZSFI_EXTEN,                              "会计凭证过账增强extension2
        LT_EXTENSION2  TYPE TABLE OF BAPIPAREX WITH HEADER LINE.     "返回参数

  DATALV_OBJ_TYPE    LIKE BAPIACHE09-OBJ_TYPE,
        LV_OBJ_KEY     LIKE BAPIACHE09-OBJ_KEY,
        LV_OBJ_SYS     LIKE BAPIACHE09-OBJ_SYS.

  DATALV_DMBTR       TYPE BAPIWRBTR,
        LV_LINES       TYPE SY-TABIX,
        ZCOUNT         TYPE SY-TABIX,
        LV_WRBTR       TYPE BSEG-WRBTR,
        DO_POST        TYPE CHAR1,
        LS_EXTEN       TYPE ZSFI_EXTEN.
  DATALS_BKPF        TYPE BKPF,
        LS_REVERSAL    TYPE BAPIACREV.
  DATAGV_OBJ_TYPE    TYPE BAPIACHE09-OBJ_TYPE,                      "参考过程
        GV_OBJ_KEY     TYPE BAPIACHE09-OBJ_KEY,                       "对象键值
        GV_OBJ_SYS     TYPE BAPIACHE09-OBJ_SYS.
  DATA LV_BELNR_01     TYPE BKPF-BELNR.
  DATA LV_WAERS        TYPE T001-WAERS.
  DATA LV_FLAG         TYPE C.

  CLEAR LV_FLAG .
  LOOP AT GT_DATA WHERE AFLAG 'X' .
    IF GT_DATA-UMSKZ IS INITIAL
      OR GT_DATA-WRBYS IS INITIAL
      OR GT_DATA-SAKYH IS INITIAL
      OR GT_DATA-WRBXX IS INITIAL
      OR GT_DATA-GZDAT IS INITIAL
      .
      LV_FLAG 'X'.
      EXIT .
    ENDIF.
  ENDLOOP.

  IF LV_FLAG IS INITIAL.
    CLEAR GST_RETURN[] .
    LOOP AT GT_DATA WHERE AFLAG 'X' .
*  会计凭证抬头数据
        CLEAR HEADER.
        HEADER-HEADER_TXT '预收开票: ' && GT_DATA-NAME1.          "凭证抬头文本
        HEADER-COMP_CODE  GT_DATA-BUKRS_VF.    "公司代码
        HEADER-DOC_DATE   GT_DATA-GZDAT.       "凭证日期
        HEADER-PSTNG_DATE GT_DATA-GZDAT.       "凭证中的过帐日期
        HEADER-USERNAME   SY-UNAME.            "用户名
        HEADER-DOC_TYPE   'SA'.                "凭证类型
        HEADER-FISC_YEAR  GT_DATA-GZDAT(4).    "财年
        HEADER-FIS_PERIOD GT_DATA-GZDAT+4(2).  "会计期间

*  分录1,借方行项目信息:
        ADD TO LV_LINES.
        CLEAR WA_CURRENCY_AMOUNT.
        WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
        WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-WAERK.                        "货币码
        WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-WRBYS.                        "金额
        APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

        CLEAR WA_ACCOUNTGL.
        WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
        WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-SAKYH.                             "科目
        WA_ACCOUNTGL-ITEM_TEXT   '预收开票: ' && GT_DATA-NAME1.              "项目文本
        WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNNR.                             "客户
        WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
        WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
*        WA_ACCOUNTGL-SALES_ORD   = GT_DATA-VBELN.                             "销售订单
        WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VBELN .                            "分配号
        APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

        CLEAR GS_EXTENSION2.
        CLEAR LT_EXTENSION2.
        GS_EXTENSION2-POSNR LV_LINES.                                        "会计凭证行项目编号
        GS_EXTENSION2-BSCHL '40'.                                            "过账码
        GS_EXTENSION2-RSTGR '101'.                                           "付款原因代码
        LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
        LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
        APPEND LT_EXTENSION2.

*  分录2,贷方行项目信息:
        ADD TO LV_LINES.
        CLEAR WA_CURRENCY_AMOUNT.
        WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
        WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-WAERK.                        "货币码
        WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-WRBYS * -1.                   "金额
        APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

        CLEAR WA_ACCOUNTGL.
        WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
        WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-SKONT.                             "科目
        WA_ACCOUNTGL-ITEM_TEXT   '预收开票: ' && GT_DATA-NAME1.              "项目文本
        WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNNR.                             "客户
        WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
*        WA_ACCOUNTGL-SALES_ORD   = GT_DATA-VBELN.                             "销售订单
        WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VBELN .                            "分配号
        APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

        CLEAR GS_EXTENSION2.
        CLEAR LT_EXTENSION2.
        GS_EXTENSION2-POSNR LV_LINES.                                        "会计凭证行项目编号
        GS_EXTENSION2-BSCHL '19'.                                            "过账码
        GS_EXTENSION2-UMSKZ GT_DATA-UMSKZ.                                   "特别总账标识
        LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
        LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
        APPEND LT_EXTENSION2.

      IF GT_DATA-FSFNS IS NOT INITIAL.

*      分录3,借方行项目信息:
        ADD TO LV_LINES.
        CLEAR WA_CURRENCY_AMOUNT.
        WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
        WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-WAERK.                        "货币码
        WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-WRBXX.                        "金额
        APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

        CLEAR WA_ACCOUNTGL.
        WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
        WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-RACQT.                             "科目
        WA_ACCOUNTGL-ITEM_TEXT   '预收开票: ' && GT_DATA-NAME1.              "项目文本
        WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNNR.                             "客户
        WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
*        WA_ACCOUNTGL-SALES_ORD   = GT_DATA-VBELN.                             "销售订单
        WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VBELN .                            "分配号
        APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

        CLEAR GS_EXTENSION2.
        CLEAR LT_EXTENSION2.
        GS_EXTENSION2-POSNR LV_LINES.                                        "会计凭证行项目编号
        GS_EXTENSION2-BSCHL '40'.                                            "过账码
        LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
        LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
        APPEND LT_EXTENSION2.

*      分录4,贷方行项目信息:
        ADD TO LV_LINES.
        CLEAR WA_CURRENCY_AMOUNT.
        WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
        WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-WAERK.                        "货币码
        WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-WRBXX * -1.                   "金额
        APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

        CLEAR WA_ACCOUNTGL.
        WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
        WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-SAKXX.                             "科目
        WA_ACCOUNTGL-ITEM_TEXT   '预收开票: ' && GT_DATA-NAME1.              "项目文本
        WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNNR.                             "客户
        WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
*        WA_ACCOUNTGL-SALES_ORD   = GT_DATA-VBELN.                             "销售订单
        WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VBELN .                            "分配号
        APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

        CLEAR GS_EXTENSION2.
        CLEAR LT_EXTENSION2.
        GS_EXTENSION2-POSNR LV_LINES.                                        "会计凭证行项目编号
        GS_EXTENSION2-BSCHL '50'.                                            "过账码
        LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
        LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
        APPEND LT_EXTENSION2.

      ENDIF.
        CLEAR LV_OBJ_KEY .
        CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
          EXPORTING
            DOCUMENTHEADER HEADER
*          IMPORTING
*            OBJ_TYPE       = LV_OBJ_TYPE
*            OBJ_KEY        = LV_OBJ_KEY
*            OBJ_SYS        = LV_OBJ_SYS
          TABLES
            ACCOUNTGL      LT_ACCOUNTGL         "总帐科目项
            CURRENCYAMOUNT LT_CURRENCY_AMOUNT   "货币项目
            EXTENSION2     LT_EXTENSION2
            
RETURN         LT_RETURN.           "返回值

        CLEAR LT_RETURN.
        LOOP AT LT_RETURN .
          APPEND LT_RETURN TO GST_RETURN .
          CLEAR LT_RETURN .
        ENDLOOP.

        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        FREE:LT_ACCOUNTGL,LT_CURRENCY_AMOUNT,LT_RETURN.
        CLEAR LV_LINES .
    ENDLOOP.

    IF SY-SUBRC 0.
      SORT GST_RETURN[] BY MESSAGE .
      DELETE ADJACENT DUPLICATES FROM GST_RETURN[] COMPARING MESSAGE.

      LOOP AT GST_RETURN.
        GST_RETURN-MESSAGE '模拟过账:  ' && GST_RETURN-MESSAGE .
        APPEND GST_RETURN TO GT_RETURN .
        CLEAR  GST_RETURN .
      ENDLOOP.
      PERFORM FRM_DATA_POST_RT .
    ELSE .
      MESSAGE '您还未选择任何条目!TYPE 'S' DISPLAY LIKE 'E' .
    ENDIF.

  ELSE .
    MESSAGE '存在信息不全的条目,请检查!TYPE 'S' DISPLAY LIKE 'E' .
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_POST_RT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST_RT .
  LOOP AT GT_RETURN WHERE TYPE 'E'.
  ENDLOOP.
  IF SY-SUBRC 0.
    GLAG_N 'X'.
    DEMO=>MAIN( ).
  ELSE .

    CLEAR GT_DATA_C[] .
    LOOP AT GT_DATA WHERE AFLAG 'X' .
      APPEND GT_DATA TO GT_DATA_C[] .
      CLEAR GT_DATA .
    ENDLOOP.

    MESSAGE '模拟过账成功,可以进行正式过账TYPE 'S' .
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_POST
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST .
  CLEAR GLAG_E .
  LOOP AT GT_DATA WHERE AFLAG 'X' .
    READ TABLE GT_DATA_C WITH KEY BUKRS_VF GT_DATA-BUKRS_VF
                                  KUNNR 
GT_DATA-KUNNR
                                  VBELN 
GT_DATA-VBELN
                                  WAERK 
GT_DATA-WAERK
                                  UMSKZ 
GT_DATA-UMSKZ
                                  SKONT 
GT_DATA-SKONT
                                  WRBYS 
GT_DATA-WRBYS
                                  SAKYH 
GT_DATA-SAKYH
                                  TXT20 
GT_DATA-TXT20
                                  FSFNS 
GT_DATA-FSFNS
                                  WRBXX 
GT_DATA-WRBXX
                                  SAKXX 
GT_DATA-SAKXX
                                  RACQT 
GT_DATA-RACQT
                                  GZDAT 
GT_DATA-GZDAT
                                  GJAHR 
GT_DATA-GJAHR
                                  ZKJQJ 
GT_DATA-ZKJQJ
                                  BELNR 
GT_DATA-BELNR
    
.
    IF SY-SUBRC <> 0.
      GLAG_E 'X'.
      EXIT.
    ENDIF.
  ENDLOOP.

  IF GLAG_E IS INITIAL.

    DATA:
      TEMP_MONTH(2),            "输入月份
      HEADER_TXT(25),           "取会计年月+固定文本制费及研发费分摊
      TEMP_AUT_MSG(30),
      LAST_DATA          LIKE SY-DATUM"一个月的最后一天
      TEMP_OBJ_KEY       TYPE AWKEY,  "是否生成
      HEADER             LIKE BAPIACHE09  OCCURS WITH HEADER LINE,
      WA_ACCOUNTGL       LIKE BAPIACGL09  OCCURS WITH HEADER LINE,
      LT_ACCOUNTGL       TYPE STANDARD TABLE OF BAPIACGL09,
      WA_CURRENCY_AMOUNT LIKE BAPIACCR09  OCCURS WITH HEADER LINE,
      LT_CURRENCY_AMOUNT TYPE STANDARD TABLE OF BAPIACCR09 WITH HEADER LINE,
      IT_EXTENSION2      TYPE STANDARD TABLE OF BAPIPAREX WITH HEADER LINE,
      LT_RETURN          LIKE BAPIRET2 OCCURS WITH HEADER LINE,
      GST_RETURN         LIKE BAPIRET2 OCCURS WITH HEADER LINE,
      LS_ZFI002          TYPE ZFI002,
      FT_FLAG   ,                                                      "= ‘X'表示分摊过
      LV_ANSWER(1),
      TEMP_BWTAR_AUFNR   LIKE AFPO-AUFNR.
    DATAGS_EXTENSION2  TYPE ZSFI_EXTEN,                              "会计凭证过账增强extension2
          LT_EXTENSION2  TYPE TABLE OF BAPIPAREX WITH HEADER LINE.     "返回参数

    DATALV_OBJ_TYPE    LIKE BAPIACHE09-OBJ_TYPE,
          LV_OBJ_KEY     LIKE BAPIACHE09-OBJ_KEY,
          LV_OBJ_SYS     LIKE BAPIACHE09-OBJ_SYS.

    DATALV_DMBTR       TYPE BAPIWRBTR,
          LV_LINES       TYPE SY-TABIX,
          ZCOUNT         TYPE SY-TABIX,
          LV_WRBTR       TYPE BSEG-WRBTR,
          DO_POST        TYPE CHAR1,
          LS_EXTEN       TYPE ZSFI_EXTEN.
    DATALS_BKPF        TYPE BKPF,
          LS_REVERSAL    TYPE BAPIACREV.
    DATAGV_OBJ_TYPE    TYPE BAPIACHE09-OBJ_TYPE,                      "参考过程
          GV_OBJ_KEY     TYPE BAPIACHE09-OBJ_KEY,                       "对象键值
          GV_OBJ_SYS     TYPE BAPIACHE09-OBJ_SYS.
    DATA LV_BELNR_01     TYPE BKPF-BELNR.
    DATA LV_WAERS        TYPE T001-WAERS.
    DATA LV_FLAG         TYPE C.

    CLEAR LV_FLAG .
    LOOP AT GT_DATA WHERE AFLAG 'X' .
      IF GT_DATA-UMSKZ IS INITIAL
        OR GT_DATA-WRBYS IS INITIAL
        OR GT_DATA-SAKYH IS INITIAL
        OR GT_DATA-WRBXX IS INITIAL
        OR GT_DATA-GZDAT IS INITIAL
        .
        LV_FLAG 'X'.
        EXIT .
      ENDIF.
    ENDLOOP.

    IF LV_FLAG IS INITIAL.
      CLEAR GST_RETURN[] .
      LOOP AT GT_DATA WHERE AFLAG 'X' .
*    会计凭证抬头数据
          CLEAR HEADER.
          HEADER-HEADER_TXT '预收开票: ' && GT_DATA-NAME1.          "凭证抬头文本
          HEADER-COMP_CODE  GT_DATA-BUKRS_VF.    "公司代码
          HEADER-DOC_DATE   GT_DATA-GZDAT.       "凭证日期
          HEADER-PSTNG_DATE GT_DATA-GZDAT.       "凭证中的过帐日期
          HEADER-USERNAME   SY-UNAME.            "用户名
          HEADER-DOC_TYPE   'SA'.                "凭证类型
          HEADER-FISC_YEAR  GT_DATA-GZDAT(4).    "财年
          HEADER-FIS_PERIOD GT_DATA-GZDAT+4(2).  "会计期间

*    分录1,借方行项目信息:
          ADD TO LV_LINES.
          CLEAR WA_CURRENCY_AMOUNT.
          WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
          WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-WAERK.                        "货币码
          WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-WRBYS.                        "金额
          APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

          CLEAR WA_ACCOUNTGL.
          WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
          WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-SAKYH.                             "科目
          WA_ACCOUNTGL-ITEM_TEXT   '预收开票: ' && GT_DATA-NAME1.              "项目文本
          WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNNR.                             "客户
          WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
*          WA_ACCOUNTGL-SALES_ORD   = GT_DATA-VBELN.                             "销售订单
          WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VBELN .                            "分配号
          APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

          CLEAR GS_EXTENSION2.
          CLEAR LT_EXTENSION2.
          GS_EXTENSION2-POSNR LV_LINES.                                        "会计凭证行项目编号
          GS_EXTENSION2-BSCHL '40'.                                            "过账码
          GS_EXTENSION2-RSTGR '101'.                                           "付款原因代码
          LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
          LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
          APPEND LT_EXTENSION2.

*    分录2,贷方行项目信息:
          ADD TO LV_LINES.
          CLEAR WA_CURRENCY_AMOUNT.
          WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
          WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-WAERK.                        "货币码
          WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-WRBYS * -1.                   "金额
          APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

          CLEAR WA_ACCOUNTGL.
          WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
          WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-SKONT.                             "科目
          WA_ACCOUNTGL-ITEM_TEXT   '预收开票: ' && GT_DATA-NAME1.              "项目文本
          WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNNR.                             "客户
          WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
*          WA_ACCOUNTGL-SALES_ORD   = GT_DATA-VBELN.                             "销售订单
          WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VBELN .                            "分配号
          APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

          CLEAR GS_EXTENSION2.
          CLEAR LT_EXTENSION2.
          GS_EXTENSION2-POSNR LV_LINES.                                        "会计凭证行项目编号
          GS_EXTENSION2-BSCHL '19'.                                            "过账码
          GS_EXTENSION2-UMSKZ GT_DATA-UMSKZ.                                   "特别总账标识
          LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
          LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
          APPEND LT_EXTENSION2.

        IF GT_DATA-FSFNS IS NOT INITIAL.

*        分录3,借方行项目信息:
          ADD TO LV_LINES.
          CLEAR WA_CURRENCY_AMOUNT.
          WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
          WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-WAERK.                        "货币码
          WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-WRBXX.                        "金额
          APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

          CLEAR WA_ACCOUNTGL.
          WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
          WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-RACQT.                             "科目
          WA_ACCOUNTGL-ITEM_TEXT   '预收开票: ' && GT_DATA-NAME1.              "项目文本
          WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNNR.                             "客户
          WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
*          WA_ACCOUNTGL-SALES_ORD   = GT_DATA-VBELN.                             "销售订单
          WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VBELN .                            "分配号
          APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

          CLEAR GS_EXTENSION2.
          CLEAR LT_EXTENSION2.
          GS_EXTENSION2-POSNR LV_LINES.                                        "会计凭证行项目编号
          GS_EXTENSION2-BSCHL '40'.                                            "过账码
          LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
          LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
          APPEND LT_EXTENSION2.

*        分录4,贷方行项目信息:
          ADD TO LV_LINES.
          CLEAR WA_CURRENCY_AMOUNT.
          WA_CURRENCY_AMOUNT-ITEMNO_ACC LV_LINES.                             "会计凭证行项目编号
          WA_CURRENCY_AMOUNT-CURRENCY   GT_DATA-WAERK.                        "货币码
          WA_CURRENCY_AMOUNT-AMT_DOCCUR GT_DATA-WRBXX * -1.                   "金额
          APPEND WA_CURRENCY_AMOUNT TO LT_CURRENCY_AMOUNT .

          CLEAR WA_ACCOUNTGL.
          WA_ACCOUNTGL-ITEMNO_ACC  LV_LINES .                                 "会计凭证行项目编号
          WA_ACCOUNTGL-GL_ACCOUNT  GT_DATA-SAKXX.                             "科目
          WA_ACCOUNTGL-ITEM_TEXT   '预收开票: ' && GT_DATA-NAME1.              "项目文本
          WA_ACCOUNTGL-CUSTOMER    GT_DATA-KUNNR.                             "客户
          WA_ACCOUNTGL-REF_KEY_1   GT_DATA-KUNNR.                             "业务伙伴参考码
*          WA_ACCOUNTGL-SALES_ORD   = GT_DATA-VBELN.                             "销售订单
          WA_ACCOUNTGL-ALLOC_NMBR  GT_DATA-VBELN .                            "分配号
          APPEND WA_ACCOUNTGL TO LT_ACCOUNTGL.

          CLEAR GS_EXTENSION2.
          CLEAR LT_EXTENSION2.
          GS_EXTENSION2-POSNR LV_LINES.                                        "会计凭证行项目编号
          GS_EXTENSION2-BSCHL '50'.                                            "过账码
          LT_EXTENSION2-STRUCTURE  'ZSFI_EXTEN'.
          LT_EXTENSION2-VALUEPART1 GS_EXTENSION2.
          APPEND LT_EXTENSION2.

        ENDIF.
          CLEAR LV_OBJ_KEY .
          CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
            EXPORTING
              DOCUMENTHEADER HEADER
            IMPORTING
              OBJ_TYPE       LV_OBJ_TYPE
              OBJ_KEY        
LV_OBJ_KEY
              OBJ_SYS        
LV_OBJ_SYS
            
TABLES
              ACCOUNTGL      LT_ACCOUNTGL         "总帐科目项
              CURRENCYAMOUNT LT_CURRENCY_AMOUNT   "货币项目
              EXTENSION2     LT_EXTENSION2
              
RETURN         LT_RETURN.           "返回值

          CLEAR LT_RETURN.
          LOOP AT LT_RETURN .
            APPEND LT_RETURN TO GST_RETURN .
            CLEAR LT_RETURN .
          ENDLOOP.

          LOOP AT LT_RETURN WHERE TYPE 'E'.
          ENDLOOP.

          IF SY-SUBRC .
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ELSE.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                WAIT 'X'.
          ENDIF.
          FREE:LT_ACCOUNTGL,LT_CURRENCY_AMOUNT,LT_RETURN.
          CLEAR LV_LINES .
          GT_DATA-AWKEY LV_OBJ_KEY .
       MODIFY GT_DATA .
       CLEAR GT_DATA .
      ENDLOOP.

      IF SY-SUBRC 0.
        SORT GST_RETURN[] BY MESSAGE .
        DELETE ADJACENT DUPLICATES FROM GST_RETURN[] COMPARING MESSAGE.

        LOOP AT GST_RETURN.
          GST_RETURN-MESSAGE '正式过账:  ' && GST_RETURN-MESSAGE .
          APPEND GST_RETURN TO GT_RETURN .
          CLEAR  GST_RETURN .
        ENDLOOP.
        PERFORM FRM_DATA_POST_R .
      ELSE .
        MESSAGE '您还未选择任何条目!TYPE 'S' DISPLAY LIKE 'E' .
      ENDIF.

    ELSE .
      MESSAGE '存在信息不全的条目,请检查!TYPE 'S' DISPLAY LIKE 'E' .
    ENDIF.

  ELSE .
    MESSAGE '模拟过账的数据已发生变动,请重新提交模拟过账!TYPE 'S' DISPLAY LIKE 'E' .
    CLEAR GLAG_N .
    CLEAR GT_DATA_C[] .
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_POST_R
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_POST_R .
  CLEAR GLAG_N .
  CLEAR GT_DATA_C[] .
  LOOP AT GT_RETURN WHERE TYPE 'E'.
  ENDLOOP.
  IF SY-SUBRC 0.
    DEMO=>MAIN( ).
  ELSE .

    LOOP AT GT_DATA WHERE AFLAG 'X' .
      SELECT SINGLE BELNR INTO GT_DATA-BELNR FROM BSEG
        
WHERE AWKEY GT_DATA-AWKEY
        
.
      MODIFY GT_DATA .
      CLEAR GT_DATA .
    ENDLOOP.

    CLEAR GT_ZTIR098[].
    LOOP AT GT_DATA WHERE AFLAG 'X' .
      MOVE-CORRESPONDING GT_DATA TO GT_ZTIR098 .
      APPEND GT_ZTIR098 .
      CLEAR GT_ZTIR098 .
    ENDLOOP.

    MODIFY ZTIR098 FROM TABLE GT_ZTIR098[] .
    COMMIT WORK .

    DATA GS_LAYOUT_ALV TYPE LVC_S_LAYO.
    DATA LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性

    LV_STABLE-ROW '1'.
    LV_STABLE-COL '1'.

    GS_LAYOUT_ALV-CWIDTH_OPT 'X'.    "优化列宽

    CALL METHOD GO_ALV_GRID->SET_FRONTEND_LAYOUT
      
EXPORTING
        IS_LAYOUT GS_LAYOUT_ALV.

    CALL METHOD GO_ALV_GRID->REFRESH_TABLE_DISPLAY
      
EXPORTING
        IS_STABLE LV_STABLE.

      CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
        
EXPORTING
          CONTROL GO_ALV_GRID.
      CALL METHOD CL_GUI_CFW=>FLUSH.

    MESSAGE '正式过账成功!TYPE 'S' .
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SELECT_ALL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SELECT_ALL .
    LOOP AT GT_DATA.
      GT_DATA-AFLAG 'X' .
      MODIFY GT_DATA.
      CLEAR GT_DATA.
    ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UNSELECT_ALL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_UNSELECT_ALL .
    LOOP AT GT_DATA.
      CLEAR GT_DATA-AFLAG .
      MODIFY GT_DATA.
      CLEAR GT_DATA.
    ENDLOOP.
ENDFORM.

INITIALIZATION.
  PERFORM FRM_EXCLUDE_OPTION.

AT SELECTION-SCREEN OUTPUT.
  PERFORM SCREEN_OUTPUT.

AT SELECTION-SCREEN.
  PERFORM SCREEN_SETTING.

START-OF-SELECTION.
  PERFORM FOM_GETDATA.
  CALL SCREEN 100.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值