Michael's profileAt world's endBlogGuestbookNetwork Tools Help

At world's end

November 10

ALV常用参数的详细描述

 

调用功能模块:

  CALL FUNCTION \'REUSE_ALV_GRID_DISPLAY\'

  EXPORTING

   i_interface_check        = \'\'                      接口一致性检查

   i_callback_program       = sy-repid                当前程序名

   is_layout                = layout                  输出样式

   it_fieldcat              = fieldcat[]              字段定义描述表

   i_callback_pf_status_set = \'PF_STATUS_SET\'         触发事件调用子程序

   i_callback_user_command  = \'USER_COMMAND\'          鼠标事件操作子程序

   it_events                = i_events[]              出口程序触发事件

   i_callback_html_top_of_page  = \'ALV_TOP_OF_PAGE\'   ALV输出表头设置

   i_grid_settings = wl_lvc_s_glay                    打印表头设置

   it_sort = sortable[]                               排序设置

TABLES

   t_outtab                 = ig_out

EXCEPTIONS

   program_error            = 1

   OTHERS                   = 2.

常用属性:(赋值’’中内容必须为大写)

1.  Fieldcat

data: fieldcat type slis_t_fieldcat_alv with header line.

it_fieldcat              = fieldcat[]

属性

  (用来定义表单中的各个列的相关信息)

   Fieldcat-col_pos = n.                  输出列

   Fieldcat-tabname = ‘FIELDNAME’.      对应的内表字段名

   Fieldcat-seltext_s/m/l = ‘列名’.     输出列文本

  (_s:短文本

   _l:长文本)

   Fieldcat-emphasize = ‘CX10’.    带有颜色的高亮列

  (其中X=(1-7)

  颜色同format)

   Fieldcat-hotspot = ‘X’.           作为热点显示

  可触发鼠标触发事件

   Fieldcat-currency = ‘CURRKEY’.   表 TCURX 中的货币名称

   Fieldcat-quantity(3)            计量单位

   Fieldcat-qfieldname           参考计量单位的字段名称

   Fieldcat-round = n.           四舍五入至小数位数下

   n 位

   Fieldcat-exponent = n.         浮点数的幂指数为n

   Fieldcat-key = ‘X’.           关键字段

   Fieldcat-icon = ‘X’.          作为图标输出

   Fieldcat-symbol = ‘X’.        输出作为符号

   Fieldcat-checkbox = ‘X’.      作为复选框输出

   Fieldcat-just = SPACE, \'R\', \'L\', \'C\'.   对齐方式

   Fieldcat-lzero = ‘X’.          输出前导零

   Fieldcat-no_sign = ‘X’.        输出抑制符号

   Fieldcat-no_zero = ‘X’.        为输出隐藏零

   Fieldcat-edit_mask = SPACE, mask..  输出为mask的模式

   Fieldcat-fix_column = ‘X’.      固定列

   Fieldcat-do_sum = ‘X’.        总计列值总和

   Fieldcat-no_out = ‘X’.         列不输出

   Fieldcat-tech = ‘X’.           该字段为技术字段

   Fieldcat-outputlen = n        列的字符宽度为n

   Fieldcat-decimals_out = n     能控制小数点的位数为n 

   Fieldcat-datatype = C,I,N…        定义数据类型

2.  SORT

data: sortable type slis_t_sortinfo_alv with header line.

it_sort = sortable[]

属性

  (排序)

    Sortable-Fieldname        字段名

             Up              升序排列

             Down            降序排列

             Subtot          

3.  Layout

    data: layout type slis_layout_alv .

    is_layout                = layout

属性 (用于定义ALV表单的相关格式、属性)

info_fieldname = \'LINE_COLOR\'.  设置特殊行颜色

