SAP OOALV-SD模块实战开发案例(增删改查)

SAP OOALV-SD模块实战开发案例(增删改查)

小白abap开发,代码比较向老奶奶的裹脚布又臭又长.总之基本的代码功能是可以实现的,后续也会对代码进行优化,欢迎讨论.

功能:根据选择屏幕的选择,获取不同维度是我数据,在根据按钮来实现不同的功能

主程序

REPORT zsdt0001 MESSAGE-ID z_sd_01.

INCLUDE zsdt0001_top.
INCLUDE zsdt0001_form.
INCLUDE zsdt0001_pai.
INCLUDE zsdt0001_pbo.

INITIALIZATION.
  "  PERFORM frm_check_authority . "权限检查


START-OF-SELECTION.

  PERFORM frm_get_data. "获取数据

END-OF-SELECTION.

  SET PF-STATUS '0100'. "设置gui状态

  IF gt_year IS NOT INITIAL OR gt_prod IS NOT INITIAL OR gt_prom IS NOT INITIAL.
     CALL SCREEN 0100 . "显示数据
  ELSE.
    MESSAGE s000 DISPLAY LIKE 'E'.
  ENDIF.

zsdt0001_top

DATA: gt_year TYPE TABLE OF ztsd004, "年度
      gt_prom TYPE TABLE OF ztsd005, "促销
      gt_prod TYPE TABLE OF ztsd006, "产品
      gs_year TYPE ztsd004,
      gs_prom TYPE ztsd005,
      gs_prod TYPE ztsd006.

*OOALV
DATA: gs_layout   TYPE lvc_s_layo,
      gt_fieldcat TYPE lvc_t_fcat,
      gs_fieldcat TYPE lvc_s_fcat.
DATA  gs_stable TYPE lvc_s_stbl. "固定
DATA STYLELIN TYPE LVC_S_STYL.
DATA gs_alv TYPE REF TO cl_gui_alv_grid .
DATA gs_parent TYPE REF TO cl_gui_custom_container.
DATA ok_code TYPE sy-ucomm .
DATA g_toolbar   TYPE ui_functions.

"宏定义
DEFINE m_fcat.
  CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = &1. "字段id
  gs_fieldcat-scrtext_l = &2. "字段描述
  gs_fieldcat-checkbox = &3 . "是否复选框
  " gs_fieldcat-edit  = &4. "是否可编辑
  
*搜索帮助
*这里的搜索帮助是需要先在se11中定义好后才能在这里使用
  IF onl1 = 'X'.
    gs_fieldcat-ref_table = 'ZTSD004'.  "透明表
    gs_fieldcat-txt_field = 'MVGR1'.    "字段
  ELSEIF onl2 = 'X'.
    gs_fieldcat-ref_table = 'ZTSD005'.
    gs_fieldcat-txt_field = 'KDGRP'.
    gs_fieldcat-txt_field = 'MVGR1'.
    gs_fieldcat-txt_field = 'KONDA'.
  ELSEIF onl3 = 'X'.
    gs_fieldcat-ref_table = 'ZTSD006'.
    gs_fieldcat-txt_field = 'KONDA'.
    gs_fieldcat-txt_field = 'KDGRP'.
  ENDIF.
  APPEND gs_fieldcat TO gt_fieldcat .
END-OF-DEFINITION.

*选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK bo2 WITH FRAME TITLE TEXT-002.
  PARAMETERS : onl1 RADIOBUTTON GROUP rept , "年度
               onl2 RADIOBUTTON GROUP rept,  "促销
               onl3 RADIOBUTTON GROUP rept.  "产品
SELECTION-SCREEN END OF BLOCK bo2.

在这里插入图片描述

屏幕创建

1.逻辑流

PROCESS BEFORE OUTPUT.
*调用gui
  MODULE STATUS_0100. 
*调用ooalv
  MODULE  INIT_ALV .
*
PROCESS AFTER INPUT.
*退出按钮
  MODULE exit at exit-command .
*按钮功能
  MODULE USER_COMMAND_0100. 

