工作生活与爱好

工作中的记录; 生活中的记忆; 业余爱好的记载。

2007-01-18

 

如何在双击ALV显示的数据中的某一条,调TRANSATION CODE?

* 要在ABAP/4程序中呼叫ALV Function Module来产生输出画面, *有几个叙述是必需做的:
* ?数据变量(Data Area)宣告
* ?宣告Internal Table来存放自数据文件的数据
* ?自数据文件选取数据存放至Internal Table
* ?建立显示字段清单(Field Catalogs)
* ?建立事件清单(Event Catalogs)
* ?呼叫ALV Function Module
* ?撰写User按键处理事件
*数据变量(Data Area)宣告
* 在SAP上预设有一个数据群组(Data Pool) SLIS, *已预先定义好所有ALV所需之数据型态, 程序如下:
program alvtest .
TYPE-POOLS: SLIS.
DATA:
FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
FIELDCAT_LN LIKE LINE OF FIELDCAT,
SORTCAT TYPE SLIS_T_SORTINFO_ALV,
SORTCAT_LN LIKE LINE OF SORTCAT,
EVENTCAT TYPE SLIS_T_EVENT,
EVENTCAT_LN LIKE LINE OF EVENTCAT.
DATA: COL_POS TYPE I.

* 宣告Internal Table
*宣告屏幕显示所需的Internal Table及包含的字段, 如报表要列出 VBAP数据, *Internal Table 定义如下:
DATA: BEGIN OF IVBAP OCCURS 0,
VBELN LIKE VBAP-VBELN,
MATNR LIKE VBAP-MATNR,
MATKL LIKE VBAP-MATKL,
END OF IVBAP.
* 自数据文件选取数据存放至Internal Table
* 选取单号字段不为空白的所有数据记录插入至Internal Table IVBAP:

SELECT VBELN POSNR MATNR MATKL KWMENG VRKME
INTO CORRESPONDING FIELDS OF TABLE IVBAP
FROM VBAP
WHERE VBELN NE SPACE.

* 建立显示字段清单(Field Catalogs)
* 例如显示的字段有 VBELN (Sales Doc.), *MATNR(Material)及MAKTL(Material Group)三个字段, 必须依序设定其属性:
ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = 'VBAP'.
FIELDCAT_LN-FIELDNAME = 'VBELN'.
FIELDCAT_LN-KEY = 'X'.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = 'VBAP'.
FIELDCAT_LN-FIELDNAME = 'MATNR'.
FIELDCAT_LN-KEY = SPACE.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = SPACE.
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = 'VBAP'.
FIELDCAT_LN-FIELDNAME = 'MATKL'.
FIELDCAT_LN-KEY = SPACE.
FIELDCAT_LN-DO_SUM = 'X'.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = SPACE.
APPEND FIELDCAT_LN TO FIELDCAT.

SORTCAT_LN-SPOS = '1'.
SORTCAT_LN-FIELDNAME = 'MATNR'.
SORTCAT_LN-UP = 'X'.
SORTCAT_LN-DOWN = SPACE.
SORTCAT_LN-SUBTOT = 'X'.
APPEND SORTCAT_LN TO SORTCAT.
* 建立事件清单(Event Catalogs)
EVENTCAT_LN-NAME = 'TOP_OF_PAGE'.
EVENTCAT_LN-form = 'PAGE_HEADER'.
APPEND EVENTCAT_LN TO EVENTCAT.
* 呼叫ALV Function Module
DATA: PGM LIKE SY-REPID.
PGM = SY-REPID.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = PGM
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
IT_FIELDCAT = FIELDCAT
IT_SORT = SORTCAT
I_SAVE = 'A'
IT_EVENT = EVENTCAT
TABLES
T_OUTTAB = IVBAP
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
* 撰写User按键处理事件
* 例如我们要加上让User可以连续按鼠标两次后可依游标所在值, 如Sales *Doc*.或Material进入 Sales Doc查询画面(T-Code VA03)或Material **查询画面(T-Code MM03)。
form USER_COMMAND USING UCOMM LIKE SY-UCOMM
SELFIELD TYPE SLIS_SELFIELD.
READ TABLE IVBAP INDEX SELFIELD-TABINDEX.
CHECK SY-SUBRC = 0.
CASE UCOMM.
WHEN '&IC1'.
CASE SELFIELD-SEL_TAB_FIELD.
WHEN 'IVBAP-VBELN'.
SET PARAMETER ID 'AUN' FIELD IVBAP-VBELN.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
WHEN 'IVBAP-MATNR'.
SET PARAMETER ID 'MAT' FIELD IVBAP-MATNR.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDCASE.
ENDCASE.
ENDform.

把自己定义的按钮和ALV的标准按钮结合起来,也是用的ALV的函数。
eg:
call function 'REUSE_ALV_LIST_DISPLAY'
exporting
i_callback_program = v_repid
i_callback_pf_status_set = 'MENU_SET'
i_callback_user_command = 'EXECUTE_COMMAND'
is_layout = ws_layout
it_fieldcat = ws_fieldcat[]
i_save = g_save
is_variant = g_variant
sp_group = alv_sp_group
it_special_groups = ws_fieldgroups_tab[]
it_sort = ws_sortfields_tab[]
it_events = ws_events[]
i_grid_title = title
tables
t_outtab = itab2
exceptions
program_error = 1
others = 2.

主要是通过两个参数来实现自定义按钮的,两个参数为:“MENU_SET”、“EXECUTE_COMMAND”,然后通过他们对应的两个子函数来实现。
*------------------------------------------------------------*
* Name: form menu_set using rt_extab type slis_t_extab *
* Desc: ALV添加按钮 *
*------------------------------------------------------------*
form menu_set using rt_extab type slis_t_extab..
set pf-status '100'. "定义屏幕状态,然后在里面定义自己的按钮
endform.
*----------------------------------------------------------------*
* Name: form execute_command using r_ucomm like sy-ucomm *
* Desc:响应ALV点击自定义按钮之后的事件 *
*----------------------------------------------------------------*
form execute_command using r_ucomm like sy-ucomm
rs_selfield type slis_selfield.
......
case r_ucomm.
when 'TEST'. "在set pf-status '100'.的屏幕状态里面定义的
....
when ..
....
endcase.
endform.

Comments: 发表评论



<< Home

Archives

1990年1月15日   2007年1月14日   2007年1月15日   2007年1月16日   2007年1月17日   2007年1月18日   2007年1月19日   2007年1月20日   2007年1月22日   2007年1月23日   2007年1月24日   2007年1月25日   2007年1月26日   2007年1月27日   2007年1月29日   2007年1月30日   2007年1月31日   2007年2月1日   2007年2月2日   2007年2月3日   2007年3月13日   2007年5月15日   2007年5月16日   2007年6月2日  

This page is powered by Blogger. Isn't yours?