(将LINE_COLOR增加到内表字段,写\'CX10\'到特殊行的LINE_COLOR, X为颜色值)

        colwidth_optimize = ‘X’.   优化列宽设置

no_colhead = \'X\'.         不显示列名

no_vline = \'X\'.            不显示列间竖线

zebra      

        f2code = \'&ETA\'.    设置触发弹出详细信息窗口的功能码,这里是双击

no_vline           这个用来设置列间隔线

        detail_initial_lines  

detail_popup        是否弹出详细信息窗口

        detail_titlebar       设置弹出窗口的标题栏

        totals_text

        totals_only

        group_change_edit

        header_text

4.按钮

  DATA: i_events TYPE slis_t_event WITH HEADER LINE.

  事件:

  it_events     = i_events[]   

  i_callback_pf_status_set = \'PF_STATUS_SET\'   

  i_callback_user_command  = \'USER_COMMAND\'

出口程序触发事件对应子程序:

  FORM PF_STATUS_SET USING rt_extab TYPE slis_t_extab.

  FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield.

功能代码:              函数文本:                          图标名称:

&ETA                   细节                        ICON_SELECT_DETAIL

&EB9                 调用报告...                     ICON_TABLE_SETTINGS

&REFRESH              刷新                        ICON_REFRESH

&ALL                 全部选择                      ICON_SELECT_ALL

&SAL                 取消全选                      ICON_DESELECT_ALL

&OUP                按升序排列                     ICON_SORT_UP

&ODN                按降序排列                     ICON_SORT_DOWN

&ILT                  设置过滤器                    ICON_FILTER

&UMC                  总计                         ICON_SUM

&SUM                  小计...                      ICON_INTERMEDIATE_SUM

&RNT_PREV           打印预览                      ICON_LAYOUT_CONTROL

&VEXCEL            Microsoft Excel                   ICON_XLS

&AQW                字处理...                       ICON_WORD_PROCESSING

%PC                   本地文件  ...                   ICON_EXPORT

%SL                  邮件收件人                      ICON_MAIL

&ABC                 ABC 分析                      ICON_ABC

&GRAPH                图形                         ICON_GRAPHICS

&OL0                 更改布局...                      ICON_ALV_VARIANTS

&OAD                选择格式...                 ICON_ALV_VARIANT_CHOOSE

&AVE                 保存格式...                  ICON_ALV_VARIANT_SAVE

&INFO                  信息                      ICON_INFORMATION

1.  ALV表头设置

i_callback_html_top_of_page  = \'ALV_TOP_OF_PAGE\'

form top_of_page using cl_dd type ref to cl_dd_document.

语法同HTML fomat  

ALV_GRID介绍

一.ALV介绍 

The ALV Grid Control (ALV = SAP List Viewer)是一个显示列表的灵活的工具,它提供了基本功能的列表操作,也可以通过自定义来进行增强,因此可以允许你可以在大型的应用程序中使用.

   SAP提示: 在SAP的开发项目中,ALV GRID也可以作为修改和创建数据的一种工具,然而,目前这个功能只在实验计划中使用,还没有向客户发布.

   下面是一个ALV GRID的图片:

它包括3大部分,工具栏,标题,用于显示数据的网格控制器.如果有必要,用户可以隐藏标题和工具栏.

    ALV家族包含3中ALV工具:简易的,两层ALV,分等级连续的列表和树形结构的ALV.

二.ALV GRID CONTROL (ALV网格控制器)

   ALV GRID CONTROL使用了控制器技术以实现艺术性的屏幕显示,象所有的控制器一样,ALV GRID CONTROL通过系统中的一个全局的类提供了方法,以响应它的动作.

   使用了ABAP的对象以后,列表是通过ALV的一个实例(INSTANCE)来显示的,程序员可以使用ABAP对象的事件管理.

三.ALV GRID CONTROL 实例

   ALV GRID实例的定义,参照CL_GUI_ALV_GRID类

     data ALV_GRID1 type ref to cl_gui_alv_grid.

  ALV GRID继承结构:

ALV_GRID介绍二(1)

四、ALV GRID相关的几个控制结构

    1.字段目录  [Field catalog]

       字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.

       常用的控制字段如下:(下面的示例将说明这些字段的使用,参考STRUCTURE LVC_S_FCAT)

2 ROW_POS ALV 控制: 输出行 (内部使用)  

3 COL_POS ALV 控制: 输出列 列的位置,第几列,例如1,2,…..

4 FIELDNAME ALV 控制: 内部表字段的字段名称 字段名称

5 TABNAME LVC 标签名称 表名,如果是内表,是1

6 CURRENCY ALV 控制: 货币单位  

7 CFIELDNAME ALV 控制: 参考的当前单位的字段名称  

8 QUANTITY ALV 控制: 计量单位  

9 QFIELDNAME ALV 控制: 参考计量单位的字段名称  

10 IFIELDNAME ALV 控制: 内部表字段的字段名称  

11 ROUND ALV 控制: ROUND 值  

12 EXPONENT ALV 控制:流动表示的指数  

13 KEY ALV 控制: 关键字段 关键字段,前面变蓝色

14 KEY_SEL ALV 控制: 可以被隐藏的关键列 可以被隐藏的关键列

15 ICON ALV 控制: 作为图标输出 此列作为图标输出

16 SYMBOL ALV 控制: 输出作为符号  

17 CHECKBOX ALV 控制: 作为复选框输出 复选框输出

18 JUST ALV 控制: 对齐 对齐方式:

\'R\': right justified

\'L\': left justified

\'C\': centered

19 LZERO ALV 控制: 输出前导零 X\'

20 NO_SIGN ALV 控制:输出抑制符号 X\',不输出符号

21 NO_ZERO ALV 控制: 为输出隐藏零 X\',隐藏0

22 NO_CONVEXT ALV 控制: 不考虑输出的转换退出  

23 EDIT_MASK ALV 控制: 为输出编辑掩码 格式

24 EMPHASIZE ALV 控制: 带有颜色的高亮列 列的颜色

25 FIX_COLUMN ALV 控制: 固定列  

26 DO_SUM ALV 控制: 总计列值 X\',合计

ALV_GRID介绍二(2)

27 NO_SUM ALV 控制: 没有总计列值 X\' ,没有合计

28 NO_OUT ALV 控制: 列没有输出 X\' ,隐藏此列

29 TECH ALV 控制: 技术字段 X\'.也是隐藏,但是有点不一样

30 OUTPUTLEN ALV 控制: 列的字符宽度 输出的长度

31 CONVEXIT 转换例程  

32 SELTEXT ALV 控制: 对话功能的列标识符  

33 TOOLTIP ALV 控制: 列抬头的工具提示  

34 ROLLNAME ALV 控制: F1 帮助的数据元素  

35 DATATYPE ABAP 字典中的数据类型 ABAP 字典中的数据类型

36 INTTYPE ABAP 数据类型(C,D,N,...) ABAP 数据类型(C,D,N,...)

37 INTLEN 以字节计的内部长度 内容的长度

38 LOWERCASE 允许/不允许小写字母 X\' 允许大小写

39 REPTEXT 标题  

40 HIER_LEVEL ALV 控制: 内部使用  

41 REPREP ALV 控制: 价值是补充/补充接口的选择标准  

42 DOMNAME 定义域名  

43 SP_GROUP 组代码  

44 HOTSPOT ALV 控制: 单击敏感 X\',下面出现下划线,响应单击

45 DFIELDNAME ALV 控制: 数据库中列组的字段名称  

46 COL_ID ALV 控制: 列 ID  

47 F4AVAILABL 字段有输入帮助吗 X\'.此列有搜索帮助

48 AUTO_VALUE ALV 控制: 自动复制值  

49 CHECKTABLE 表名  

50 VALEXI 固定值存在  

51 WEB_FIELD ALV 控制: 内部表字段的字段名称  

52 HREF_HNDL 自然数 热点连接的句柄

53 STYLE ALV 控制: 样式 下面有例子会介绍,比如PUSHBUTTION

54 STYLE2 ALV 控制: 样式  

55 STYLE3 ALV 控制: 样式  

56 STYLE4 ALV 控制: 样式  

57 DRDN_HNDL 自然数 下拉的句柄

58 DRDN_FIELD ALV 控制: 内部表字段的字段名称 下拉的字段

59 NO_MERGING 字符字段长度 1 相同的值不合并

60 H_FTYPE ALV 树控制: 功能类型 (总计,平均,最大.最小, ...)  

61 COL_OPT 可选列优化的条目  

62 NO_INIT_CH 字符字段长度 1  

63 DRDN_ALIAS 字符字段长度 1  

64 REF_FIELD ALV 控制: 内部表字段的参考字段名称  

65 REF_TABLE ALV 控制: 内部表字段的参考表名称  

66 TXT_FIELD ALV 控制: 内部表字段的字段名称  

67 ROUNDFIELD ALV 控制: 带有 ROUND 说明的字段名称  

68 DECIMALS_O ALV 控制: 输出小数位的编号  

69 DECMLFIELD ALV 控制: 带有 DECIMALS 说明的字段名称  

70 DD_OUTLEN ALV 控制: 输出字符长度  

71 DECIMALS 小数点后的位数 设置小数的位数

72 COLTEXT ALV 控制: 列标题 列标题

73 SCRTEXT_L 长字段标签  

74 SCRTEXT_M 中字段标签  

75 SCRTEXT_S 短字段标签  

76 COLDDICTXT ALV 控制: 确定 DDIC 文本参考  

77 SELDDICTXT ALV 控制: 确定 DDIC 文本参考  

78 TIPDDICTXT ALV 控制: 确定 DDIC 文本参考  

79 EDIT ALV 控制: 准备输入 输出状态.\'X\'可输入

80 TECH_COL ALV 控制: 内部使用  

81 TECH_FORM ALV 控制: 内部使用  

82 TECH_COMP ALV 控制: 内部使用  

83 HIER_CPOS ALV 控制: 层次列位置  

84 H_COL_KEY 树控制: 列名称/项目名称  

85 H_SELECT 标识是否可以选择树控制中的列  

86 DD_ROLL 数据元素 (语义域)  

87 DRAGDROPID ALV 控制: 拖&放处理拖放对象  

88 MAC 字符字段长度 1  

89 INDX_FIELD 自然数  

90 INDX_CFIEL 自然数  

91 INDX_QFIEL 自然数  

92 INDX_IFIEL 自然数  

93 INDX_ROUND 自然数  

94 INDX_DECML 自然数  

95 GET_STYLE 字符字段长度 1  

96 MARK 字符字段长度 1  

ALV_GRID介绍二(3)

2.布局控制[layout]

   布局是用来控制整个ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色.

   参照ALV的控制结构[LVC_S_LAYO],以后的例子我将详细介绍如何设置行颜色和列颜色.

   详细的结构说明

字段名 描述  Value range

CWIDTH_OPT 最优化宽度 SPACE, \'X\'

SMALLTITLE 小标题,如果设置了这个字段,

则标题与列标题大小一样 SPACE, \'X\'

GRID_TITLE 标题,在网格和工具条之间 最长70个字符

NO_HEADERS 如果被设置,列标题隐藏 SPACE, \'X\'

NO_HGRIDLN 隐藏水平线 SPACE, \'X\'

NO_MERGING 禁用单元格合并 SPACE, \'X\'

NO_ROWMARK 如果被设置,选择列在选择模式

为D和A的时候隐藏 SPACE, \'X\'

NO_TOOLBAR 隐藏工具条 SPACE, \'X\'

NO_VGRIDLN 隐藏垂直线 SPACE, \'X\'

SEL_MODE 选择模式 SPACE, \'A\', \'B\', \'C\', \'D\'

EXCP_CONDS 合计例外 SPACE, \'X\'

EXCP_FNAME 字段名称带有例外编码 最长30个字符

EXCP_LED 例外作为 LED SPACE, \'X\'

EXCP_ROLLN 例外文档的数据元素 SPACE, \'X\'

CTAB_FNAME 带有复杂单元格颜色编码的字段名称 最长30个字符

INFO_FNAME 带有简单行彩色代码的字段名称 最长30个字符

ZEBRA 可选行颜色,如果设置了,出现了间隔色带 SPACE, \'X\'

NO_TOTLINE 没有总计 SPACE, \'X\'

NUMC_TOTAL 可以对NUMC字段进行合计 SPACE, \'X\'

TOTALS_BEF 总计输出在第一行,小计在新的值之前 SPACE, \'X\'

STYLEFNAME 设置单元格,比如PUSHBUTTON 最长30个字符

ALV_GRID介绍二(4)

3.打印和排序,过滤控制

   打印的参数控制请参考结构 [LVC_S_PRNT]

   排序的参数控制请参考结构[LVC_S_SORT]

   过滤的参数控制请参考结构[LVC_S_FILT]

这里不再一一解释,进入中文版本,里面应该也有解释的,虽然一些不是很清楚.

五.编写简单的ALV程序.

   首先这里就不详细介绍DIALOG的用法了.

   OO的ALV GRID必须存在于一个容器当中,就是FUNCTION的ALV,其实也是一样的,底层也是使用CL_GUI_ALV_GRID这个类的.

   首先ALV的显示需要有几个先决条件.

   1,字段目录,这个是必须的,如果没有这个参数,参考一个数据字典也是可以的,就是参数I_STRUCTURE_NAME.

   2.存放数据的内表,最好内表的结构和字段目录是一致的,否则可能会出现一些无法预知的错误,当然你说我非要不一样,那也不一定会出现错误.我建议是最好一样的.

   这2个是必须的,布局的话,应该是可以不设置的,使用默认的就可以了.

第一步:创建个SCREEN,在屏幕上创建个容器,CONTAINER.定义变量.

  DATA:

      WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,

      WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .

  *--- 存放字段目录的内表

    DATA gt_fieldcat TYPE lvc_t_fcat .

  *--- 布局结构

    DATA gs_layout TYPE lvc_s_layo .

  *----声明需要显示的内表(以SFLIGHT为例)

    DATA BEGIN OF gt_list OCCURS 0 .

         INCLUDE STRUCTURE SFLIGHT .

    DATA END OF gt_list .

第二步: 创建ALV这个对象,它的父组件是那个容器.

       在PBO中写入如下代码:

         PROCESS BEFORE OUTPUT .

             MODULE display_alv .

       创建DISPLAY_ALV的MODULE后,写下如下代码:

             MODULE display_alv OUTPUT .

                 PERFORM display_alv .

           ENDMODULE .

       在FORM DISPLAY_ALV中,判断ALV实例是否存在,如果不存在,则创建:

     IF  WCL_ALV IS INITIAL .

      CREATE OBJECT: WCL_CONTAINER

       EXPORTING

         CONTAINER_NAME = \'ALV_CON\'.

      CREATE OBJECT WCL_ALV

       EXPORTING

         I_PARENT = WCL_CONTAINER.

       *-----准备获取字段目录

PERFORM prepare_field_catalog CHANGING gt_fieldcat .

       *-----设置布局

PERFORM prepare_layout CHANGING gs_layout .

       *-----显示ALV

CALL METHOD gr_alvgrid->set_table_for_first_display

EXPORTING

* I_BUFFER_ACTIVE =

* I_CONSISTENCY_CHECK =

* I_STRUCTURE_NAME =

* IS_VARIANT =

* I_SAVE =

* I_DEFAULT = \'X\'

is_layout = gs_layout

* IS_PRINT =

* IT_SPECIAL_GROUPS =

* IT_TOOLBAR_EXCLUDING =

* IT_HYPERLINK =

CHANGING

it_outtab = gt_list[]

it_fieldcatalog = gt_fieldcat

* IT_SORT =

* IT_FILTER =

EXCEPTIONS

invalid_parameter_combination = 1

program_error = 2

too_many_lines = 3

OTHERS = 4 .

       ELSE .

        *----刷新ALV

CALL METHOD gr_alvgrid->refresh_table_display

* EXPORTING

* IS_STABLE =

* I_SOFT_REFRESH =

EXCEPTIONS

finished = 1

OTHERS = 2 .

IF sy-subrc <> 0.

*--异常处理

ENDIF.

      ENDIF .

  方法"set_table_for_first_display"的参数说明

参数 含义

I_BUFFER_ACTIVE 如果方法调用是静态的,可以设置这个标记,这表示,如果每次显示ALV都是

相同的字段目录.既然这样,那么字段目录会被放到一个特殊的缓存里,

这样加速了ALV的显示

I_STRUCTURE_NAME 输出数据参考的数据字典的结构名,例如\'SFLIGHT\'.如果指定了这个参数,字段

目录会自动生成,下面的参数IT_FIELDCATALOG不需要传值.

IS_VARIANT 决定布局显示的变式

I_SAVE 决定用户是否可以保存变式:

\'X\' 只能保存全局变式

\'U\' 只能保存特定变式

\'A\' 都可以保存

SPACE 不可以保存变式

I_DEFAULT 决定用户是否可以定义默认的布局:

\'X\' 可以定义默认布局,这个参数是默认的

SPACE 不可以定义默认布局

IS_LAYOUT 布局参数,传递布局控制的一些信息

IS_PRINT 后台打印属性的参数

IT_SPECIAL_GROUPS 如果在字段目录中,一些字段通过SP_GROUP被分组在一起.我们就必须为这些

组传递一个组的文本内表进去

IT_TOOLBAR_EXCLUDING 需要隐藏的标准的按钮的内表

IT_HYPERLINK 为每个句柄分配了超连接的内表,LVC_S_HYPE中的HREF存放了超连接的地址,

HANDLE指定了句柄,使用这些句柄,你可以在GRID中使用超连接

IT_ALV_GRAPHICS 比较复杂,没有用过,意思好象是可以在图表中显示ALV.

IT_OUTTAB 输出数据存放的内表,数据都是存放在这个内表里

IT_FIELDCATALOG 字段目录

IT_SORT 排序的标准

IT_FILTER 过滤的标准

方法"REFRESH_TABLE_DISPLAY"的参数说明

参数 含义

IS_STABLE 刷新的稳定性,有2个参数,一个是行,一个是列.如果设置了相应的值,

那么对应的行,或者列,在刷新的时候,将会保持稳定,就是滚动条保持不动.

I_SOFT_REFRESH 这个参数只是在异常情况下被使用,如果设置了这个参数,任何创建的合计,

任何排序次序,任何为了显示数据而设置的过滤都将保持不变.这个是非常

有意义的.例如:当然你没有修改数据内表里的数据而想刷新ALV,仅仅只是

改变一下布局和字段目录.

ALV_GRID介绍二(5)

   第三步,获取要显示数据的字段目录.有两种方式.

       1.手动创建

FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .

DATA ls_fcat type lvc_s_fcat .

ls_fcat-fieldname = \'CARRID\' .

ls_fcat-inttype = \'C\' .

ls_fcat-outputlen = \'3\' .

ls_fcat-coltext = \'Carrier ID\' .

ls_fcat-seltext = \'Carrier ID\' .

APPEND ls_fcat to pt_fieldcat .

CLEAR ls_fcat .

ls_fcat-fieldname = \'CONNID\' .

ls_fcat-ref_table = \'SFLIGHT\' .

ls_fcat-ref_table = \'CONNID\' .

ls_fcat-outputlen = \'3\' .

ls_fcat-coltext = \'Connection ID\' .

ls_fcat-seltext = \'Connection ID\' .

APPEND ls_fcat to pt_fieldcat .

ENDFORM .

   2.半自动的创建

FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .

DATA ls_fcat type lvc_s_fcat .

CALL FUNCTION \'LVC_FIELDCATALOG_MERGE\'

EXPORTING

i_structure_name = \'SFLIGHT\'

CHANGING

ct_fieldcat = pt_fieldcat[]

EXCEPTIONS

inconsistent_interface = 1

program_error = 2

OTHERS = 3.

IF sy-subrc <> 0.

*--Exception handling

ENDIF.

LOOP AT pt_fieldcat INTO ls_fcat .

CASE pt_fieldcat-fieldname .

WHEN \'CARRID\' .

ls_fcat-outpulen = \'10\' .

ls_fcat-coltext = \'Airline Carrier ID\' .

MODIFY pt_fieldcat FROM ls_fcat .

WHEN \'PAYMENTSUM\' .

ls_fcat-no_out = \'X\' .

MODIFY pt_fieldcat FROM ls_fcat .

ENDCASE .

ENDLOOP .

ENDFORM .

ALV_GRID介绍二(6)

第四步,设置布局

FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.

    ps_layout-zebra = \'X\' .

    ps_layout-grid_title = \'Flights\' .

    ps_layout-smalltitle = \'X\' .

ENDFORM. " prepare_layout

第五步,排除不需要的标准按钮(可选,这个是第一种方法,还有另外一种,在添加自定义的按钮的时候介绍)

    在你的ALV上,如果你想排除一些你不想要的标准按钮,你可以把需要排除的按钮填入到表UI_FUNCTIONS中,然后传给set_table_for_first_display方法的参数"IT_TOOLBAR_EXCLUDING".这些按钮的功能码一般都可以通过查看类cl_gui_alv_grid的常量属性中获取到,或者自己加个断点,在after_user_command事件中.

    如果你要隐藏全部的工具条,你可以把layout中的no_toolbar设置为"X".

FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .

     DATA ls_exclude TYPE ui_func.

     ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .

     APPEND ls_exclude TO pt_exclude.

     ls_exclude = cl_gui_alv_grid=>mc_fc_minimum .

     APPEND ls_exclude TO pt_exclude.

     ls_exclude = cl_gui_alv_grid=>mc_fc_subtot .

     APPEND ls_exclude TO pt_exclude.

     ls_exclude = cl_gui_alv_grid=>mc_fc_sum .

     APPEND ls_exclude TO pt_exclude.

     ls_exclude = cl_gui_alv_grid=>mc_fc_average .

     APPEND ls_exclude TO pt_exclude.

     ls_exclude = cl_gui_alv_grid=>mc_mb_sum .

     APPEND ls_exclude TO pt_exclude.

     ls_exclude = cl_gui_alv_grid=>mc_mb_subtot .

ENDFORM .

ALV_GRID介绍二(7)

按照上面的步骤,一个ALV的DEMO基本可以创建了.下面我们将讲述一些功能.

功能一:在第一次显示以后,修改字段目录和布局.

    在运行的时候,很有可能需要在显示之后,需要设置一个新的布局或者字段目录.有下面这些方法去实现.

   字段目录 :    get_frontend_fieldcatalog

                set_frontend_fieldcatalog

   布局:         get_frontend_layout

                set_frontend_layout

   使用这些方法,你在执行的任何时候,可以获取这些内容,然后修改他们.

DATA ls_fcat TYPE lvc_s_fcat .

DATA lt_fcat TYPE lvc_t_fcat .

DATA ls_layout TYPE lvc_s_layo .

CALL METHOD gr_alvgrid->get_frontend_fieldcatalog

  IMPORTING

    et_fieldcatalog = lt_fcat[] .

LOOP AT lt_fcat INTO ls_fcat .

   IF ls_fcat-fieldname = \'PAYMENTSUM\' .

     ls_fcat-no_out = space .

     MODIFY lt_fcat FROM ls_fcat .

   ENDIF .

ENDLOOP .

CALL METHOD gr_alvgrid->set_frontend_fieldcatalog

   EXPORTING

     it_fieldcatalog = lt_fcat[] .

CALL METHOD gr_alvgrid->get_frontend_layout

  IMPORTING

    es_layout = ls_layout .

   ls_layout-grid_title = \'Flights (with Payment Sums)\' .

CALL METHOD gr_alvgrid->set_frontend_layout

  EXPORTING

    is_layout = ls_layout .

ALV_GRID介绍二(8)

功能二:设置排序条件

   有时候我们需要使用到数据的排序.这个可以通过填充参考结构LVC_T_SORT创建的内表来实现,这个内表中包含了排序的标准.可以传递给set_table_for_first_display这个方法的IT_SORT参数来初始化一个排序.

FORM prepare_sort_table CHANGING pt_sort TYPE lvc_t_sort .

     DATA ls_sort TYPE lvc_s_sort .

     ls_sort-spos = \'1\' .

     ls_sort-fieldname = \'CARRID\' .

     ls_sort-up = \'X\' . "A to Z

     ls_sort-down = space .

     APPEND ls_sort TO pt_sort .

     ls_sort-spos = \'2\' .

     ls_sort-fieldname = \'SEATSOCC\' .

     ls_sort-up = space .

     ls_sort-down = \'X\' . "Z to A

     APPEND ls_sort TO pt_sort .

ENDFORM. " prepare_sort_table

   这有2点特别的说明:

      1.如果这边排序的字段名,不存在于字段目录中,那将出现DUMP.

      2.排序以后,垂直的网格中,如果出现相同的内容,就会合并,如果要避免,请在布局中设置"no_merging"为"X" .

    你可以通过使用方法“get_sort_criteria” 和“set_sort_criteria”来获取和设置排序的标准.

ALV_GRID介绍二(9)

功能三:设置过滤(和排序类似)

   ALV的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件.我们需要把过滤条件填充到参考表类型"LVC_T_FILT"创建的内表中.过滤条件是类似一个RANGES结构的.然后把这个内表传递给方法"SET_TABLE_FOR_FIRST_DISPLAY"中的参数"IT_FILTER"

FORM prepare_filter_table CHANGING pt_filt TYPE lvc_t_filt .

     DATA ls_filt TYPE lvc_s_filt .

     ls_filt-fieldname = \'FLDATE\' .

     ls_filt-sign = \'E\' .

     ls_filt-option = \'BT\' .

     ls_filt-low = \'20030101\' .

     ls_filt-high = \'20031231\' .

     APPEND ls_filt TO pt_filt .

ENDFORM. " preparefiltertable

    我们可以使用"get_filter_criteria" 和"set_filter_criteria"来获取过滤条件和设置过滤条件.

ALV_GRID介绍二(10)

功能四:选择方式

   有时候,我们需要选择一些单元格,行或者列,在布局中,有个参数"SEL_MODE"可以设置我们不同的选择方式.下面是参数的介绍.和不同的地方.

值 模式 可能的选择 注释

SPACE 等同于B 参考B 默认设置

\'A\' 行和列的选择,无法选择单元格 多行,多列 用户可以使用最左边的选择按钮来选择多行

\'B\' 单选,不可以多选行,不可以多选单元格 多行,多列  

\'C\' 多选,可以多选行,不可以多选单元格 多行,多列  

\'D\' 单元格的选择,可以多选单元格 多行,多列,任何单元格多选 用户可以使用最左边的选择按钮来选择多行

注意:

  1.如果你设置了ALV是可编辑的,可能会覆盖你在布局中选择方式的设置的.

  2.设置了选择方式以后,我们可以使用很多方法来获取用户的选择.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_ROWS","GET_SELECTED_COLUMNS"

  3.在执行PAI以后,用户所选择的单元格,行或者列可能丢失.你可以在PBO中,使用对应的SET方法来恢复这些选择.

ALV_GRID介绍二(11)

功能五:颜色设置

   有的时候,我们需要在ALV网格上绘上一些颜色.可以给特定的行,某个特定的列,某个特定的单元格绘制颜色.

如果某列被设置为关键列,这列的颜色将被自动绘制,而不需要我们额外的指定.

先介绍ALV里色码.就是颜色编码,4位CHAR型.

                            Cxyz---

             Color ||    |

                     |    1/0: 相反 开/关

                     1/0: 强化 开/关

其中C是固定的第一位,第二位代表是颜色编码(1到7),第三位是加强的设置,第四位是相反,个人理解,在强化关闭的情况下,相反的作用是背景和字体的变化.

颜色编码:

x 颜色 主要使用在

1 Gray-blue headers

2 Light gray List bodies

3 yellow totals

4 Blue-green Key columns

5 green Positive threshold value

6 red Negative threshold value

7 orange Control levels

A)设置列的颜色.

   我们可以通过字段目录的"emphasize"控制字段来控制某列的颜色.这个字段同样是4位的CHAR型,传入上述的颜色编码.例如:

           LS_FCAT-EMPHASIZE = \'C701\'.

