ALV下拉列表

前言:不仅仅可以选择屏幕可以下拉列表,ALV也可以进行下拉列表,

本文主要讲述FUNCTION ALV下拉列表,对于OOALV来说“换汤不换药”,理解了就不会有什么具体的难点。

具体实现方法:(本文章自定义一个下拉列表字段LISBOX)

1.ALV展示结构类型定义:

增加 handle TYPE i, "下拉列表分组

2.相关定义:

DATA:gt_events TYPE slis_t_event."ALV事件

DATA: gt_ddval TYPE lvc_t_drop.    "ALV下拉列表赋值用

3.fieldcat

edit       = 'X'."可编辑

drdn_hndl  = '1'."分组标识  下拉列表

drdn_field = 'HANDLE'." 内部表字段的字段名称

4.在ALV显示之前对下拉列表进行赋值

   gt_ddval = VALUE #( ( handle = '1'
                                       value = '红' )
                                    ( handle = '1'
                                      value = '绿' )
                                    ( handle = '1'
                                      value = '黄' )
                                  ).

5.本文章是根据ALV下拉列表通过ALV回车、光标焦点变化事件进行ALV状态灯的更新变化。

代码如下:

*&---------------------------------------------------------------------*
*& 程 序 名:YTEST_DEMO2
*& 程序描述:ALV单元格按钮
*& 创 建 者:你们的小涵
*& 创建日期:2023/03/13
*&---------------------------------------------------------------------*
*& 版本     修改者(公司)     日期         修改描述
*& 1.0.0    XXXX           YYYYMMDD      创建程序
*&---------------------------------------------------------------------*

REPORT ytest_demo2.

TYPE-POOLS: slis."类型池
TYPES:
  "选择屏幕用
  BEGIN OF typ_s_screen,
    ebeln TYPE ekko-ebeln, "采购凭证编号
    bukrs TYPE ekko-bukrs, "公司代码
    werks TYPE ekpo-werks, "工厂
    ernam TYPE ekko-ernam, "对象创建人姓名
  END OF typ_s_screen,
  "ALV显示用
  BEGIN OF ty_out,
    sel    TYPE sel,
    ebeln  TYPE ekko-ebeln, "采购凭证编号
    bukrs  TYPE ekko-bukrs, "公司代码
    ekorg  TYPE ekko-ekorg, "采购组织
    ekgrp  TYPE ekko-ekgrp, "采购组
    ebelp  TYPE ekpo-ebelp, "凭证项目编号
    matnr  TYPE ekpo-matnr, "物料编号
    werks  TYPE ekpo-werks, "工厂
    lgort  TYPE ekpo-lgort, "库存地点
    matkl  TYPE ekpo-matkl, "物料组
    menge  TYPE ekpo-menge, "采购订单数量
    meins  TYPE ekpo-meins, "采购订单计量单位
    lisbox TYPE char10,     "自定义下拉列表
    handle TYPE i,         "下拉列表分组
    icon   TYPE icon-name,  "显示灯
  END OF ty_out,
  "表类型
  tt_out TYPE STANDARD TABLE OF ty_out.

DATA:
  gt_alv    TYPE tt_out,
  gv_screen TYPE typ_s_screen.

DATA:
  gs_layout   TYPE lvc_s_layo,
  gt_fieldcat TYPE lvc_t_fcat.

"ALV事件
DATA:
  gt_events TYPE slis_t_event.

"ALV下拉列表赋值用
DATA:
  gt_ddval TYPE lvc_t_drop.

SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
    s_ebeln FOR gv_screen-ebeln,
    s_bukrs FOR gv_screen-bukrs.
  PARAMETERS: p_werks TYPE werks_d OBLIGATORY DEFAULT '1000'.
SELECTION-SCREEN END OF BLOCK b01.

INITIALIZATION.
  CLEAR:
  gt_alv,
  gt_fieldcat,
  gt_events,
  gt_ddval.

