.
*---------------------------------資料定義區域-------------------*
* 資料定義區域(全局變量,表,常量,資料類型等)
TYPE-POOLS:SLIS.
TABLES:KNA1,KNC3,T074T,TKUKT,BSIS,BSAS.
DATA:G_DOCKING TYPE REF TO CL_GUI_DOCKING_CONTAINER,
G_SPLITER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
G_CONTAINER TYPE REF TO CL_GUI_CONTAINER.
DATA:BEGIN OF IT_KNA1 OCCURS 0,
GSBER TYPE GSBER,
KUNNR LIKE KNA1-KUNNR,
KUKLA LIKE KNA1-KUKLA,
NAME1 LIKE KNA1-NAME1,
LTEXT LIKE T074T-LTEXT,
VTEXT TYPE BEZEI20,"直通車描述
END OF IT_KNA1.
DATA:BEGIN OF IT_DATA OCCURS 0,
CHECKBOX TYPE C,
KUNNR LIKE KNA1-KUNNR,
KUKLA LIKE KNA1-KUKLA,
NAME1 LIKE KNA1-NAME1,
LTEXT LIKE T074T-LTEXT,
VTEXT TYPE BEZEI20,"直通車描述
HABNL LIKE KNC3-HABNL,
HABNLX LIKE KNC3-HABNL,
GSBER TYPE GSBER,
BELNR LIKE BSIS-BELNR,
COLORX(4) TYPE C,
END OF IT_DATA.
DATA:IT_KNC3 LIKE TABLE OF KNC3 WITH HEADER LINE.
DATA:IT_ITAB_ALV LIKE TABLE OF IT_DATA WITH HEADER LINE.
DATA:BEGIN OF IT_KUNNR OCCURS 0,
KUNNR LIKE KNA1-KUNNR,
GSBER TYPE GSBER,
END OF IT_KUNNR.
*&--POST ACC
DATA: DOCUMENTHEADER LIKE TABLE OF BAPIACHE09 WITH HEADER LINE,
AC TYPE BAPIACGL09,"WA
ACCOUNTGL TYPE TABLE OF BAPIACGL09,
CU TYPE BAPIACCR09,"WA
CURRENCYAMOUNT TYPE TABLE OF BAPIACCR09,
ACCOUNTRECEIVABLE TYPE TABLE OF BAPIACAR09,
ACC TYPE BAPIACAR09,
RE TYPE BAPIRET2,
RETURN TYPE TABLE OF BAPIRET2.
DATA: BEGIN OF WA_OBJKEY ,
OBJ_KEY TYPE BAPIACHE09-OBJ_KEY,
END OF WA_OBJKEY.
DATA: IT_OBJKEY LIKE TABLE OF WA_OBJKEY,
OBJ_KEY TYPE BAPIACHE09-OBJ_KEY.
DATA: WA_RETURN TYPE BAPIRET2.
*DATA:BEGIN OF IT_ERROR OCCURS 10000,
* ERROR(100) TYPE C,
* END OF IT_ERROR.
*DATA: ERROR_TEXT TYPE STRING.
* 架構
DATA: GT_HEADER TYPE TABLE OF SLIS_LISTHEADER"頭檔案定義,固定.
WITH HEADER LINE,
GT_FIELDCAT_LVC TYPE LVC_T_FCAT
WITH HEADER LINE,
GR_FIELDCAT_LVC TYPE LVC_T_FCAT
WITH HEADER LINE,
GT_SORT_GRID TYPE LVC_T_SORT
WITH HEADER LINE,
GT_ROW_TABLE TYPE LVC_T_ROW
WITH HEADER LINE, "行選擇資料
OK_CODE LIKE SY-UCOMM.
* 固定格式
DATA: GRID TYPE REF TO CL_GUI_ALV_GRID, "ALVOO
GS_LAYOUT_ALV TYPE LVC_S_LAYO, "ALV布局
GS_TOOLBAR TYPE STB_BUTTON, "工具欄按鈕
G_CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER. "ALV容器
* 類聲明
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
DATA: EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.
* 常量定義
CONSTANTS:G_REPID LIKE SY-REPID VALUE SY-REPID, "目前系統
FCODE_BACK LIKE SY-UCOMM VALUE 'BACK', "傳回
* FCODE_DISP LIKE SY-UCOMM VALUE 'DISP', "工具欄上的自定按鈕
* FCODE_END LIKE SY-UCOMM VALUE 'END', "
FCODE_ENTER LIKE SY-UCOMM VALUE 'ENTER', "确定
FCODE_EXIT LIKE SY-UCOMM VALUE 'EXIT'. "退出
* FCODE_PLANE LIKE SY-UCOMM VALUE 'FLIGHT'. "工具欄上的自定按鈕
*---------------------------------資料定義區域< END >-------------------*
*----------------------------------主程式區域--------------------*
INITIALIZATION.
PERFORM FRM_INI.
*1 選擇螢幕
SELECTION-SCREEN BEGIN OF BLOCK BOX1
WITH FRAME TITLE TEXT-001.
PARAMETERS:P_BUKRS LIKE BSIS-BUKRS DEFAULT '1000',
P_GJAHR LIKE BSIS-GJAHR DEFAULT SY-DATUM+0(4).
SELECT-OPTIONS:S_SHBKZ FOR T074T-SHBKZ DEFAULT 'L'NO INTERVALS,
S_KTOKD FOR KNA1-KTOKD DEFAULT 'D001' TO 'D002',
S_KUKLA FOR KNA1-KUKLA DEFAULT '01' TO '02',
S_KUNNR FOR KNA1-KUNNR,
S_WERKS FOR KNA1-WERKS.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 2(79) SCSHOW.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BOX1.
START-OF-SELECTION.
PERFORM SET_QUANX. "權限
* 資料處理
PERFORM FRM_DATA_RD.
END-OF-SELECTION.
*調用DYPLNR
CALL SCREEN 100.
* &--------------------------- 類執行個體化
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS:
*- 指令按鈕
HANDLE_USER_COMMAND
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM,
*- 輕按兩下清單欄事件
HANDLE_DOUBLE_CLICK
FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW,
*- CHECKBOX
HANDLE_DATA_CHANGED
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED.
PRIVATE SECTION.
ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
*-------------------------------------------------------------------
* 事件方法
*---------------------------------------------------------------------------
METHOD HANDLE_USER_COMMAND.
*- 事件開始:
CASE E_UCOMM.
WHEN 'CHECKBOX'.
BREAK:WANGCHENGBIN.
ENDCASE.
ENDMETHOD. "handle_user_command
*-------------------------------------------------------------------
* 輕按兩下清單欄事件方法
METHOD HANDLE_DOUBLE_CLICK.
ENDMETHOD. "handle_button_click
*-----------------------------------------------------------------
* 單元格資料改變
METHOD HANDLE_DATA_CHANGED.
PERFORM HANDLE_DATA_CHANGED USING ER_DATA_CHANGED.
ENDMETHOD. "HANDLE_DATA_CHANGED
ENDCLASS. "l
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* 狀态欄
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'.
SET TITLEBAR 'TITLE_0100'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* 指令區域
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
DATA:ACTION LIKE SY-UCOMM.
ACTION = OK_CODE.
CLEAR: OK_CODE.
CASE ACTION.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'ACCPOST'.
PERFORM FRM_ACCPOST.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module PBO_INCLUDE OUTPUT
*&---------------------------------------------------------------------*
* 處理區域
*----------------------------------------------------------------------*
MODULE PBO_INCLUDE OUTPUT.
IF G_DOCKING IS INITIAL .
CREATE OBJECT G_DOCKING
EXPORTING
REPID = G_REPID
DYNNR = '0100'
SIDE = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_BOTTOM
EXTENSION = '440'
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
CREATE OBJECT G_SPLITER
EXPORTING
PARENT = G_DOCKING
ROWS = 1
COLUMNS = 1.
CALL METHOD G_SPLITER->GET_CONTAINER
EXPORTING
ROW = 1
COLUMN = 1
RECEIVING
CONTAINER = G_CONTAINER.
* 建立FIELDCAT
PERFORM FRM_FIELDCAT.
* 建立LAYOUT
PERFORM FRM_LAYOUT.
*3. ALV資料填充
CREATE OBJECT GRID
EXPORTING
I_PARENT = G_CONTAINER."使用畫布,此畫布放在上面的指定的容器中
CALL METHOD GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
* I_STRUCTURE_NAME = 'ZSFIR001' "參照結構
IS_LAYOUT = GS_LAYOUT_ALV "布局設定
CHANGING
IT_OUTTAB = IT_ITAB_ALV[] "資料源
IT_FIELDCATALOG = GR_FIELDCAT_LVC[]."字段
CALL METHOD GRID->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1. "使用方法set_ready_for_input 傳入參數
"i_ready_for_input = 1 可以是ALV 進入編輯狀态
CALL METHOD GRID->REGISTER_EDIT_EVENT "觸發資料改變事件
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED. "1.按回車觸發:mc_event_enter;2.MC_EVT_MODIFIED:單元格失去焦點
CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
EXPORTING
CONTROL = GRID. "SET_READY_FOR_INPUT,REGISTER_EDIT_EVENT,OO-ALV的單元編輯
CREATE OBJECT EVENT_RECEIVER.
SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR GRID.
SET HANDLER EVENT_RECEIVER->HANDLE_DOUBLE_CLICK FOR GRID.
SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR GRID. "ALV 單元編輯事件
ELSE.
CALL METHOD GRID->REFRESH_TABLE_DISPLAY.
ENDIF.
ENDMODULE. " PBO_INCLUDE OUTPUT
*&---------------------------------------------------------------------*
*& Form FRM_DATA_RD
*&---------------------------------------------------------------------*
* SQL語句 S_MTART
*----------------------------------------------------------------------*
FORM FRM_DATA_RD .
DATA:SALDV LIKE KNC3-SALDV, SOLLL LIKE KNC3-SOLLL,HABNL LIKE KNC3-HABNL,X1 LIKE KNC3-HABNL,X2 LIKE KNC3-HABNL.
DATA:WA_KNC3 LIKE LINE OF IT_KNC3.
DATA:KUKLA LIKE KNA1-KUKLA,KUNNR LIKE KNA1-KUNNR.
DATA:BEGIN OF IT_KUNNR2 OCCURS 100,
KUNNR LIKE KNA1-KUNNR,
END OF IT_KUNNR2.
CLEAR:IT_KNA1[],IT_KUNNR[].
*&---客戶資料,IT_KNA1
IF S_KUNNR[] IS NOT INITIAL.
CLEAR:S_WERKS[].
ENDIF.
IF S_WERKS[] IS NOT INITIAL.
SELECT KUNN2 AS KUNNR VKORG AS GSBER INTO TABLE IT_KUNNR FROM KNVP WHERE PARVW = 'RG' AND VKORG IN S_WERKS.
SORT IT_KUNNR BY KUNNR GSBER.
DELETE ADJACENT DUPLICATES FROM IT_KUNNR COMPARING KUNNR GSBER.
IF IT_KUNNR[] IS NOT INITIAL.
LOOP AT IT_KUNNR.
SELECT SINGLE KUNNR NAME1 KUKLA INTO (IT_KNA1-KUNNR,IT_KNA1-NAME1,IT_KNA1-KUKLA)
FROM KNA1 WHERE KUNNR = IT_KUNNR-KUNNR AND KTOKD IN S_KTOKD .
SELECT SINGLE VTEXT FROM TKUKT INTO IT_KNA1-VTEXT WHERE SPRAS = '1' AND KUKLA = IT_KNA1-KUKLA.
IF SY-SUBRC <> 0.
SELECT KUNNR INTO TABLE IT_KUNNR2 FROM KNVP WHERE KUNN2 = IT_KUNNR-KUNNR AND VKORG IN S_WERKS ORDER BY KUNNR.
DELETE ADJACENT DUPLICATES FROM IT_KUNNR2 COMPARING KUNNR.
LOOP AT IT_KUNNR2.
IF IT_KNA1-VTEXT IS NOT INITIAL.
CONTINUE.
ENDIF.
SELECT SINGLE KUKLA INTO KUKLA FROM KNA1 WHERE KUNNR = IT_KUNNR2-KUNNR.
IF SY-SUBRC = 0 AND KUKLA = '02'.
SELECT SINGLE VTEXT INTO IT_KNA1-VTEXT FROM TKUKT WHERE SPRAS = '1' AND KUKLA = KUKLA.
CONTINUE.
ENDIF.
ENDLOOP.
ENDIF.
IT_KNA1-GSBER = IT_KUNNR-GSBER.
APPEND IT_KNA1.
CLEAR:IT_KNA1,KUNNR,KUKLA,IT_KUNNR2[].
ENDLOOP.
SORT IT_KNA1 BY KUNNR.
ENDIF.
ELSE.
SELECT KUNN2 AS KUNNR VKORG AS GSBER INTO TABLE IT_KUNNR FROM KNVP WHERE PARVW = 'RG' AND KUNNR IN S_KUNNR.
SORT IT_KUNNR BY KUNNR GSBER.
DELETE ADJACENT DUPLICATES FROM IT_KUNNR COMPARING KUNNR GSBER.
LOOP AT IT_KUNNR.
SELECT SINGLE KUNNR NAME1 KUKLA INTO (IT_KNA1-KUNNR,IT_KNA1-NAME1,IT_KNA1-KUKLA)
FROM KNA1 WHERE KUNNR = IT_KUNNR-KUNNR AND KTOKD IN S_KTOKD .
SELECT SINGLE VTEXT FROM TKUKT INTO IT_KNA1-VTEXT WHERE SPRAS = '1' AND KUKLA = IT_KNA1-KUKLA.
IF SY-SUBRC <> 0.
SELECT KUNNR INTO TABLE IT_KUNNR2 FROM KNVP WHERE KUNN2 = IT_KUNNR-KUNNR AND VKORG IN S_WERKS ORDER BY KUNNR.
DELETE ADJACENT DUPLICATES FROM IT_KUNNR2 COMPARING KUNNR.
LOOP AT IT_KUNNR2.
IF IT_KNA1-VTEXT IS NOT INITIAL.
CONTINUE.
ENDIF.
SELECT SINGLE KUKLA INTO KUKLA FROM KNA1 WHERE KUNNR = IT_KUNNR2-KUNNR.
IF SY-SUBRC = 0 AND KUKLA = '02'.