AS01~AS03资产主数据增强
一、增强步骤
-
执行事务码AS03进入主资产屏幕中,新增一个客户增强屏幕,并添加对应的字段。
-
使用BADI查找程序,查找到对应屏幕增强smod为AIST0002,并知道增强的结构为CI_ANLU,将增强的字段添加到结构中并激活,如下图。
-
双击出口函数**EXIT_SAPLAIST_002****,进入所在的函数组,在函数组中创建新的子屏幕,并将字段加入到屏幕中,同事以anlu命名。
-
屏幕编辑好之后,需要将屏幕分配到对应资产类中,首先使用事务码AOLK,根据不同分类定义前台的屏幕展示,选中1000分类,点击左侧的格式的一般分配
-
我们看到当前固定资产操作屏幕显示布局为’SAP’,我们现在要做的是自建一个布局将其替换。执行T-code AOLA,通过复制’SAP’的方式新建布局’ZSAP’。
-
选中新建的ZSAP,点击左侧的表页标题进行编
-
我们想增加一个新的标签页,通过debug的方式对数据库表TAMLAY1和TAMLAY2插入一条新数据,四个字段值分别为 FI-AA,ZSAP,9,客户增强,然后重新打开AOLA,查看ZSAP表页标题,发现标签页码增加了一行。
-
选中新加行,双击左侧标签页上的组位置,将新建的子屏幕增加到其中。
-
回到AOLK,将对应布局由SAP改为ZSAP,激活程序,进入AS01界面,增强字段已经生效
二、AS03增强详细行屏幕
-
执行事务码AS03,新增一个屏幕,用于记录合同详细信息的屏幕,一个资产号包括多个合同号,如下。
-
首先需要新建在一个自建表用于存储合同信息
-
然后使用事务码se80进入SAP资源库浏览器,查看函数组XAIS,新建屏幕9002,编辑对应的屏幕,注意:在该函数组使用表向导的组件创建表控件会报禁止修改程序,解决方法使用不带向导的表控件,或者建立一个测试程序将屏幕画好表控件后再复制到XAIS程序,同时在函数组中建立一个包含文件,把代码也复制过来。
-
同时需要在建立PBO和PAI来操作数据
-
对应的代码如下
*----------------------------------------------------------------------*
***INCLUDE ZXAISO01.
*----------------------------------------------------------------------*
"获取合同屏幕的数据逻辑添加 by hand 20221021 begin of "
TYPES:BEGIN OF ty_cont,
zbox TYPE char1,
zindex TYPE i,
contract_id TYPE ztanlu-contract_id,
contract_name TYPE ztanlu-contract_name,
is_delete TYPE ztanlu-is_delete,
END OF ty_cont.
DATA:gt_cont TYPE STANDARD TABLE OF ty_cont,
gs_cont TYPE ty_cont.
DATA:gt_ztanlu TYPE STANDARD TABLE OF ztanlu,
gs_ztanlu TYPE ztanlu.
DATA gt_znlu LIKE anlu.
"表控件屏幕代码 by hand 20221021 begin of
*&SPWIZARD: DECLARATION OF TABLECONTROL 'ZTAB' ITSELF
CONTROLS: ztab TYPE TABLEVIEW USING SCREEN 9002.
*&SPWIZARD: LINES OF TABLECONTROL 'ZTAB'
DATA: g_ztab_lines LIKE sy-loopc.
DATA: ok_code LIKE sy-ucomm.
*&SPWIZARD: OUTPUT MODULE FOR TC 'ZTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE ztab_change_tc_attr OUTPUT.
DESCRIBE TABLE gt_cont LINES ztab-lines.
ENDMODULE.
*&SPWIZARD: OUTPUT MODULE FOR TC 'ZTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE ztab_get_lines OUTPUT.
g_ztab_lines = sy-loopc.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TC 'ZTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MODIFY TABLE
MODULE ztab_modify INPUT.
MODIFY gt_cont
FROM gs_cont
INDEX ztab-current_line.
ENDMODULE.
*&SPWIZARD: INPUT MODUL FOR TC 'ZTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MARK TABLE
MODULE ztab_mark INPUT.
DATA: g_ztab_wa2 LIKE LINE OF gt_cont.
IF ztab-line_sel_mode = 1
AND gs_cont-zbox = 'X'.
LOOP AT gt_cont INTO g_ztab_wa2
WHERE zbox = 'X'.
g_ztab_wa2-zbox = ''.
MODIFY gt_cont
FROM g_ztab_wa2
TRANSPORTING zbox.
ENDLOOP.
ENDIF.
MODIFY gt_cont
FROM gs_cont
INDEX ztab-current_line
TRANSPORTING zbox.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TC 'ZTAB'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: PROCESS USER COMMAND
MODULE ztab_user_command INPUT.
ok_code = sy-ucomm.
PERFORM user_ok_tc USING 'ZTAB'
'GT_CONT'
'ZBOX'
CHANGING ok_code.
sy-ucomm = ok_code.
ENDMODULE.
*----------------------------------------------------------------------*
* INCLUDE TABLECONTROL_FORMS *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form USER_OK_TC *
*&---------------------------------------------------------------------*
FORM user_ok_tc USING p_tc_name TYPE dynfnam
p_table_name
p_mark_name
CHANGING p_ok LIKE sy-ucomm.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA: l_ok TYPE sy-ucomm,
l_offset TYPE i.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
*&SPWIZARD: Table control specific operations *
*&SPWIZARD: evaluate TC name and operations *
SEARCH p_ok FOR p_tc_name.
IF sy-subrc <> 0.
EXIT.
ENDIF.
l_offset = strlen( p_tc_name ) + 1.
l_ok = p_ok+l_offset.
*&SPWIZARD: execute general and TC specific operations *
CASE l_ok.
WHEN 'INSR'. "insert row
PERFORM fcode_insert_row USING p_tc_name
p_table_name.
CLEAR p_ok.
WHEN 'DELE'. "delete row
PERFORM fcode_delete_row USING p_tc_name
p_table_name
p_mark_name.
CLEAR p_ok.
WHEN 'P--' OR "top of list
'P-' OR "previous page
'P+' OR "next page
'P++'. "bottom of list
PERFORM compute_scrolling_in_tc USING p_tc_name
l_ok.
CLEAR p_ok.
* WHEN 'L--'. "total left
* PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.
*
* WHEN 'L-'. "column left
* PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.
*
* WHEN 'R+'. "column right
* PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.
*
* WHEN 'R++'. "total right
* PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.
*
WHEN 'MARK'. "mark all filled lines
PERFORM fcode_tc_mark_lines USING p_tc_name
p_table_name
p_mark_name .
CLEAR p_ok.
WHEN 'DMRK'. "demark all filled lines
PERFORM fcode_tc_demark_lines USING p_tc_name
p_table_name
p_mark_name .
CLEAR p_ok.
* WHEN 'SASCEND' OR
* 'SDESCEND'. "sort column
* PERFORM FCODE_SORT_TC USING P_TC_NAME
* l_ok.
ENDCASE.
ENDFORM. " USER_OK_TC
*&---------------------------------------------------------------------*
*& Form FCODE_INSERT_ROW *
*&---------------------------------------------------------------------*
FORM fcode_insert_row
USING p_tc_name TYPE dynfnam
p_table_name .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA l_lines_name LIKE feld-name.
DATA l_selline LIKE sy-stepl.
DATA l_lastline TYPE i.
DATA l_line TYPE i.
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <lines> TYPE i.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (p_tc_name) TO <tc>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
*&SPWIZARD: get looplines of TableControl *
CONCATENATE 'G_' p_tc_name '_LINES' INTO l_lines_name.
ASSIGN (l_lines_name) TO <lines>.
*&SPWIZARD: get current line *
GET CURSOR LINE l_selline.
IF sy-subrc <> 0. " append line to table
l_selline = <tc>-lines + 1.
*&SPWIZARD: set top line *
IF l_selline > <lines>.
<tc>-top_line = l_selline - <lines> + 1 .
ELSE.
<tc>-top_line = 1.
ENDIF.
ELSE. " insert line into table
l_selline = <tc>-top_line + l_selline - 1.
l_lastline = <tc>-top_line + <lines> - 1.
ENDIF.
*&SPWIZARD: set new cursor line *
l_line = l_selline - <tc>-top_line + 1.
*&SPWIZARD: insert initial line *
INSERT INITIAL LINE INTO <table> INDEX l_selline.
<tc>-lines = <tc>-lines + 1.
*&SPWIZARD: set cursor *
SET CURSOR LINE l_line.
ENDFORM. " FCODE_INSERT_ROW
*&---------------------------------------------------------------------*
*& Form FCODE_DELETE_ROW *
*&---------------------------------------------------------------------*
FORM fcode_delete_row
USING p_tc_name TYPE dynfnam
p_table_name
p_mark_name .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <wa>.
FIELD-SYMBOLS <mark_field>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (p_tc_name) TO <tc>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
*&SPWIZARD: delete marked lines *
DESCRIBE TABLE <table> LINES <tc>-lines.
LOOP AT <table> ASSIGNING <wa>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.
IF <mark_field> = 'X'.
DELETE <table> INDEX syst-tabix.
IF sy-subrc = 0.
<tc>-lines = <tc>-lines - 1.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " FCODE_DELETE_ROW
*&---------------------------------------------------------------------*
*& Form COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
* -->P_OK ok code
*----------------------------------------------------------------------*
FORM compute_scrolling_in_tc USING p_tc_name
p_ok.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA l_tc_new_top_line TYPE i.
DATA l_tc_name LIKE feld-name.
DATA l_tc_lines_name LIKE feld-name.
DATA l_tc_field_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <lines> TYPE i.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (p_tc_name) TO <tc>.
*&SPWIZARD: get looplines of TableControl *
CONCATENATE 'G_' p_tc_name '_LINES' INTO l_tc_lines_name.
ASSIGN (l_tc_lines_name) TO <lines>.
*&SPWIZARD: is no line filled? *
IF <tc>-lines = 0.
*&SPWIZARD: yes, ... *
l_tc_new_top_line = 1.
ELSE.
*&SPWIZARD: no, ... *
CALL FUNCTION 'SCROLLING_IN_TABLE'
EXPORTING
entry_act = <tc>-top_line
entry_from = 1
entry_to = <tc>-lines
last_page_full = 'X'
loops = <lines>
ok_code = p_ok
overlapping = 'X'
IMPORTING
entry_new = l_tc_new_top_line
EXCEPTIONS
* NO_ENTRY_OR_PAGE_ACT = 01
* NO_ENTRY_TO = 02
* NO_OK_CODE_OR_PAGE_GO = 03
OTHERS = 0.
ENDIF.
*&SPWIZARD: get actual tc and column *
GET CURSOR FIELD l_tc_field_name
AREA l_tc_name.
IF syst-subrc = 0.
IF l_tc_name = p_tc_name.
*&SPWIZARD: et actual column *
SET CURSOR FIELD l_tc_field_name LINE 1.
ENDIF.
ENDIF.
*&SPWIZARD: set the new top line *
<tc>-top_line = l_tc_new_top_line.
ENDFORM. " COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
*& Form FCODE_TC_MARK_LINES
*&---------------------------------------------------------------------*
* marks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM fcode_tc_mark_lines USING p_tc_name
p_table_name
p_mark_name.
*&SPWIZARD: EGIN OF LOCAL DATA-----------------------------------------*
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <wa>.
FIELD-SYMBOLS <mark_field>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (p_tc_name) TO <tc>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
*&SPWIZARD: mark all filled lines *
LOOP AT <table> ASSIGNING <wa>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.
<mark_field> = 'X'.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines
*&---------------------------------------------------------------------*
*& Form FCODE_TC_DEMARK_LINES
*&---------------------------------------------------------------------*
* demarks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM fcode_tc_demark_lines USING p_tc_name
p_table_name
p_mark_name .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <wa>.
FIELD-SYMBOLS <mark_field>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (p_tc_name) TO <tc>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
*&SPWIZARD: demark all filled lines *
LOOP AT <table> ASSIGNING <wa>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.
<mark_field> = space.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines
*&---------------------------------------------------------------------*
*& Module INIT OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init OUTPUT.
IF gt_cont IS INITIAL.
CLEAR gt_ztanlu.
SELECT * FROM ztanlu INTO TABLE gt_ztanlu
WHERE bukrs = anlu-bukrs
AND anln1 = anlu-anln1
AND anln2 = anlu-anln2
AND is_delete = ''.
IF gt_ztanlu IS NOT INITIAL.
SORT gt_ztanlu BY contract_id.
LOOP AT gt_ztanlu INTO gs_ztanlu.
MOVE-CORRESPONDING gs_ztanlu TO gs_cont.
gs_cont-zindex = sy-tabix.
APPEND gs_cont TO gt_cont.
ENDLOOP.
ENDIF.
ENDIF.
IF gt_cont IS NOT INITIAL.
LOOP AT gt_cont INTO gs_cont .
gs_cont-zindex = sy-tabix.
MODIFY gt_cont FROM gs_cont.
ENDLOOP.
ENDIF.
LOOP AT gt_ztanlu INTO gs_ztanlu.
gs_ztanlu-is_delete = 'X'.
MODIFY gt_ztanlu FROM gs_ztanlu.
CLEAR gs_ztanlu.
ENDLOOP.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module user_command_9002 INPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE user_command_9002 INPUT.
IF gd_mode = 'V'.
IF gt_cont IS NOT INITIAL.
LOOP AT gt_cont INTO gs_cont WHERE contract_id <> ''.
READ TABLE gt_ztanlu INTO gs_ztanlu WITH KEY contract_id = gs_cont-contract_id BINARY SEARCH.
IF sy-subrc = 0.
gs_ztanlu-is_delete = ''.
MODIFY gt_ztanlu FROM gs_ztanlu INDEX sy-tabix.
ELSE.
gs_ztanlu-bukrs = anlu-bukrs.
gs_ztanlu-anln1 = anlu-anln1.
gs_ztanlu-anln2 = anlu-anln2.
gs_ztanlu-contract_id = gs_cont-contract_id.
gs_ztanlu-contract_name = gs_cont-contract_name.
gs_ztanlu-is_delete = ''.
APPEND gs_ztanlu TO gt_ztanlu.
ENDIF.
ENDLOOP.
CLEAR gs_cont.
ENDIF.
IF gt_ztanlu IS NOT INITIAL.
MODIFY ztanlu FROM TABLE gt_ztanlu.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ENDIF.
ENDIF.
ENDIF.
ENDMODULE.
-
激活后按照同样的步骤将屏幕分配给资产类。
-
遇到的问题,在画屏幕中,翻译抬头标签失败:画屏幕这里点击编辑改成的中文,激活后显示还是英文,解决办法:将抬头删除,使用文本组件替代。