加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

如何设置ALV输出界面上的某一可编辑行的字段值为必输

(2011-06-07 21:57:33)
标签:

abap

alv

编辑字段必输

杂谈

分类: SAP家园-ABAP常见问题

  今天,一个以前的同事问我这个问题,当时就把我问愣住了。第一反应是不可能实现。当时我好象就是这么回答的。后来想想,ALV是输出用的,标准的程序中可能没有这个功能,那么我们能不能自己写代码实现呢?答案是肯定的。

  经过我仔细地研究,决定用如下方法实现:

  1、在结果内表中加一个MSSG字段,用来保存某行的该字段为空时的错误提示。

  2、在ALV的USER_COMMAND事件中,添加该字段的检查,当该字段为空时,将错误信息更新到内表的MSSG字段内。

  3、在USER_COMMAND中添加错误信息输出的代码,如果有该字段为空的情况,则输出一个E类型的MESSAGE信息。

  具体代码我也实现了(如果ALV界面再输出一个顺序排列的行号,这个程序就非常完整了)。整体程序代码如下(关键处标记为红色):

 

*&---------------------------------------------------------------------*
*& Report  ZFFI010R01 计量单位查询清单
*&
*&---------------------------------------------------------------------*
*& Created by Xavery Hsueh(薛现军)
*& Created on 2011-06-07
*& Background
*& Arithmetic
*& Version      1.0
*& Function Description
*&---------------------------------------------------------------------*
REPORT  zffi010r01 NO STANDARD PAGE HEADING.
*@=====================================================================@
*@ 声明数据库表
*@=====================================================================@
TABLES: t006,
        t006a.
*@=====================================================================@
*@ 定义结构类型
*@=====================================================================@
TYPES:BEGIN OF typ_result,
        box    TYPE c,            "选择字段
        mandt  TYPE mandt,
        spras  TYPE spras,
        msehi  TYPE msehi,
        mseh3  TYPE mseh3,
        mseh6  TYPE mseh6,
        mseht  TYPE mseht,
        msehl  TYPE msehl,
        mssg   TYPE txt50,       "错误信息
      END OF typ_result.
*@=====================================================================@
*@ 定义全局变量、内表与工作区
*@=====================================================================@
DATA:gt_result TYPE TABLE OF typ_result WITH HEADER LINE.
FIELD-SYMBOLS  <fs_result> TYPE typ_result.
DATA:g_indic TYPE c.
*@------------------ ALV 相关的变量 -----------------------------------*
TYPE-POOLS:slis.
DATA: g_grid TYPE REF TO  cl_gui_alv_grid,
      g_repid             LIKE sy-repid,
      g_title             TYPE lvc_title,
      g_setting           TYPE lvc_s_glay,
      wa_print            TYPE slis_print_alv,
      gt_list_top_of_page TYPE slis_t_listheader,
      gt_events           TYPE slis_t_event WITH HEADER LINE,
      gt_sort             TYPE slis_t_sortinfo_alv,
      wa_layout           TYPE slis_layout_alv,
      gt_fieldcat         TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      wa_fieldcat         LIKE LINE OF gt_fieldcat,
      g_save              TYPE c,
      g_pos               TYPE i.
   用操作具体单元的是否可编辑的内表和工作区
DATA: wa_color   TYPE lvc_s_scol,
      gt_color   TYPE lvc_t_scol,
      wa_color_6 TYPE lvc_s_colo,
      wa_color_5 TYPE lvc_s_colo,
      wa_color_4 TYPE lvc_s_colo.
*@=====================================================================@
*@ 定义宏
*@=====================================================================@
DEFINE mcr_field.
  clear wa_fieldcat.
  g_pos = g_pos + 1 .
  wa_fieldcat-col_pos       g_pos.
  wa_fieldcat-fieldname = &1.
  wa_fieldcat-tabname = 'TYP_RESULT'.
* wa_fieldcat-no_out = 'X'.      "field no display, choose from layout
  wa_fieldcat-key = ' '.         "SUBTOTAL KEY
  wa_fieldcat-seltext_l = &2.
  wa_fieldcat-outputlen = &3.
  if g_pos = '3'.
    wa_fieldcat-key_sel   = 'X'.
   wa_fieldcat-input = 'X'.
    wa_fieldcat-edit = 'X'.
  endif.
  append wa_fieldcat to gt_fieldcat.
END-OF-DEFINITION.
*@=====================================================================@
*@ SELECT-SCREEN 选择屏幕
*@=====================================================================@
SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE text-001.
PARAMETERS: p_spras  TYPE spras OBLIGATORY.          "语言代码
SELECT-OPTIONS:s_msehi FOR  t006-msehi.              "期间
SELECTION-SCREEN END OF BLOCK xavery.
*@=====================================================================@
*@ 执行程序事件
*@=====================================================================@
INITIALIZATION.
  PERFORM sub_init_cond.        "初始化选择屏幕字段

START-OF-SELECTION.
  PERFORM sub_process_cond.    "对选择条件进行处理
  PERFORM sub_query_t006a .    "查询相关数据