2.元素清单
在这里插入图片描述

3.布局
这个容器是用来存放alv显示的效果的
在这里插入图片描述

ZSDT0001_PBO

*&---------------------------------------------------------------------*
*& 包含               ZSDT0001_PBO
*&---------------------------------------------------------------------*
MODULE init_alv OUTPUT.
  IF  gs_alv IS INITIAL.
    PERFORM creat_alv.
    PERFORM frm_init_fieldcat.  " 设置输出屏幕的ALV输出字段
    PERFORM frm_init_layout.    " 设置输出屏幕的ALV显示格式
    PERFORM frm_display_alv.    " 调用ALV显示函数显示数据
  ELSE.
    PERFORM refresh_alv . "刷新屏幕
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS '0100'. "gui状态
  SET TITLEBAR '0100'.
ENDMODULE.

ZSDT0001_PAI

*&---------------------------------------------------------------------*
*& 包含               ZSDT0001_PAI
*&---------------------------------------------------------------------*
MODULE exit INPUT.
  LEAVE PROGRAM .
ENDMODULE.
"按钮功能
MODULE user_command_0100 INPUT.
  CASE OK_CODE.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0 .
    WHEN 'EXIT' OR  'CANCEL'.
      LEAVE PROGRAM .
    WHEN '&SAVE'.
      PERFORM frm_save_data. "保存数据
    WHEN '&DELE'.
      PERFORM frm_delete_data. "删除数据
*    WHEN '&DAM'.
*      PERFORM frm_disp_edit.  " 显示<->修改
  ENDCASE.
ENDMODULE.

ZSDT0001_FORM

*&---------------------------------------------------------------------*
*& 包含               ZSDT0001_FORM
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text 我真服了
*&---------------------------------------------------------------------*
FORM frm_get_data .
  "根据fs字段参考获取相应的数据
  IF onl1 = 'X'.
    "年度
    SELECT * FROM ztsd004
*      INNER JOIN tvm1t ON ztsd004~bezei = tvm1t~bezei
      INTO CORRESPONDING FIELDS OF TABLE gt_year.

  ELSEIF onl2 = 'X'.
    "促销
    SELECT * FROM ztsd005
*      INNER JOIN t188t ON ztsd005~vtext = t188t~vtext
*      INNER JOIN t151t ON ztsd005~ktext = t151t~ktext
*     INNER JOIN tvm1t ON ztsd005~bezei = tvm1t~bezei
      INTO CORRESPONDING FIELDS OF TABLE gt_prom.

  ELSEIF onl3 = 'X'.
    "产品
    SELECT * FROM ztsd006
*     INNER JOIN t188t ON ztsd006~vtext = t188t~vtext
*      INNER JOIN t151t ON ztsd006~ktext = t151t~ktext
*      INNER JOIN makt ON ztsd006~maktx = makt~maktx
      INTO CORRESPONDING FIELDS OF TABLE gt_prod.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_init_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init_layout .
  gs_layout-cwidth_opt  =  'X'.
  gs_layout-zebra  = 'X'." 颜色交替.
  gs_layout-edit = 'X'. "修改

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_init_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init_fieldcat ."宏定义

  CLEAR gs_fieldcat.
  "年度字段展示
  IF onl1 = 'X'.
    m_fcat:
'MJAHR'	 '年度' ''  ,
'MVGR1'	 '系列代码' ''  ,
'BEZEI'	 '系列名称' ''  ,
'PRICE'	 '返利单价' ''  ,
'ERNAM'	 '创建人' ''  ,
'AUDAT'   '创建日期'  '' ,
'ZERNAM'  '审核人' ''  ,
'ANGDT'	 '审核日期' ''  ,
'STATE'	 '状态' ''  ,
'ZTIME'	 '更新时间' '' .

    APPEND gs_fieldcat TO gt_fieldcat .

  ELSEIF onl2 = 'X'.
    m_fcat:
   'MJAHR'   '年度'            ''  ,
   'KDGRP'   '客户分类'        ''  ,
   'MVGR1'   '系列代码'        ''  ,
   'KONDA'   '促销类型'        ''  ,
   'VTEXT'   '促销类型描述'    ''  ,
   'KTEXT'   '客户分类名称'    ''  ,
   'BEZEI'   '系列名称'        ''  ,
   'PRICE'   '返利单价'        ''  ,
   'ERNAM'   '创建人'          ''  ,
   'AUDAT'   '创建日期'        ''  ,
   'ZERNAM'   '审核人'         ''  ,
   'ANGDT'   '审核日期'        ''  ,
   'STATE'   '状态'            ''  ,
   'ZTIME'   '更新时间'        ''  .

    APPEND gs_fieldcat TO gt_fieldcat .
  ELSEIF onl3 = 'X'.
    m_fcat:
