ALV和OOALV

ALV

总的大体的执行顺序如下:

REPORT ZT_RETURN.
include ZT_RETURN_TOP."变量定义
include ZT_RETURN_SEL."选择屏幕
include ZT_RETURN_FRM."方法
START-OF-SELECTION.
  "获取数据
  PERFORM frm_get_data.
  "设置alv的显示列
  PERFORM frm_set_fieldcat.
  "设置alv的显示样式
  PERFORM frm_set_layout.
  "显示alv
  PERFORM frm_display_alv.
end-OF-SELECTION.

1、ZT_RETURN_TOP:变量的定义

"定义一个内表来接收查询到的数据
TYPES:BEGIN OF T_RETURN,
        EBELN type EKPO-EBELN,
        EBELP type EKPO-EBELP,
        MATNR type EKPO-MATNR,
        MENGE type EKPO-MENGE,
      END OF T_STORETURN.
DATA: LT_RETURN TYPE TABLE OF T_RETURN,
      LS_RETURN TYPE T_RETURN.
"声明ALV的对象
DATA:gs_layout_lvc TYPE lvc_s_layo,
     gt_fcat_lvc   TYPE lvc_t_fcat,
     gs_fcat_lvc   TYPE lvc_s_fcat.

2、ZT_RETURN_SEL:定义对应的选择屏幕