*&---------------------------------------------------------------------*
*               START-OF-SELECTION 执行主逻辑
*&---------------------------------------------------------------------*
START-OF-SELECTION.

  "数据取得
  SELECT
    ekko~ebeln,
    ekko~bukrs,
    ekko~ekorg,
    ekko~ekgrp,
    ekpo~ebelp,
    ekpo~matnr,
    ekpo~werks,
    ekpo~lgort,
    ekpo~matkl,
    ekpo~menge,
    ekpo~meins
    FROM ekko
    INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln
    WHERE ekpo~werks = @p_werks
      AND ekko~ebeln IN @s_ebeln
      AND ekko~bukrs IN @s_bukrs
    INTO CORRESPONDING FIELDS OF TABLE @gt_alv
    UP TO 20 ROWS.

  "给ALV画面做初始值
  MODIFY gt_alv FROM VALUE #( lisbox = '红' ) TRANSPORTING lisbox WHERE sel = abap_off.
  MODIFY gt_alv FROM VALUE #( icon = icon_red_light ) TRANSPORTING icon WHERE sel = abap_off.

  "Layout
  gs_layout-cwidth_opt      = 'X'.  "优化行宽度
  gs_layout-zebra           = 'X'.  "斑马纹!
  gs_layout-box_fname       = 'SEL'. "选择列

  "Fieldcat
  DATA: ls_fieldcat TYPE lvc_s_fcat.
  DEFINE hong.
    ls_fieldcat-fieldname = &1."字段名
    ls_fieldcat-scrtext_l = &2."文本描述
    ls_fieldcat-edit      = &3."可编辑
    ls_fieldcat-no_out    = &4."不显示列
    APPEND ls_fieldcat TO gt_fieldcat.
    CLEAR ls_fieldcat.
  END-OF-DEFINITION.

  hong 'EBELN' '采购凭证编号' '' ''.
  hong 'BUKRS' '公司代码' '' ''.
  hong 'EKORG' '采购组织' '' ''.
  hong 'EKGRP' '采购组' '' ''.
  hong 'EBELP' '凭证项目编号' '' ''.
  hong 'MATNR' '物料编号' '' ''.
  hong 'WERKS' '工厂' '' ''.
  hong 'LGORT' '库存地点' '' ''.
  hong 'MATKL' '物料组' '' ''.
  hong 'MENGE' '采购订单数量' '' ''.
  hong 'MEINS' '采购订单计量单位' '' ''.
  hong 'LISBOX' '下拉列表' '' ''.
  hong 'ICON' '灯-------灯' '' ''.

  "给下拉列表的字段分配分组、给分组标识
  READ TABLE gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>)
                                     WITH KEY fieldname = 'LISBOX'.
  IF sy-subrc = 0.
    <fs_fieldcat>-edit       = 'X'."可编辑
    <fs_fieldcat>-drdn_hndl  = '1'."分组标识  下拉列表
    <fs_fieldcat>-drdn_field = 'HANDLE'." 内部表字段的字段名称
  ENDIF.

  "下拉列表赋值1
  gt_ddval = VALUE #( ( handle = '1'
                         value = '红' )
                       ( handle = '1'
                         value = '绿' )
                       ( handle = '1'
                         value = '黄' )
                      ).

  "ALV事件
  PERFORM f_set_alv_event."下拉列表事件

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
*     i_callback_pf_status_set = 'F_STATUS_SET '
*     i_callback_user_command  = 'F_USER_COMMAND '
*     i_grid_title       = ''
      is_layout_lvc      = gs_layout
      it_fieldcat_lvc    = gt_fieldcat
      i_save             = 'A'
      it_events          = gt_events "ALV事件
    TABLES
      t_outtab           = gt_alv
    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.
*&---------------------------------------------------------------------*
*& Form f_set_alv_event
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_set_alv_event .

  "下拉列表事件/捕捉事件
  gt_events = VALUE #( ( name = 'CALLER_EXIT'
                          form = 'FRM_SET_EVENT'    ) "下拉列表的事件
                        ( name = 'DATA_CHANGED'
                          form = 'FRM_DATA_CHANGED' ) "捕捉事件
                      ).

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  caller_exit
*&---------------------------------------------------------------------*
*       设置下拉列表,使Grid和内表能链接上
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM frm_set_event USING ls_data TYPE slis_data_caller_exit.

  DATA
    lo_grid TYPE REF TO cl_gui_alv_grid.

  DATA:
    l_lvc_s_modi TYPE lvc_s_modi,
    l_lvc_t_modi TYPE lvc_t_modi.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  "下拉列表
  CALL METHOD lo_grid->set_drop_down_table
    EXPORTING
      it_drop_down = gt_ddval.

  "当我光标焦点发生变化的时候
  CALL METHOD lo_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.

  "敲回车的时候
  CALL METHOD lo_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      F_DATA_CHANGE