'MJAHR'	'年度' '' ,
'KONDA'	'促销类型' '' ,
'VTEXT'	'促销类型描述' '' ,
'KDGRP'	'客户分类' '' ,
'KTEXT'	'客户分类名称'  ''  ,
'MANTR'	'产品编码' '' ,
'MAKTX'	'产品名称' '' ,
'PRICE'	'返利单价' '' ,
'ERNAM'	'创建人' '' ,
'AUDAT'	'创建日期' '' ,
'ZERNAM'  '审核人' '' ,
'ANGDT'	'审核日期' '' ,
'STATE'	'状态' '' ,
'ZTIME'	'更新时间' '' .
    APPEND gs_fieldcat TO gt_fieldcat .
  ENDIF.
  PERFORM frm_toolbar .
ENDFORM.

*关闭到alv上的部分按钮
FORM frm_toolbar .
  REFRESH g_toolbar.
  PERFORM append_alv_exclude_functions TABLES g_toolbar  USING:
               cl_gui_alv_grid=>mc_fc_reprep            ,
               cl_gui_alv_grid=>mc_fc_check             ,
               cl_gui_alv_grid=>mc_mb_export            ,
               cl_gui_alv_grid=>mc_fc_detail            ,
*               cl_gui_alv_grid=>mc_fc_refresh           ,
               cl_gui_alv_grid=>mc_fc_graph             ,
               cl_gui_alv_grid=>mc_fc_loc_undo          ,
               cl_gui_alv_grid=>mc_fc_loc_delete_row    ,
               cl_gui_alv_grid=>mc_fc_loc_insert_row    ,
               cl_gui_alv_grid=>mc_fc_loc_copy_row      ,
               cl_gui_alv_grid=>mc_fc_loc_cut           ,
               cl_gui_alv_grid=>mc_fc_loc_append_row    ,
               cl_gui_alv_grid=>mc_fc_loc_paste_new_row ,
               cl_gui_alv_grid=>mc_fc_info              ,
               cl_gui_alv_grid=>mc_fc_loc_copy          ,
               cl_gui_alv_grid=>mc_fc_loc_paste         ,
               cl_gui_alv_grid=>mc_fc_print             ,
               cl_gui_alv_grid=>mc_mb_sum               ,
               cl_gui_alv_grid=>mc_mb_view              ,
               cl_gui_alv_grid=>mc_fc_current_variant   ,
               cl_gui_alv_grid=>mc_fc_save_variant      ,
               cl_gui_alv_grid=>mc_fc_load_variant      ,
               cl_gui_alv_grid=>mc_fc_maintain_variant  ,
               cl_gui_alv_grid=>mc_fc_deselect_all      ,
               cl_gui_alv_grid=>mc_fc_select_all        .


