1. 程式人生 > >SAP筆記-abap 銀行對賬功能開發

SAP筆記-abap 銀行對賬功能開發

前一段時間花了幾天重新設計了一下銀行對賬功能,其中用到了 abap 的 OO 事件處理方法,及alv 的一些用法和大家分享一下,這次的修改更貼合實際業務操作.

銀行對賬功能:

   功能簡價:基本功能,匯入銀行對賬單,企業明細賬和銀行明細賬核對,列印餘額調節表.

                 增加了一些輔助功能:對於第一次對賬的科目允許單邊確認,對賬過程中調整銀行對賬單等...

  基本操作流程:

  • 1. 選擇公司程式碼和對賬科目
  • 2. 新建或開啟一個對賬事務.
  • 3. 匯入銀行對賬單(銀行出具的科目明細賬)
  • 4. 進行勾選對賬,或自動邏輯對賬

開發設計:

1.資料模型

 

程式原始碼(不包含螢幕的設計)

*&------------------------------------------------------------------
*& PROGRAM NAME: Z_FI_ENH_003_V2 ( old name : Z_FI_ENH_003)
*& T-CODE:  (ZFIE003)
*& PORGRAM TYPE: REPORT
*& DESCRIPTION: 銀行對帳功能
*&------------------------------------------------------------------


*& AUTHOR:  LONGXU
*& EMAIL:   [email protected]
*& DATE:    2009.03.12
*&------------------------------------------------------------------
*&
*&-------------------------------------------------------------------
*& Modification Log:
*& Version   Date        Author       DESCRIPTION     CHANGE REQUEST

*& -------- ----------  -----------  -------------  -----------------
*& V1.0      2008.3.15   longxu       初始設計
*& V1.1      2008.4.14   longxu       增加列印餘調節表功能
*& V1.2      2008.4.23   longxu       修改自動對賬邏輯(  按 票號 金額 全等 且不能為空 ).
*& V2.0      2009.3.12   longxu       重構功能並從命名 Z_FI_ENH_003_V2
*&
*&-------------------------------------------------------------------
*& REFRENCE OBJECT :
*& NAME                   TYPE                DESC
*& ---------------------  -----------------   -----------------------
*& ZFIE003_ACT            table               對賬事務表
*& ZFIE003_BKDOC          table               銀行對賬單明細賬
*& ZFIE003_EMAT           table               銀行對賬單已匹配
*& ZFIE003_BMAT           table               企業明細賬已匹配
*& ZFIE003_ENMAT          table               銀行對賬單未匹配
*& ZFIE003_BNMAT          table               企業明細賬未匹配
*& ZFIE003_ACTNO          號碼物件             對賬事務號
*& ZFIE003_DOCNO          號碼物件             銀行對賬單行項號
*& ZFIE003_MATNO          號碼物件             對賬匹配確認號
*& ZFIE003_S_NMAT         structure            餘額調節表結構
*& ZFIE003_SM_NMAT        smartforms           餘額調節表報表
*&
*&-------------------------------------------------------------------

Report  Z_FI_ENH_003_V2.

* ALV
TYPE-POOLS: slis.

CONSTANTS startDate type D VALUE '20090101'.

TABLES:ZFIE003_ENMAT,ZFIE003_BNMAT,ZFIE003_ACT,ZFIE003_BKDOC,ZFIE003_EMAT,ZFIE003_BMAT,SKB1,BSIS.


*Select Screen
PARAMETERS: p_BUKRS LIKE ZFIE003_ACT-BUKRS OBLIGATORY MEMORY ID buk ,"  CHAR  4 0 公司程式碼
            p_SAKNR LIKE ZFIE003_ACT-SAKNR OBLIGATORY.  " CHAR  10  0 總帳科目編號


"###############################

CLASS lcl_event_receiver DEFINITION DEFERRED.

DATA:i_ZFIE003_ACT LIKE TABLE OF ZFIE003_ACT WITH HEADER LINE.
DATA:wa_CurrentAct LIKE  LINE OF  i_ZFIE003_ACT.
DATA:wa_PreAct LIKE  LINE OF  i_ZFIE003_ACT.

DATA:i_ZFIE003_BKDOC LIKE TABLE OF ZFIE003_BKDOC WITH HEADER LINE.

"=======================
"Screen 150 variable
"=======================
DATA:FCODE_150 LIKE SY-UCOMM.

data: grid_150_1 type  ref to cl_gui_alv_grid,
      con_150_1 type ref to   cl_gui_custom_container.
"=============================================================

"=======================
"Screen 250 varialbe
"=======================
DATA:FCODE_250 LIKE SY-UCOMM.
data: grid_250_1 type  ref to cl_gui_alv_grid,
      grid_250_2 type  ref to cl_gui_alv_grid,
      con_250_1 type ref to   cl_gui_custom_container.

DATA splitter TYPE REF TO cl_gui_splitter_container.
DATA container_1 TYPE REF TO cl_gui_container.
DATA container_2 TYPE REF TO cl_gui_container.

DATA: TBX_250_1 type  P  DECIMALS 2,
      TBX_250_2 TYPE   P  DECIMALS 2.
"=============================================================




data event_receiver type ref to lcl_event_receiver.

DATA: BEGIN OF I_BSIS OCCURS 0 .
      INCLUDE STRUCTURE  bsis.
DATA:   SELEC(1),
      END OF I_BSIS.



DATA:BEGIN OF I_EMAT OCCURS 0,
      MATNO LIKE  ZFIE003_EMAT-MATNO,
      ACTNO LIKE  ZFIE003_EMAT-ACTNO,

      BUKRS LIKE  ZFIE003_EMAT-BUKRS,
      GJAHR LIKE  ZFIE003_EMAT-GJAHR,
      BELNR LIKE  ZFIE003_EMAT-BELNR,
      BUZEI LIKE  ZFIE003_EMAT-BUZEI,

      MONAT LIKE  BSIS-MONAT,
      BLDAT LIKE  BSIS-BLDAT,
      BUDAT LIKE  BSIS-BUDAT,
      SHKZG LIKE  BSIS-SHKZG,
      DMBTR LIKE  BSIS-DMBTR,
      WAERS LIKE  BSIS-WAERS,
      WRBTR LIKE  BSIS-WRBTR,
      SGTXT LIKE  BSIS-SGTXT,
      ZUONR LIKE  BSIS-ZUONR,

      SELEC LIKE  ZFIE003_BKDOC-SELEC,
     END OF I_EMAT.


