2020.01.11 【ABAP隨筆】SM30常見增強操作-自動帶描述等


1.    自動帶出描述類型(更新回數據庫)

我們使用的是在SM30中自動帶出銷售訂單類型的描述

首先我們創建一張表和一個維護視圖(維護視圖的好處就是可以方便增加字段),維護視圖中維護標記為R標識字段不可輸入

 

 

 

然后需求就是根據填入的銷售訂單號,去TVAKT中抓取描述,給context字段

我們根據維護視圖創建表維護生成器:

函數組名稱為ZVJXZHU_FG_01

 

接着進入到函數組ZVJXZHU_FG_01界面下:

為了防止維護程序的時候出現空的VBELN,所有我們進入到9000屏幕布局頁面將VBELN和POSNR設置為必輸,雙擊vbeln列,將input設置為required。

 

然后代碼部分為在9000屏幕的代碼下增加:雙擊創建

PROCESS BEFORE OUTPUT.
 MODULE LISTE_INITIALISIEREN.
 LOOP AT EXTRACT WITH CONTROL
  TCTRL_ZVJXZHU_01 CURSOR NEXTLINE.
   MODULE LISTE_SHOW_LISTE.
 ENDLOOP.
 MODULE mod_set_sort.
*
PROCESS AFTER INPUT.
 MODULE LISTE_EXIT_COMMAND AT EXIT-COMMAND.
 MODULE LISTE_BEFORE_LOOP.
 LOOP AT EXTRACT.
   MODULE LISTE_INIT_WORKAREA.
   CHAIN.
    FIELD ZVJXZHU_01-VBELN .
    FIELD ZVJXZHU_01-PONSR .
    FIELD ZVJXZHU_01-CONTEXT .
    FIELD ZVJXZHU_01-ID .
    MODULE SET_UPDATE_FLAG ON CHAIN-REQUEST.
   ENDCHAIN.
   FIELD VIM_MARKED MODULE LISTE_MARK_CHECKBOX.
   CHAIN.
    FIELD ZVJXZHU_01-VBELN .
    FIELD ZVJXZHU_01-PONSR .
    "add Customization requirements 
    MODULE customize_update.
    "add Customization requirements
    MODULE LISTE_UPDATE_LISTE.
   ENDCHAIN.
 ENDLOOP.
 MODULE LISTE_AFTER_LOOP.

在include 程序中增加代碼:(注意這個和下面通過事件寫的自動流水號不同,這個自動帶入描述時每次都會執行)

LZVJXZHU_FG_01I01


MODULE customize_update INPUT.
  CLEAR gv_auart.

  IF zvjxzhu_01-vbeln IS NOT INITIAL.
    SELECT SINGLE auart INTO gv_auart
     FROM vbak WHERE vbeln =  zvjxzhu_01-vbeln.
    IF sy-subrc EQ 0.
      SELECT SINGLE bezei INTO zvjxzhu_01-context
        FROM tvakt
        WHERE auart = gv_auart AND spras = sy-langu
        .
    ELSE."未找到訂單
      zvjxzhu_01-context = '訂單不存在'.
    ENDIF.
  ENDIF.

ENDMODULE.

 

我們看下SM30進去維護的效果就是:

 

2.    自動帶出描述(不更新數據庫,僅顯示)

(1)   利用數據庫自帶的外鍵,用維護視圖來帶出所需要的字段

我們這里就帶出一下訂單日期好了。

首先必須在ZTJXZHU_01中給vbeln設置外鍵:VBAK-VBELN

 

 進入維護視圖ZVJXZHU_01點關系:

 

  

然后在視圖字段上增加字段:

 

我們重新生成一下表維護生成器(重新生成之后,9000屏幕上的代碼會被刷新,所以需要重新加一下代碼,要是代碼比較多就最好體現備份一下)

 

效果如下當你輸入一個訂單時,會自動帶出其創建日期,同時因為設置了外鍵,當你輸入VBELN不存在於VBAK時,不允許輸入。

 

 

(2)   直接修改屏幕-給屏幕加一列,然后自己在PBO中寫代碼獲取所需的值。

我們就以訂單類型來舉個例子:

進入9000屏幕布局:分別把文本和輸入框拖到指定位置(因為我的SAP有語言包確實問題所以暫時命名為1234,到元素清單中可以修改)

 

 

在9000屏幕的PBO中增加代碼:

 

執行SM30效果如下圖所示:

 

3.    自動編號功能

這個是昨天ABAP群里小伙伴的一個需求,每次增加條目時給條目一個流水號碼,當前最大號碼+1 (有刪除先不管)

我們通過表維護生成器事件來實現這個功能

首先我們使用上面定義的ID來作為流水號碼,進入視圖的表維護生成器界面(點修改進入):

 

點擊事件:

 

彈出消息,無需理會

 

點擊新條目,然后

 

我們使用05維護事件,還有其他的維護事件可以使用,大家可以自己去嘗試

 

增加子例程FRM_AUTO_NUM,然后點擊編輯器(下圖紅框),創建form

 

只有才創建新條目才會調用

FORM frm_auto_num.

  DATA lt_zvjxzhu TYPE TABLE OF zvjxzhu_01.

  MOVE-CORRESPONDING total[] TO lt_zvjxzhu.

  IF lt_zvjxzhu[] IS NOT INITIAL.
    SORT lt_zvjxzhu BY id DESCENDING.“取ID最大值
    READ TABLE lt_zvjxzhu INTO DATA(ls_zvjxzhu) INDEX 1.
    IF sy-subrc EQ 0.
      zvjxzhu_01-id = ls_zvjxzhu-id + 1.” ID最大值+1
    ENDIF.
  ELSE.
    zvjxzhu_01-id = 1.
  ENDIF.
ENDFORM.

這個事件就寫好了,在創建新條目的時候,會自動給ID加上流水號碼。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM