OO_alv中的cl_salv_table类

7 篇文章 0 订阅

文章目录

1.背景

在alv展示中,以前用的是REUSE_ALV_GRID_DISPLAY这个函数,现在用cl_salv_table更好。最大的优势就是不需要定义太多。

2.demo

REUSE_ALV_GRID_DISPLAY的用法

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          "显示界面可编辑字段上修改了数据,回车后就会立即将内表的数据也修改
          i_grid_settings          = i_grid_settings
          "标记当前程序
          i_callback_program       = sy-cprog
          it_fieldcat              = fieldcat[]
          is_layout                = layout
          i_callback_user_command  = 'USER_COMMAND' "此处是用户动作的入口
          i_callback_pf_status_set = 'SET_STATUS'   "此处是工具栏的入口
        TABLES
          t_outtab                 = item.           "此处是数据内表

cl_salv_table的用法,比起REUSE_ALV_GRID_DISPLAY,简单太多.

REPORT zjglmm012.
TABLES: marc,eina,eine,sscrfields,agr_users, ztesoppap.
DATA:zbz.
DATA  ALV TYPE REF TO cl_salv_table.

.

TYPES: BEGIN OF ty_item,
         matnr     LIKE marc-matnr,
         maktx     LIKE makt-maktx,
         werks     LIKE marc-werks,
         lifnr     LIKE eina-lifnr,
         name1     LIKE lfa1-name1,
         major     LIKE ztesoppap-major,
         esostu    LIKE ztesoppap-esostu,
         esono     LIKE ztesoppap-esono,
         esodate   LIKE ztesoppap-esodate,
         ppapstu LIKE ztesoppap-ppapstu,
         ppapno    LIKE ztesoppap-ppapno,
         ppapdate  LIKE ztesoppap-ppapdate,
         dled      LIKE ztesoppap-dled,
       END OF ty_item.
DATA: item TYPE STANDARD TABLE OF ty_item ,
       wa_item type ty_item .
*二、声明查询屏幕
SELECTION-SCREEN FUNCTION KEY 1 .

SELECTION-SCREEN BEGIN OF BLOCK blc WITH FRAME TITLE text-001.
PARAMETERS:
pwerks LIKE marc-werks DEFAULT '2100' OBLIGATORY.


SELECT-OPTIONS : smatnr  FOR marc-matnr,
                 slifnr FOR eina-lifnr NO INTERVALS NO-EXTENSION.
SELECTION-SCREEN END OF BLOCK blc.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 USER-COMMAND sele DEFAULT 'X' ,
            r2 RADIOBUTTON GROUP rad1 ,
            r3 RADIOBUTTON GROUP rad1 .

INITIALIZATION.
  sscrfields-functxt_01 = '更新数据'.

AT SELECTION-SCREEN .

  CASE sscrfields-ucomm . "
    WHEN 'FC01'.
      PERFORM frm_update_data.
  ENDCASE.

START-OF-SELECTION.
  PERFORM check_authority.
  CHECK zbz IS INITIAL.
  PERFORM frm_get_data.                 "获取数据
  IF item[] IS NOT INITIAL.
    PERFORM frm_show_data.
  ELSE.
    MESSAGE s001(00) WITH '没有查询到数据'.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .
  SELECT
    *
    INTO CORRESPONDING FIELDS OF TABLE item
    FROM ztesoppap
    WHERE werks = pwerks
    AND matnr IN smatnr
    AND lifnr IN slifnr .


  LOOP AT item into wa_item .
    SELECT SINGLE maktx INTO wa_item-maktx FROM MAKT WHERE matnr = wa_item-matnr.
    SELECT SINGLE name1 INTO wa_item-name1 FROM lfa1 WHERE lifnr = wa_item-lifnr.
    MODIFY item from wa_item.
  ENDLOOP.


   DATA message TYPE REF TO cx_salv_msg.
      TRY.
       cl_salv_table=>factory(
        IMPORTING
          r_salv_table =  alv
        CHANGING
          t_table      = item ).
       CATCH cx_salv_msg INTO message.
         ENDTRY.
ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_show_data .




       alv->display( ).