END-OF-SELECTION.
  PERFORM sub_create_fieldcat.
  PERFORM sub_init_layout.
  PERFORM sub_display_as_alv.  "以ALV的方式输出结果表
*&---------------------------------------------------------------------*
*&      Form  SUB_INIT_COND
*&---------------------------------------------------------------------*
      设置选择屏幕上的初始值
*----------------------------------------------------------------------*
FORM sub_init_cond .
  p_spras = sy-langu.
ENDFORM.                    " SUB_INIT_COND
*&---------------------------------------------------------------------*
*&      Form  SUB_PROCESS_COND
*&---------------------------------------------------------------------*
      对选择条件进行处理
*----------------------------------------------------------------------*
FORM sub_process_cond .
ENDFORM.                    " SUB_PROCESS_COND
*&---------------------------------------------------------------------*
*&      Form  SUB_QUERY_T006A
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
FORM sub_query_t006a .
  SELECT * FROM t006a
      INTO CORRESPONDING FIELDS OF TABLE gt_result
      WHERE spras EQ p_spras AND
            msehi IN s_msehi.
ENDFORM.                    " SUB_QUERY_T006A
*&---------------------------------------------------------------------*
*&      Form  SUB_CREATE_FIELDCAT
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
FORM sub_create_fieldcat .
  CLEAR gt_fieldcat[].
  mcr_field  'MANDT'       '客户端'                 '8'.
  mcr_field  'SPRAS'       '语言代码'               '8'.
  mcr_field  'MSEHI'       '计量单位'               '4'.
  mcr_field  'MSEH3'       '商业格式中外部计量单'   '18'.
  mcr_field  'MSEH6'       '技术格式中的外部计量单' '30'.
  mcr_field  'MSEHT'       '度量单位文本'           '10'.
  mcr_field  'MSEHL'       '度量单位长文本'         '20'.
ENDFORM.                    " SUB_CREATE_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  SUB_INIT_LAYOUT
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
FORM sub_init_layout .
  wa_layout-zebra           = 'X'.
  wa_layout-window_titlebar = '计量单位查询清单'.
  wa_layout-colwidth_optimize = 'X'.
  wa_layout-box_fieldname     = 'BOX'.
  wa_layout-coltab_fieldname  = 'COLOR'.
  g_title = 'My God'.

ENDFORM.                    " SUB_INIT_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  SUB_DISPLAY_AS_ALV
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
FORM sub_display_as_alv .
  g_repid = sy-repid.
  g_setting-coll_top_p = 'X'.       "最小化 CALLBACK-TOP-OF-PAGE.
*ABAP List Viewer
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = g_repid
      i_structure_name         = 'TYP_RESULT'
      i_grid_title             = g_title
      i_grid_settings          = g_setting
      i_callback_user_command  = 'SUB_USER_COMMAND'
      i_callback_pf_status_set = 'SUB_SET_PF_STATUS'
      i_callback_top_of_page   = 'SUB_TOP_OF_PAGE'
      i_save                   = g_save
      is_layout                = wa_layout
      it_fieldcat              = gt_fieldcat[]
    TABLES
      t_outtab                 = gt_result
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.                    " SUB_DISPLAY_AS_ALV
*@--------------------------------------------------------------------*
*@      Form  sub_user_command
*@--------------------------------------------------------------------*
     -->R_UCOMM     事务功能码
     -->RS_SELFIELD ALV相关的数据
*---------------------------------------------------------------------*
FORM sub_user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.
  CASE r_ucomm.
    WHEN '&IC1'.                 "双击事件的功能码

  ENDCASE.
* 刷新ALV内表
  rs_selfield-refresh = 'X'.
* 根据字段内容,处理信息提示
  DATA g_tabix(6) TYPE c.
  LOOP AT gt_result ASSIGNING <fs_result>.
    g_tabix = sy-tabix.
    IF <fs_result>-msehi IS INITIAL.
      CONCATENATE '第' g_tabix ' 行‘计量单位’的字段值不能为空'
           INTO <fs_result>-mssg.
    ELSE.
      CLEAR <fs_result>-mssg.
    ENDIF.
  ENDLOOP.
* 输出错误信息
  LOOP AT gt_result WHERE NOT mssg IS INITIAL.
    MESSAGE gt_result-mssg TYPE 'E'.
  ENDLOOP.
ENDFORM.                    "sub_user_command
*@---------------------------------------------------------------------*
*@       FORM SUB_SET_PF_STATUS                                        *
*@---------------------------------------------------------------------*
设置ALV菜单
通过SE41,拷贝程序SAPLSLVC_FULLSCREEN的状态STANDARD_FULLSCREEN过来
*@---------------------------------------------------------------------*
FORM sub_set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.                    "sub_set_pf_status
*&---------------------------------------------------------------------*
*&      Form  sub_top_of_page
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
FORM sub_top_of_page.

ENDFORM.                    "sub_top_of_page

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有