如果这列被设置为关键列,就是    LS_FCAT-KEY = \'X\' ,那么颜色设置就不会起作用.请注意,自动产生的字段目录中,KEY的设置是自动获取的.

B)设置行的颜色

  为某行设置颜色,是有点复杂的,我们需要在要显示的数据内表中增加一个字段,这个字段不需要在字段目录中存在.同样,这个字段也是4位的CHAR型,符合颜色编码的定义.

  那我们就需要这样来定义我们的数据内表:

DATA BEGIN OF gt_list OCCURS 0 .

     INCLUDE STRUCTURE SFLIGHT .

     DATA rowcolor(4) TYPE c .

DATA END OF gt_list .

  很明显,填入颜色编码以后,ALV怎么知道它是我们用来设置颜色的呢,在布局中,有个控制字段"INFO_FNAME",我们可以设置这个字段来告诉ALV,我们的颜色字段是哪个.

   ps_layout-info_fname = \'ROWCOLOR\'.

  请注意,这个字段随便你起名字,但是记住,一定是数据内表里的字段,而且这边设置的时候一定要大写.你可以在任何时候设置行的颜色,只需要去修改内表里的这个字段的值,但是记得,一定要刷新以后才起作用.

C)设置单元格的颜色    

   设置单元格和设置行的颜色,本质上没有什么大的区别,但是定位单元格需要2个参数.我们需要在数据内表中插入一个表类型的字段,这样我们的数据内表就变成了DEEP结构了,不过ALV是可以处理的.不需要担心.

插入的这个表类型的类型为"LVC_T_SCOL".

   里面有3个参数:

     FNAME告诉我们你需要设置的是哪个字段,如果为空,然后直接在COLOR中设置颜色,就是整行设置为这个颜色.如果具体到某个单元格,必须指定是哪个字段.

     COLOR字段是用来设置颜色的.

     NOKEYCOL字段比较关键了.设置为关键列的一些字段,我们的颜色设置可能被覆盖.通过这个字段的设置,可以避免被关键列覆盖.

  同样,ALV在布局中有个字段"CTAB_FNAME"告诉我们,数据内表中,哪个字段是用来设置单元格的颜色的.

DATA BEGIN OF gt_list OCCURS 0 .

    INCLUDE STRUCTURE SFLIGHT .