ENDFORM.                    " FRM_SHOW_DATA
FORM set_status USING rt_extab TYPE slis_t_extab.
  DATA:it_status TYPE TABLE OF sy-ucomm.
  IF r1 = 'X'.
    APPEND '&ZZPT' TO it_status.
    SET PF-STATUS 'ZCMD1' EXCLUDING it_status.
  ELSE.
    SET PF-STATUS 'ZCMD1'.
  ENDIF.

ENDFORM.

FORM user_command USING rf_ucomm  LIKE sy-ucomm
                        rs        TYPE slis_selfield .

ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  FRM_UPDATE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_update_data .


  SELECT
    marc~matnr
    marc~werks
    eina~lifnr
       INTO CORRESPONDING FIELDS OF TABLE item
     FROM marc
     INNER JOIN eina ON marc~matnr = eina~matnr
     WHERE marc~lvorm <>  'X'
     AND eina~loekz <> 'X'    .


  DATA: lt_zjsfs LIKE TABLE OF ztesoppap WITH HEADER LINE.
  DATA: in_zjsfs LIKE TABLE OF ztesoppap WITH HEADER LINE.
  DATA: up_zjsfs LIKE TABLE OF ztesoppap WITH HEADER LINE.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_zjsfs FROM ztesoppap .
  SORT item BY werks  matnr lifnr.
  DELETE ADJACENT DUPLICATES FROM item COMPARING ALL FIELDS.
  DATA: num(1) TYPE c.
  LOOP AT item into wa_item.
   SELECT SINGLE  *  FROM ztesoppap WHERE matnr = wa_item-matnr
      AND  werks = wa_item-werks
      AND  lifnr = wa_item-lifnr.
    IF sy-subrc = 0."存在相同数据
       clear ztesoppap.                                                "  Because it is defintion in the tables.
      IF ztesoppap-dled IS NOT INITIAL."存在相同数据,但是已经被标记删除
        up_zjsfs-werks =  wa_item-werks.
        up_zjsfs-matnr = wa_item-matnr.
        up_zjsfs-lifnr = wa_item-lifnr.
        up_zjsfs-major = ztesoppap-major.
        up_zjsfs-esostu = ztesoppap-esostu.
         up_zjsfs-esodate = ztesoppap-esodate.
        up_zjsfs-major = ztesoppap-major.
         up_zjsfs-ppapno = ztesoppap-ppapno.
        up_zjsfs-ppapdate = ztesoppap-ppapdate.
        up_zjsfs-dled = ''.
        APPEND up_zjsfs.
      ENDIF.
    ELSEIF sy-subrc <> 0."不存在该数据,做插入动作
      in_zjsfs-werks = wa_item-werks.
      in_zjsfs-matnr = wa_item-matnr.
      in_zjsfs-lifnr = wa_item-lifnr.
      in_zjsfs-dled = ''.
      APPEND in_zjsfs.
    ENDIF.
  ENDLOOP.
  "更新删除标识
  IF up_zjsfs[] IS NOT INITIAL.
    UPDATE ztesoppap FROM TABLE up_zjsfs.
  ENDIF.

  "插入新数据
  IF in_zjsfs[] IS NOT INITIAL.
    INSERT ztesoppap FROM TABLE in_zjsfs.
  ENDIF.

  MESSAGE s001(00) WITH '更新成功'.
ENDFORM.                    " FRM_UPDATE_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_SAVEDATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_savedata .

ENDFORM.                    " FRM_SAVEDATA
*&---------------------------------------------------------------------*
*&      Form  CHECK_AUTHORITY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM check_authority .
  CLEAR:zbz.
  IF r2 = 'X'.
    SELECT SINGLE *  FROM agr_users WHERE uname = sy-uname AND agr_name = 'Z_AU_ZRPP015T'.
    IF sy-subrc <> 0.
      MESSAGE s001(00) WITH '没有数据维护权限'.
      zbz = 'X'.
    ENDIF.
  ENDIF.
ENDFORM.                    " CHECK_AUTHORITY

源文档

3.总结

在写程序的时候,定义了比较多的数据元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值