广告位联系
返回顶部
分享到

APAP ALV进阶写法及优化介绍

相关技巧 来源:互联网 作者:佚名 发布时间:2022-09-13 21:27:49 人浏览
摘要

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

先导

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

流程搭建

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

1

2

3

4

5

6

7

8

9

10

11

12

13

*数据准备

*常规定义变量,内表结构,工作区,内表,包。。。。

你的代码

*系统变量准备

*如layout,fieldcat 等 系统变量

你的代码

*选择屏幕

你的代码

*INITIALIZATION

*at SELECTION-SCREEN .

"START-OF-SELECTION

"End-OF-SELECTION .

“子例程及自定义宏

流程讲解

INITIALIZATION.

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

at SELECTION-SCREEN!

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

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

START-OF-SELECTION

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

End-OF-SELECTION .

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

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

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

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

演练

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

数据准备

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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.

选择屏幕

1

2

3

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  .

1

2

INITIALIZATION  .

%_p_p1_%_app_%-text = '物料号'.  "设定选择屏幕初始化名称

at SELECTION-SCREEN .

1

2

at SELECTION-SCREEN .

PERFORM check_auth .  "权限检查

START-OF-SELECTION    .

1

2

START-OF-SELECTION    .

PERFORM get_DAta  .  "获取数据属性

END-OF-SELECTION .

1

2

End-OF-SELECTION .

PERFORM diaplay_data.   "展示alv

子程序和宏

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

"获取数据子程序

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 这个例子代码少了很多, 但是比其他语言来讲还是太复杂了.

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

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 : https://juejin.cn/post/7140904450901671949
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计