*&---------------------------------------------------------------------*
*       DATA CHANGE
*----------------------------------------------------------------------*
FORM frm_data_changed USING pr_data_changed
                      TYPE REF TO cl_alv_changed_data_protocol.

  DATA lo_grid TYPE REF TO cl_gui_alv_grid.

  DATA:
    stbl TYPE lvc_s_stbl.

  DATA:
    l_lvc_s_modi TYPE lvc_s_modi,
    l_lvc_t_modi TYPE lvc_t_modi,   "列的内容
    lv_value     TYPE lvc_value.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  "获取变化行
  l_lvc_t_modi = pr_data_changed->mt_mod_cells.

  READ TABLE l_lvc_t_modi INTO l_lvc_s_modi INDEX 1.

  READ TABLE gt_alv ASSIGNING FIELD-SYMBOL(<fs_zo>) INDEX l_lvc_s_modi-row_id.
  IF sy-subrc = 0.

*    "当前字段取值
*    CALL METHOD ir_data_changed->get_cell_value "获取单元格中的值
*      EXPORTING
*        i_row_id    = l_lvc_s_modi-row_id    "行号
*        i_fieldname = l_lvc_s_modi-fieldname "要获取的列的列名
*      IMPORTING
*        e_value     = lv_value. "获取到的单元格中的值

    CASE l_lvc_s_modi-fieldname."变化的字段名称
      WHEN 'LISBOX'.
        CASE l_lvc_s_modi-value."变化后的字段值
          WHEN '红'.
            <fs_zo>-icon = icon_red_light.
          WHEN '绿'.
            <fs_zo>-icon = icon_green_light.
          WHEN '黄'.
            <fs_zo>-icon = icon_yellow_light.
          WHEN OTHERS.
*            "如果验证不通过,记录错误消息日志
*            CALL METHOD ir_data_changed->add_protocol_entry
*              EXPORTING
*                i_msgid     = '00'
*                i_msgno     = '001'
*                i_msgty     = 'E'
*                i_msgv1     = lv_error
*                i_msgv2     = ''
*                i_msgv3     = ''
*                i_fieldname = l_lvc_s_modi-fieldname
*                i_row_id    = l_lvc_s_modi-row_id.
**            CALL METHOD ir_data_changed->modify_cell
**              EXPORTING
**                i_row_id    = l_lvc_s_modi-row_id
**                i_fieldname = 'LISBOX'
**                i_value     = lv_umlgo.
        ENDCASE.
      WHEN OTHERS.
    ENDCASE.
  ENDIF.

  IF lo_grid IS NOT INITIAL.
    "稳定刷新
    stbl-row = 'X'." 基于行的稳定刷新
    stbl-col = 'X'." 基于列稳定刷新

    CALL METHOD lo_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDIF.

