SAP OOALV-SD模块实战开发案例(增删改查)
小白abap开发,代码比较向老奶奶的裹脚布又臭又长.总之基本的代码功能是可以实现的,后续也会对代码进行优化,欢迎讨论.功能:根据选择屏幕的选择,获取不同维度是我数据,在根据按钮来实现不同的功能zsdt0001_top1.逻辑流2.元素清单3.布局这个容器是用来存放alv显示的效果的ZSDT0001_PAIZSDT0001_FORM效果...
·
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.
效果
更多推荐
已为社区贡献1条内容
所有评论(0)