当前位置: 代码迷 >> 综合 >> ALV显示红绿灯(FMnbsp;ALVnbsp;和nbsp;OOnbsp;ALV两…
  详细解决方案

ALV显示红绿灯(FMnbsp;ALVnbsp;和nbsp;OOnbsp;ALV两…

热度:63   发布时间:2024-01-18 15:03:01.0
FM 方式ALV 红绿灯

*&---------------------------------------------------------------------*
*&  Report    ZLM_ALV_07
*&
*&---------------------------------------------------------------------*
*1)在alv引用类型池定义时加入icon,如type-pools:  slis,  icon.
*
*2)给显示内表itab定义一字段statu存储状态灯;
*
*3)循环内表itab给字段statu值赋:
*绿灯:itab-statu  icon_led_green.
*红灯:itab-statu  icon_led_red.
*4)alv的fieldcat属性i_fieldcat-icon  'X'.
*&---------------------------------------------------------------------*

REPORT    zlm_alv_07 .

*&---------------------------------------------------------------------*
*&  声明
*&---------------------------------------------------------------------*
TYPE-POOLS :  slis ,  icon .

*&---------------------------------------------------------------------*
*&基本数据定义
*&---------------------------------------------------------------------*
DATA :
            BEGIN  OF  str_data ,
                id          TYPE  int4 ,
                age        TYPE  int4 ,
                statu    TYPE  char10 ,
            END  OF  str_data .

DATA :
            g_it_data  LIKE  TABLE  OF  str_data ,
            g_wa_data  LIKE  str_data .

*&---------------------------------------------------------------------*
*&  ALV相关定义
*&---------------------------------------------------------------------*
DATA :  fieldcat  TYPE  slis_t_fieldcat_alv  WITH  HEADER  LINE .

*&---------------------------------------------------------------------*
*&  宏定义
*&---------------------------------------------------------------------*
DEFINE  fill_fieldcat .
    fieldcat -fieldname  &1 .
    fieldcat -seltext_l  &2 .
    fieldcat - icon        'X' .            "图标功能
    append  fieldcat .
END-OF-DEFINITION .

*&---------------------------------------------------------------------*
*&  主逻辑
*&---------------------------------------------------------------------*

START-OF-SELECTION .
    PERFORM  zform_fill_data .
    PERFORM  zform_show .

*&---------------------------------------------------------------------*
*&  form区
*&---------------------------------------------------------------------*

FORM  zform_fill_data .
    fill_fieldcat    'ID'      '编号' .
    fill_fieldcat    'AGE'    '年龄' .
    fill_fieldcat    'STATU'  '灯饰' .

    g_wa_data - id        1 .
    g_wa_data -age      12 .
    g_wa_data -statu  icon_led_red .

    APPEND  g_wa_data  TO  g_it_data .

    g_wa_data - id        2 .
    g_wa_data -age      13 .
    g_wa_data -statu  icon_led_green .

    APPEND  g_wa_data  TO  g_it_data .
ENDFORM .                                        "zform_fill_data

*&---------------------------------------------------------------------*
*&            Form    zform_show
*&---------------------------------------------------------------------*
            text
*----------------------------------------------------------------------*
FORM  zform_show .
    CALL  FUNCTION  'REUSE_ALV_LIST_DISPLAY'
        EXPORTING
            it_fieldcat  fieldcat[]
        TABLES
            t_outtab        g_it_data[] .
ENDFORM .                                        "zform_show


OO 方式ALV 红绿灯
效果:
ALV显示红绿灯(FM <wbr>ALV <wbr>和 <wbr>OO <wbr>ALV两种实现方式)

主要代码:
*&---------------------------------------------------------------------*
*&   全局变量
*&---------------------------------------------------------------------*
DATA:
    BEGIN OF str_spfli,
      checkbox TYPE char1,
      status   TYPE icon_d,                 "检查状态图标
      carrid   TYPE   sflight-carrid       , "航线承运人ID
      connid   TYPE   sflight-connid       , "航班连接 Id
      fldate   TYPE   sflight-fldate       , "航班日期
      price     TYPE   sflight-price         , "航空运费
      cellstyle TYPE lvc_t_styl,           "可编辑字段SORT表
    END OF   str_spfli.

DATA:
    g_it_show LIKE TABLE OF str_spfli WITH KEY checkbox carrid connid,
    g_wa_show LIKE str_spfli.


START-OF-SELECTION.

