AS01~AS03资产主数据屏幕增强

22 篇文章 0 订阅
本文详细描述了如何在SAP系统中通过事务码AS03增强资产主数据,包括新增客户增强屏幕、配置BADI查找程序、自定义表单及表控件,并解决屏幕翻译问题的过程。
摘要由CSDN通过智能技术生成
AS01~AS03资产主数据增强
一、增强步骤
  1. 执行事务码AS03进入主资产屏幕中,新增一个客户增强屏幕,并添加对应的字段。

  2. 使用BADI查找程序,查找到对应屏幕增强smod为AIST0002,并知道增强的结构为CI_ANLU,将增强的字段添加到结构中并激活,如下图。

    在这里插入图片描述

    在这里插入图片描述

  3. 双击出口函数**EXIT_SAPLAIST_002****,进入所在的函数组,在函数组中创建新的子屏幕,并将字段加入到屏幕中,同事以anlu命名

    在这里插入图片描述
    在这里插入图片描述

  4. 屏幕编辑好之后,需要将屏幕分配到对应资产类中,首先使用事务码AOLK,根据不同分类定义前台的屏幕展示,选中1000分类,点击左侧的格式的一般分配

    在这里插入图片描述

  5. 我们看到当前固定资产操作屏幕显示布局为’SAP’,我们现在要做的是自建一个布局将其替换。执行T-code AOLA,通过复制’SAP’的方式新建布局’ZSAP’。在这里插入图片描述

  6. 选中新建的ZSAP,点击左侧的表页标题进行编

    在这里插入图片描述

  7. 我们想增加一个新的标签页,通过debug的方式对数据库表TAMLAY1和TAMLAY2插入一条新数据,四个字段值分别为 FI-AA,ZSAP,9,客户增强,然后重新打开AOLA,查看ZSAP表页标题,发现标签页码增加了一行。 在这里插入图片描述

  8. 选中新加行,双击左侧标签页上的组位置,将新建的子屏幕增加到其中。 在这里插入图片描述

  9. 回到AOLK,将对应布局由SAP改为ZSAP,激活程序,进入AS01界面,增强字段已经生效 在这里插入图片描述

二、AS03增强详细行屏幕
  1. 执行事务码AS03,新增一个屏幕,用于记录合同详细信息的屏幕,一个资产号包括多个合同号,如下。 在这里插入图片描述

  2. 首先需要新建在一个自建表用于存储合同信息
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 然后使用事务码se80进入SAP资源库浏览器,查看函数组XAIS,新建屏幕9002,编辑对应的屏幕,注意:在该函数组使用表向导的组件创建表控件会报禁止修改程序,解决方法使用不带向导的表控件,或者建立一个测试程序将屏幕画好表控件后再复制到XAIS程序,同时在函数组中建立一个包含文件,把代码也复制过来。
    在这里插入图片描述

  4. 同时需要在建立PBO和PAI来操作数据在这里插入图片描述

  5. 对应的代码如下

*----------------------------------------------------------------------*
***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.
  1. 激活后按照同样的步骤将屏幕分配给资产类。

  2. 遇到的问题,在画屏幕中,翻译抬头标签失败:画屏幕这里点击编辑改成的中文,激活后显示还是英文,解决办法:将抬头删除,使用文本组件替代。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值