DATA:BEGIN OF I_BMAT OCCURS 0,
      MATNO LIKE  ZFIE003_BMAT-MATNO,

      ACTNO LIKE  ZFIE003_BMAT-ACTNO,
      DOCNO LIKE  ZFIE003_BMAT-DOCNO,

      BLDAT LIKE  ZFIE003_BKDOC-BLDAT,
      SHKZG LIKE  ZFIE003_BKDOC-SHKZG,
      DMBTR LIKE  ZFIE003_BKDOC-DMBTR,
      BALAC LIKE  ZFIE003_BKDOC-BALAC,
      WAERS LIKE  ZFIE003_BKDOC-WAERS,
      BKITM LIKE  ZFIE003_BKDOC-BKITM,
      PINFO LIKE  ZFIE003_BKDOC-PINFO,
      SDOCNO  LIKE  ZFIE003_BKDOC-SDOCNO,

      SELEC LIKE  ZFIE003_BKDOC-SELEC,

     END OF I_BMAT.





"$ Region Class Definition and implementation

****************************************************************
* LOCAL CLASSES: Definition
****************************************************************
*===============================================================
* class lcl_event_receiver: local class to
*                         define and handle own functions.
*
* Definition:
* ~~~~~~~~~~~
CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS  grid_250_1_toolbar     FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING e_object e_interactive.

    CLASS-METHODS  grid_250_1_user_command  FOR EVENT user_command OF cl_gui_alv_grid
              IMPORTING e_ucomm.


    CLASS-METHODS  grid_250_2_toolbar  FOR EVENT toolbar OF cl_gui_alv_grid
            IMPORTING e_object e_interactive.

    CLASS-METHODS  grid_250_2_user_command  FOR EVENT user_command OF cl_gui_alv_grid
              IMPORTING e_ucomm.





    CLASS-METHODS  handle_menu_button   FOR EVENT menu_button OF cl_gui_alv_grid
            IMPORTING e_object e_ucomm.

    CLASS-METHODS  handle_user_after_user_command   FOR EVENT after_user_command OF cl_gui_alv_grid.

    CLASS-METHODS  handle_user_befor_user_command   FOR EVENT before_user_command OF cl_gui_alv_grid.

    CLASS-METHODS  Handle_data_changed  FOR EVENT data_changed OF cl_gui_alv_grid
         IMPORTING er_data_changed.



  PRIVATE SECTION.

ENDCLASS.
*
* lcl_event_receiver (Definition)
*===============================================================

****************************************************************
* LOCAL CLASSES: Implementation
****************************************************************
*===============================================================
* class lcl_event_receiver (Implementation)
*
*
CLASS lcl_event_receiver IMPLEMENTATION.


METHOD grid_250_1_toolbar.
    data:gs_toolbar  TYPE stb_button.
    data:icount type i.

    IF wa_CurrentAct-EDDAT <> '00000000'.
          "MESSAGE '當前事務已經被關賬過,不可再修改!' type 'E'.
          EXIT.
    ENDIF.

    DESCRIBE TABLE i_ZFIE003_ACT LINES icount.
    IF icount > 1.
      "MESSAGE '當前不是第一次對賬,不能無條件單邊確認' type 'E'.
      EXIT.
    ENDIF.


    CLEAR gs_toolbar.
    MOVE 'IniMat' TO gs_toolbar-function.

    MOVE ICON_TRANSPORT TO gs_toolbar-icon.
    MOVE '無條件企業單邊確認'(200) TO gs_toolbar-quickinfo.

    MOVE space TO gs_toolbar-disabled.
    APPEND gs_toolbar TO e_object->mt_toolbar.



  ENDMETHOD.

 METHOD grid_250_1_user_command.
   CASE e_ucomm.
      WHEN 'IniMat'.

      data: f_MATNO like ZFIE003_EMAT-MATNO.
      data: wa_BSIS LIKE LINE OF I_BSIS.

      CALL  FUNCTION 'NUMBER_GET_NEXT'
        EXPORTING
          NR_RANGE_NR         = '01'
          OBJECT          = 'ZSN_MATNO'
          QUANTITY          = '1'
        IMPORTING
          NUMBER          = f_MATNO
        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 NE 0.
         MESSAGE '取對賬成功確認號錯誤!' type 'E'.
        EXIT.
      ENDIF.

      LOOP AT I_BSIS INTO wa_BSIS WHERE SELEC = 'X'.
         ZFIE003_EMAT-MATNO = f_MATNO.
         ZFIE003_EMAT-ACTNO = wa_CurrentAct-ACTNO.
         ZFIE003_EMAT-BUKRS = wa_BSIS-BUKRS.
         ZFIE003_EMAT-GJAHR = wa_BSIS-GJAHR.
         ZFIE003_EMAT-BELNR = wa_BSIS-BELNR.
         ZFIE003_EMAT-BUZEI = wa_BSIS-BUZEI.
         INSERT INTO ZFIE003_EMAT VALUES ZFIE003_EMAT .
      ENDLOOP.


      IF sy-subrc <> 0.
         ROLLBACK WORK.
         exit.
       else.
         COMMIT WORK.
         PERFORM GetBsisFromDb.
         clear tbx_250_1.
         CALL METHOD grid_250_1->refresh_table_display.
      ENDIF.

    ENDCASE.
  ENDMETHOD.



  METHOD grid_250_2_toolbar.
** § 2.At event TOOLBAR define a toolbar element of type 1 by using
**     event paramenter E_OBJECT. Remember its function code.
**.......
** Part I: Define a menu button including a function code that
**         is evaluated in 'handle_MENU_BUTTON
**.......
*
*
** append a separator to normal toolbar
*    CLEAR gs_toolbar.
*    MOVE 3 TO gs_toolbar-butn_type.
*    APPEND gs_toolbar TO e_object->mt_toolbar.
*
**...................
** append a menu with default button (Type 1)
** The function code of the default button is the same as
** the one for the menu.
** If the user klicks on the default button ALV raises
** directly event BEFORE_USER_COMMAND
** (then USER_COMMAND, AFTER_USER_COMMAND).
** If the user klicks on the menu button ALV raises event MENU_BUTTON.
*

    data:gs_toolbar  TYPE stb_button.

    IF wa_CurrentAct-EDDAT <> '00000000'.
          "MESSAGE '當前事務已經被關賬過,不可再修改!' type 'E'.
          EXIT.
    ENDIF.

    CLEAR gs_toolbar.
    MOVE 'DELETE' TO gs_toolbar-function.
* --> This function code is evaluated in 'handle_menu_button'
    MOVE ICON_DELETE_ROW TO gs_toolbar-icon.
    MOVE '刪除選取中行'(200) TO gs_toolbar-quickinfo.
    "MOVE 1 TO gs_toolbar-butn_type.
    MOVE space TO gs_toolbar-disabled.
    APPEND gs_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.

 METHOD grid_250_2_user_command.
   CASE e_ucomm.
      WHEN 'DELETE'.

        data: wa_ZFIE003_BKDOC like LINE OF i_ZFIE003_BKDOC.

        LOOP AT i_ZFIE003_BKDOC INTO wa_ZFIE003_BKDOC.
          IF wa_ZFIE003_BKDOC-selec = 'X'.
             DELETE FROM ZFIE003_BKDOC where docno = wa_ZFIE003_BKDOC-DocNO.
             "delete TABLE i_ZFIE003_BKDOC FROM wa_ZFIE003_BKDOC.
          ENDIF.
        ENDLOOP.

        PERFORM GetBKDocFromDb.
        clear tbx_250_2.
        CALL METHOD grid_250_2->refresh_table_display.

    ENDCASE.
  ENDMETHOD.                           "grid_250_2_user_command