"获取数据
SELECT carrid
        connid
        fldate
        price
  FROM sflight INTO CORRESPONDING FIELDS OF   TABLE g_it_show.

FIELD-SYMBOLS   LIKE LINE OF   g_it_show.
DATA:l_dex TYPE int4.

LOOP AT g_it_show ASSIGNING .
  l_dex = sy-tabix MOD 3.

  CASE l_dex.
    WHEN 1 .
      -status = icon_led_green.
    WHEN 2.
      -status = icon_led_red.
    WHEN OTHERS.
      -status = icon_led_yellow.
  ENDCASE.
ENDLOOP.
"调用屏幕
CALL SCREEN 9001.



FORM zform_alv_show .
DATA:   l_style       TYPE i,
        ls_layout     TYPE lvc_s_layo,
        is_stable     TYPE lvc_s_stbl,
        l_disvariant TYPE disvariant.

* 屏幕初始化
IF alv_ctner IS INITIAL.

  CREATE OBJECT alv_ctner
    EXPORTING
      repid                       = sy-repid
      dynnr                       = '9001'
*       side                         = cl_gui_docking_container=>dock_at_right       ”ALV贴屏幕右边,从屏幕右边开始算宽度
      side                         = cl_gui_docking_container=>dock_at_left       "ALV贴屏幕左边,从左边算屏幕宽度,
      extension                   = 900                                           "屏幕宽度
*         style                       = cl_gui_control=>ws_child                     "可选参数,设置ALV是否可用手动拖动大小
    EXCEPTIONS
      cntl_error                   = 1
      cntl_system_error           = 2
      create_error                 = 3
      lifetime_error               = 4
      lifetime_dynpro_dynpro_link = 5
      OTHERS                       = 6.

  IF sy-subrc <> 0.
    MESSAGE s001(00) WITH '屏幕初始化失败'.
    LEAVE LIST-PROCESSING.
  ENDIF.

*添加自定义工具条
  PERFORM frm_set_alv_toolbar.
*
  CREATE OBJECT g_alv_grid
    EXPORTING
      i_parent = alv_ctner.

*构建显示字段样式
  PERFORM frm_build_fieldcat.

  "Set/Reset Ready for Input Status
  CALL METHOD g_alv_grid->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

* layout 设定样式
  CLEAR ls_layout.
  ls_layout-cwidth_opt = 'X'.     "优化列宽

  CLEAR l_disvariant.
  l_disvariant-report = sy-repid. "当前程序

* event   绑定事件
  CREATE OBJECT g_event.

  SET HANDLER g_event->toolbar             FOR g_alv_grid.
  SET HANDLER g_event->handle_data_changed FOR g_alv_grid.
*     SET HANDLER g_event->handle_f4           FOR g_alv_grid.
  SET HANDLER g_event->handle_cell_click   FOR g_alv_grid.
  SET HANDLER g_event->handle_user_command FOR g_alv_grid.
  SET HANDLER g_event->handle_double_click FOR g_alv_grid.
  SET HANDLER g_event->handle_onf1         FOR g_alv_grid.

  "以下两个方法达到的效果是:光标离开正在编辑的单元格时,就触发了handle_data_changed
  "如果不注释掉以下两个方法,则只有执行下一操作时才会触发handle_data_changed,比如点保存点删除
  CALL METHOD g_alv_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_modified.

  CALL METHOD g_alv_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter.

*   "显示内表数据
  CALL METHOD g_alv_grid->set_table_for_first_display
    EXPORTING
      is_layout             = ls_layout
      is_variant           = l_disvariant
      it_toolbar_excluding = gt_tools
    CHANGING
      it_fieldcatalog       = it_fieldcatalog[]
      it_outtab             = g_it_show[].

ELSE.

  "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
  CALL METHOD cl_gui_cfw=>set_new_ok_code
    EXPORTING
      new_code = 'RELOAD'.

  "ALV 控制:刷新稳定性 按行刷新,可选参数
  CLEAR is_stable.
  is_stable-col = 'X'.

  "刷新
  CALL METHOD g_alv_grid->refresh_table_display
    EXPORTING
      is_stable       = is_stable
      i_soft_refresh = 'X'.

  "提交
  CALL METHOD cl_gui_cfw=>flush.

ENDIF.
ENDFORM.                     " ZFORM_ALV_SHOW


OOalv相关,可见; http://blog.sina.com.cn/s/blog_c0978c9b0101f1ee.html

  相关解决方案