DATA rowcolor(4) TYPE c .

DATA cellcolors TYPE lvc_t_scol .

DATA END OF gt_list .

DATA ls_cellcolor TYPE lvc_s_scol .

...

  READ TABLE gt_list INDEX 5 .

    ls_cellcolor-fname = \'SEATSOCC\' .

    ls_cellcolor-color-col = \'7\' .

    ls_cellcolor-color-int = \'1\' .

    APPEND ls_cellcolor TO gt_list-cellcolors .

  MODIFY gt_list INDEX 5 .

注意:

   颜色设置中有优先级顺序,他们是单元格--->行--->列.

ALV_GRID介绍二(12)

功能六:插入超链接

    插入超链接是通过一个含有超级链接和句柄的表来实现的.这个表类型为"LVC_T_HYPE" ,句柄是一个INT4类型的字段,我们需要在数据显示的内表中,加入这样的字段,来告诉ALV,我们的字段指定的句柄,从而找到对应的超级链接.在字段目录中,WEB_FIELD是用来指定对应的句柄名的.

   下面举个例子来说明,我们要为字段CARRID,CONNID建立超级链接:

首先,内表定义中,我们加入2个句柄字段:

DATA BEGIN OF gt_list OCCURS 0 .

    INCLUDE STRUCTURE SFLIGHT .

DATA rowcolor(4) TYPE c .

DATA cellcolors TYPE lvc_t_scol .

DATA carrid_handle TYPE int4 .

DATA connid_handle TYPE int4 .

DATA END OF gt_list .

第二: 建立一个超级链接内表,里面存放句柄所对应的超级链接.创建的时候注意,它参考的表类型,一定是"LVC_T_HYPE".

FORM prepare_hyperlinks_table CHANGING pt_hype TYPE lvc_t_hype .

DATA ls_hype TYPE lvc_s_hype .

   ls_hype-handle = \'1\' .

   ls_hype-href = \'http://www.company.com/carrids/car1\' .

   APPEND ls_hype TO pt_hype .

   ls_hype-handle = \'2\' .

   ls_hype-href = \'http://www.company.com/carrids/car1\' .

   APPEND ls_hype TO pt_hype .

   ls_hype-handle = \'3\' .

   ls_hype-href = \'http://www.company.com/carrids/car1\' .

   APPEND ls_hype TO pt_hype .

   ls_hype-handle = \'4\' .

   ls_hype-href = \'http://www.company.com/connids/con11\' .

   APPEND ls_hype TO pt_hype .

   ls_hype-handle = \'5\' .

   ls_hype-href = \'http://www.company.com/connids/con12\'

   APPEND ls_hype TO pt_hype .

.. ..

ENDFORM .

第三.通过字段目录FIELDCATLOG来指定相应的句柄字段.

    对于CARRID的field catalog

       Ls_fieldcat-web_field = ‘CARRID_HANDLE’.

    对于CONNID的field catalog

       Ls_fieldcat-web_field = ‘CONNID_HANDLE’.

在方法"SET_TABLE_FOR_FIRST_DISPLAY"中把句柄内表传给参数it_hyperlink。

第四:在数据显示的内表中,指定对应的句柄:

  LOOP AT gt_list.

   IF gt_list-carrid = ‘XX’.

  Gt_list-carrid_handle = ‘1’.

  IF gt_list-connid = ‘01’.

   Gt_list-connid_handle = ‘4’.

  ENDIF.

   ENDIF.

  ENDLOOP.

ALV_GRID介绍二(13)

功能七:把字段设置为下拉

   有时候我们可以把一些字段设置为下拉,比如一些类型,一些字段的值是比较固定的一些值,当然,我们也可以通过搜索帮助来做,这些只是看各自的爱好和需要了.

   设置为下拉,和上一篇设置超级链接是类似的,也是使用了一个内表存放了句柄和对应的值,这个表类型为"LVC_T_DROP".不过传递给ALV的方式有点区别.超级链接是通过方法"SET_TABLE_FOR_FIRST_DISPLAY"的参数来传递的,而下拉的内表传递需要使用方法"SET_DROP_DOWN_TABLE".

   如果我们希望把这个列都设置为下拉,那么我们可以在字段目录中,把控制字段"DRDN_HNDL"指向对应的下拉内表的句柄就可以了.例如:

      ps_fcat-drdn_hndl = \'1\' .

如果是某个单元格设置为下拉,那我们就需要在数据显示的内表中增加一个句柄字段(如果是有多个不同的字段需要设置下拉,可以增加多个字段),同时得在字段目录里设置"DRDN_FIELD".例如:

     ps_fcat-drdn_field = \'PTYP_DD_HNDL\' .

数据显示内表定义为:

DATA BEGIN OF gt_list OCCURS 0 .

INCLUDE STRUCTURE SFLIGHT .

DATA rowcolor(4) TYPE c .

DATA cellcolors TYPE lvc_t_scol .

DATA carrid_handle TYPE int4 .

DATA connid_handle TYPE int4 .

DATA ptype_dd_hndl TYPE int4 .

DATA END OF gt_list .

定义下拉的句柄内表:

FORM prepare_drilldown_values.

DATA lt_ddval TYPE lvc_t_drop .

DATA ls_ddval TYPE lvc_s_drop .

   ls_ddval-handle = \'1\' .

   ls_ddval-value = \'JFK-12\' .

   APPEND ls_ddval TO lt_ddval .

   ls_ddval-handle = \'1\' .

   ls_ddval-value = \'JSF-44\' .

   APPEND ls_ddval TO lt_ddval .

   ls_ddval-handle = \'1\' .

   ls_ddval-value = \'KMDA-53\' .

   APPEND ls_ddval TO lt_ddval .

   ls_ddval-handle = \'1\' .

   ls_ddval-value = \'SS3O/N\' .

   APPEND ls_ddval TO lt_ddval .

CALL METHOD gr_alvgrid->set_drop_down_table

   EXPORTING

      it_drop_down = lt_ddval .

ENDFORM. " prepare_drilldown_values

准备好内表,以后,使用方法set_drop_down_table来传递给ALV.

ALV_GRID介绍二(14)

功能八:基于事件的附加功能

     作为使用面向对象的方法开发的一个组件,ALV GRID控制器有很多响应用户交互的事件.这些事件经常被用来增强一些用户响应的功能.为实现这样的功能,我们必须在程序中创建一个类的实例来作为ALV GRID实例的事件处理者.

    下表列出了一些ALV GRID的事件,后面的HTML列用来说明是否在HTML形式SAP GUI上支持.

用户定义文本输出:

Event Application HTML

Print_end_of_list Define output text to be printed at the end of the entire list √

Print_top_of_list Define output text to be printed at begin of the entire list √

Print_top_of_page Define output text to be printed at begin of each page √

Print_end_of_page Define output text to be printed at the end of each page √

Subtotal_text Define self-defined subtotal texts √

ALV GRID的鼠标动作事件

Event Application HTML

Button_click Query click on a push button in the ALV GRID control √

Double_click Query a double click on a cell of the ALV GRID √

Hotspot_click Query a hotspot click on columns defined for this purpose in advance √

ondrag Collect information when elements of the ALV GRID Control are dragged ×

ondrop Process information when elements of the ALV GRID Control are dropped ×

ondropComplete Perform final actions after successful drag&drop ×

ondropGetFlavor Distinguish between options for drag&drop behavior ×

自定义和标准功能实现

Event Application HTML

Before_user_command Query self-defined and standard functions √

User_command Query self-defined function codes √

After_user_command Query self-defined and standard functions codes √

自定义功能的定义(自定义按钮,菜单等等)

Event Application HTML

Tool bar Change,delete or add gui elements on alv grid √

Menu_button Define menus for menu buttons in the toolbar √

Context_menu_request Change context menu ×

Onf1 Define self-defined f1 help √

下面是一段代码,举例说明如果定义我们的事件处理类.

CLAS lcl_event_handler DEFINITION.

PUBLIC SECTION.

METHODS:

*--在ALV的工具条上增加新的按钮

Handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid

    IMPORTING e_object e_interactive,

*--实现用户命令

Handle_user_command

       FOR EVENT user_command OF cl_gui_alv_grid

       IMPORTING e_ucomm.

*--热点点击控制

Handle_hotspot_click

       FOR EVENT hotspot_click OF cl_gui_alv_grid

       IMPORTING e_row_id e_column_id es_row_no.

*--在用户命令触发之前

Handle_before_user_command

   FOR EVENT before_user_command OF cl_gui_alv_grid

        IMPORTING e_ucomm.

*--在用户命令触发之后

Handle_after_user_command

   FOR EVENT after_user_command OF cl_gui_alv_grid

       IMPORTING e_ucomm.

*--在ALV可修改的情况下,控制数据修改

Handle_data_changed

   FOR EVENT data_changed OF cl_gui_alv_grid

        IMPORTING er_data_changed.

*--在数据修改完成之后

Handle_data_changed_finished

   FOR EVENT data_changed_finished OF cl_gui_alv_grid

        IMPORTING e_modified.

*--管理菜单

Handle_menu_button

   FOR EVENT menu_button OF cl_gui_alv_grid

        IMPORTING e_object e_ucomm.

*--管理按钮点击

Handle_button_click

   FOR EVENT button_click OF cl_gui_alv_grid

        IMPORTING e_objec e_ucomm.

PRIVATE SECTION.

ENDCLASS.

下面是类的实现的一些概要代码,参数可以从ALV的事件中直接获取出来:

CLASS lcl_event_handler IMPLEMENTATION.

*-- Handle toolbar

METHOD handle_toolbar.

    PERFORM handle_toolbar USIGN e_object e_interactive.

ENDMETHOD.

*-- Handle hotspot click

METHOD handle_hotspot_click.

    PERFORM handle_hotspot_click USING e_row_id e_column_id es_row_no.

ENDMETHOD.

*-- Handle double click

METHOD handle_double_click.

    PERFORM handle_double_click USING e_row e_column es_row_no.

ENDMETHOD.

*-- Handle after user command

METHOD handle _after_user_command.

    PERFORM handle_after_user_command USING e_object.

ENDFORM.

*-- Handle before user command

METHOD handle_before_user_command.

    PERFORM handle_before_user_command.

ENDMETHOD.

*--Handle data changed

METHOD handle_data_changed.

    PERFORM handle_data_changed USING er_data_changed.

ENDMEHTOD.

METHOD handle_data_changed_finished.

     PERFORM handle_data_chaged USING e_modified.

ENDMETHOD.

METHOD handle_menu_button.

     PERFORM handle_menu_button USING e_object e_ucomm.

ENDMEHTOD.

MEHTOD handle_button_click.

     PERFORM handle_button_click USING e_objcet e_ucomm.

ENDMETHOD.

ENDCALSS.

光定义了这些还不够,我们需要把事件管理类注册到ALV GRID的实例事件.

DATA gr_event_handler TYPE REF TO lcl_event_handler .

.. ..

*--Creating an instance for the event handler

CREATE OBJECT gr_event_handler .

*--Registering handler methods to handle ALV Grid events

SET HANDLER gr_event_handler->handle_user_command FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_toolbar FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_menu_button FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_double_click FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_hotspot_click FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_button_click FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_before_user_command

FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_context_menu_request

FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_data_changed FOR gr_alvgrid .

SET HANDLER gr_event_handler->handle_data_changed_finished