*--------------------------------------------------------------------
  METHOD handle_user_after_user_command .
      "BREAK-POINT.
  ENDMETHOD.

  METHOD handle_user_befor_user_command .
      "BREAK-POINT.
  ENDMETHOD.

  METHOD handle_menu_button.
** § 3.At event MENU_BUTTON query your function code and define a
**     menu in the same way as a context menu.
**..........
** Part II: Evaluate 'e_ucomm' to see which menu button of the toolbar
**          has been clicked on.
**          Define then the corresponding menu.
**          The menu contains function codes that are evaluated
**          in 'grid_250_2_user_command'.
**...........
*
**  query e_ucomm to find out which menu button has been clicked on
*    IF e_ucomm = 'TO_SFLIGHT'.
*      CALL METHOD e_object->add_function
*                  EXPORTING fcode   = 'TO_SPFLI'
*                            text    = text-100. "Overview
**  § 3a.) choose a default function and define the same function code
**         as used for the menu.
*      CALL METHOD e_object->add_function
*                  EXPORTING fcode   = 'TO_SFLIGHT'
*                            text    = text-200. "Flights
*
*    ENDIF.
  ENDMETHOD.


 METHOD  handle_data_changed.
  "BREAK-POINT.
 ENDMETHOD.

*---------------------------------------------------------------------









ENDCLASS.
*
* lcl_event_receiver (Implementation)
*===================================================================
"$ Endregion Class Definition and implementation






"$ Region Main proc
START-OF-SELECTION.
 IF sy-UNAME = 'HS014'.
   data: clear(5).
   "重新初始化對賬系統可以進入除錯模式 將 clear 值設為 'HS014'.
   BREAK-POINT.
   IF clear = 'HS014'.
     PERFORM ClearAllUserTableData.
   ENDIF.
 ENDIF.
 SELECT SINGLE * FROM SKB1 WHERE BUKRS =  p_BUKRS AND SAKNR = p_SAKNR .

 IF sy-subrc <> 0.
    MESSAGE '科目不存在!' type 'I'.
 else.
   call screen '0150'.
 ENDIF.
"$ Endregion Main proc




"###############################
FORM ClearAllUserTableData.
*& ZFIE003_ACT            table               對賬事務表
  delete from ZFIE003_ACT.
*& ZFIE003_BKDOC          table               銀行對賬單明細賬
  delete from ZFIE003_BKDOC.
*& ZFIE003_EMAT           table               銀行對賬單已匹配
  delete from ZFIE003_EMAT.
*& ZFIE003_BMAT           table               企業明細賬已匹配
  delete from ZFIE003_BMAT.
*& ZFIE003_ENMAT          table               銀行對賬單未匹配
  delete from ZFIE003_ENMAT.
*& ZFIE003_BNMAT          table               企業明細賬未匹配
  delete from ZFIE003_BNMAT.
ENDFORM.




"###############################
"$ region screen 150
*********************************************

FORM S150_ALV_INI.

data: gt_fieldcat  type lvc_t_fcat.
data: gs_layout type lvc_s_layo.
data: gs_variant type disvariant.



  if con_150_1 is initial.
   create object con_150_1
   exporting container_name = 'CON_150_1'.
   create object grid_150_1
   exporting
   i_parent = con_150_1.
  endif.



  "定義grid格式
  clear gs_layout.
  gs_layout-smalltitle  = ''.
  gs_layout-grid_title  = ''.
  gs_layout-detailtitl  = '細節資訊'(003).
  gs_layout-zebra   =  'X'."定義GRID的樣式如斑馬條式
  gs_layout-sel_mode  = 'B'.
  gs_layout-cwidth_opt  = 'X'.
  gs_layout-no_toolbar  = ''.
  "gs_layout-BOX_FNAME = 'MARK'.

  "定義列
  DATA: ls_fieldcat like line of gt_fieldcat.
  CLEAR gt_fieldcat[].

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'ACTNO'.
  ls_fieldcat-coltext = 'ID'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'BUKRS'.
  ls_fieldcat-coltext = '公司程式碼'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SAKNR'.
  ls_fieldcat-coltext = '總帳科目編號'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'STEXT'.
  ls_fieldcat-coltext = '科目描述'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'BEDAT'.
  ls_fieldcat-coltext = '開啟事務時間'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'EDDAT'.
  ls_fieldcat-coltext = '結束事務時間'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'BUDAT'.
  ls_fieldcat-coltext = '對賬截止日期'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'ETBLC'.
  ls_fieldcat-coltext = '企業餘額'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'BKBLC'.
  ls_fieldcat-coltext = '銀行餘額'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'WAERS'.
  ls_fieldcat-coltext = '科目幣別'.
  APPEND ls_fieldcat TO gt_fieldcat.

  gs_variant-report = sy-repid. "指定儲存變式的程式名.
  call  method grid_150_1->set_table_for_first_display
     exporting
      is_variant    = gs_variant
      is_layout      =  gs_layout"採用自定義的格式
      I_SAVE = 'A'
      I_DEFAULT = 'X'

     changing
      it_outtab      =  i_ZFIE003_ACT[]
      it_fieldcatalog  = gt_fieldcat[].

ENDFORM.





FORM UpdateCurrentActToDB.

  UPDATE ZFIE003_ACT
    SET BUDAT = wa_CurrentAct-BUDAT
        EDDAT = wa_CurrentAct-EDDAT
        ETBLC = wa_CurrentAct-ETBLC
        BKBLC = wa_CurrentAct-BKBLC
  WHERE ACTNO = wa_CurrentAct-ACTNO.

ENDFORM.

FORM GetActorFromDB.
  SELECT * INTO TABLE I_ZFIE003_ACT FROM ZFIE003_ACT WHERE BUKRS = p_BUKRS AND SAKNR = p_SAKNR.
ENDFORM.