```clike
TABLES:ekko,ekpo,lips.
SELECT-OPTIONS: P_BSTYP FOR EKKO-BSTYP,
                P_EBELN FOR EKPO-EBELN,
                P_LGORT for lips-LGORT."库存地点

3、ZT_RETURN_FRM:定义对应的方法

FORM FRM_GET_DATA ."查询对应的数据到内表LT_RETURN中

ENDFORM.
FORM FRM_SET_FIELDCAT . "设置显示的列名已经长度等基本属性
  DEFINE set_fieldcat.
  CLEAR gs_fcat_lvc .
  gs_fcat_lvc-fieldname = &1."内表的字段
  gs_fcat_lvc-outputlen = &2."输出长度
  gs_fcat_lvc-scrtext_l = &3."在ALV里面显示的名字
  gs_fcat_lvc-just      = &4."水平对齐方式,L左对齐,R右对齐。
  gs_fcat_lvc-no_zero   = &5."去除前导零
  APPEND gs_fcat_lvc TO gt_fcat_lvc .
  END-OF-DEFINITION.
  set_fieldcat:'EBELN'  '' '凭证' '' '',
               'EBELP' '' '行项目' '' '',
               'MATNR' '' '物料' '' ''.
ENDFORM.

FORM FRM_SET_LAYOUT .    "设置alv的显示样式
  CLEAR:gs_layout_lvc.
  gs_layout_lvc-zebra     = 'X'.
  gs_layout_lvc-cwidth_opt   = 'X'.
ENDFORM.

FORM FRM_DISPLAY_ALV .      "alv显示
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      is_layout_lvc      = gs_layout_lvc
      it_fieldcat_lvc    = gt_fcat_lvc
      i_save             = 'A'
    TABLES
      t_outtab           = LT_STORETURN
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

注:
1、选择屏幕中的p_werks如果要显示为中文:菜单–转到–文本元素–选择文本–在对应的行中输入中文
2、如果alv显示后,上面的一排菜单没反应的话,则去事务代码(se41),按图输入对应的程序及状态名:
SAPLKKBL
STANDARD_FULLSCREEN

在这里插入图片描述

**

说下abap程序对应事件的执行顺序:

**
1、INITIATION: 初始化事件,用于程序初始化,例如选择屏幕中字段默认值的填充。
2、START-OF-SELECTION: 选择开始事件,如果报表中含有选择屏幕,则在选择屏幕的处理结束后触发
3、END-OF-SELECTION:选择结束事件,如果程序中使用逻辑数据库,则在所有逻辑数据处理结束后触发。一般在该事件中输出列表。
4、AT SELECTION-SCREEN OUTPUT :显示选择屏幕之前触发。
5、AT SELECTION-SCREEN:选择屏幕PAI事件,用户在选择屏幕中执行某些功能后被触发(比如:当用户输入不正确的值时,给处错误消息)
6、TOP-OF-PAGE:页眉控制,在每个新页面开始时触发
7、END-OF-PAGE:页脚控制,在当前页面结束时触发
8、AT LINE-SELECTION:行选择控制,用户选择某列表行时触发
9、AT USER-COMMAND : 用户交互控制,用户选择某个GUI功能时触发
**

事件块的中止分为有条件中止和无条件中止。

**
1 、CHECK:根据条件中止
CHEXK:如果CHECK语句中的条件为假,则系统离开当前事件并转向下一个事件块。但是如果CHECK用在事件块内部的循环语句中,则只作用于当前循环。
2、STOP;EXIT:无条件中止
STOP:立即结束任何当前事件,直接转向END-OF-SELECTION.
EXIT:立即离开任何模块,直接转向列表输出屏幕,不执行END-OF-SELECTION。

**

补:增加alv增加自定义按钮的内容(在以上alv成功实现的情况下,需复制状态过来)

**
1、事务代码:se41
2、SAPLKKBL
STANDARD_FULLSCREEN

注意:第五步和第六步根据自己的程序名和想要命名的状态名去填写
在这里插入图片描述
3、打开GUI状态,然后双击,填写完3之后,在4的位置进行双击在这里插入图片描述
4、输入对应的按钮名称,并选择对应的图标。
在这里插入图片描述
5、在alv的调用上添加对应的菜单项和按钮方法:

FORM FRM_DISPLAY_ALV .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      i_callback_pf_status_set  = 'FRM_SET_STATUS'  "一定要添加菜单调用的方法,不然添加菜单也出不来
      i_callback_user_command   = 'FRM_USER_COMMAND'"按钮调用事件
      is_layout_lvc      = gs_layout_lvc
      it_fieldcat_lvc    = gt_fcat_lvc
      i_save             = 'A'
    TABLES
      t_outtab           = LT_STORETURN
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.

FORM frm_set_status USING p_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.

FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
  CASE r_ucomm.
    WHEN 'CREATE'.
      MESSAGE  '自定的按钮' TYPE 'I'.
  ENDCASE.
ENDFORM.

在这里插入图片描述
**

补:alv增加checkbox可勾选,事件的创建:勾选一个,自动勾选相同类型的

**
1、定义的结构需要多一个列,用来存放复选框。

TYPES:BEGIN OF T_STORETURN,
        SEL(1) TYPE c, "复选框字段
        EBELN type EKPO-EBELN,
        EBELP type EKPO-EBELP
      END OF T_STORETURN.

2、在alv组件的定义的时候需要增加复选框的选项以及可编辑。

FORM FRM_SET_FIELDCAT .
  DEFINE set_fieldcat.
  CLEAR gs_fcat_lvc .
  gs_fcat_lvc-fieldname = &1."内表的字段
  gs_fcat_lvc-outputlen = &2."输出长度
  gs_fcat_lvc-scrtext_l = &3."在ALV里面显示的名字
  gs_fcat_lvc-just      = &4."水平对齐方式,L左对齐,R右对齐。
  gs_fcat_lvc-no_zero   = &5."去除前导零
  gs_fcat_lvc-checkbox  = &6. "设置是否选择框
  gs_fcat_lvc-hotspot   = &7. "设置热点
  gs_fcat_lvc-EDIT      = &8."设置可编辑
  gs_fcat_lvc-KEY      = &9."设置key
  APPEND gs_fcat_lvc TO gt_fcat_lvc .
  END-OF-DEFINITION.
  set_fieldcat: 'SEL'  '' '选择' '' ''  'X' '' 'X' '',"这边的设置热点要为空,不然就选择不了,这个有点不懂,有知道的可以留言帮忙解惑下
                'EBELN'  '' '采购凭证' '' '' '' '' '' '',
                'EBELP' '' '采购行项目' '' '' '' '' '' ''.
ENDFORM.

注:以上两步的完成,就可以实现alv前方增加一个checkbox了。
以下则是关于事件的创建(勾选一个,自动勾选其他数据一样的行):
3、事件的创建

"要先定义对应的变量
 DATA:GO_GRID TYPE REF TO  CL_GUI_ALV_GRID.
 DATA: LT_EVENT TYPE SLIS_T_EVENT,
        LS_EVENT TYPE SLIS_ALV_EVENT.
 
 "添加一个方法用来创建事件
 FORM FRM_SET_EVENT .
  CLEAR LS_EVENT.
  LS_EVENT-NAME = 'CALLER_EXIT'.
  LS_EVENT-FORM = 'CALLER_EXIT'.
  APPEND LS_EVENT TO LT_EVENT.
  
  CLEAR LS_EVENT.
  LS_EVENT-NAME = 'DATA_CHANGED'.
  LS_EVENT-FORM = 'DATA_CHANGED'.
  APPEND LS_EVENT TO LT_EVENT.
ENDFORM.

然后在alv显示的这边需要加一个事件参数

FORM FRM_DISPLAY_ALV .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      i_callback_pf_status_set  = 'FRM_SET_STATUS'  "一定要添加菜单调用的方法,不然添加菜单也出不来
      i_callback_user_command   = 'FRM_USER_COMMAND'"按钮调用事件
      is_layout_lvc      = gs_layout_lvc
      it_fieldcat_lvc    = gt_fcat_lvc
      IT_EVENTS          = LT_EVENT               "事件参数这边需要添加
      i_save             = 'A'
    TABLES
      t_outtab           = LT_STORETURN
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

接下来就是触发的逻辑以及对alv界面的刷新

""勾选单个数据时,把相同的数据也勾选
FORM DATA_CHANGED  USING OR_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
  DATA: LS_MOD_CELLS    TYPE LVC_S_MODI.
  DATA: LV_TABIX TYPE SY-TABIX,
        LV_OK    TYPE CHAR1.
  FIELD-SYMBOLS: <FS_VALUE> TYPE ANY.
  CLEAR: LV_OK,LV_TABIX.
  IF <FS_VALUE> IS ASSIGNED.
    CLEAR: <FS_VALUE>.
  ENDIF.
  LOOP AT OR_DATA_CHANGED->MT_GOOD_CELLS INTO LS_MOD_CELLS.
    IF LS_MOD_CELLS-FIELDNAME = 'SEL'.
      CLEAR ls_STORETURN.
      READ TABLE LT_STORETURN INTO ls_STORETURN  INDEX LS_MOD_CELLS-ROW_ID.
      IF SY-SUBRC = 0.
        ls_STORETURN-SEL = LS_MOD_CELLS-VALUE.
        MODIFY LT_STORETURN FROM ls_STORETURN TRANSPORTING SEL  where EBELN = ls_STORETURN-EBELN.
      ENDIF.
    ENDIF.
  ENDLOOP.
  PERFORM FRM_REF_ALV.
ENDFORM.

FORM FRM_REF_ALV .
  DATA: LS_STBL TYPE LVC_S_STBL.

  LS_STBL-ROW = ABAP_TRUE.
  LS_STBL-COL = ABAP_TRUE.
  CALL METHOD GO_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = LS_STBL.
ENDFORM.

FORM CALLER_EXIT USING U_EXIT TYPE SLIS_DATA_CALLER_EXIT.
  DATA LT_F4   TYPE LVC_T_F4.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = GO_GRID.
  CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
    EXCEPTIONS
      ERROR      = 1
      OTHERS     = 2.
  CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
    EXCEPTIONS
      ERROR      = 1
      OTHERS     = 2.
ENDFORM.

补:alv中可编制,并保存到数据库表中

注:在前面可以正常展示alv的前提下,做如下的增加:

ZT_RETURN_TOP:

data:ls_setting type lvc_s_glay.

ZT_RETURN_FRM

"这个方法内增加了&6可编辑和&7设置小数点
FORM FRM_SET_FIELDCAT . "设置显示的列名已经长度等基本属性
  DEFINE set_fieldcat.
  CLEAR gs_fcat_lvc .
  gs_fcat_lvc-fieldname = &1."内表的字段
  gs_fcat_lvc-outputlen = &2."输出长度
  gs_fcat_lvc-scrtext_l = &3."在ALV里面显示的名字
  gs_fcat_lvc-just      = &4."水平对齐方式,L左对齐,R右对齐。
  gs_fcat_lvc-no_zero   = &5."去除前导零
  gs_fcat_lvc-EDIT      = &6."设置可编辑
  gs_fcat_lvc-decimals = &7."修改有数字的时候要设置小数点位,不然会自动缩小100倍
  APPEND gs_fcat_lvc TO gt_fcat_lvc .
  END-OF-DEFINITION.
  set_fieldcat:'CID'  '' '航空公司代码' '' '' '' '',
               'CNAME' '' '航空公司名称' '' '' '' '',
               'FLYID' '' '航班号' '' '' '' '',
               'FFROM'  '' '起飞地' '' '' '' '',
               'FDEST' '' '目的地' '' '' '' '',
               'FLYFARE' '' '机票金额' '' '' 'X' '2',
               'CURCY'  '' '货币码' '' '' '' '',
               'ISPAUSE' '' '航班状态' '' '' '' ''.
ENDFORM.
"在alv显示的方法这边增加了个i_grid_settings    = ls_setting:用来回传编辑后的值
FORM FRM_DISPLAY_ALV .      "alv显示
  ls_setting-edt_cll_cb = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      is_layout_lvc      = gs_layout_lvc
      it_fieldcat_lvc    = gt_fcat_lvc
      i_callback_pf_status_set  = 'FRM_SET_STATUS'  "一定要添加菜单调用的方法,不然添加菜单也出不来
      i_callback_user_command   = 'FRM_USER_COMMAND'"按钮调用事件
      i_save             = 'A'
      i_grid_settings    = ls_setting
    TABLES
      t_outtab           = LT_RETURN
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

"最后自定义按钮去执行对应的事件就可以
FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
  CASE r_ucomm.
    WHEN '&DATA_SAVE'.
      MODIFY YFLYPLAN999 from TABLE LT_RETURN.
  ENDCASE.
ENDFORM.

RS_SELFIELD:可以获取到修改的列名以及值
在这里插入图片描述
在这里插入图片描述

OOALV

1、总的include

INCLUDE zooalv_top."定义的变量

include zooalv_method.  "ooalv的事件,这个要放在包含CREATE OBJECT EVENT_RECEIVER的include之前,不然会报错

INClUDE zooalv_sel."选择屏幕

include zooalv_frm."定义的方法

2、INCLUDE zooalv_top

这边主要是定义ooalv中会用到的各种变量,事件LCL_EVENT_RECEIVER也在这边定义

		CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
		"用来存放屏幕点击的按键
		DATA: OK_CODE LIKE SY-UCOMM.
		
		"ALV容器类
		DATA: G_DOCKING   TYPE REF TO CL_GUI_DOCKING_CONTAINER.
		"ALV分割容器
		DATA: G_SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER.
		"ALV容器
		DATA: G_CONTAINER_UP TYPE REF TO CL_GUI_CONTAINER,
		      G_GRID_UP      TYPE REF TO CL_GUI_ALV_GRID.    "ALV对象
		"ALV容器
		DATA: G_CONTAINER_DOWN TYPE REF TO CL_GUI_CONTAINER.
		
		
		DATA:LT_FLY TYPE TABLE OF YFLYPLAN999,
		     LS_FLY TYPE YFLYPLAN999.
		
		"ALV样式
		DATA: LS_LAYOUT TYPE LVC_S_LAYO.
		
		"ALV的输出列表工作区
		DATA:LS_FIELDCAT_UP  TYPE LVC_T_FCAT.
		
		DATA: LS_VARIANT  TYPE DISVARIANT.
		
		DATA: GV_ROW      TYPE I VALUE 1.
		
		DATA:EVENT_RECEIVER     TYPE REF TO LCL_EVENT_RECEIVER.
		
		DATA: L_FLAG TYPE C.
		
		"菜单
		DATA: LS_TOOLBAR  TYPE UI_FUNCTIONS.

3、INCLUDE ZOOALV_METHOD

		CLASS LCL_EVENT_RECEIVER DEFINITION.  "事件定义
		  PUBLIC SECTION.
		    DATA: ERROR_IN_DATA TYPE C.						
		    METHODS:
		*---定义ALV按钮事件
		      HANDLE_TOOLBAR FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID
		        IMPORTING
		            E_OBJECT
		            E_INTERACTIVE,		
		*---用户双击事件
		      HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
		        IMPORTING
		            E_ROW
		            E_COLUMN
		            ES_ROW_NO,		
		*---数据修改事件
		      HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
		        IMPORTING
		            ER_DATA_CHANGED,		
		*---数据修改完成事件
		      HANDLE_DATA_CHANGED_FINISHED FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
		        IMPORTING
		            SENDER
		            E_MODIFIED
		            ET_GOOD_CELLS,		
		*---ALV按钮功能事件
		      HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
		        IMPORTING
		            E_UCOMM.
		      "自定义校验列
		    METHODS: check_curcy
		      IMPORTING  ps_change       TYPE lvc_s_modi
		                 pr_data_changed TYPE REF TO cl_alv_changed_data_protocol.		
		ENDCLASS.		
		
		CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.	
			"增加自定义按钮
		    METHOD HANDLE_TOOLBAR.	
		    DATA: L_BUTTON TYPE STB_BUTTON.	
		    CLEAR L_BUTTON.
		    L_BUTTON-BUTN_TYPE = 3.   "分隔符 |
		    APPEND L_BUTTON TO E_OBJECT->MT_TOOLBAR.	
		    CLEAR L_BUTTON.
		    L_BUTTON-FUNCTION = 'EXCEL_IN'.
		    L_BUTTON-ICON     = ICON_POSITION.
		    L_BUTTON-TEXT     = '导入'.
		    APPEND L_BUTTON TO E_OBJECT->MT_TOOLBAR.
		  ENDMETHOD.
		 "数据修改结束后的操作
		  METHOD HANDLE_DATA_CHANGED_FINISHED.		
		    DATA: LS_GOOD TYPE LVC_S_MODI,
		          LS_FLAG TYPE C VALUE '0'.		
		    DATA: L_FIRST TYPE SY-DATUM,
		          L_LAST  TYPE SY-DATUM,
		          LV_DATE TYPE SY-DATUM.
		    DATA: COLNAME(10).		
		    "如果修改成功,刷新ALV
		    CHECK E_MODIFIED = 'X'.		
		    "PERFORM FRM_REFRESH_ALV.
		  ENDMETHOD.  
		                    
		 "alv修改数据时候触发的事件
		  METHOD HANDLE_DATA_CHANGED.	
		    DATA: LV_VALUE TYPE LVC_VALUE,
		          L_SUBRC  LIKE SY-SUBRC.
		    DATA: LS_GOOD TYPE LVC_S_MODI.		
		    ERROR_IN_DATA = SPACE.
		    SORT ER_DATA_CHANGED->MT_MOD_CELLS BY ROW_ID."对发生改变所有单元格进行排序
		    LOOP AT ER_DATA_CHANGED->MT_MOD_CELLS INTO LS_GOOD.
		*获取改变的数据(列名,行数)
		*      CALL METHOD ER_DATA_CHANGED->GET_CELL_VALUE
		*        EXPORTING
		*          I_ROW_ID    = LS_GOOD-ROW_ID
		*          I_FIELDNAME = LS_GOOD-FIELDNAME
		*        IMPORTING
		*          E_VALUE     = LV_VALUE.
		
		       CLEAR L_FLAG.
		       IF ls_good-fieldname = 'CURCY'.
		        "这边增加了个方法,针对修改的列进行校验等操作
		        CALL METHOD check_curcy
		          EXPORTING
		            ps_change       = ls_good
		            pr_data_changed = er_data_changed.
		        ENDIF.
		        "显示错误信息
		        IF L_FLAG EQ 'X'.
		          CALL METHOD er_data_changed->display_protocol.
		        ENDIF.
		    ENDLOOP.		
		    GV_ROW = LS_GOOD-ROW_ID.
		    IF GV_ROW = 0.
		      GV_ROW = 99999999.
		    ENDIF.	
		  ENDMETHOD.                   "HANDLE_DATA_CHANGED.
		
		  "触发对应自定义按钮事件	
		  METHOD HANDLE_USER_COMMAND.	
		    CASE  E_UCOMM .
		      WHEN 'EXCEL_IN' .
		        MESSAGE '自定义导入按钮' TYPE 'I'.
		    ENDCASE.		
		  ENDMETHOD.
		
		  "双击alv事件
		  METHOD HANDLE_DOUBLE_CLICK.	
		    DATA: LV_WERKS TYPE MARC-WERKS,
		          LV_MATNR TYPE MARC-MATNR.
		    MESSAGE '双击成功' TYPE 'S'.
		    "READ TABLE gt_alv INDEX rs_selfield-tabindex INTO DATA(wa_sel_temp).  "获取击行		    		
		  ENDMETHOD.                 "HANGDLE_DOUBLE_CLICK
		
		  "自定义校验列的方法
		  METHOD check_curcy.
		    DATA: l_CURCY TYPE CURCY.
		    "获取修改值
		    CALL METHOD pr_data_changed->get_cell_value
		      EXPORTING
		        i_row_id    = ps_change-row_id
		        i_fieldname = ps_change-fieldname
		      IMPORTING
		        e_value     = l_CURCY.
		
		    select *
		    INTO TABLE @data(lt_TCURC)
		    FROM TCURC
		    WHERE WAERS = @l_CURCY.
		    IF SY-SUBRC <> 0.
		      L_FLAG = 'X'.
		      "MESSAGE '输入的值有误' TYPE 'I'.
		    ENDIF.
		  ENDMETHOD.		
		ENDCLASS.

4、ZOOALV_SEL

	SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-s01.          "Model Option
	 PARAMETERS p_cid02 type YFLYPLAN999-cid.
	SELECTION-SCREEN: END OF BLOCK b1.
	
	START-OF-SELECTION.
	call SCREEN 2000.

5、ZOOALV_FRM

    "屏幕2000的按钮方法,需要先复制一个gui状态过来并引用才可以调用到按钮名称
	MODULE USER_COMMAND_2000 INPUT.
	  CASE OK_CODE.
	    WHEN 'BACK' OR 'CANCEL'.
	      LEAVE TO SCREEN 0.
	    WHEN 'EXIT'.
	      LEAVE PROGRAM.
	    WHEN 'SAVE'.
	      "PERFORM FRM_SAVEDATE.
	  ENDCASE.
	  CLEAR OK_CODE.
	ENDMODULE.
	
	"这边调用对应的gui状态和标题
	MODULE STATUS_2000 OUTPUT.
	  SET PF-STATUS '2000'. "调用菜单"
	  SET TITLEBAR '1000'.
	
	"这边可以去设置显示的alv要分成几部分,这边分成了2部分,就写了上面的部分,下面没写
	****************分成上下两个页面*******
	  PERFORM FRM_CREATE_CONTAINER. "容器创建
	  PERFORM FRM_OBJECT_UP.   "上屏
	  "PERFORM FRM_OBJECT_DOWN. "下屏
	****************分成上下两个页面*******	
	ENDMODULE.
	
	"容器创建
	FORM FRM_CREATE_CONTAINER .
	  CHECK G_DOCKING IS INITIAL.
	  CREATE OBJECT G_DOCKING
	    EXPORTING
	      REPID     = SY-REPID
	      DYNNR     = SY-DYNNR
	      EXTENSION = 2000.                     "初始界面宽度
	
	"这边设置界面的分布
	*--分割容器,21列
	  CREATE OBJECT G_SPLITTER
	    EXPORTING
	      PARENT  = G_DOCKING
	      ROWS    = 2
	      COLUMNS = 1.
	
	*---设置容器对象
	  G_CONTAINER_UP   = G_SPLITTER->GET_CONTAINER( ROW = 1
	                                     COLUMN = 1 ).
	  G_CONTAINER_DOWN = G_SPLITTER->GET_CONTAINER( ROW = 2
	                                     COLUMN = 1 ).
	ENDFORM.
	
	FORM FRM_OBJECT_UP .
	  PERFORM FRM_GET_UPDATA.                            "获取数据
	  PERFORM FRM_GET_LAYOUT.                           "ALV样式设定
	  PERFORM FRM_GET_FIELDCAT_UP.                      "ALV字段目录
	  PERFORM EXCLUDE_TB_FUNCTIONS CHANGING LS_TOOLBAR. "删除不需要的按钮
	
	  "创建ALV对象
	  IF G_GRID_UP IS INITIAL.
	    CREATE OBJECT G_GRID_UP
	      EXPORTING
	        I_PARENT = G_CONTAINER_UP.
	  ENDIF.
	
	  "布局设置
	  CLEAR: LS_VARIANT.
	  LS_VARIANT-REPORT = SY-REPID && 'UP'.
	
	  CALL METHOD G_GRID_UP->SET_TABLE_FOR_FIRST_DISPLAY      "ALV显示
	    EXPORTING
	      I_SAVE                        = 'U'
	      IS_LAYOUT                     = LS_LAYOUT "ALV输出样式
	      I_DEFAULT                     = 'X'       "默认布局
	      I_BUFFER_ACTIVE               = 'X'
	      IT_TOOLBAR_EXCLUDING          = LS_TOOLBAR"需要删除不需要的按钮,这边需要这个参数
	      IS_VARIANT                    = LS_VARIANT
	    CHANGING
	      IT_OUTTAB                     = LT_FLY
	      IT_FIELDCATALOG               = LS_FIELDCAT_UP
	    EXCEPTIONS
	      INVALID_PARAMETER_COMBINATION = 1
	      PROGRAM_ERROR                 = 2
	      TOO_MANY_LINES                = 3
	      OTHERS                        = 4.
	
	  CALL METHOD G_GRID_UP->REGISTER_EDIT_EVENT           "调用事件
	    EXPORTING
	      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
	
	  CREATE OBJECT EVENT_RECEIVER.
	  "增加自定义菜单按钮事件
	  SET HANDLER EVENT_RECEIVER->HANDLE_TOOLBAR FOR G_GRID_UP.
	  "双击事件
	  SET HANDLER EVENT_RECEIVER->HANDLE_DOUBLE_CLICK FOR G_GRID_UP.
	  "修改结束后事件
	  SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED_FINISHED FOR G_GRID_UP.
	  "数据修改时间
	  SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR G_GRID_UP.
	  "按钮触发事件
	  SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR G_GRID_UP.
	
	  "设置alv中是否允许编辑
	  CALL METHOD G_GRID_UP->SET_READY_FOR_INPUT
	    EXPORTING
	      I_READY_FOR_INPUT = 1. "0:不可编辑;1:可编辑
	      
	  "刷新alv
	  PERFORM FRM_REFRESH_ALV.
	
	ENDFORM.
	
	FORM FRM_GET_UPDATA .
	  SELECT *
	  INTO TABLE LT_FLY
	  FROM YFLYPLAN999.
	ENDFORM.
	
	FORM FRM_GET_LAYOUT .
	  CLEAR: LS_LAYOUT.
	*  LS_LAYOUT-CWIDTH_OPT = 'X'.              "自适应列宽
	*  LS_LAYOUT-BOX_FNAME  = 'BOX'.            "选择框
	  LS_LAYOUT-SEL_MODE   = 'A'.              "复选按钮
	  LS_LAYOUT-ZEBRA      = 'X'.              "表格条纹形式
	  LS_LAYOUT-STYLEFNAME = 'CELLSTAB'.       "设置可编辑信息
	*  LS_LAYOUT-CTAB_FNAME = 'CELLCOLOR'.      "设置单元格颜色信息
	
	ENDFORM.
	
	FORM FRM_GET_FIELDCAT_UP .
	  REFRESH LS_FIELDCAT_UP.
	  PERFORM FRM_FIELD_APPEND USING:
	   LS_FIELDCAT_UP  'CID'       '代码'          ''  ''  '8'   ''  ''  ''  ''  ''  '' ''  'YFLYPLAN999' 'CID' ,
	   LS_FIELDCAT_UP  'CNAME'       '名称'          ''  ''  '12'  ''  ''  ''  ''  ''  '' ''  'YFLYPLAN999' 'CNAME' ,
	   LS_FIELDCAT_UP  'FLYID'         '航班号'          ''  ''  '12'  ''  ''  ''  ''  ''  '' ''  'YFLYPLAN999' 'FLYID' ,
	   LS_FIELDCAT_UP  'FFROM'       '起飞地'          ''  ''  '15'   ''  ''  ''  ''  ''  '' ''  'YFLYPLAN999' 'FFROM' ,
	   LS_FIELDCAT_UP  'FDEST'       '目的地'          ''  ''  '10'   ''  ''  ''  ''  ''  '' ''  'YFLYPLAN999' 'FDEST' ,
	   LS_FIELDCAT_UP  'FLYFARE'       '机票金额'          ''  ''  '12'  ''  ''  ''  ''  ''  '' ''  'YFLYPLAN999' 'FLYFARE' ,
	   LS_FIELDCAT_UP  'CURCY'         '货币码'          'X'  ''  '8'  ''  ''  ''  ''  ''  '' ''  'YFLYPLAN999' 'CURCY' ,
	   LS_FIELDCAT_UP  'ISPAUSE'       '航班状态'          ''  ''  '12'   ''  ''  ''  ''  ''  '' ''  'YFLYPLAN999' 'ISPAUSE'.
	
	
	ENDFORM.
	
	FORM FRM_FIELD_APPEND USING IT_FIELDCAT TYPE LVC_T_FCAT "字段目录内表
	       FIELD_NAME          "字段名
	       FIELD_TEXT          "字段描述
	       FIELD_EDIT          "是否可编辑
	       FIELD_KEY           "关键字段
	       FIELD_LENTH_O       "输出长度
	       FIELD_DECI          "小数位
	       FIELD_DECI_O        "显示的小数位
	       FIELD_NO_ZERO       "隐藏零
	       FIELD_NO_OUT        "是否输出显示
	       FIELD_CHECKBOX      "复选框
	       FIELD_ICON          "图标,居中显示
	       FIELD_EMPHASIZE     "颜色
	       FIELD_REF_TABLE     "参考表
	       FIELD_REF_FIELD.    "参考字段
	
	  DATA: LS_FIELDCAT TYPE LVC_S_FCAT.
	
	  DATA L_TEXT TYPE CHAR50.
	  IF L_TEXT IS INITIAL.
	    L_TEXT = FIELD_TEXT.
	  ENDIF.
	
	  CLEAR: LS_FIELDCAT.
	  LS_FIELDCAT-FIELDNAME  = FIELD_NAME.        "字段名
	  LS_FIELDCAT-REPTEXT    = L_TEXT.            "字段描述
	  LS_FIELDCAT-EDIT       = FIELD_EDIT.        "是否可编辑
	  LS_FIELDCAT-KEY        = FIELD_KEY.         "关键字段
	  LS_FIELDCAT-OUTPUTLEN  = FIELD_LENTH_O.     "输出长度
	  LS_FIELDCAT-DECIMALS   = FIELD_DECI.        "小数位
	  LS_FIELDCAT-DECIMALS_O = FIELD_DECI_O.      "显示的小数位
	  LS_FIELDCAT-NO_ZERO    = FIELD_NO_ZERO.     "隐藏零
	  LS_FIELDCAT-NO_OUT     = FIELD_NO_OUT.      "是否输出
	  LS_FIELDCAT-CHECKBOX   = FIELD_CHECKBOX.    "复选框
	  LS_FIELDCAT-ICON       = FIELD_ICON.        "图标,居中显示
	  LS_FIELDCAT-EMPHASIZE  = FIELD_EMPHASIZE.   "颜色
	  LS_FIELDCAT-REF_TABLE  = FIELD_REF_TABLE.
	  LS_FIELDCAT-REF_FIELD  = FIELD_REF_FIELD.
	  LS_FIELDCAT-INTLEN = '200'.
	  APPEND LS_FIELDCAT TO IT_FIELDCAT.
	
	ENDFORM.
	
	FORM FRM_REFRESH_ALV .
	  DATA: LS_STBL TYPE LVC_S_STBL.
	  LS_STBL-ROW = 'X'.
	  LS_STBL-COL = 'X'.
	  CALL METHOD G_GRID_UP->REFRESH_TABLE_DISPLAY
	    EXPORTING
	      IS_STABLE = LS_STBL.	
	ENDFORM.                    " FRM_REFRESH_ALV
	
	
	
	FORM EXCLUDE_TB_FUNCTIONS  CHANGING PT_EXCLUDE TYPE UI_FUNCTIONS.
	  DATA LS_EXCLUDE TYPE UI_FUNC.	
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_CHECK.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_LY_NO_DELETE_ROWS.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_MOVE_ROW.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.
	  LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_REFRESH.
	  APPEND LS_EXCLUDE TO PT_EXCLUDE.	
	ENDFORM.

在这里插入图片描述

6、2000屏幕

我们去复制或者新建一个gui状态,调用的时候这边会生成一行菜单,而我们ooalv也会有一行菜单,就比较不美观,所以要把状态自带的哪个菜单取消掉
在这里插入图片描述
打开屏幕的属性,把如下打钩即可。
在这里插入图片描述
在屏幕的元素清单这边,需要输入如下名称,该名称对应我们top中设置的变量名,设置完,才可以获取屏幕返回的按钮的名称。
在这里插入图片描述

7、2000状态

这边设置对应按钮的名称,然后设置点击事件,也可以用初始化的按钮名称。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值