FOR gr_alvgrid .

November 02

ABAP Source Scan

* 6.00
* MAWP3HK007362 01092005 RPR_ABAP_SOURCE_SCAN: Selektion
*                        "Kommentarzeilen ignorieren" (note 875190)
* 5.00
* MAWSLNK002692 19042004 RPR_ABAP_SOURCE_SCAN: Ausgabeformatierung der
*                        Kopfzeile.[note 729038]
*
*----------------------------------------------------------------------*
* Scan a set of reports for a particular string
*----------------------------------------------------------------------*
REPORT rpr_abap_source_scan MESSAGE-ID 56
NO STANDARD PAGE HEADING LINE-SIZE 150.
TABLES: d020s,
        tadir,
        trdir,
        tuchk3.
TYPES:  BEGIN OF result_ln,
          repname LIKE sy-repid,
          dynnr   LIKE sy-dynnr,
          line_no(6) TYPE n,
*         text    like rstxp-tdline,
text TYPE string,
          sstring,
END OF result_ln,
       result_tab TYPE result_ln OCCURS 0.
DATA: disptype   VALUE 'A',
      dtab       TYPE result_tab WITH HEADER LINE,
      ftab       TYPE result_tab WITH HEADER LINE,
      hit_count  TYPE i,
      tabix      LIKE sy-tabix,
*     text_line  like rstxp-tdline,
      text_line  TYPE string,
      top_flag.
DATA: BEGIN OF dyn OCCURS 0,
        prog  LIKE d020s-prog,
        dnum  LIKE d020s-dnum,
END OF dyn,
BEGIN OF fm OCCURS 0,
        obj_name LIKE tadir-obj_name,
END OF fm,
BEGIN OF irdir OCCURS 50,
        name LIKE trdir-name,
END OF irdir,
BEGIN OF itab OCCURS 50,
        repname LIKE sy-repid,
END OF itab,
      itab_ii LIKE itab OCCURS 50 WITH HEADER LINE,
BEGIN OF rtab OCCURS 0,
*      text like rpy_dyflow-line,
text(1000),
END OF rtab,
     rtab_lcase LIKE LINE OF rtab,
     rtab_tmp   LIKE LINE OF rtab.
SELECTION-SCREEN: BEGIN OF BLOCK a10 WITH FRAME TITLE a10.
SELECT-OPTIONS:   repname  FOR trdir-name MEMORY ID scan_repid,
                  dynnr    FOR d020s-dnum,
                  subc     FOR trdir-subc,
                  appl     FOR trdir-appl,
                  cnam     FOR trdir-cnam,
                  unam     FOR trdir-unam,
                  devclass FOR tadir-devclass.
SELECTION-SCREEN: END OF BLOCK a10,
BEGIN OF BLOCK a20 WITH FRAME TITLE a20.
SELECT-OPTIONS:   sstring     FOR tuchk3-object NO INTERVALS.
PARAMETERS:       plusminu(2) TYPE n DEFAULT 2,
                  inclu       AS CHECKBOX DEFAULT 'X',
                  modiass     AS CHECKBOX,
comment AS CHECKBOX,
mask AS CHECKBOX.
SELECTION-SCREEN: END OF BLOCK a20,
BEGIN OF BLOCK a30 WITH FRAME TITLE a30.
PARAMETERS:       rb_code  RADIOBUTTON GROUP r10,
                  rb_dyn   RADIOBUTTON GROUP r10,
                  rb_all   RADIOBUTTON GROUP r10.
SELECTION-SCREEN: END OF BLOCK a30.
DATA: string LIKE sstring-low.
INITIALIZATION.
  a10 = 'Report/Dynpro Selektion'(a10).
  a20 = 'Suchkriterien'(a20).
  a30 = 'Suchbereich'(a30).
TOP-OF-PAGE.
PERFORM top_of_page.
TOP-OF-PAGE DURING LINE-SELECTION.
PERFORM top_of_page.
AT SELECTION-SCREEN.
IF sstring[] IS INITIAL AND modiass IS INITIAL.
MESSAGE e016 WITH 'Bitte Suchstring eingeben'(003).
ENDIF.
START-OF-SELECTION.
IF NOT modiass IS INITIAL.
    sstring-sign    = 'I'.
    sstring-option  = 'EQ'.
    sstring-low     = '{'.
APPEND sstring.
    sstring-low     = '}'.
APPEND sstring.
ENDIF.
READ TABLE sstring INDEX 1.
DESCRIBE TABLE sstring LINES sy-tfill.
IF sy-tfill = 1.
    string = sstring-low.
ELSE.
CONCATENATE sstring-low
'...'
INTO string SEPARATED BY space.
ENDIF.
SET PF-STATUS 'MAIN'.
IF NOT devclass[] IS INITIAL.
SELECT obj_name INTO TABLE irdir
FROM tadir
WHERE pgmid  = 'R3TR'
AND   object = 'PROG'
AND   devclass IN devclass.                     "#EC CI_SGLSELECT
SELECT obj_name INTO TABLE fm
FROM tadir
WHERE pgmid  = 'R3TR'
AND   object = 'FUGR'
AND   devclass IN devclass.                     "#EC CI_SGLSELECT
LOOP AT fm.
CONCATENATE 'SAPL'
                   fm-obj_name INTO irdir.
APPEND irdir.
ENDLOOP.
ENDIF.
IF NOT repname[] IS INITIAL.
SELECT name APPENDING TABLE irdir
FROM trdir
WHERE name IN repname
AND   cnam IN cnam
AND   unam IN unam
AND   subc IN subc
AND   appl IN appl.
ENDIF.
CHECK NOT irdir[] IS INITIAL.
IF rb_code IS INITIAL.
*   Also scan dynpro flow logic
SELECT prog dnum INTO TABLE dyn
FROM d020s FOR ALL ENTRIES IN irdir
WHERE prog = irdir-name
AND   dnum IN dynnr.
ENDIF.
IF NOT inclu IS INITIAL.
LOOP AT irdir.
REFRESH itab_ii.
CALL FUNCTION 'GET_INCLUDES'
EXPORTING
          progname = irdir-name
TABLES
          incltab  = itab_ii.
APPEND LINES OF itab_ii TO itab.
ENDLOOP.
ENDIF.
APPEND LINES OF irdir TO itab.
SORT itab.
DELETE ADJACENT DUPLICATES FROM itab.
IF rb_dyn IS INITIAL.
LOOP AT itab.
READ REPORT itab-repname INTO rtab.
CHECK sy-subrc = 0.
IF NOT comment IS INITIAL.
DELETE rtab
*         where text(1) = '*'.                              "MAWK007362
WHERE text(1) = '*' "MAWK007362
OR text(1) = '"'.                              "MAWK007362
ENDIF.
LOOP AT sstring.
IF mask IS INITIAL.
SEARCH rtab FOR sstring-low.
CHECK sy-subrc = 0.
ELSE.
          sy-tabix = 1.
ENDIF.
LOOP AT rtab FROM sy-tabix.
          tabix      = sy-tabix.
          rtab_lcase = rtab.
TRANSLATE rtab TO UPPER CASE.
CASE mask.
WHEN space.
IF rtab-text CS sstring-low.
PERFORM: get_hit_set USING rtab_lcase tabix space.
ENDIF.
WHEN OTHERS.
IF rtab-text CP sstring-low.
PERFORM: get_hit_set USING rtab_lcase tabix space.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ENDIF.
FREE: itab.
IF rb_code IS INITIAL.
LOOP AT dyn.
PERFORM get_dynpro_flow_logic.
IF NOT comment IS INITIAL.
DELETE rtab
*         where text(1) = '*'.                              "MAWK007362
WHERE text(1) = '*' "MAWK007362
OR text(1) = '"'.                              "MAWK007362
ENDIF.
LOOP AT sstring.
IF mask IS INITIAL.
SEARCH rtab FOR sstring-low.
CHECK sy-subrc = 0.
ELSE.
          sy-tabix = 1.
ENDIF.
LOOP AT rtab FROM sy-tabix.
          tabix      = sy-tabix.
          rtab_lcase = rtab.
TRANSLATE rtab TO UPPER CASE.
CASE mask.
WHEN space.
IF rtab-text CS sstring-low.
PERFORM: get_hit_set USING rtab_lcase tabix 'D'.
ENDIF.
WHEN OTHERS.
IF rtab-text CP sstring-low.
PERFORM: get_hit_set USING rtab_lcase tabix 'D'.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ENDIF.
FREE: dyn.
END-OF-SELECTION.
IF ftab[] IS INITIAL AND dtab[] IS INITIAL.
MESSAGE s016 WITH 'String'(006) string 'nicht gefunden'(m01).
EXIT.
ENDIF.
SORT: ftab BY repname line_no sstring DESCENDING,
        dtab BY repname dynnr line_no sstring DESCENDING.
DELETE ADJACENT DUPLICATES FROM: ftab COMPARING repname line_no,
                                   dtab COMPARING repname dynnr line_no.
MESSAGE s016 WITH hit_count 'Treffer für String'(m02) string.
PERFORM: display_ftab_alt,
           display_dtab_alt.
AT LINE-SELECTION.
PERFORM call_editor.
AT USER-COMMAND.
CASE sy-ucomm.
WHEN 'TOGL'.
CASE disptype.
WHEN 'M'.
          disptype = 'A'.
PERFORM: display_ftab_alt,
                   display_dtab_alt.
WHEN 'A'.
          disptype = 'M'.
PERFORM: display_ftab,
                   display_dtab.
ENDCASE.
      sy-lsind = sy-lsind - 1.
ENDCASE.
*---------------------------------------------------------------------*
*       FORM APPEND_FTAB                                              *
*---------------------------------------------------------------------*
FORM append_ftab USING text LIKE rtab_lcase
                       line_no LIKE sy-tabix
                       sstring TYPE c
                       source  TYPE c.
DATA: ln TYPE result_ln.
  ln-line_no = line_no.
  ln-text    = text.
  ln-sstring = sstring.
IF source IS INITIAL.
    ln-repname = itab-repname.
APPEND ln TO ftab.
ELSE.
    ln-repname = dyn-prog.
    ln-dynnr   = dyn-dnum.
APPEND ln TO dtab.
CLEAR: ln-dynnr.
ENDIF.
IF NOT ln-sstring IS INITIAL.
ADD 1 TO hit_count.
ENDIF.
ENDFORM.                    "append_ftab
*---------------------------------------------------------------------*
*       FORM TOP_OF_PAGE                                              *
*---------------------------------------------------------------------*
FORM top_of_page.
DATA: repname(50).
FORMAT INTENSIFIED OFF.
ULINE /(150).
* Begin MAWK002692
*  write: /  sy-vline,
*           'Source Scan für String:'(h01),
*            string                              color col_total,
*        48 'Datum:'(t01),
*            sy-datum dd/mm/yyyy,
*        66  'Zeit:'(t02),
*            sy-uzeit,
*      150   sy-vline.
WRITE: /  sy-vline,
'Source Scan für String:'(h01),
            string                              COLOR COL_TOTAL,
55 'Datum:'(t01),
            sy-datum DD/MM/YYYY,
77 'Zeit:'(t02),
            sy-uzeit,
150   sy-vline.
* End MAWK002692
ULINE /(150).
FORMAT INTENSIFIED ON.
WRITE: / sy-vline.
IF top_flag = 'A'.
    repname = ftab-repname.