FORM CreateActor.

  "DATA: FACTNO LIKE I_ZFIE003_ACT-ACTNO.

  SELECT SINGLE *  FROM ZFIE003_ACT WHERE BUKRS = p_BUKRS AND SAKNR = p_SAKNR AND EDDAT = '00000000'.
  IF sy-subrc = 0.
    MESSAGE '科目已開啟了一個對賬事務' type 'E'.
    exit.
  ENDIF.

  data: l_answer.
    CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
      EXPORTING
        defaultoption = 'N'
        diagnosetext1 = '開啟一個新的對賬事物,'
        textline1     = '確定繼續?'
        titel         = '詢問'
      IMPORTING
        answer        = l_answer.

    IF l_answer <> 'J'.
      EXIT.
    ENDIF.

  CLEAR wa_CurrentAct.

  CALL  FUNCTION 'NUMBER_GET_NEXT'
   EXPORTING
     NR_RANGE_NR         = '01'
     OBJECT          = 'ZSN_ACTNO'
     QUANTITY          = '1'
   IMPORTING
     NUMBER          = wa_CurrentAct-ACTNO
   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 NE 0.
    MESSAGE '取對賬事務號錯誤!' type 'E'.
   EXIT.
  ENDIF.

  wa_CurrentAct-BUKRS = p_BUKRS.
  wa_CurrentAct-SAKNR = p_SAKNR.
  wa_CurrentAct-BUDAT = sy-datum.
  wa_CurrentAct-BEDAT = sy-datum.
  wa_CurrentAct-WAERS = SKB1-WAERS.

  select SINGLE TXT50 INTO wa_CurrentAct-STEXT from skat inner join t001 on t001~BUKRS = p_BUKRS and t001~KTOPL = skat~KTOPL where SAKNR = p_SAKNR AND skat~SPRAS = '1'.

  SELECT SINGLE * FROM SKB1 WHERE BUKRS =  p_BUKRS AND SAKNR = p_SAKNR .

  PERFORM GetAccountBalance USING wa_CurrentAct-bukrs
                                  wa_CurrentAct-SAKNR
                                  wa_CurrentAct-BUDAT
                                  wa_CurrentAct-WAERS
                         CHANGING wa_CurrentAct-ETBLC.

  MOVE wa_CurrentAct to ZFIE003_ACT.
  INSERT  ZFIE003_ACT.


  IF SY-SUBRC NE 0.
    ROLLBACK work.
  else.
    commit work.
  ENDIF.



  "todo 將上期未匹配資料 copy 到本次銀行對賬明細表中....
  DATA: preActNo like ZFIE003_ACT-ACTNO.
  data: lc type i.
  preActNo = 0.
  DESCRIBE TABLE i_ZFIE003_ACT lines lc.
  IF lc > 0.
    LOOP AT i_ZFIE003_ACT.
      IF preActNo < i_ZFIE003_ACT-ACTNO .
        preActNo = i_ZFIE003_ACT-ACTNO .
      ENDIF.
    ENDLOOP.
  ENDIF.

  CLEAR I_ZFIE003_BKDOC[].
  IF preActNo > 0.
    SELECT
      *
    INTO CORRESPONDING FIELDS OF TABLE I_ZFIE003_BKDOC
    FROM ZFIE003_BKDOC
    INNER JOIN ZFIE003_BNMAT ON ZFIE003_BKDOC~DOCNO = ZFIE003_BNMAT~DOCNO
    WHERE ZFIE003_BKDOC~ACTNO = preActNo.

    IF sy-subrc = 0.
      LOOP AT I_ZFIE003_BKDOC.
        I_ZFIE003_BKDOC-ACTNO = wa_CurrentAct-ACTNO.
         "取序號碼
        CALL  FUNCTION 'NUMBER_GET_NEXT'
         EXPORTING
           NR_RANGE_NR         = '01'
           OBJECT          = 'ZSN_DOCNO'
           QUANTITY          = '1'
         IMPORTING
           NUMBER          = I_ZFIE003_BKDOC-DOCNO
         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 NE 0.
          MESSAGE '取銀行對賬行號碼錯誤!' type 'I'.
         EXIT.
        ENDIF.
        INSERT INTO ZFIE003_BKDOC VALUES I_ZFIE003_BKDOC.
      ENDLOOP.
    ENDIF.
  ENDIF.

  IF SY-SUBRC NE 0.
    ROLLBACK work.
  else.
    commit work.
  ENDIF.

ENDFORM.



FORM OpenActor.
  DATA:gi_index_rows TYPE lvc_t_row WITH HEADER LINE.
  DATA:l_lines type i.

  CALL METHOD grid_150_1->get_selected_rows
    IMPORTING
      et_index_rows = gi_index_rows[].
  DESCRIBE TABLE gi_index_rows LINES l_lines.
  IF l_lines = 0.
    MESSAGE '請選中一個對賬事務!' type 'E'.
    EXIT.
  ENDIF.

  CLEAR wa_CurrentAct .
  READ TABLE gi_index_rows INDEX 1.
  READ TABLE I_ZFIE003_ACT INDEX  gi_index_rows-index into wa_CurrentAct .

  PERFORM GetBKDocFromDb.

  PERFORM GetBsisFromDb.

  IF wa_CurrentAct-EDDAT = '00000000'. "沒結賬前更新餘額.
    PERFORM GetAccountBalance USING wa_CurrentAct-bukrs
                                    wa_CurrentAct-SAKNR
                                    wa_CurrentAct-BUDAT
                                    wa_CurrentAct-WAERS
                           CHANGING wa_CurrentAct-ETBLC.
    PERFORM UpdateCurrentActToDB.
  ENDIF.


ENDFORM.



FORM GetAccountBalance USING bukrs like i_ZFIE003_ACT-BUKRS
                             saknr like i_ZFIE003_ACT-SAKNR
                             budat like i_ZFIE003_ACT-BUDAT
                             WAERS like i_ZFIE003_ACT-WAERS
                       CHANGING rlt like i_ZFIE003_ACT-ETBLC.
  DATA: i_ACCOUNT_BALANCES  LIKE  BAPI3006_4 OCCURS 0.
  DATA: i_line LIKE LINE OF i_ACCOUNT_BALANCES.
  DATA: i_bsis like bsis OCCURS 0 WITH HEADER LINE.
  DATA: CURR LIKE BAPI3006_5-CURR_TYPE.
  DATA: count type i.
*
*
*  CALL FUNCTION 'BAPI_GL_ACC_GETPERIODBALANCES'
*     EXPORTING
*
*      COMPANYCODE   =  bukrs
*      GLACCT        =  saknr
*      FISCALYEAR    =  budat(4)
*      CURRENCYTYPE  =  '00'
*     TABLES
*      ACCOUNT_BALANCES = i_ACCOUNT_BALANCES.
*
*     DESCRIBE TABLE i_ACCOUNT_BALANCES LINES  count.
*
*     IF count = 0.
*        CALL FUNCTION 'BAPI_GL_ACC_GETPERIODBALANCES'
*           EXPORTING
*
*            COMPANYCODE   =  bukrs
*            GLACCT        =  saknr
*            FISCALYEAR    =  budat(4)
*            CURRENCYTYPE  =  '10'
*           TABLES
*            ACCOUNT_BALANCES = i_ACCOUNT_BALANCES.
*     ENDIF.
*
*
*     READ TABLE i_ACCOUNT_BALANCES INDEX  budat+4(2) INTO  i_line   .
*
*     IF sy-subrc <> 0.
*       exit.
*     ENDIF.
*
*     rlt = i_line-BALANCE.

     DATA: SPSWBT like bsis-PSWBT,
           HPSWBT LIKE bsis-PSWBT.

     IF WAERS = 'RMB'.
       select sum( dmbtr ) into SPSWBT  FROM bsis where bsis~bukrs = bukrs and bsis~HKONT = SAKNR and bsis~budat <= budat and bsis~SHKZG = 'S'.
       select sum( dmbtr ) into HPSWBT  FROM bsis where bsis~bukrs = bukrs and bsis~HKONT = SAKNR and bsis~budat <= budat and bsis~SHKZG = 'H'.
     ELSE.
       select sum( wrbtr ) into SPSWBT  FROM bsis where bsis~bukrs = bukrs and bsis~HKONT = SAKNR and bsis~budat <= budat and bsis~SHKZG = 'S'.
       select sum( wrbtr ) into HPSWBT  FROM bsis where bsis~bukrs = bukrs and bsis~HKONT = SAKNR and bsis~budat <= budat and bsis~SHKZG = 'H'.
     ENDIF.

