SAP筆記-abap 銀行對賬功能開發
阿新 • • 發佈:2019-01-05
前一段時間花了幾天重新設計了一下銀行對賬功能,其中用到了 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