ELSE.
CONCATENATE dtab-repname
'Dynpro'(004)
                dtab-dynnr
INTO repname SEPARATED BY space.
ENDIF.
CASE disptype.
WHEN 'A'.
CONCATENATE 'Zeile  Source Code ('(001)
                   repname
')' INTO text_line.
WRITE: text_line.
WHEN 'M'.
IF top_flag = 'A'.
WRITE: 'Source Code ...'(002).
ELSE.
WRITE: 'Source Code ...'(005).
ENDIF.
ENDCASE.
WRITE: 150 sy-vline.
ULINE (150).
ENDFORM.                    "top_of_page
*---------------------------------------------------------------------*
*       FORM DISPLAY_FTAB                                             *
*---------------------------------------------------------------------*
*       Display search results
*---------------------------------------------------------------------*
FORM display_ftab.
CHECK rb_dyn IS INITIAL.
  top_flag = 'A'.
NEW-PAGE.
LOOP AT ftab.
FORMAT HOTSPOT ON.
IF ftab-sstring IS INITIAL.
WRITE: / sy-vline,
               ftab-text INTENSIFIED OFF.
ELSE.
WRITE: / sy-vline,
               ftab-text INTENSIFIED OFF COLOR COL_TOTAL.
ENDIF.
WRITE:   sy-vline       NO-GAP,
             ftab-line_no   NO-GAP INTENSIFIED,
             sy-vline       NO-GAP,
             ftab-repname   NO-GAP INTENSIFIED,
150  sy-vline       NO-GAP.
HIDE: ftab-repname,
          ftab-line_no.
AT END OF repname.
FORMAT HOTSPOT OFF.
ULINE /(150).
ENDAT.
ENDLOOP.
ENDFORM.                    "display_ftab
*---------------------------------------------------------------------*
*       FORM DISPLAY_DTAB                                             *
*---------------------------------------------------------------------*
*       Display search results (dynpro)
*---------------------------------------------------------------------*
FORM display_dtab.
CHECK rb_code IS INITIAL.
  top_flag = 'D'.
NEW-PAGE.
LOOP AT dtab.
FORMAT HOTSPOT ON.
IF dtab-sstring IS INITIAL.
WRITE: / sy-vline,
               dtab-text INTENSIFIED OFF.
ELSE.
WRITE: / sy-vline,
               dtab-text INTENSIFIED OFF COLOR COL_TOTAL.
ENDIF.
WRITE:   sy-vline       NO-GAP,
             dtab-line_no   NO-GAP INTENSIFIED,
             sy-vline       NO-GAP,
             dtab-repname   NO-GAP INTENSIFIED,
             dtab-dynnr     NO-GAP INTENSIFIED,
150  sy-vline       NO-GAP.
HIDE:    dtab-repname,
             dtab-dynnr,
             dtab-line_no.
AT END OF repname.
FORMAT HOTSPOT OFF.
ULINE /(150).
ENDAT.
ENDLOOP.
ENDFORM.                    "display_dtab
*---------------------------------------------------------------------*
*       FORM DISPLAY_FTAB_ALT
*---------------------------------------------------------------------*
*       Display hit list without report name on every line
*---------------------------------------------------------------------*
FORM display_ftab_alt.
CHECK rb_dyn IS INITIAL.
  top_flag = 'A'.
NEW-PAGE.
LOOP AT ftab.
AT NEW repname.
FORMAT HOTSPOT ON.
IF sy-tabix > 1.
NEW-PAGE.
ENDIF.
ENDAT.
WRITE: / sy-vline       NO-GAP,
             ftab-line_no   NO-GAP,
             sy-vline       NO-GAP.
IF ftab-sstring IS INITIAL.
WRITE: ftab-text INTENSIFIED OFF.
ELSE.
WRITE: ftab-text INTENSIFIED OFF COLOR COL_TOTAL.
ENDIF.
WRITE: 150 sy-vline.
HIDE:    ftab-repname,
             ftab-line_no.
AT END OF repname.
FORMAT HOTSPOT OFF.
ULINE /(150).
ENDAT.
ENDLOOP.
ENDFORM.                    "display_ftab_alt
*---------------------------------------------------------------------*
*       FORM DISPLAY_DTAB_ALT
*---------------------------------------------------------------------*
*       Display dynpro hit list without report name on every line
*---------------------------------------------------------------------*
FORM display_dtab_alt.
CHECK rb_code IS INITIAL.
  top_flag = 'D'.
NEW-PAGE.
LOOP AT dtab.
AT NEW repname.
FORMAT HOTSPOT ON.
IF sy-tabix > 1.
NEW-PAGE.
ENDIF.
ENDAT.
WRITE: / sy-vline       NO-GAP,
             dtab-line_no   NO-GAP,
             sy-vline       NO-GAP.
IF dtab-sstring IS INITIAL.
WRITE: dtab-text INTENSIFIED OFF.
ELSE.
WRITE: dtab-text INTENSIFIED OFF COLOR COL_TOTAL.
ENDIF.
WRITE: 150 sy-vline.
HIDE:    dtab-repname,
             dtab-dynnr,
             dtab-line_no.
AT END OF repname.
FORMAT HOTSPOT OFF.
ULINE /(150).
ENDAT.
ENDLOOP.
ENDFORM.                    "display_dtab_alt
*----------------------------------------------------------------------*
*       Form  GET_PLUS_MINUS_X_LINES
*----------------------------------------------------------------------*
*       Get x lines before the found string and x lines after
*----------------------------------------------------------------------*
FORM get_hit_set USING value(ctext)   LIKE rtab_lcase
value(line_no) LIKE sy-tabix
                       srce_type      TYPE c.
DATA: end TYPE i,
        start  TYPE i,
        xtabix LIKE sy-tabix.
IF plusminu <= 0.
PERFORM append_ftab USING ctext line_no 'X' srce_type.
EXIT.
ENDIF.
  start = line_no - plusminu .
end   = line_no + plusminu.
IF start < 1.
    start = 1.
ENDIF.
WHILE start <= end.
READ TABLE rtab INTO ctext INDEX start.
IF sy-subrc <> 0.
EXIT.
ENDIF.
    xtabix = sy-tabix.
IF start = line_no.
PERFORM append_ftab USING ctext xtabix 'X' srce_type.
ELSE.
PERFORM append_ftab USING ctext xtabix space srce_type.
ENDIF.
ADD 1 TO start.
ENDWHILE.
ENDFORM.                               " GET_HIT_SET
*----------------------------------------------------------------------*
*       Form  CALL_EDITOR
*----------------------------------------------------------------------*
*       Call ABAP or screen painter editor
*----------------------------------------------------------------------*
FORM call_editor.
CLEAR: ftab,
         dtab.
READ LINE sy-lilli
FIELD VALUE ftab-repname
                   ftab-line_no
                   dtab-repname
                   dtab-dynnr
                   dtab-line_no.
IF ftab-repname IS INITIAL AND dtab-repname IS INITIAL.
MESSAGE s016 WITH 'Ungültige Cursor Position'(m03).
EXIT.
ENDIF.
IF dtab-dynnr IS INITIAL.
*   Call ABAP editor
CALL FUNCTION 'EDITOR_PROGRAM'
EXPORTING
        display = 'X'
program = ftab-repname
        topline = ftab-line_no
EXCEPTIONS
OTHERS  = 1.
SET PARAMETER ID 'RID' FIELD sy-repid.
ELSE.
CALL FUNCTION 'RS_SCRP'
EXPORTING
        abl_line       = dtab-line_no
        dynnr          = dtab-dynnr
        progname       = dtab-repname
        wanted_mode    = 'SHOW'
EXCEPTIONS
        already_exists = 1
        not_found      = 2
        not_executed   = 3
OTHERS         = 4.
ENDIF.
ENDFORM.                               " CALL_EDITOR
*---------------------------------------------------------------------*
*       Form  GET_DYNPRO_FLOW_LOGIC
*----------------------------------------------------------------------*
*       Get flow logic of the dynpro
*----------------------------------------------------------------------*
FORM get_dynpro_flow_logic.
DATA: dhead  LIKE d020s,
        dfield LIKE d021s OCCURS 0,
        dflow  LIKE d022s OCCURS 0,
        dmatch LIKE d023s OCCURS 0,
BEGIN OF dynp_id,
          prog LIKE d020s-prog,
          dnum LIKE d020s-dnum,
END OF dynp_id.
  dynp_id-prog = dyn-prog.
  dynp_id-dnum = dyn-dnum.
IMPORT DYNPRO dhead dfield dflow dmatch ID dynp_id.
  rtab[] = dflow[].
ENDFORM.                               " GET_DYNPRO_FLOW_LOGIC

SEARCH_ABAP_STRING

*&---------------------------------------------------------------------*
*& Report  Z_BARRY_SEARCH_ABAP_STRING                                  *
*& Scan a set of reports for a particular string                       *
*&---------------------------------------------------------------------*
*&  Ver 1.1 2007.06.04                                                 *
*&---------------------------------------------------------------------*
REPORT ZRS08127 MESSAGE-ID 56  NO STANDARD PAGE HEADING LINE-SIZE 150.

TABLES: d020s,
        tadir,
        trdir,
        tuchk3,
        rsrepl.
TYPES:  BEGIN OF result_ln,
          repname LIKE sy-repid,
          dynnr   LIKE sy-dynnr,
          line_no(6) TYPE n,
*         text    like rstxp-tdline,
          text TYPE string,
          sstring ,
          del_flag,
       END OF result_ln,

       result_tab TYPE result_ln OCCURS 0.

DATA: disptype   VALUE 'A',
      dtab       TYPE result_tab WITH HEADER LINE,
      ftab       TYPE result_tab WITH HEADER LINE,
      hit_count  TYPE i,
      tabix      LIKE sy-tabix,
*     text_line  like rstxp-tdline,
      text_line  TYPE string,
      top_flag.

DATA: BEGIN OF dyn OCCURS 0,
        prog  LIKE d020s-prog,
        dnum  LIKE d020s-dnum,
      END OF dyn,

      BEGIN OF fm OCCURS 0,
        obj_name LIKE tadir-obj_name,
      END OF fm,

      BEGIN OF irdir OCCURS 50,
        name LIKE trdir-name,
      END OF irdir,

      BEGIN OF itab OCCURS 50,
        repname LIKE sy-repid,
      END OF itab,

      itab_ii LIKE itab OCCURS 50 WITH HEADER LINE,

     BEGIN OF rtab OCCURS 0,
*      text like rpy_dyflow-line,
       text(1000),
     END OF rtab,

     rtab_lcase LIKE LINE OF rtab,
     rtab_tmp   LIKE LINE OF rtab.

SELECTION-SCREEN: BEGIN OF BLOCK a10 WITH FRAME TITLE a10.
SELECT-OPTIONS:   repname  FOR trdir-name MEMORY ID scan_repid OBLIGATORY,
                  dynnr    FOR d020s-dnum,
                  subc     FOR trdir-subc,
                  appl     FOR trdir-appl,
                  cnam     FOR trdir-cnam,
                  unam     FOR trdir-unam,
                  devclass FOR tadir-devclass.
SELECTION-SCREEN: END OF BLOCK a10,
                  BEGIN OF BLOCK a20 WITH FRAME TITLE a20.
