APAP ALV进阶写法及优化详解

2023-12-05 0 531
目录
  • 先导
  • 流程搭建
  • 流程讲解
    • INITIALIZATION.
    • atSELECTION-SCREEN!
    • START-OF-SELECTION
    • End-OF-SELECTION.
  • 数据准备
    • 选择屏幕
      • INITIALIZATION.
      • atSELECTION-SCREEN.
      • START-OF-SELECTION.
      • END-OF-SELECTION .
    • 子程序和宏
      • 总结

        先导

        上一期讲了在ABAP中,ALV的普通写法,流程以及相关属性,还讲了基本DEMO ,但是在真正开发中,不会写这么多的代码.原则上是一切从简. o( ̄︶ ̄)oo( ̄︶ ̄)o.今天讲下如何用少的代码,标准套路,实现ALV基本功能,满足开发生产需求.

        流程搭建

        万变不离其宗,首先书写的还是流程,比如让你写一个某某查询报表. 上来啥都不用想你先这么写

        *数据准备
        *常规定义变量,内表结构,工作区,内表,包。。。。
        你的代码
        *系统变量准备
        *如layout,fieldcat 等 系统变量
        你的代码
        *选择屏幕
        你的代码
        *INITIALIZATION
        *at SELECTION-SCREEN .
        \”START-OF-SELECTION
        \”End-OF-SELECTION .
        “子例程及自定义宏

        流程讲解

        APAP ALV进阶写法及优化详解

        INITIALIZATION.

        APAP ALV进阶写法及优化详解

        该事件在屏幕未显示之前执行,对程序设置值及屏幕元素进行初始化赋值。一般作用就是初始值设定,如选择屏幕的数据赋值,默认参数赋值等。

        atSELECTION-SCREEN!

        APAP ALV进阶写法及优化详解

        1:选择屏幕事件,有很多参数,代表不同的扩展信息

        2:在这个事件响应中,可以对屏幕字段进行有效性检验,控制屏幕元素的属性等。

        START-OF-SELECTION

        该事件在单击按钮后触发,一般是数据初始化,数据处理操作的地方

        APAP ALV进阶写法及优化详解

        End-OF-SELECTION.

        该事件应用于所有数据选择处理完成,

        即START-OF-SELECTION相关执行事件执行完成,

        但输出屏幕还未显示之前 在实际的应用于一些执行结果的检验等。

        一般做为ALV展示及用户操作按钮事件等。

        演练

        这里写一个简单的物料明细查询报表 ,知识点用到了,宏,循环,opensql,用户事件等内容。

        数据准备

        TABLES : MARA .
        *数据准备
        \”定义结构
        TYPES : BEGIN OF gw_Data ,
        MATNR TYPE MATNR ,
        MEINS TYPE MEINS ,
        MAKTX TYPE MAKTX ,
        end of gw_Data .
        \”定义工作区及内表
        data : gs_data TYPE gw_Data .
        data :gt_data TYPE table of gw_Data .
        \”alv 数据
        *——————————————————————–*
        * 通用ALV变量
        *——————————————————————–*
        DATA: wa_layout TYPE lvc_s_layo.
        DATA:wa_fieldcat TYPE lvc_s_fcat,
        gt_fieldcat TYPE lvc_t_fcat.
        DATA:gs_glay TYPE lvc_s_glay.
        DATA : gv_error TYPE c.
        DATA : BS1 TYPE C.

        选择屏幕

        SELECTION-SCREEN BEGIN OF BLOCK BLOCK WITH FRAME TITLE TEXT-001 .
        PARAMETERS p_p1 TYPE mara-matnr OBLIGATORY. \”料号
        SELECTION-SCREEN END OF BLOCK BLOCK .

        INITIALIZATION.

        INITIALIZATION .
        %_p_p1_%_app_%-text = \’物料号\’. \”设定选择屏幕初始化名称

        atSELECTION-SCREEN.

        at SELECTION-SCREEN .
        PERFORM check_auth . \”权限检查

        START-OF-SELECTION.

        START-OF-SELECTION .
        PERFORM get_DAta . \”获取数据属性

        END-OF-SELECTION .

        End-OF-SELECTION .
        PERFORM diaplay_data. \”展示alv

        子程序和宏

        以下程序都使用新语法.不懂新语法后续会出相关内容

        \”获取数据子程序
        FORM get_DAta .
        select a~matnr,a~MEINS,b~maktx
        from mara as a inner join makt as b
        on a~matnr = b~MATNR where a~ZMATNR = @p_p1 into table @data(lt_outdata) .
        ENDFORM .
        *展示alv 子程序 直接复制
        FORM diaplay_data .
        PERFORM set_alv_layout. \”样式设定
        PERFORM bulid_fieldcat. \”格式设定
        PERFORM call_alv_func. \”alv 函数
        ENDFORM.
        \”样式设定 直接复制
        FORM set_alv_layout .
        CLEAR: wa_layout.
        wa_layout-zebra = \’X\’. \”斑马线
        wa_layout-cwidth_opt = \’X\’. \”自动列宽
        ENDFORM.
        \”格式设定 固定换数
        FORM bulid_fieldcat .
        DEFINE add_col.
        * ADD 1 TO pos.
        * lw_fieldcat-col_pos = pos.
        wa_fieldcat-fieldname = &1.
        wa_fieldcat-ref_field = &2.
        wa_fieldcat-ref_table = &3.
        wa_fieldcat-scrtext_l = &4.
        wa_fieldcat-outputlen = &5.
        wa_fieldcat-no_zero = &6.
        wa_fieldcat-edit = &7.
        wa_fieldcat-edit_mask = &8.
        wa_fieldcat-key = &9.
        CASE wa_fieldcat-fieldname.
        WHEN \’slbox\’.
        wa_fieldcat-checkbox = \’X\’ .
        wa_fieldcat-edit = \’X\’ .
        wa_fieldcat-edit_mask = \’X\’.
        WHEN OTHERS.
        ENDCASE .
        APPEND wa_fieldcat TO gt_fieldcat.
        CLEAR : wa_fieldcat.
        END-OF-DEFINITION.
        REFRESH: gt_fieldcat.
        \”add_col \’matnr\’ space space \’物料号\’ space space space space space.
        add_col \’MEINS\’ space space \’单位\’ space space space space space.
        add_col \’maktx\’ space space \’物料名\’ space space space space space.
        ENDFORM.
        \”刷新 固定复制
        FORM refresh_alv .
        DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
        lw_stable TYPE lvc_s_stbl.
        CALL FUNCTION \’GET_GLOBALS_FROM_SLVC_FULLSCR\’
        IMPORTING
        e_grid = lo_grid.
        lw_stable-row = \’X\’.
        lw_stable-col = \’X\’.
        lo_grid->refresh_table_display(
        EXPORTING
        is_stable = lw_stable
        EXCEPTIONS
        finished = 1
        OTHERS = 2 ).
        ENDFORM.
        \”固定,只需要传内表就行
        FORM call_alv_func .
        gs_glay-edt_cll_cb = abap_true. \” 选中复选款,立刻触发data changed 事件
        CALL FUNCTION \’REUSE_ALV_GRID_DISPLAY_LVC\’
        EXPORTING
        i_callback_program = sy-repid \”回调程序
        i_callback_pf_status_set = \’SET_PF_STATUS\’
        i_callback_user_command = \’USER_COMMAND\’
        i_grid_settings = gs_glay
        is_layout_lvc = wa_layout
        it_fieldcat_lvc = gt_fieldcat \”需要显示的内表的列
        i_save = \’A\’
        TABLES
        t_outtab = lt_outdata \”需要显示的数据
        EXCEPTIONS
        program_error = 1
        OTHERS = 2.
        IF sy-subrc <> 0.
        ENDIF.
        ENDFORM.
        \”staus 工具栏 直接复制
        FORM set_pf_status USING rt_extab TYPE slis_t_extab.
        DATA : lw_tab LIKE LINE OF rt_extab.
        REFRESH rt_extab.
        SET PF-STATUS \’STD\’ EXCLUDING rt_extab.
        ENDFORM.
        \”用户事件 ,这里没写. 但是如果设定函数双击会apap dump
        FORM user_command USING r_ucomm LIKE sy-ucomm
        rs_selfield TYPE slis_selfield.
        CASE r_ucomm.
        * 导入
        WHEN \’&IMPLE\’.
        ENDCASE.
        ENDFORM.
        \”权限检查,按照不同的情况调用不同的函数,这里需要更换.
        *&———————————————————————*
        *& Form check_auth
        *&———————————————————————*
        *& text
        *&———————————————————————*
        *& –> p1 text
        *& <– p2 text
        *&———————————————————————*
        FORM check_auth .
        \”select SINGLE WERKS, KUNNR into @data(ls_t001w) from t001w WHERE WERKS = @p_p1 .
        AUTHORITY-CHECK OBJECT \’M_MSEG_WMB\’
        ID \’ACTVT\’ DUMMY
        ID \’WERKS\’ FIELD p_p1 .
        IF sy-subrc <> 0.
        * Implement a suitable exception handling here
        ENDIF.
        ENDFORM.

        以上就为一个alv 的写法 ,其中 70%以上的代码是固定的.

        自己需要写的地方, 选择屏幕,获取数据 ,数据处理,用户事件,权限. 这四个地方.

        总结

        相比较上一个demo 这个例子代码少了很多, 但是比其他语言来讲还是太复杂了.

        大部分还是套路,固定这么写,就可以. 主要还是在程序及逻辑操作上.

        使用新语法可以减少很多不必要的操作,比如定义结构,内表,关联等.

        以上就是APAP ALV进阶写法及优化详解的详细内容,更多关于APAP ALV写法优化的资料请关注悠久资源网其它相关文章!

        您可能感兴趣的文章:

        • ABAP ALV最常规写法及常用功能详解

        收藏 (0) 打赏

        感谢您的支持,我会继续努力的!

        打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
        点赞 (0)

        悠久资源 编程综合 APAP ALV进阶写法及优化详解 https://www.u-9.cn/biancheng/bczonghe/99484.html

        常见问题

        相关文章

        发表评论
        暂无评论
        官方客服团队

        为您解决烦忧 - 24小时在线 专业服务