OOALV案例
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
主程序
前言:
基本上所有的注释应该都是在代码中的,不过多赘述,早期的练习用的有些小问题懒得改,很多东西仅供参考。
代码如下(示例):
REPORT ZSF_OOALV_02.
INCLUDE ZSF_OOALV_02_TOP. "全局定义(包含OOALV的定义)
INCLUDE ZSF_OOALV_02_TOP2. "屏幕7000中的定义
INCLUDE ZSF_OOALV_02_SCREEN. "选择屏幕
INCLUDE ZSF_OOALV_02_F01. "选择屏幕查询与屏幕7000刷新
INCLUDE ZSF_OOALV_02_O01. "屏幕7000显示
INCLUDE ZSF_OOALV_02_I01. "屏幕7000中的点击事件
"在8000的屏幕中做修改与删除操作
INCLUDE ZSF_OOALV_02_O02. "屏幕8000中的显示状态
INCLUDE ZSF_OOALV_02_I02. "屏幕8000中的点击事件
INCLUDE ZSF_OOALV_02_F02. "存放导入方法,用于新建条目
INCLUDE ZSF_DOWNLOAD. "下载模板
一、top
代码如下(示例):
TABLES: ZCRM , SSCRFIELDS.
TYPES: BEGIN OF TY_DATA,
BOX,
ID TYPE ZCRM-ID,
RCODE TYPE ZCRM-REGION_CODE,
RNAME TYPE ZCRM-REGION_NAME,
PID TYPE ZCRM-PARENT_ID,
PCODE TYPE ZCRM-PARENT_CODE,
RTYPE TYPE ZCRM-REGION_TYPE,
SRCODE TYPE ZCRM-SAP_REGION_CODE,
END OF TY_DATA.
DATA: GT_SAVE TYPE TABLE OF ZCRM WITH HEADER LINE,
GT_CHANGE TYPE TABLE OF ZCRM WITH HEADER LINE,
GW_CHANGE TYPE ZCRM.
DATA: GT_DATA TYPE TABLE OF TY_DATA,
GW_DATA TYPE TY_DATA.
*DATA: GW_MARA LIKE LINE OF GT_DATA,
* GT_MARA TYPE TY_DATA OCCURS 0.
"屏幕7000
"标题输出
*DATA: P_MATNR TYPE MARA-MATNR,
* P_MTART TYPE MARA-MTART,
* P_MATKL TYPE MARA-MATKL.
DATA: P_ID TYPE ZCRM-ID,
P_RCODE TYPE ZCRM-REGION_CODE,
P_RNAME TYPE ZCRM-REGION_NAME,
P_PID TYPE ZCRM-PARENT_ID,
P_PCODE TYPE ZCRM-PARENT_CODE,
P_RTYPE TYPE ZCRM-REGION_TYPE,
P_SRCODE TYPE ZCRM-SAP_REGION_CODE.
"屏幕8000
DATA: P_ID2 TYPE ZCRM-ID,
P_RCODE2 TYPE ZCRM-REGION_CODE,
P_RNAME2 TYPE ZCRM-REGION_NAME,
P_PID2 TYPE ZCRM-PARENT_ID,
P_PCODE2 TYPE ZCRM-PARENT_CODE,
P_RTYPE2 TYPE ZCRM-REGION_TYPE,
P_SRCODE2 TYPE ZCRM-SAP_REGION_CODE.
"创建指示标识。
DATA: G_INDIC TYPE C.
DATA: G_CODE TYPE SY-UCOMM.
DATA: GT_ROW TYPE LVC_T_ROID,
GW_ROW TYPE LVC_S_ROID.
"屏幕定义
"初始化ALV表格控件
DATA : GRID TYPE REF TO CL_GUI_ALV_GRID. "ALV表格控件对应的全局类
"创建ALV控制容器
DATA : C_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER."控件容器
"DATA : GT_FIELDCAT TYPE LVC_T_FCAT. "宏定义
DATA : GT_FIELDCAT TYPE LVC_T_FCAT WITH HEADER LINE.
DATA : GW_LAYOUT TYPE LVC_S_LAYO. "ALV布局设置(外观设置)
DATA : OK_CODE(8)."点击事件
DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
"定义宏结构
DEFINE DE_FIELDCAT.
CLEAR GT_FIELDCAT.
GT_FIELDCAT-FIELDNAME = &1. "字段名
GT_FIELDCAT-SCRTEXT_L = &2. "字段长描述
GT_FIELDCAT-KEY = &3. "主键,蓝底显示,默认冻结列
GT_FIELDCAT-CHECKBOX = &4. "选择
GT_FIELDCAT-EDIT = &5. "设置为可编辑
APPEND GT_FIELDCAT.
END-OF-DEFINITION.
CLASS ALV_DISPLAY_7000 DEFINITION. "定义事件处理类
PUBLIC SECTION."初始化ALV工具栏对象事件,如增加按钮并设定属性
METHODS: HANDLE_TOOLBAR
FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
IMPORTING E_OBJECT E_INTERACTIVE.
"alv工具栏按钮点击事件
METHODS: HANDLE_USER_COMMAND
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM.
"alv表格双击事件
METHODS: HANDLE_DOUBLE_CLICK
FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW E_COLUMN ES_ROW_NO.
"数据改变触发,alv数据修改事件
* METHODS: HANDLE_DATA_CHANGED
* FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
* IMPORTING ER_DATA_CHANGED.
PRIVATE SECTION.
ENDCLASS.
CLASS ALV_DISPLAY_9000 DEFINITION."定义事件处理类
PUBLIC SECTION. "初始化ALV工具栏对象事件
"定义,添加状态栏按钮
METHODS: HANDLE_TOOLBAR
FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
IMPORTING E_OBJECT E_INTERACTIVE.
"alv工具栏按钮点击事件
METHODS: HANDLE_USER_COMMAND
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM.
PRIVATE SECTION.
ENDCLASS.
"批导用的屏幕
二、top2
代码如下(示例):
*&---------------------------------------------------------------------*
*& 包含 ZSF_OOALV_02_TOP2
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Class (Implementation) ALV_DISPLAY_7000
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS ALV_DISPLAY_7000 IMPLEMENTATION.
METHOD HANDLE_TOOLBAR.
DATA: LS_TOOLBAR TYPE STB_BUTTON. "参考STB_BUTTON创建工作区,用于存放自定义按钮
CLEAR LS_TOOLBAR.
MOVE 3 TO LS_TOOLBAR-BUTN_TYPE. " 3 为竖杠
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE 'B_SUM' TO LS_TOOLBAR-FUNCTION."按钮对应的FunctionCode
MOVE 0 TO LS_TOOLBAR-BUTN_TYPE. "0 为标准按钮
MOVE ICON_DISPLAY TO LS_TOOLBAR-ICON. "按钮图标
MOVE '总行数' TO LS_TOOLBAR-TEXT. "按钮标签
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE 3 TO LS_TOOLBAR-BUTN_TYPE.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE 'DESELECT_ALL' TO LS_TOOLBAR-FUNCTION.
MOVE 0 TO LS_TOOLBAR-BUTN_TYPE.
MOVE ICON_DESELECT_ALL TO LS_TOOLBAR-ICON.
MOVE '取消全选' TO LS_TOOLBAR-TEXT.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE 'REFRESH' TO LS_TOOLBAR-FUNCTION.
MOVE 0 TO LS_TOOLBAR-BUTN_TYPE.
MOVE ICON_REFRESH TO LS_TOOLBAR-ICON.
MOVE '刷新' TO LS_TOOLBAR-TEXT.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE 3 TO LS_TOOLBAR-BUTN_TYPE.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
ENDMETHOD.
"alv工具栏单点事件
METHOD HANDLE_USER_COMMAND.
DATA: RS_SELFIELD TYPE SLIS_SELFIELD.
"刷新屏幕
DATA: SUM TYPE I.
*IF E_UCOMM = 'B_SUM'.
* DESCRIBE TABLE GT_DATA LINES SUM.
* MESSAGE I001(00) WITH '当前ALV表这中的数据总行数为:' SUM DISPLAY LIKE 'E'.
*ENDIF.
CASE E_UCOMM.
WHEN 'B_SUM'.
DESCRIBE TABLE GT_DATA LINES SUM.
MESSAGE I001(00) WITH '当前ALV表这中的数据总行数为:' SUM .
WHEN 'REFRESH'.
"刷新显示事件
PERFORM REFRESH_DATA.
PERFORM DISPLAY_DATA.
RS_SELFIELD-REFRESH = 'X'.
CALL METHOD GRID->REFRESH_TABLE_DISPLAY.
" WHEN ''.
ENDCASE.
ENDMETHOD.
"双击事件
METHOD HANDLE_DOUBLE_CLICK.
ENDMETHOD.
"修改事件
* METHOD HANDLE_DATA_CHANGED.
* CALL METHOD UPDATE_DELAT_TBLES( ER_DATA_CHANGED ).
* ENDMETHOD.
*
* METHOD UPDATE_DELAT_TBLES.
* ENDMETHOD.
ENDCLASS.
DATA : EVENT_RECEIVER TYPE REF TO ALV_DISPLAY_7000.
*&---------------------------------------------------------------------*
*& Class (Implementation) ALV_DISPLAY_9000
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
CLASS ALV_DISPLAY_9000 IMPLEMENTATION.
METHOD HANDLE_TOOLBAR.
DATA: LS_TOOLBAR2 TYPE STB_BUTTON. "参考STB_BUTTON创建工作区,用于存放自定义按钮
CLEAR LS_TOOLBAR2.
MOVE 3 TO LS_TOOLBAR2-BUTN_TYPE. " 3 为竖杠
APPEND LS_TOOLBAR2 TO E_OBJECT->MT_TOOLBAR.
CLEAR LS_TOOLBAR2.
MOVE 'UPLOAD' TO LS_TOOLBAR2-FUNCTION."按钮对应的FunctionCode
MOVE 0 TO LS_TOOLBAR2-BUTN_TYPE. "0 为标准按钮
" MOVE ICON_DISPLAY TO LS_TOOLBAR-ICON. "按钮图标
MOVE '修改' TO LS_TOOLBAR2-TEXT. "按钮标签
APPEND LS_TOOLBAR2 TO E_OBJECT->MT_TOOLBAR.
ENDMETHOD.
METHOD HANDLE_USER_COMMAND.
* CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "响应后刷新
* IMPORTING
* E_GRID = LR_GRID.
*
* CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
CASE E_UCOMM.
WHEN 'UPLOAD'.
MODIFY ZCRM FROM TABLE @( CORRESPONDING #( GT_CHANGE[] ) ).
IF SY-SUBRC = 0.
MESSAGE '更新成功!' TYPE 'S' DISPLAY LIKE 'S'.
LOOP AT GT_CHANGE INTO GW_CHANGE .
" MOVE-CORRESPONDING GW_CHANGE TO GW_DATA. 结构参照不同无法使用
GW_DATA-ID = GW_CHANGE-ID.
GW_DATA-RCODE = GW_CHANGE-REGION_CODE.
GW_DATA-RNAME = GW_CHANGE-REGION_NAME.
GW_DATA-PID = GW_CHANGE-PARENT_ID.
GW_DATA-PCODE = GW_CHANGE-PARENT_CODE.
GW_DATA-RTYPE = GW_CHANGE-REGION_TYPE.
GW_DATA-SRCODE = GW_CHANGE-SAP_REGION_CODE.
MODIFY TABLE GT_DATA FROM GW_DATA.
ENDLOOP.
LEAVE TO SCREEN 0.
ELSE.
MESSAGE '更新失败' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDCASE.
ENDMETHOD.
ENDCLASS.
DATA : EVENT_RECEIVER2 TYPE REF TO ALV_DISPLAY_9000.
三.SCREEN
代码如下(示例):
*&---------------------------------------------------------------------*
*& 包含 ZSF_OOALV_02_SCREEN
*&---------------------------------------------------------------------*
*SELECTION-SCREEN BEGIN OF BLOCK B1K1 WITH FRAME TITLE TEXT-T01.
* SELECTION-SCREEN SKIP.
*
* SELECTION-SCREEN SKIP.
* SELECTION-SCREEN END OF BLOCK B1K1.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN BEGIN OF BLOCK B1K2 WITH FRAME TITLE TEXT-T02.
PARAMETERS: P_RB1 RADIOBUTTON GROUP G1 DEFAULT 'X' USER-COMMAND F1,
P_RB2 RADIOBUTTON GROUP G1.
SELECTION-SCREEN SKIP.
SELECT-OPTIONS: S_ID FOR ZCRM-ID MODIF ID M2.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN PUSHBUTTON /1(12) TEXT_BUT USER-COMMAND BLD MODIF ID M1.
SELECTION-SCREEN SKIP.
PARAMETERS: P_FILE LIKE RLGRAP-FILENAME MODIF ID M1 . "上传文件
SELECTION-SCREEN END OF BLOCK B1K2.
INITIALIZATION.
SSCRFIELDS-FUNCTXT_01 = '@0Q@查询'.
TEXT_BUT = '@0Q@模板下载'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. "文件搜索帮助
PERFORM GET_FILENAME.
"隐藏与显示,查询与批导
AT SELECTION-SCREEN OUTPUT.
PERFORM SET_SCREEN.
"查询时按按钮
AT SELECTION-SCREEN .
PERFORM SELECTION_SCREEN_PAI.
*&---------------------------------------------------------------------*
*& Form SET_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SET_SCREEN .
LOOP AT SCREEN.
IF P_RB1 IS NOT INITIAL.
IF SCREEN-GROUP1 = 'M1'.
SCREEN-ACTIVE = 0.
ENDIF.
ENDIF.
IF P_RB2 IS NOT INITIAL.
IF SCREEN-GROUP1 = 'M2'.
SCREEN-ACTIVE = 0.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_FILENAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM GET_FILENAME .
CALL FUNCTION 'F4_FILENAME'
EXPORTING
PROGRAM_NAME = SYST-CPROG "此处填SY-CPROG同样
DYNPRO_NUMBER = SYST-DYNNR
FIELD_NAME = ' '
IMPORTING
FILE_NAME = P_FILE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SELECTION_SCREEN_PAI
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SELECTION_SCREEN_PAI .
CASE SSCRFIELDS-UCOMM.
WHEN 'FC01'.
PERFORM FIND_DATA.
CALL SCREEN '7000'.
WHEN 'BLD'.
PERFORM DOWLOAD_DATA.
ENDCASE.
ENDFORM.
四.F01
实例代码:
*&---------------------------------------------------------------------*
*& 包含 ZSF_OOALV_02_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FIND_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FIND_DATA .
SELECT
ID
REGION_CODE AS RCODE
REGION_NAME AS RNAME
PARENT_ID AS PID
PARENT_CODE AS PCODE
REGION_TYPE AS RTYPE
SAP_REGION_CODE AS SRCODE
FROM ZCRM
INTO CORRESPONDING FIELDS OF TABLE GT_DATA
WHERE ID IN S_ID.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form REFRESH_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM REFRESH_DATA .
"刷新屏幕
CLEAR GT_DATA.
SELECT
ID
REGION_CODE AS RCODE
REGION_NAME AS RNAME
PARENT_ID AS PID
PARENT_CODE AS PCODE
REGION_TYPE AS RTYPE
SAP_REGION_CODE AS SRCODE
FROM ZCRM
INTO CORRESPONDING FIELDS OF TABLE GT_DATA.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHANGE_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM CHANGE_DATA .
DATA: NUM TYPE I VALUE 0.
"修改选中条目
"第一步,将选中的信息提取出来
LOOP AT GT_ROW INTO GW_ROW.
READ TABLE GT_DATA INTO GW_DATA INDEX GW_ROW-ROW_ID.
IF SY-SUBRC = 0.
GW_DATA-BOX = 'X'.
ENDIF.
NUM = NUM + 1.
MODIFY GT_DATA FROM GW_DATA INDEX SY-TABIX TRANSPORTING BOX.
CLEAR GW_DATA.
CLEAR GW_ROW.
ENDLOOP.
IF NUM > 1.
MESSAGE '每次修改仅可选择一条!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE TO SCREEN '7000'.
ENDIF.
SORT GT_DATA BY BOX.
READ TABLE GT_DATA WITH KEY BOX = 'X' BINARY SEARCH TRANSPORTING NO FIELDS.
IF SY-SUBRC <> 0.
MESSAGE '在修改前必须进行选择!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE TO SCREEN '7000'.
ELSE.
"将数据存入屏幕8000中。
LOOP AT GT_DATA INTO GW_DATA WHERE BOX = 'X'.
P_ID2 = GW_DATA-ID.
P_RCODE2 = GW_DATA-RCODE.
P_RNAME2 = GW_DATA-RNAME.
P_PID2 = GW_DATA-PID.
P_PCODE2 = GW_DATA-PCODE.
P_RTYPE2 = GW_DATA-RTYPE.
P_SRCODE2 = GW_DATA-SRCODE.
ENDLOOP.
ENDIF.
ENDFORM.
五.O01
实例代码:
*&---------------------------------------------------------------------*
*& 包含 ZSF_OOALV_02_O01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module ALV_DISPLAY OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE ALV_DISPLAY OUTPUT.
SET PF-STATUS 'STATUS_7000'.
* SET TITLEBAR 'xxx'.
PERFORM DISPLAY_DATA.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM DISPLAY_DATA .
IF C_CUSTOM_CONTAINER IS INITIAL.
REFRESH GT_FIELDCAT.
* DE_FIELDCAT 'BOX' '' '' ''.
DE_FIELDCAT 'ID' '市区域ID' '' '' ''.
DE_FIELDCAT 'RCODE' '市区域码' '' '' ''.
DE_FIELDCAT 'RNAME' '市区域名称' '' '' ''.
DE_FIELDCAT 'PID' '省区域ID' '' '' ''.
DE_FIELDCAT 'PCODE' '省区域码' '' '' ''.
DE_FIELDCAT 'RTYPE' '区域类型码' '' '' ''.
DE_FIELDCAT 'SRCODE' 'SAP地区代码' '' '' ''.
CREATE OBJECT C_CUSTOM_CONTAINER "创建ALV显示的实例
EXPORTING
CONTAINER_NAME = 'CONT1'.
CREATE OBJECT GRID
EXPORTING
I_PARENT = C_CUSTOM_CONTAINER.
GW_LAYOUT-CWIDTH_OPT = 'X'.
"复选框
GW_LAYOUT-SEL_MODE = 'D'.
"无法用过字段来记录,所以调用方法
" GW_LAYOUT-STYLEFNAME = 'SRCODE'.
"当查询出来的内表不为空时,显示ALV
IF GT_DATA IS NOT INITIAL.
CALL METHOD GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = GW_LAYOUT
CHANGING
IT_OUTTAB = GT_DATA
IT_FIELDCATALOG = GT_FIELDCAT[]
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
CREATE OBJECT: EVENT_RECEIVER. " 为ALV按钮注册监听事件
SET HANDLER: EVENT_RECEIVER->HANDLE_TOOLBAR FOR GRID.
SET HANDLER: EVENT_RECEIVER->HANDLE_USER_COMMAND FOR GRID.
ENDIF.
CALL METHOD GRID->REFRESH_TABLE_DISPLAY. "刷新内表
CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
EXPORTING
CONTROL = GRID.
ENDFORM.
六.I01
*&---------------------------------------------------------------------*
*& 包含 ZSF_OOALV_02_I01
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_7000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_7000 INPUT.
" DATA : SELFIELD TYPE SLIS_SELFIELD.
* RANGES: R_MATNR FOR MARA-MATNR, "将单值转换为区间形式
* R_MTART FOR MARA-MTART,
* R_MATKL FOR MARA-MATKL.
RANGES: R_ID FOR ZCRM-ID,
R_RCODE FOR ZCRM-REGION_CODE,
R_RNAME FOR ZCRM-REGION_NAME,
R_PID FOR ZCRM-PARENT_ID,
R_PCODE FOR ZCRM-PARENT_CODE,
R_RTYPE FOR ZCRM-REGION_TYPE,
R_SRCODE FOR ZCRM-SAP_REGION_CODE.
"刷新屏幕
DATA: LS_STABLE TYPE LVC_S_STBL. "刷新稳定性
LS_STABLE-ROW = '1'.
LS_STABLE-COL = '1'.
CASE OK_CODE.
WHEN 'EXIT' OR 'CANCEL' OR 'BAC'.
LEAVE TO SCREEN 0.
WHEN 'CHEAK'.
* REFRESH : R_MATNR , R_MTART , R_MATKL.
* IF P_MATNR IS NOT INITIAL.
* CLEAR R_MATNR.
* R_MATNR-OPTION = 'EQ'.
* R_MATNR-SIGN = 'I'.
* R_MATNR-LOW = P_MATNR.
* APPEND R_MATNR.
* ENDIF.
* IF P_MTART IS NOT INITIAL.
* CLEAR R_MTART.
* R_MTART-OPTION = 'EQ'.
* R_MTART-SIGN = 'I'.
* R_MTART-LOW = P_MTART.
* APPEND R_MTART.
* ENDIF.
* IF P_MATKL IS NOT INITIAL.
* CLEAR R_MATKL.
* R_MATKL-OPTION = 'EQ'.
* R_MATKL-SIGN = 'I'.
* R_MATKL-LOW = P_MATKL.
* APPEND R_MATKL.
* ENDIF.
*
* CLEAR GT_DATA.
* SELECT
* MATNR
* MTART
* MBRSH
* MATKL
* FROM MARA
* INTO CORRESPONDING FIELDS OF TABLE GT_DATA
* WHERE MATNR IN R_MATNR
* AND MTART IN R_MTART
* AND MATKL IN R_MATKL.
REFRESH : R_ID , R_RCODE , R_RNAME , R_PID , R_PCODE , R_RTYPE , R_SRCODE.
IF P_ID IS NOT INITIAL.
CLEAR R_ID.
R_ID-OPTION = 'EQ'.
R_ID-SIGN = 'I'.
R_ID-LOW = P_ID.
APPEND R_ID.
ENDIF.
IF P_RCODE IS NOT INITIAL.
CLEAR R_RCODE.
R_RCODE-OPTION = 'EQ'.
R_RCODE-SIGN = 'I'.
R_RCODE-LOW = P_RCODE.
APPEND R_RCODE.
ENDIF.
IF P_RNAME IS NOT INITIAL.
CLEAR R_RNAME.
R_RNAME-OPTION = 'EQ'.
R_RNAME-SIGN = 'I'.
R_RNAME-LOW = P_RNAME.
APPEND R_RNAME.
ENDIF.
IF P_PID IS NOT INITIAL.
CLEAR R_PID.
R_PID-OPTION = 'EQ'.
R_PID-SIGN = 'I'.
R_PID-LOW = P_PID.
APPEND R_PID.
ENDIF.
IF P_PCODE IS NOT INITIAL.
CLEAR R_PCODE.
R_PCODE-OPTION = 'EQ'.
R_PCODE-SIGN = 'I'.
R_PCODE-LOW = P_PCODE.
APPEND R_PCODE.
ENDIF.
IF P_RTYPE IS NOT INITIAL.
CLEAR R_RTYPE.
R_RTYPE-OPTION = 'EQ'.
R_RTYPE-SIGN = 'I'.
R_RTYPE-LOW = P_RTYPE.
APPEND R_RTYPE.
ENDIF.
IF P_SRCODE IS NOT INITIAL.
CLEAR R_SRCODE.
R_SRCODE-OPTION = 'EQ'.
R_SRCODE-SIGN = 'I'.
R_SRCODE-LOW = P_SRCODE.
APPEND R_SRCODE.
ENDIF.
CLEAR GT_DATA.
SELECT
ID
REGION_CODE AS RCODE
REGION_NAME AS RNAME
PARENT_ID AS PID
PARENT_CODE AS PCODE
REGION_TYPE AS RTYPE
SAP_REGION_CODE AS SRCODE
FROM ZCRM
INTO CORRESPONDING FIELDS OF TABLE GT_DATA
WHERE ID IN R_ID
AND REGION_CODE IN R_RCODE
AND REGION_NAME IN R_RNAME
AND PARENT_ID IN R_PID
AND PARENT_CODE IN R_PCODE
AND REGION_TYPE IN R_RTYPE
AND SAP_REGION_CODE IN R_SRCODE.
"刷新屏幕调用
CALL METHOD GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE.
"添加新条目
WHEN 'ADD'.
CLEAR G_INDIC.
G_INDIC = 'A'. "A标识添加add
CALL SCREEN '8000' STARTING AT 10 8.
"修改选中的条目
WHEN 'CHANGE'.
* READ TABLE GT_DATA INTO GW_DATA WITH KEY BOX = 'X' BINARY SEARCH TRANSPORTING NO FIELDS.
* IF SY-SUBRC = 0.
CLEAR G_INDIC.
"返回行号
CALL METHOD GRID->GET_SELECTED_ROWS
IMPORTING
ET_ROW_NO = GT_ROW.
"将选中的条目存入另一张内表中
PERFORM CHANGE_DATA.
"调用屏幕8000,但为显示状态,部分可修改
G_INDIC = 'C'.
" CALL SCREEN '9000'.
CALL SCREEN '8000'STARTING AT 10 8.
* ELSE.
* MESSAGE '请选择条目进行更改!' TYPE 'S' DISPLAY LIKE 'E'.
* ENDIF.
WHEN 'DELETE'.
"返回行号
CALL METHOD GRID->GET_SELECTED_ROWS
IMPORTING
ET_ROW_NO = GT_ROW.
"第一步,将选中的信息提取出来
LOOP AT GT_ROW INTO GW_ROW.
READ TABLE GT_DATA INTO GW_DATA INDEX GW_ROW-ROW_ID.
IF SY-SUBRC = 0.
GW_DATA-BOX = 'X'.
ENDIF.
MODIFY GT_DATA FROM GW_DATA INDEX SY-TABIX TRANSPORTING BOX.
CLEAR GW_DATA.
CLEAR GW_ROW.
ENDLOOP.
LOOP AT GT_DATA INTO GW_DATA WHERE BOX = 'X'.
DELETE FROM ZCRM WHERE ID = GW_DATA-ID.
IF SY-SUBRC = 0.
MESSAGE '删除成功!' TYPE 'S' DISPLAY LIKE 'S'.
ENDIF.
DELETE TABLE GT_DATA FROM GW_DATA.
ENDLOOP.
ENDCASE.
ENDMODULE.
七.O02
ooalv的显示,我记得这里是创建跟修改是用的同一个屏幕,所以需要设置,创建时全部字段可修改,修改时主键不能动,因为要用主键作为索引取更新数据。
*&---------------------------------------------------------------------*
*& 包含 ZSF_OOALV_02_O02
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_8000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_8000 OUTPUT.
SET PF-STATUS 'STATUS_8000'.
SET TITLEBAR '8000'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module SET_FIELD_STATUS OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE SET_FIELD_STATUS OUTPUT.
*CHECK G_INDIC = 'A'.
*
**LOOP AT SCREEN.
** IF SCREEN-NAME = ''.
**
** ENDIF.
**
**ENDLOOP.
*LOOP AT SCREEN.
*IF SY-UNAME <> 'KF178'.
* IF SCREEN-NAME = 'BUTTEN1'.
* SCREEN-INPUT = 1.
* MESSAGE '该按钮不可用' TYPE 'S' DISPLAY LIKE 'E'.
* LEAVE LIST-PROCESSING.
*
* ENDIF.
* MODIFY SCREEN.
*ENDIF.
*
*ENDLOOP.
"当为C是,是进行数据修改
CHECK G_INDIC = 'C'.
"当为修改时,其主键ID为不可更改!
LOOP AT SCREEN.
IF SCREEN-NAME = 'P_ID2'.
SCREEN-INPUT = 0. "不可编辑,当为修改时,ID不可修改!
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDMODULE.
八.I02
屏幕8000的点击事件
*&---------------------------------------------------------------------*
*& 包含 ZSF_OOALV_02_I02
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_8000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_8000 INPUT.
CLEAR G_CODE.
G_CODE = SY-UCOMM.
CALL METHOD GRID->CHECK_CHANGED_DATA.
CASE G_CODE.
WHEN 'REF'.
CLEAR G_CODE.
LEAVE TO SCREEN 0.
WHEN 'LEAVE'.
CLEAR G_CODE.
LEAVE TO SCREEN 0.
WHEN 'SAVE'.
PERFORM SAVE_SAVE.
" LEAVE TO SCREEN 0.
ENDCASE.
CALL METHOD GRID->CHECK_CHANGED_DATA.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module EXIT_8000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE EXIT_8000 INPUT.
CASE OK_CODE.
WHEN 'BACK'.
CLEAR OK_CODE.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
九.F01
因为这里使用的数据库表是自己创建练习用的,所以不需要判断数据是否正确,具体数据判断请结合业务场景。
*&---------------------------------------------------------------------*
*& 包含 ZSF_OOALV_02_F02
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form SAVE_SAVE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SAVE_SAVE .
"暂时不对传入的值做判断
GT_SAVE-ID = P_ID2.
GT_SAVE-REGION_CODE = P_RCODE2.
GT_SAVE-REGION_NAME = P_RNAME2.
GT_SAVE-PARENT_ID = P_PID2.
GT_SAVE-PARENT_CODE = P_PCODE2.
GT_SAVE-REGION_TYPE = P_RTYPE2.
GT_SAVE-SAP_REGION_CODE = P_SRCODE2.
APPEND GT_SAVE.
IF GT_SAVE[] IS NOT INITIAL.
MODIFY ZCRM FROM TABLE @( CORRESPONDING #( GT_SAVE[] ) ).
IF SY-SUBRC = 0.
MESSAGE '创建成功!' TYPE 'S' DISPLAY LIKE 'S'.
LEAVE TO SCREEN 0.
ENDIF.
ENDIF.
CLEAR GT_SAVE[].
"添加完后需要刷新页面,进行显示
ENDFORM.
十.附加DOWNLOAD
下载模板部分。
*&---------------------------------------------------------------------*
*& 包含 ZSF_DOWNLOAD
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form DOWLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM DOWLOAD_DATA .
DATA: LV_FILE TYPE STRING.
DATA: BEGIN OF TY_DOWNLOAD OCCURS 0,
ID(010) VALUE '市区域ID',
RCODE(010) VALUE '市区域码',
RNAME(010) VALUE '市区域名称',
PID(010) VALUE '省区域ID(市归属地)',
PCODE(010) VALUE '省区域码',
RTYPE(010) VALUE '区域类型码',
SRCODE(010) VALUE 'SAP地区代码',
END OF TY_DOWNLOAD.
REFRESH TY_DOWNLOAD. " 清空表体
APPEND TY_DOWNLOAD. "从表中行增加标题的内容
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = '城市维护导入'
MASK = ',Excel文件(*.xls),*.xls.'
MODE = 'S'
TITLE = '保存文件路径'
IMPORTING
FILENAME = LV_FILE
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5 .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
CHECK LV_FILE IS NOT INITIAL.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
FILENAME = LV_FILE
WRITE_FIELD_SEPARATOR = 'X'
TABLES
DATA_TAB = TY_DOWNLOAD
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
十一.其它
一些其他的部分,因为ooalv涉及到要自己画屏幕,所以这里只展示画完的样子,同样的也需要自己在GUI状态中设置代码中对应的部分。按钮之类的需要自己添加。
post SAP-Garson
原文链接:https://blog.csdn.net/weixin_44715527/article/details/126425269文章来自于网络,如果侵犯了您的权益,请联系站长删除!