*     LOOP AT i_bsis.
*       IF i_bsis-SHKZG = 'S'.
*         rlt = rlt - i_bsis-PSWBT .
*       ELSE.
*         rlt = rlt + i_bsis-PSWBT .
*       ENDIF.
*     ENDLOOP.

      rlt =  SPSWBT - HPSWBT .

ENDFORM.




DATA: f_bsis like bsis."  OCCURS 0 WITH HEADER LINE.
FORM LOOP_OUTPUT.

  MOVE-CORRESPONDING f_bsis to I_BSIS.
  IF I_BSIS-SHKZG = 'H'.
        I_BSIS-dmbtr = - I_BSIS-dmbtr.
        I_BSIS-wrbtr = - I_BSIS-wrbtr.
        modify table I_BSIS.
  ENDIF.
  APPEND I_BSIS.
ENDFORM.
FORM GetBsisFromDb.
  CLEAR I_BSIS[].

  IF wa_CurrentAct-EDDAT = '00000000'. "沒結賬前從bsis取數
    "對當前表檢索出不存於另一表的資料 , 用open sql 效率較低,採用 native sql (oracle)
    EXEC SQL PERFORMING LOOP_OUTPUT.
      SELECT *
      INTO  :f_bsis
      FROM BSIS
      WHERE bsis.bukrs = :wa_CurrentAct-bukrs
        and bsis.HKONT = :wa_CurrentAct-SAKNR
        and bsis.budat <= :wa_CurrentAct-budat
        and bsis.budat >= :startDate
        and bsis.MANDT = :SY-MANDT
        and NOT EXISTS (select *
                        from ZFIE003_EMAT
                        where ZFIE003_EMAT.BUKRS = bsis.bukrs
                          and ZFIE003_EMAT.GJAHR = bsis.GJAHR
                          and ZFIE003_EMAT.BELNR = bsis.BELNR
                          and ZFIE003_EMAT.BUZEI = bsis.BUZEI
                          and ZFIE003_EMAT.MANDT = :SY-MANDT )
    ENDEXEC.
  ELSE.   關賬後只取未核對資料表 zfie003_enmat
    "BREAK-POINT.
    EXEC SQL PERFORMING LOOP_OUTPUT.
      SELECT
        bsis.*
      INTO  :f_bsis
      FROM BSIS
      INNER JOIN ZFIE003_ENMAT ON ZFIE003_ENMAT.BUKRS = bsis.bukrs
                              and ZFIE003_ENMAT.GJAHR = bsis.GJAHR
                              and ZFIE003_ENMAT.BELNR = bsis.BELNR
                              and ZFIE003_ENMAT.BUZEI = bsis.BUZEI
                              and ZFIE003_ENMAT.MANDT = bsis.MANDT
                              and ZFIE003_ENMAT.ACTNO = :wa_CurrentAct-ActNO
                              and bsis.MANDT = :SY-MANDT

    ENDEXEC.

  ENDIF.
ENDFORM.



"DATA: f_bsis like bsis."  OCCURS 0 WITH HEADER LINE.
FORM LOOP_BKDOC.
  APPEND I_ZFIE003_BKDOC.
ENDFORM.
FORM GetBKDocFromDb.
  CLEAR I_ZFIE003_BKDOC[].
  "對當前表檢索出不存於另一表的資料 , 用open sql 效率較低,採用 native sql (oracle)
  EXEC SQL PERFORMING LOOP_BKDOC.
    SELECT *
    INTO :I_ZFIE003_BKDOC
    FROM ZFIE003_BKDOC
    WHERE ZFIE003_BKDOC.ACTNO = :wa_CurrentAct-ACTNO
      and ZFIE003_BKDOC.MANDT = :SY-MANDT
      and NOT EXISTS (select *
                      from ZFIE003_BMAT
                      where ZFIE003_BMAT.ACTNO = :wa_CurrentAct-ACTNO
                        and ZFIE003_BMAT.DOCNO = ZFIE003_BKDOC.DOCNO
                        and ZFIE003_BMAT.MANDT = :SY-MANDT )
  ENDEXEC.

ENDFORM.



"PROCESS BEFORE OUTPUT.
 MODULE STATUS_0150 OUTPUT.
   set pf-status 'G150'.
   set TITLEBAR  'T150'.

   PERFORM GetActorFromDB .

   PERFORM S150_ALV_INI.



 ENDMODULE.






"PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0150 INPUT.
  " BREAK-POINT.
  case  FCODE_150.
   when 'BACK'.
     Clear FCODE_150.
     LEAVE to screen 0 .
   when 'EXIT'.
     Clear FCODE_150.
     LEAVE PROGRAM.
   when 'CANCEL'.
     Clear FCODE_150.
     leave to screen 0 .
   WHEN 'NEW'.
     Clear FCODE_150.



     PERFORM CreateActor .
     PERFORM GetActorFromDB .
     CALL METHOD grid_150_1->refresh_table_display.


   When 'OPEN'.
     "BREAK-POINT.
     Clear FCODE_150.
     PERFORM OpenActor.

     call SCREEN '0250'.
     CALL METHOD grid_150_1->refresh_table_display.

  endcase.

 ENDMODULE.





"$ endregion  screen 150.
"###############################

"###############################
"$ Region screen 250

FORM RefreshSelectAmont.
    CALL METHOD grid_250_1->check_changed_data.
    CALL METHOD grid_250_2->check_changed_data.

    TBX_250_1 = 0.
    DATA: wa_BSIS LIKE LINE OF I_BSIS,
          wa_ZFIE003_BKDOC LIKE LINE OF I_ZFIE003_BKDOC.

    IF wa_CurrentAct-WAERS = 'RMB'.
      LOOP AT I_BSIS INTO wa_BSIS WHERE SELEC = 'X'.
        TBX_250_1 = TBX_250_1 + wa_BSIS-dmbtr.
      ENDLOOP.
    ELSE.
      LOOP AT I_BSIS INTO wa_BSIS WHERE SELEC = 'X'.
        TBX_250_1 = TBX_250_1 + wa_BSIS-wrbtr.
      ENDLOOP.
    ENDIF.

    TBX_250_2 = 0.
    LOOP AT  I_ZFIE003_BKDOC INTO wa_ZFIE003_BKDOC WHERE SELEC = 'X'.
       TBX_250_2 = TBX_250_2 + wa_ZFIE003_BKDOC-DMBTR.
    ENDLOOP.