*SELECT-OPTIONS:   sstring     FOR tuchk3-object NO INTERVALS.
SELECT-OPTIONS:   sstring     FOR rsrepl-tdfind NO INTERVALS OBLIGATORY.
PARAMETERS:       plusminu(2) TYPE n DEFAULT 2,
                  inclu       AS CHECKBOX DEFAULT 'X',
                  modiass     AS CHECKBOX,
                  comment     AS CHECKBOX,
                  mask        AS CHECKBOX.
SELECTION-SCREEN: END OF BLOCK a20,
                  BEGIN OF BLOCK a30 WITH FRAME TITLE a30.
PARAMETERS:       rb_code  RADIOBUTTON GROUP r10,
                  rb_dyn   RADIOBUTTON GROUP r10,
                  rb_all   RADIOBUTTON GROUP r10.
SELECTION-SCREEN: END OF BLOCK a30.

DATA: string LIKE sstring-low.

INITIALIZATION.
  a10 = '报表/屏幕选择'.
  a20 = '搜索标准'.
  a30 = '搜索区域'.

TOP-OF-PAGE.
  PERFORM top_of_page.

TOP-OF-PAGE DURING LINE-SELECTION.
  PERFORM top_of_page.

START-OF-SELECTION.
  IF NOT modiass IS INITIAL.
    sstring-sign    = 'I'.
    sstring-option  = 'EQ'.
    sstring-low     = '{'.
    APPEND sstring.
    sstring-low     = '}'.
    APPEND sstring.
  ENDIF.

  READ TABLE sstring INDEX 1.
  DESCRIBE TABLE sstring LINES sy-tfill.
  IF sy-tfill = 1.
    string = sstring-low.
  ELSE.
    CONCATENATE sstring-low
               '...'
                INTO string SEPARATED BY space.
  ENDIF.

  SET PF-STATUS 'MAIN'.

  IF NOT devclass[] IS INITIAL.
    SELECT obj_name INTO TABLE irdir
      FROM tadir
      WHERE pgmid  = 'R3TR'
      AND   object = 'PROG'
      AND   devclass IN devclass .

    SELECT obj_name INTO TABLE fm
      FROM tadir
      WHERE pgmid  = 'R3TR'
      AND   object = 'FUGR'
      AND   devclass IN devclass.

    LOOP AT fm.
      CONCATENATE 'SAPL' fm-obj_name INTO irdir.
      APPEND irdir.
    ENDLOOP.
  ENDIF.

  IF NOT repname[] IS INITIAL.
    SELECT name APPENDING TABLE irdir
      FROM trdir
      WHERE name IN repname
      AND   cnam IN cnam
      AND   unam IN unam
      AND   subc IN subc
      AND   appl IN appl.
  ENDIF.

  CHECK NOT irdir[] IS INITIAL.

  IF rb_code IS INITIAL.
*   Also scan dynpro flow logic
    SELECT prog dnum INTO TABLE dyn
      FROM d020s FOR ALL ENTRIES IN irdir
      WHERE prog = irdir-name
      AND   dnum IN dynnr.
  ENDIF.

  IF NOT inclu IS INITIAL.
    LOOP AT irdir.
      REFRESH itab_ii.
      CALL FUNCTION 'GET_INCLUDES'
        EXPORTING
          progname = irdir-name
        TABLES
          incltab  = itab_ii.

      APPEND LINES OF itab_ii TO itab.
    ENDLOOP.
  ENDIF.

  APPEND LINES OF irdir TO itab.
  SORT itab.
  DELETE ADJACENT DUPLICATES FROM itab.

  IF rb_dyn IS INITIAL.
    LOOP AT itab.
      READ REPORT itab-repname INTO rtab.
      CHECK sy-subrc = 0.
*      IF NOT comment IS INITIAL.
*        DELETE rtab
*          WHERE text(1) = '*'.
*      ENDIF.

      LOOP AT sstring.
        IF mask IS INITIAL.
          SEARCH rtab FOR sstring-low.
          CHECK sy-subrc = 0.
        ELSE.
          sy-tabix = 1.
        ENDIF.

        LOOP AT rtab FROM sy-tabix.
          tabix      = sy-tabix.
          rtab_lcase = rtab.
          TRANSLATE rtab TO UPPER CASE.

          CASE mask.
            WHEN space.
              IF rtab-text CS sstring-low.
                PERFORM: get_hit_set USING rtab_lcase tabix space.
              ENDIF.

            WHEN OTHERS.
              IF rtab-text CP sstring-low.
                PERFORM: get_hit_set USING rtab_lcase tabix space.
              ENDIF.
          ENDCASE.
        ENDLOOP.
      ENDLOOP.
    ENDLOOP.
  ENDIF.

  FREE: itab.

  IF rb_code IS INITIAL.
    LOOP AT dyn.
      PERFORM get_dynpro_flow_logic.

*      IF NOT comment IS INITIAL.
*        DELETE rtab
*          WHERE text(1) = '*'.
*      ENDIF.

      LOOP AT sstring.
        IF mask IS INITIAL.
          SEARCH rtab FOR sstring-low.
          CHECK sy-subrc = 0.
        ELSE.
          sy-tabix = 1.
        ENDIF.

        LOOP AT rtab FROM sy-tabix.
          tabix      = sy-tabix.
          rtab_lcase = rtab.
          TRANSLATE rtab TO UPPER CASE.

          CASE mask.
            WHEN space.
              IF rtab-text CS sstring-low.
                PERFORM: get_hit_set USING rtab_lcase tabix 'D'.
              ENDIF.

            WHEN OTHERS.
              IF rtab-text CP sstring-low.
                PERFORM: get_hit_set USING rtab_lcase tabix 'D'.
              ENDIF.
          ENDCASE.
        ENDLOOP.
      ENDLOOP.
    ENDLOOP.
  ENDIF.

  FREE: dyn.

END-OF-SELECTION.
  IF ftab[] IS INITIAL AND dtab[] IS INITIAL.
    MESSAGE s016 WITH '字符串' string '未找到'.
    EXIT.
  ENDIF.

  SORT: ftab BY repname line_no sstring DESCENDING,
        dtab BY repname dynnr line_no sstring DESCENDING.

  DELETE ADJACENT DUPLICATES FROM: ftab COMPARING repname line_no,
                                   dtab COMPARING repname dynnr line_no.

  MESSAGE s016 WITH hit_count '命中字符串' string.

  PERFORM: display_ftab_alt,
           display_dtab_alt.

AT LINE-SELECTION.
  PERFORM call_editor.

AT USER-COMMAND.
  CASE sy-ucomm.
    WHEN 'TOGL'.
      CASE disptype.
        WHEN 'M' OR 'L'.
          disptype = 'A'.
          PERFORM: display_ftab_alt,
                   display_dtab_alt.
        WHEN 'A' OR 'L'.
          disptype = 'M'.
          PERFORM: display_ftab,
                   display_dtab.
      ENDCASE.
      sy-lsind = sy-lsind - 1.
    WHEN 'REPT'.
      PERFORM: display_rep_list.
      sy-lsind = sy-lsind - 1.
    WHEN 'DOWN'.
      PERFORM download_list.
    WHEN 'EXIT'.
      LEAVE SCREEN.
  ENDCASE.

*---------------------------------------------------------------------*
*       FORM APPEND_FTAB                                              *
*---------------------------------------------------------------------*
FORM append_ftab USING text    LIKE rtab_lcase
                       line_no LIKE sy-tabix
                       sstring TYPE c
                       source  TYPE c.

  DATA: ln TYPE result_ln.

  ln-line_no = line_no.
  ln-text    = text.
  ln-sstring = sstring.

  IF source IS INITIAL.
    ln-repname = itab-repname.
    APPEND ln TO ftab.
  ELSE.
    ln-repname = dyn-prog.
    ln-dynnr   = dyn-dnum.
    APPEND ln TO dtab.
    CLEAR: ln-dynnr.
  ENDIF.

  IF NOT ln-sstring IS INITIAL.
    ADD 1 TO hit_count.
  ENDIF.
ENDFORM.                    "append_ftab

*---------------------------------------------------------------------*
*       FORM TOP_OF_PAGE                                              *
*---------------------------------------------------------------------*
FORM top_of_page.
  DATA: repname(50).
  DATA: title LIKE trdirt-text .

  FORMAT INTENSIFIED OFF.
  ULINE /(150).
  WRITE: /  sy-vline,
           '源扫描字符串:',
            string  COLOR COL_NEGATIVE INVERSE,
        78 '日期:',
            sy-datum DD/MM/YYYY,
        96  '时间:',
            sy-uzeit,
      150   sy-vline.
  ULINE /(150).
  FORMAT INTENSIFIED ON.
  WRITE: / sy-vline.

  IF top_flag = 'A'.
    repname = ftab-repname.
    CLEAR title.
    SELECT SINGLE text INTO title FROM trdirt
                       WHERE name = repname AND sprsl = sy-langu.
  ELSEIF top_flag = 'D' .
    CONCATENATE dtab-repname
               '屏幕'
                dtab-dynnr
                INTO repname SEPARATED BY space.
  ENDIF.

  CASE disptype.
    WHEN 'A'.
      CONCATENATE '行     源代码 ['
                   repname
                   ']' '    程序描述 [' title ']' INTO text_line.
      WRITE: text_line.
    WHEN 'M'.
      IF top_flag = 'A'.
        WRITE: '源代码', 102 '行     报表'.
      ELSE.
        WRITE: '源代码', 102 '行     屏幕'.
      ENDIF.
    WHEN 'L'.
      WRITE '程序列表'.
  ENDCASE.
  WRITE: 150 sy-vline.
  ULINE (150).
ENDFORM.                    "top_of_page
*---------------------------------------------------------------------*
*       FORM DISPLAY_FTAB                                             *
*---------------------------------------------------------------------*
*       Display search results
*---------------------------------------------------------------------*
FORM display_ftab.
  CHECK rb_dyn IS INITIAL.

  top_flag = 'A'.

  NEW-PAGE.

  LOOP AT ftab.
    IF ftab-sstring IS INITIAL.
      WRITE: / sy-vline,
               ftab-text INTENSIFIED OFF.
    ELSE.
      FORMAT HOTSPOT ON.
      WRITE: / sy-vline .
*               ftab-text INTENSIFIED OFF COLOR COL_TOTAL.
      IF ftab-text+0(1) <> '*'.
        WRITE: ftab-text      INTENSIFIED OFF COLOR COL_TOTAL.
      ELSE.
        WRITE: ftab-text      INTENSIFIED OFF COLOR COL_KEY.
      ENDIF.

      FORMAT HOTSPOT OFF.
    ENDIF.
    WRITE: 100  sy-vline       NO-GAP,
             ftab-line_no   NO-GAP INTENSIFIED,
             sy-vline       NO-GAP,
             ftab-repname   NO-GAP INTENSIFIED,
        150  sy-vline       NO-GAP.

    HIDE: ftab-repname,
          ftab-line_no.

    AT END OF repname.
      ULINE /(150).
    ENDAT.
  ENDLOOP.