ENDFORM.
FORM append_alv_exclude_functions TABLES pt_exclude TYPE ui_functions
                                    USING  p_value    TYPE ui_func.
  APPEND p_value TO pt_exclude.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv  .
  IF  onl1 = 'X'.
    CALL METHOD gs_alv->set_table_for_first_display
      EXPORTING
        it_toolbar_excluding          = g_toolbar
        is_layout                     = gs_layout
      CHANGING
        it_outtab                     = gt_year "传出表
        it_fieldcatalog               = gt_fieldcat "表单列格式
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
  ELSEIF onl2 = 'X'.
    CALL METHOD gs_alv->set_table_for_first_display
      EXPORTING
        it_toolbar_excluding          = g_toolbar
        is_layout                     = gs_layout
      CHANGING
        it_outtab                     = gt_prom "传出表
        it_fieldcatalog               = gt_fieldcat "表单列格式
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
  ELSEIF onl3 = 'X'.
    CALL METHOD gs_alv->set_table_for_first_display
      EXPORTING
        it_toolbar_excluding          = g_toolbar
        is_layout                     = gs_layout
      CHANGING
        it_outtab                     = gt_prod "传出表
        it_fieldcatalog               = gt_fieldcat "表单列格式
      EXCEPTIONS
        invalid_parameter_combination = 1
        program_error                 = 2
        too_many_lines                = 3
        OTHERS                        = 4.
  ENDIF.
ENDFORM.

FORM creat_alv .
  CREATE OBJECT gs_parent
    EXPORTING
      container_name = 'GC_CON'. "界面中的cunstomer control 控件名称
*将lav注入到容器中
  CREATE OBJECT gs_alv
    EXPORTING
      i_parent = gs_parent.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form refresh_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM refresh_alv .
  gs_stable-row = 'X'.
  gs_stable-col = 'X'.

  CALL METHOD gs_alv->refresh_table_display
    EXPORTING
      is_stable = gs_stable
*     i_soft_refresh =
    EXCEPTIONS
      finished  = 1
      OTHERS    = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_save_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_save_data .

  DATA: gt_tmp_4  TYPE TABLE OF ztsd004.
  DATA: gt_tmp_5  TYPE TABLE OF ztsd005.
  DATA: gt_tmp_6  TYPE TABLE OF ztsd006.

  DATA flg TYPE c LENGTH 1.

  "修改数据->内表得到数据->添加导数据库->
  "1.添加成功->修改状态和审核人->修改 审核 存在数据库->返回消息成功
  IF  onl1 = 'X'.

    MODIFY  ztsd004 FROM TABLE gt_year .

    SELECT * FROM ztsd004
    INTO CORRESPONDING FIELDS OF TABLE gt_tmp_4.
    CALL FUNCTION 'CTVB_COMPARE_TABLES_3'
      EXPORTING
        it_table_old  = gt_tmp_4
        it_table_new  = gt_year
        iv_key_count  = 100
      IMPORTING
        ev_no_changes = flg.
    IF  flg = 'X'.

      MESSAGE s001 DISPLAY LIKE 'S'.
      EXIT.
    ELSE .
      MESSAGE e002 DISPLAY LIKE 'E'.
      EXIT .
    ENDIF.
    CLEAR : flg, gt_tmp_4.
  ELSEIF onl2 = 'X'.
    MODIFY  ztsd005 FROM TABLE gt_prom .
    SELECT * FROM ztsd005
    INTO CORRESPONDING FIELDS OF TABLE gt_tmp_5.
    CALL FUNCTION 'CTVB_COMPARE_TABLES_3'
      EXPORTING
        it_table_old  = gt_tmp_5
        it_table_new  = gt_prom
        iv_key_count  = 100
      IMPORTING
        ev_no_changes = flg.
    IF  flg = 'X'.

      MESSAGE s001 DISPLAY LIKE 'S'.
      EXIT.
    ELSE .
      MESSAGE e002 DISPLAY LIKE 'E'.
      EXIT .
    ENDIF.
    CLEAR : flg, gt_tmp_5.
  ELSEIF onl3 = 'X'.
    MODIFY  ztsd006 FROM TABLE gt_prod .
    SELECT * FROM ztsd006
    INTO CORRESPONDING FIELDS OF TABLE gt_tmp_6.
    CALL FUNCTION 'CTVB_COMPARE_TABLES_3'
      EXPORTING
        it_table_old  = gt_tmp_6
        it_table_new  = gt_prod
        iv_key_count  = 100
      IMPORTING
        ev_no_changes = flg.
    IF  flg = 'X'.

      MESSAGE s001 DISPLAY LIKE 'S'.
      EXIT.
    ELSE .
      MESSAGE e002 DISPLAY LIKE 'E'.
      EXIT .
    ENDIF.
    CLEAR : flg, gt_tmp_6.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_delete_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_delete_data .