ENDFORM.

"檢查餘額調節表是否平衡。
FORM CheckBalance CHANGING IsOK TYPE C.
    DATA: wa_BSIS LIKE LINE OF I_BSIS,
          wa_ZFIE003_BKDOC LIKE LINE OF I_ZFIE003_BKDOC.

    DATA: b1 type  P  DECIMALS 2, "企業餘額
      b2 TYPE   P  DECIMALS 2.    "銀行餘額

    IF wa_CurrentAct-WAERS = 'RMB'.
      LOOP AT I_BSIS INTO wa_BSIS .
        b1 = b1 + wa_BSIS-dmbtr.
      ENDLOOP.
    ELSE.
      LOOP AT I_BSIS INTO wa_BSIS .
        b1 = b1 + wa_BSIS-wrbtr.
      ENDLOOP.
    ENDIF.

    b2 = 0.
    LOOP AT  I_ZFIE003_BKDOC INTO wa_ZFIE003_BKDOC .
       b2 = b2 + wa_ZFIE003_BKDOC-DMBTR.
    ENDLOOP.


    b1 = b1 + wa_CurrentAct-BKBLC. " 餘業餘額+企業未達
    b2 = b2 + wa_CurrentAct-ETBLC. " 銀行餘額_銀行未達

    IsOK = ''.
    IF b1 = b2.
      IsOK = 'X'.
    ENDIF.
ENDFORM.





FORM S250_ALV_INI.

data: gt_fieldcat  type lvc_t_fcat.
data: gs_layout type lvc_s_layo.
data: gs_variant type disvariant.
data:gt_toolbar_excluding   Type  UI_FUNCTIONS.



  if con_250_1 is initial.
   create object con_250_1
   exporting container_name = 'CON_250_1'.

   CREATE OBJECT splitter
                  EXPORTING parent = con_250_1
                            rows    = 1
                            ALIGN = 15
                            columns = 2.

   CALL METHOD splitter->get_container
                      EXPORTING row      = 1
                                column   = 1
                      RECEIVING container = container_1.

   CALL METHOD splitter->get_container
                  EXPORTING row      = 1
                            column   = 2
                  RECEIVING container = container_2.


   create object grid_250_1
   exporting
   i_parent = container_1.

   create object grid_250_2
   exporting
   i_parent = container_2.





  "$ "$ Region grid1

  "定義 gird toolbar
  CLEAR gt_toolbar_excluding.
  APPEND:
          cl_gui_alv_grid=>MC_FC_PRINT               to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_DRAG_DROP_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_NO_DELETE_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_NO_INSERT_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_TO_OFFICE to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_ABC    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CHAIN    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CRBATCH    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CRWEB    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_LINEITEMS    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_MASTER_DATA    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_MORE    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_REPORT    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_XINT    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_XXL    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CHECK    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_MB_EXPORT    to gt_toolbar_excluding,

          cl_gui_alv_grid=>MC_FC_GRAPH     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_HELP     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_HTML     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_INFO     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_PC_FILE   to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_VIEWS   to gt_toolbar_excluding,

          cl_gui_alv_grid=>MC_FC_LOC_APPEND_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_COPY     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_COPY_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_CUT     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_DELETE_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_INSERT_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_MOVE_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_PASTE     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_PASTE_NEW_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_REFRESH    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_UNDO     to gt_toolbar_excluding
          .


 "定義grid格式
  clear gs_layout.
  gs_layout-smalltitle  = ''.
  gs_layout-grid_title  = ''.
  gs_layout-zebra   =  'X'."定義GRID的樣式如斑馬條式
  gs_layout-sel_mode  = 'B'.
  gs_layout-no_toolbar  = ''.
  gs_layout-NO_ROWMARK = 'X'.
  gs_layout-EDIT_MODE = ''.

  "定義列
  DATA: ls_fieldcat like line of gt_fieldcat.
  CLEAR gt_fieldcat[].

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SELEC'.
  ls_fieldcat-coltext = '選擇'.
  ls_fieldcat-outputlen = 2.
  ls_fieldcat-checkbox = 'X'.
  "ls_fieldcat-input = 'X'.
  ls_fieldcat-edit = 'X'.

  APPEND ls_fieldcat TO gt_fieldcat.



  CONCATENATE sy-repid 'left' into   gs_variant-report  . "指定儲存變式的程式名.
  call  method grid_250_1->set_table_for_first_display
     exporting
      is_variant    = gs_variant
      is_layout      =  gs_layout"採用自定義的格式
      it_toolbar_excluding = gt_toolbar_excluding
      i_structure_name = 'BSIS'
      I_SAVE = 'A'
      I_DEFAULT = 'X'

     changing
      it_outtab      =  i_bsis[]
      it_fieldcatalog  = gt_fieldcat[].
      .

 "$ Endregion grid1




  "$ "$ Region grid2

  "定義 gird toolbar
  CLEAR gt_toolbar_excluding.
  APPEND:
          cl_gui_alv_grid=>MC_FC_PRINT               to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_DRAG_DROP_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_NO_DELETE_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_LYSTYLE_NO_INSERT_ROWS to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_TO_OFFICE to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_ABC    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CHAIN    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CRBATCH    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_CRWEB    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_LINEITEMS    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_MASTER_DATA    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_MORE    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_REPORT    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_XINT    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CALL_XXL    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_CHECK    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_MB_EXPORT    to gt_toolbar_excluding,

          cl_gui_alv_grid=>MC_FC_GRAPH     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_HELP     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_HTML     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_INFO     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_PC_FILE   to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_VIEWS   to gt_toolbar_excluding,

          cl_gui_alv_grid=>MC_FC_LOC_APPEND_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_COPY     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_COPY_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_CUT     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_DELETE_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_INSERT_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_MOVE_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_PASTE     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_PASTE_NEW_ROW     to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_REFRESH    to gt_toolbar_excluding,
          cl_gui_alv_grid=>MC_FC_LOC_UNDO     to gt_toolbar_excluding
          .



  "定義grid格式
  clear gs_layout.
  gs_layout-smalltitle  = ''.
  gs_layout-grid_title  = ''.
  gs_layout-zebra   =  'X'."定義GRID的樣式如斑馬條式
  gs_layout-sel_mode  = 'B'.
  gs_layout-no_toolbar  = ''.
  gs_layout-NO_ROWMARK = 'X'.
  gs_layout-EDIT_MODE = ''.


  "定義列


  CLEAR gt_fieldcat[].

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SELEC'.
  ls_fieldcat-coltext = '選擇'.
  ls_fieldcat-outputlen = 2.
  ls_fieldcat-checkbox = 'X'.
  "ls_fieldcat-input = 'X'.
  ls_fieldcat-edit = 'X'.

  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DOCNO'.
  ls_fieldcat-coltext = '行號'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'ACTNO'.
  ls_fieldcat-coltext = '事務ID'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'BLDAT'.
  ls_fieldcat-coltext = '日期'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SHKZG'.
  ls_fieldcat-coltext = '借方/貸方標識'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'DMBTR'.
  ls_fieldcat-coltext = '發生金額'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'BALAC'.
  ls_fieldcat-coltext = '餘額'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'WAERS'.
  ls_fieldcat-coltext = '貨幣'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'BKITM'.
  ls_fieldcat-coltext = '傳票號'.
  APPEND ls_fieldcat TO gt_fieldcat.

  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'PINFO'.
  ls_fieldcat-coltext = '對方資訊'.
  APPEND ls_fieldcat TO gt_fieldcat.


  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname    = 'SDOCNO'.
  ls_fieldcat-coltext = '複製行號'.
  APPEND ls_fieldcat TO gt_fieldcat.






  CONCATENATE sy-repid 'right' into   gs_variant-report  . "指定儲存變式的程式名.
  call  method grid_250_2->set_table_for_first_display
     exporting
      is_variant    = gs_variant
      is_layout      =  gs_layout"採用自定義的格式
      it_toolbar_excluding = gt_toolbar_excluding

      I_SAVE = 'A'
      I_DEFAULT = 'X'


     changing
      it_outtab      =  i_ZFIE003_BKDOC[]
      it_fieldcatalog  = gt_fieldcat[].




  SET HANDLER event_receiver->grid_250_1_user_command
              event_receiver->grid_250_1_toolbar FOR  grid_250_1 .
  CALL METHOD grid_250_1->set_toolbar_interactive.

  SET HANDLER event_receiver->grid_250_2_user_command
              event_receiver->grid_250_2_toolbar FOR  grid_250_2 .
  CALL METHOD grid_250_2->set_toolbar_interactive.


 "$ Endregion grid2
  endif.

  IF sy-ucomm = 'OPEN'.
        clear tbx_250_1.
        clear tbx_250_2.
        CALL METHOD grid_250_1->refresh_table_display.
        CALL METHOD grid_250_2->refresh_table_display.