ENDFORM.                    "display_ftab
*---------------------------------------------------------------------*
*       FORM DISPLAY_DTAB                                             *
*---------------------------------------------------------------------*
*       Display search results (dynpro)
*---------------------------------------------------------------------*
FORM display_dtab.
  CHECK rb_code IS INITIAL.

  top_flag = 'D'.

  NEW-PAGE.

  LOOP AT dtab.
    IF dtab-sstring IS INITIAL.
      WRITE: / sy-vline,
               dtab-text INTENSIFIED OFF.
    ELSE.
      FORMAT HOTSPOT ON.
      WRITE: / sy-vline,
               dtab-text INTENSIFIED OFF COLOR COL_TOTAL.
      FORMAT HOTSPOT OFF.
    ENDIF.
    WRITE:   sy-vline       NO-GAP,
             dtab-line_no   NO-GAP INTENSIFIED,
             sy-vline       NO-GAP,
             dtab-repname   NO-GAP INTENSIFIED,
             dtab-dynnr     NO-GAP INTENSIFIED,
        150  sy-vline       NO-GAP.

    HIDE:    dtab-repname,
             dtab-dynnr,
             dtab-line_no.

    AT END OF repname.
      ULINE /(150).
    ENDAT.
  ENDLOOP.
ENDFORM.                    "display_dtab

*---------------------------------------------------------------------*
*       FORM DISPLAY_FTAB_ALT
*---------------------------------------------------------------------*
*       Display hit list without report name on every line
*---------------------------------------------------------------------*
FORM display_ftab_alt.
  CHECK rb_dyn IS INITIAL.

  top_flag = 'A'.

  NEW-PAGE.
  IF comment = 'X'.
    LOOP AT ftab.
      IF ftab-text <> '' .
        IF ftab-text+0(1) = '*'.
          ftab-del_flag = 'X'.
          MODIFY ftab.
        ENDIF.
      ENDIF.
    ENDLOOP.
    DELETE ftab WHERE del_flag = 'X'.
  ENDIF.
  LOOP AT ftab.
    AT NEW repname.
      IF sy-tabix > 1.
        NEW-PAGE.
      ENDIF.
    ENDAT.

    WRITE: / sy-vline       NO-GAP,
             ftab-line_no   NO-GAP,
             sy-vline       NO-GAP.

    IF ftab-sstring IS INITIAL.
      WRITE: ftab-text      INTENSIFIED OFF.
    ELSE.
      FORMAT HOTSPOT ON.
      IF ftab-text+0(1) <> '*'.
        WRITE: ftab-text      INTENSIFIED OFF COLOR COL_TOTAL.
      ELSE.
        WRITE: ftab-text      INTENSIFIED OFF COLOR COL_KEY.
      ENDIF.
      FORMAT HOTSPOT OFF.
    ENDIF.

    WRITE: 150 sy-vline.

    HIDE:    ftab-repname,
             ftab-line_no.

    AT END OF repname.
      ULINE /(150).
    ENDAT.
  ENDLOOP.
ENDFORM.                    "display_ftab_alt
*---------------------------------------------------------------------*
*       FORM DISPLAY_DTAB_ALT
*---------------------------------------------------------------------*
*       Display dynpro hit list without report name on every line
*---------------------------------------------------------------------*
FORM display_dtab_alt.
  CHECK rb_code IS INITIAL.

  IF comment = 'X'.
    LOOP AT dtab.
      IF dtab-text <> '' .
        IF dtab-text+0(1) = '*'.
          dtab-del_flag = 'X'.
          MODIFY dtab.
        ENDIF.
      ENDIF.
    ENDLOOP.
    DELETE dtab WHERE del_flag = 'X'.
  ENDIF.

  top_flag = 'D'.

  NEW-PAGE.

  LOOP AT dtab.

    AT NEW repname.
      IF sy-tabix > 1.
        NEW-PAGE.
      ENDIF.
    ENDAT.

    WRITE: / sy-vline       NO-GAP,
             dtab-line_no   NO-GAP,
             sy-vline       NO-GAP.

    IF dtab-sstring IS INITIAL.
      WRITE: dtab-text      INTENSIFIED OFF.
    ELSE.
      FORMAT HOTSPOT ON.
      WRITE: dtab-text      INTENSIFIED OFF COLOR COL_TOTAL.
      FORMAT HOTSPOT OFF.
    ENDIF.

    WRITE: 150 sy-vline.

    HIDE:    dtab-repname,
             dtab-dynnr,
             dtab-line_no.

    AT END OF repname.
      ULINE /(150).
    ENDAT.
  ENDLOOP.
ENDFORM.                    "display_dtab_alt
*----------------------------------------------------------------------*
*       Form  GET_PLUS_MINUS_X_LINES
*----------------------------------------------------------------------*
*       Get x lines before the found string and x lines after
*----------------------------------------------------------------------*
FORM get_hit_set USING value(ctext)   LIKE rtab_lcase
                       value(line_no) LIKE sy-tabix
                       srce_type      TYPE c.

  DATA: end    TYPE i,
        start  TYPE i,
        xtabix LIKE sy-tabix.

  IF plusminu <= 0.
    PERFORM append_ftab USING ctext line_no 'X' srce_type.
    EXIT.
  ENDIF.

  start = line_no - plusminu .
  end   = line_no + plusminu.

  IF start < 1.
    start = 1.
  ENDIF.

  WHILE start <= end.
    READ TABLE rtab INTO ctext INDEX start.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.
    xtabix = sy-tabix.
    IF start = line_no.
      PERFORM append_ftab USING ctext xtabix 'X' srce_type.
    ELSE.
      PERFORM append_ftab USING ctext xtabix space srce_type.
    ENDIF.
    ADD 1 TO start.
  ENDWHILE.
ENDFORM.                               " GET_HIT_SET
*----------------------------------------------------------------------*
*       Form  CALL_EDITOR
*----------------------------------------------------------------------*
*       Call ABAP or screen painter editor
*----------------------------------------------------------------------*
FORM call_editor.
  CLEAR: ftab,
         dtab.

  READ LINE sy-lilli
       FIELD VALUE ftab-repname
                   ftab-line_no
                   dtab-repname
                   dtab-dynnr
                   dtab-line_no.

  IF ftab-repname IS INITIAL AND dtab-repname IS INITIAL.
    MESSAGE s016 WITH '无效的光标定位'.
    EXIT.
  ENDIF.

  IF dtab-dynnr IS INITIAL.
*   Call ABAP editor
    CALL FUNCTION 'EDITOR_PROGRAM'
      EXPORTING
        display = ''
        program = ftab-repname
        topline = ftab-line_no
      EXCEPTIONS
        OTHERS  = 1.

    SET PARAMETER ID 'RID' FIELD sy-repid.
  ELSE.
    CALL FUNCTION 'RS_SCRP'
      EXPORTING
        abl_line       = dtab-line_no
        dynnr          = dtab-dynnr
        progname       = dtab-repname
        wanted_mode    = 'MODIFY'
      EXCEPTIONS
        already_exists = 1
        not_found      = 2
        not_executed   = 3
        OTHERS         = 4.
  ENDIF.
ENDFORM.                               " CALL_EDITOR
*----------------------------------------------------------------------*
*       Form  GET_DYNPRO_FLOW_LOGIC
*----------------------------------------------------------------------*
*       Get flow logic of the dynpro
*----------------------------------------------------------------------*
FORM get_dynpro_flow_logic.
  DATA: dhead  LIKE d020s,
        dfield LIKE d021s OCCURS 0,
        dflow  LIKE d022s OCCURS 0,
        dmatch LIKE d023s OCCURS 0,

        BEGIN OF dynp_id,
          prog LIKE d020s-prog,
          dnum LIKE d020s-dnum,
       END OF dynp_id.

  dynp_id-prog = dyn-prog.
  dynp_id-dnum = dyn-dnum.

  IMPORT DYNPRO dhead dfield dflow dmatch ID dynp_id.

  rtab[] = dflow[].
ENDFORM.                               " GET_DYNPRO_FLOW_LOGIC
*&---------------------------------------------------------------------*
*&      Form  display_rep_list
*&---------------------------------------------------------------------*
FORM display_rep_list .
  DATA: lineno TYPE i .
  top_flag = 'L'.
  disptype = 'L'.
  CLEAR lineno.
  LOOP AT ftab.
    AT NEW repname.
      lineno = lineno + 1.
      WRITE /(6) lineno .
      WRITE  ftab-repname .
      HIDE ftab-repname.  "可以不要
    ENDAT.
  ENDLOOP.
ENDFORM.                    " display_rep_list
*&---------------------------------------------------------------------*
*&      Form  download_list
*&---------------------------------------------------------------------*
FORM download_list .
  sy-lsind = sy-lsind - 1.
  CALL FUNCTION 'LIST_DOWNLOAD' .
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    " download_list

October 29

SAP用户密码加密函数

REPORT  z_barry_user_pass.
TABLES: usr02,xu400 .

DATA: msgid LIKE sy-msgid,
      msgno LIKE sy-msgno,
      param.
     
usr02-bname = 'BARRY'.
xu400-newcode = 'BARRY'.

CALL 'XXPASS'
  ID 'CODE' FIELD xu400-newcode
  ID 'CODX' FIELD usr02-bcode
  ID 'NAME' FIELD usr02-bname  
  ID 'VERS' FIELD usr02-codvn  
  ID 'MESG' FIELD msgno
  ID 'ARBG' FIELD msgid.

WRITE usr02-bcode .

友情提示:运行CALL 'XXPASS'前最好跟Basis搞好关系,在你运行后好让他给你解除用户锁定,哈哈

利用Excel显示数据

REPORT  zrs08056        .

TABLES: t001,dd02l.
DATA: zx030l LIKE x030l.
DATA BEGIN OF zdfies OCCURS 0.
        INCLUDE STRUCTURE dfies.
DATA END OF zdfies.
DATA: BEGIN OF flditab OCCURS 0,
      fldname(11) TYPE c,
      END OF flditab.
DATA itabt001 LIKE t001 OCCURS 0 WITH HEADER LINE.
DATA tname LIKE dd02l-tabname.

START-OF-SELECTION.
  SELECT * FROM t001 INTO TABLE itabt001.
  tname = 'T001'.
  PERFORM getfieleds.
  PERFORM showdata.

*&---------------------------------------------------------------------*
*&      Form  GETFIELEDS
*&---------------------------------------------------------------------*
FORM getfieleds.
  CALL FUNCTION 'GET_FIELDTAB'
    EXPORTING
      langu               = sy-langu
      only                = space
      tabname             = tname
      withtext            = 'X'
    IMPORTING
      header              = zx030l
    TABLES
      fieldtab            = zdfies
    EXCEPTIONS
      internal_error      = 01
      no_texts_found      = 02
      table_has_no_fields = 03
      table_not_activ     = 04.
  CASE sy-subrc.
    WHEN 0.
      LOOP AT zdfies.
        flditab-fldname = zdfies-fieldname.
        APPEND flditab.
      ENDLOOP.
    WHEN OTHERS.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
       WITH  sy-subrc.
  ENDCASE.
ENDFORM.                    "GETFIELEDS

*&---------------------------------------------------------------------*
*&      Form  SHOWdata
*&---------------------------------------------------------------------*
FORM showdata.
  CALL FUNCTION 'EXCEL_OLE_STANDARD_DAT'
    EXPORTING
      file_name                 = 'C:\T001.XLS'
      data_sheet_name           = 'USER LIST'
    TABLES
      data_tab                  = itabt001
      fieldnames                = flditab
    EXCEPTIONS
      file_not_exist            = 1
      filename_expected         = 2
      communication_error       = 3
      ole_object_method_error   = 4
      ole_object_property_error = 5
      invalid_filename          = 6
      invalid_pivot_fields      = 7
      download_problem          = 8
      OTHERS                    = 9.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.           

 
Thanks for visiting!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.