ENDFORM.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用SAP ABAP语言编写一个ALV列表。首先,你需要了解ALV(Adobe List Viewer)是什么,它是SAP系统中用于显示数据的一种标准用户界面控件。 具体来说,你可以使用ALV函数库,这些函数可以让你设置ALV列表的各种属性,如列宽、字段格式、排序方式等。 例如,你可以使用REUSE_ALV_GRID_DISPLAY函数来显示ALV列表,并使用IT_FIELDCAT参数来设置列的格式。 下面是一个简单的例子: ``` *定义数据结构 TYPES: BEGIN OF ty_sflight, carrid TYPE sflight-carrid, connid TYPE sflight-connid, fldate TYPE sflight-fldate, END OF ty_sflight. *定义数据表 DATA: it_sflight TYPE TABLE OF ty_sflight. *定义字段描述表 DATA: it_fieldcat TYPE lvc_t_fcat. *填充数据 SELECT * FROM sflight INTO TABLE it_sflight. *填充字段描述表 APPEND INITIAL LINE TO it_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>). <fs_fieldcat>-fieldname = 'CARRID'. <fs_fieldcat>-seltext_l = '航空公司代码'. APPEND INITIAL LINE TO it_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>). <fs_fieldcat>-fieldname = 'CONNID'. <fs_fieldcat>-seltext_l = '航班号'. APPEND INITIAL LINE TO it_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>). <fs_fieldcat>-fieldname = 'FLDATE'. <fs_fieldcat>-seltext_l = '起飞日期'. *显示ALV列表 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid i_structure_name = 'TY_SFLIGHT' i_save = 'A' TABLES t_outtab = it_sflight i_fieldcat = it_fieldcat. ``` ### 回答2: ABAP是SAP系统的编程语言,可用于开发和定制各种功能和报表。以下是使用ABAP编写一个ALV列表的步骤。 1. 定义内表:首先,我们需要定义一个内表来存储数据。使用ABAP的DATA语句创建一个具有所需字段的内表。 2. 获取数据:使用ABAP的SELECT语句从数据库中检索所需的数据,并将其存储在内表中。 3. 创建ALV试图:使用ABAP的CL_GUI_ALV_GRID类创建一个ALV列表的实例。定义此实例的属性和设置,如列标题,列宽度,排序等。 4. 载入数据:将内表的数据加载到ALV列表中,使用ALV实例的METHODS属性和方法。 5. 显示ALV列表:使用ABAP的CALL METHOD语句调用ALV实例的DISPLAY方法,以便将其显示在屏幕上。 6. 添加用户交互功能:根据需要,您可以在ALV列表中添加各种用户交互功能,如过滤器,排序,编辑等。使用ALV实例的相应方法和事件来实现它们。 7. 添加功能按钮:您还可以为ALV列表添加自定义功能按钮,以实现特定的操作。使用ABAP的FUNCTION_KEY语句来定义功能按钮,并使用ALV实例的EVENTS属性和方法来处理按钮的点击事件。 8. 处理用户输入:如果用户在ALV列表中进行了更改或交互操作,您可以使用相应的ALV事件来处理这些更改,并在内表中更新数据。 9. 处理指令:根据需要,您可以处理ALV列表中的不同命令,如打印,导出等。使用ALV实例的事件和方法来实现这些指令的功能。 10. 完善界面:最后,如果需要在ALV列表中添加其他UI元素,如选择框,文本框等,您可以使用ABAP的DIALOG和SCREEN等功能来实现。 以上是使用ABAP编写一个ALV列表的一般步骤。根据实际需求和具体业务场景,您可能需要根据自己的要求进行适当的调整和修改。 ### 回答3: ABAP是一种编程语言,用于在SAP系统中开发和定制应用程序。要使用ABAP编写一个ALV(ABAP List Viewer)列表,可以按照以下步骤进行操作: 1. 创建一个ABAP报表程序,使用SE38事务代码打开ABAP编辑器。 2. 在ABAP编辑器中,定义一个内部表,用于存储数据。例如,可以使用类型为TABLE OF结构的内部表。 3. 在ABAP编辑器中,使用SELECT语句从数据库表中检索所需的数据,并将其放入内部表中。 4. 定义一个ALV网格控件,并与内部表关联。可以使用CL_SALV_TABLE类来创建ALV网格控件对象。 5. 在ALV网格控件上,定义列,标题和布局等。可以使用方法ADD_COLUMN和SET_TABLE_FOR_FIRST_DISPLAY来添加列和定义布局。 6. 调用方法DISPLAY来显示ALV列表。 7. 为ALV列表添加自定义功能。例如,可以添加排序、筛选、汇总等功能。 8. 编译并执行ABAP报表程序,以显示ALV列表。 下面是一个示例代码,用于创建一个包含两列的ALV列表,并在SFLIGHT表中显示航班号和航班日期。 ``` REPORT ZALV_LIST. DATA: lt_flight TYPE TABLE OF sflight, lr_alv TYPE REF TO cl_salv_table. START-OF-SELECTION. SELECT carrid, connid, fldate, price FROM sflight INTO TABLE lt_flight. CREATE OBJECT lr_alv. lr_alv->add_column( 'Carrid' ). lr_alv->add_column( 'Connid' ). lr_alv->set_table_for_first_display( CHANGING it_outtab = lt_flight ). lr_alv->display( ). ``` 以上是一个简单的示例,您可以根据实际需求对代码进行修改和扩展。请注意,使用ALV列表还可以进行更复杂的操作,如行编辑、数据修改等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值