*1.获取选中的行号
*2.把选中的数据给到另一个内表中
*3.删除所选行号
*4.删除数据库

  "删除
  DATA lt_select TYPE lvc_t_row.
  DATA gt_del4 TYPE TABLE OF ztsd004.
  DATA gt_del5 TYPE TABLE OF ztsd005.
  DATA gt_del6 TYPE TABLE OF ztsd006.
  DATA gs_del4 LIKE LINE OF gt_del4.
  DATA gs_del5 LIKE LINE OF gt_del5.
  DATA gs_del6 LIKE LINE OF gt_del6.
*  DATA ls_del LIKE LINE OF gt_del.

  CALL METHOD gs_alv->get_selected_rows
    IMPORTING
      et_index_rows = lt_select.
  IF onl1 = 'X'.
    LOOP AT lt_select INTO DATA(ls_select4).
      READ TABLE gt_year INTO gs_year INDEX ls_select4-index.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING gs_year TO gs_del4.
        gs_del4-ztime = 'X'.
        APPEND gs_del4 TO gt_del4.
        CLEAR gs_del4.
      ENDIF.
      DELETE  gt_year INDEX ls_select4-index.
      DELETE ztsd004 FROM TABLE gt_del4 .
      IF sy-subrc = 0.
        MESSAGE s003 DISPLAY LIKE 'S'.
      ELSE.
        MESSAGE e004 DISPLAY LIKE 'E'.
      ENDIF.
    ENDLOOP.
  ELSEIF onl2 = 'X'.
    LOOP AT lt_select INTO DATA(ls_select5).
      READ TABLE gt_prom INTO gs_prom INDEX ls_select5-index.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING gs_prom TO gs_del5.
        gs_del5-ztime = 'X'.
        APPEND gs_del5 TO gt_del5.
        CLEAR gs_del5.
      ENDIF.
      DELETE  gt_prom INDEX ls_select5-index.
      DELETE ztsd005 FROM TABLE gt_del5 .
      IF sy-subrc = 0.
        MESSAGE s003 DISPLAY LIKE 'S'.
      ELSE.
        MESSAGE e004 DISPLAY LIKE 'E'.
      ENDIF.
    ENDLOOP.
  ELSEIF onl3 = 'X'.
    LOOP AT lt_select INTO DATA(ls_select6).
      READ TABLE gt_prod INTO gs_prod INDEX ls_select6-index. "获取选中的行号
      IF sy-subrc = 0.
        MOVE-CORRESPONDING gs_prod TO gs_del6.
        gs_del6-ztime = 'X'.
        APPEND gs_del6 TO gt_del6.
        CLEAR gs_del6.
      ENDIF.
      DELETE  gt_prod INDEX ls_select6-index."删除ooalv显示
      DELETE ztsd006 FROM TABLE gt_del6 . "删除数据库中的
      IF sy-subrc = 0.
        MESSAGE s003 DISPLAY LIKE 'S'.
      ELSE.
        MESSAGE e004 DISPLAY LIKE 'E'.
      ENDIF.
    ENDLOOP.
  ENDIF.
  PERFORM refresh_alv . "刷新
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_authority
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_check_authority .
*  AUTHORITY-CHECK OBJECT 'ZQM06_WERK'
*          ID 'WERKS' FIELD p_werks.
*  IF sy-subrc <> 0.
*    MESSAGE e036(zsy_qm_dev) WITH p_werks.
*  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_disp_edit
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
*FORM frm_disp_edit .
*      STYLELIN-FIELDNAME = 'ZBQFS'. " 需要编辑的列名
*     STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 设置为不可编辑状态
*      CLEAR STYLELIN.
*ENDFORM.

效果

在这里插入图片描述

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨天行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值