*    else.
*
*    DATA: l_valid(1) TYPE c.
*
*    CALL METHOD grid_250_1->check_changed_data
*      CHANGING
*            c_refresh = l_valid.
*    IF l_valid = 'X'.
*      CALL METHOD grid_250_1->refresh_table_display.
*    ENDIF.
*
*    CALL METHOD grid_250_2->check_changed_data
*      CHANGING
*            c_refresh = l_valid.
*    IF l_valid = 'X'.
*      CALL METHOD grid_250_2->refresh_table_display.
*    ENDIF.

    clear sy-ucomm.
  ENDIF.
ENDFORM.




*PROCESS BEFORE OUTPUT.
 MODULE STATUS_0250 OUTPUT.
   set pf-status 'G250'.
   set TITLEBAR  'T250'.
   PERFORM S250_ALV_INI.
 ENDMODULE.


*PROCESS AFTER INPUT.
 MODULE USER_COMMAND_0250 INPUT.

  "BREAK-POINT.

  case  FCODE_250.
   when 'BACK'.
     CLEAR FCODE_250.
     LEAVE to screen  0 .
   when 'EXIT'.
     CLEAR FCODE_250.
     LEAVE PROGRAM.
   when 'CANCEL'.
     CLEAR FCODE_250.
     LEAVE to screen  0 .

   when 'REFRESH'.
     CLEAR FCODE_250.
     PERFORM RefreshSelectAmont.

   when 'MAT'.
     CLEAR FCODE_250.
     IF wa_CurrentAct-EDDAT <> '00000000'.
        MESSAGE '當前事務已經被關賬過,不可再修改!' type 'E'.
        EXIT.
     ENDIF.

     PERFORM RefreshSelectAmont.
     IF TBX_250_1 <> TBX_250_2.
       MESSAGE '選擇的金額不匹配!' type 'E'.
     ELSE.
      data: f_MATNO like ZFIE003_EMAT-MATNO.
      data: wa_BSIS LIKE LINE OF I_BSIS.
      data: wa_ZFIE003_BKDOC LIKE LINE OF I_ZFIE003_BKDOC.

      CALL  FUNCTION 'NUMBER_GET_NEXT'
        EXPORTING
          NR_RANGE_NR         = '01'
          OBJECT          = 'ZSN_MATNO'
          QUANTITY          = '1'
        IMPORTING
          NUMBER          = f_MATNO
        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 NE 0.
         MESSAGE '取對賬成功確認號錯誤!' type 'E'.
        EXIT.
      ENDIF.

      LOOP AT I_BSIS INTO wa_BSIS WHERE SELEC = 'X'.
         ZFIE003_EMAT-MATNO = f_MATNO.
         ZFIE003_EMAT-ACTNO = wa_CurrentAct-ACTNO.
         ZFIE003_EMAT-BUKRS = wa_BSIS-BUKRS.
         ZFIE003_EMAT-GJAHR = wa_BSIS-GJAHR.
         ZFIE003_EMAT-BELNR = wa_BSIS-BELNR.
         ZFIE003_EMAT-BUZEI = wa_BSIS-BUZEI.
         insert ZFIE003_EMAT.
      ENDLOOP.

      LOOP AT I_ZFIE003_BKDOC INTO wa_ZFIE003_BKDOC.
         if wa_ZFIE003_BKDOC-SELEC = 'X'.
           ZFIE003_BMAT-MATNO = f_MATNO.
           ZFIE003_BMAT-ACTNO = wa_CurrentAct-ACTNO.
           ZFIE003_BMAT-DOCNO = wa_ZFIE003_BKDOC-DOCNO.
           insert ZFIE003_BMAT.
         endif.
      ENDLOOP.


      IF sy-subrc <> 0.
         ROLLBACK WORK.
         exit.
       else.
         COMMIT WORK.
         PERFORM GetBsisFromDb.
         PERFORM GetBKDocFromDb.
         clear tbx_250_1.
         clear tbx_250_2.
         CALL METHOD grid_250_1->refresh_table_display.
         CALL METHOD grid_250_2->refresh_table_display.
      ENDIF.
     ENDIF.

   when 'SMAT'.
     CLEAR FCODE_250.

     PERFORM GetMatFromDb.

     CALL SCREEN '0350'.

     PERFORM GetBsisFromDb.
     PERFORM GetBKDocFromDb.
     CALL METHOD grid_250_1->refresh_table_display.
     CALL METHOD grid_250_2->refresh_table_display.


   when 'UPL'.
     CLEAR FCODE_250.

     IF wa_CurrentAct-EDDAT <> '00000000'.
        MESSAGE '當前事務已經被關賬過,不可再修改!' type 'E'.
        EXIT.
     ENDIF.

     call screen '0010' starting at 30 5 ending at 80 10.

     PERFORM GetBKDocFromDb.
     clear tbx_250_2.
     CALL METHOD grid_250_2->refresh_table_display.

  when 'SNMAT'.
    CLEAR FCODE_250.
    DATA: I_ZFIE003_S_NMAT LIKE ZFIE003_S_NMAT OCCURS 0 WITH HEADER LINE.
    DATA: wa_ZFIE003_S_NMAT LIKE LINE OF I_ZFIE003_S_NMAT,
          wa2_ZFIE003_S_NMAT LIKE LINE OF I_ZFIE003_S_NMAT.
    DATA: ln like ZFIE003_S_NMAT-LINNO,
          ln2 like ZFIE003_S_NMAT-LINNO.



    ln = 1.
*    IF wa_CurrentAct-EDDAT = '00000000'.
*        MESSAGE '當前事務未關賬,最終列印餘額調節表!' type 'W'.
*        "EXIT.
*    ENDIF.


    CLEAR I_ZFIE003_S_NMAT[].

    CLEAR wa2_ZFIE003_S_NMAT.
    wa2_ZFIE003_S_NMAT-TEXT_A = '調整後(銀行存款)餘額'.
    wa2_ZFIE003_S_NMAT-TEXT_B = '調整後(銀行對賬單)餘額'.
    wa2_ZFIE003_S_NMAT-DMBTR_A = wa_CurrentAct-ETBLC.
    wa2_ZFIE003_S_NMAT-DMBTR_B = wa_CurrentAct-BKBLC.



    CLEAR I_ZFIE003_S_NMAT.
    I_ZFIE003_S_NMAT-LINNO = ln.
    I_ZFIE003_S_NMAT-TEXT_A = '銀行存款日記賬餘額'.
    I_ZFIE003_S_NMAT-BLDAT  = wa_CurrentAct-BUDAT.
    I_ZFIE003_S_NMAT-DMBTR_A = wa_CurrentAct-ETBLC.
    I_ZFIE003_S_NMAT-TEXT_B = '銀行對賬單餘額'.
    I_ZFIE003_S_NMAT-BUDAT  = wa_CurrentAct-BLDAT.
    I_ZFIE003_S_NMAT-DMBTR_B = wa_CurrentAct-BKBLC.
    APPEND I_ZFIE003_S_NMAT.
    ln = ln + 1.


    CLEAR I_ZFIE003_S_NMAT.
    CLEAR wa_ZFIE003_S_NMAT.
    I_ZFIE003_S_NMAT-LINNO = ln.
    I_ZFIE003_S_NMAT-TEXT_A = '  加:銀行已收,企業未收'.
    "I_ZFIE003_S_NMAT-BLDAT  = ''.
    I_ZFIE003_S_NMAT-DMBTR_A = 0.
    I_ZFIE003_S_NMAT-TEXT_B = '  加:企業已收,銀行未收'.
    "I_ZFIE003_S_NMAT-BUDAT  = ''.
    I_ZFIE003_S_NMAT-DMBTR_B = 0.
    MOVE I_ZFIE003_S_NMAT to wa_ZFIE003_S_NMAT. "暫存,求了彙總後再新增

    ln = ln + 1.
    ln2 = ln.

    LOOP AT I_ZFIE003_BKDOC WHERE SHKZG = 'S'.
      CLEAR I_ZFIE003_S_NMAT.
      I_ZFIE003_S_NMAT-LINNO = ln.
      I_ZFIE003_S_NMAT-TEXT_A = I_ZFIE003_BKDOC-PINFO.
      I_ZFIE003_S_NMAT-BLDAT  = I_ZFIE003_BKDOC-BLDAT .
      I_ZFIE003_S_NMAT-DMBTR_A = I_ZFIE003_BKDOC-DMBTR.
      wa_ZFIE003_S_NMAT-DMBTR_A = wa_ZFIE003_S_NMAT-DMBTR_A + I_ZFIE003_S_NMAT-DMBTR_A.
      APPEND I_ZFIE003_S_NMAT.
      ln = ln + 1.
    ENDLOOP.

    LOOP AT I_BSIS WHERE SHKZG = 'S'.
      CLEAR I_ZFIE003_S_NMAT.
      IF ln2 < ln.
        READ TABLE I_ZFIE003_S_NMAT with key LINNO = ln2.
        "I_ZFIE003_S_NMAT-LINNO = ln2.
        I_ZFIE003_S_NMAT-TEXT_B = I_BSIS-SGTXT.
        I_ZFIE003_S_NMAT-BUDAT  = I_BSIS-BLDAT .
        I_ZFIE003_S_NMAT-DMBTR_B = I_BSIS-DMBTR.
        I_ZFIE003_S_NMAT-BELNR = I_BSIS-BELNR.
        I_ZFIE003_S_NMAT-BUZEI = I_BSIS-BUZEI.

        wa_ZFIE003_S_NMAT-DMBTR_B = wa_ZFIE003_S_NMAT-DMBTR_B + I_ZFIE003_S_NMAT-DMBTR_B.
        modify  I_ZFIE003_S_NMAT  TRANSPORTING TEXT_B BUDAT DMBTR_B BELNR BUZEI where LINNO = ln2 .
        ln2 = ln2 + 1.

      ELSE.
        I_ZFIE003_S_NMAT-LINNO = ln.
        I_ZFIE003_S_NMAT-TEXT_B = I_BSIS-SGTXT.
        I_ZFIE003_S_NMAT-BUDAT  = I_BSIS-BLDAT .
        I_ZFIE003_S_NMAT-DMBTR_B = I_BSIS-DMBTR.
        I_ZFIE003_S_NMAT-BELNR = I_BSIS-BELNR.
        I_ZFIE003_S_NMAT-BUZEI = I_BSIS-BUZEI.
        wa_ZFIE003_S_NMAT-DMBTR_B = wa_ZFIE003_S_NMAT-DMBTR_B + I_ZFIE003_S_NMAT-DMBTR_B.
        APPEND I_ZFIE003_S_NMAT.
        ln = ln + 1.
      ENDIF.

    ENDLOOP.

    wa2_ZFIE003_S_NMAT-DMBTR_A = wa2_ZFIE003_S_NMAT-DMBTR_A + wa_ZFIE003_S_NMAT-DMBTR_A.
    wa2_ZFIE003_S_NMAT-DMBTR_B = wa2_ZFIE003_S_NMAT-DMBTR_B + wa_ZFIE003_S_NMAT-DMBTR_B.
    move wa_ZFIE003_S_NMAT to I_ZFIE003_S_NMAT.
    APPEND I_ZFIE003_S_NMAT. "新增彙總行





    CLEAR I_ZFIE003_S_NMAT.
    CLEAR wa_ZFIE003_S_NMAT.
    I_ZFIE003_S_NMAT-LINNO = ln.
    I_ZFIE003_S_NMAT-TEXT_A = '  減:銀行已付,企業未付'.
    "I_ZFIE003_S_NMAT-BLDAT  = ''.
    I_ZF