2010年10月25日 星期一

SAP-Dialog (Dynamically editable cells in a table control)

*********************************************************************
* Goal         : 限制Table開放修改的筆數
* T-Code       : SE80
* Description  : 精靈製作出來的Table,加上一些程式碼,限制只能一筆一筆新增。
* Source       :
saptechnical.com
* P.S          : 該範例是看著範本的練習,英文原版如上網址。
*********************************************************************

利用精靈製作出來的Table,如果有出現List的情況,即使沒有資料,每行都會出現[未知],看起來是不是醜醜的!

image

我們要將上圖那種醜醜的情況改成如下圖,限制開放修改的筆數,這就是今天的練習。

image

預告:大抵上需要增加的語法只有三段,還算簡單吧!^__^  (希望大家不要看到這裡就落跑了..)

先在程式一開始宣告要用到的Internal Table以及Work Area,我習慣放在include的TOP裡。

image

這是第一段程式,宣告的部分。

TYPES : BEGIN OF TY_EMP_DETAILS,
          PERNR  TYPE PA0001-PERNR ,
          GENDER TYPE GESCH,
          INPUT  TYPE CHAR10,
          SEL TYPE CHAR1,         "利用SEL控制Row能不能輸入
        END OF TY_EMP_DETAILS.
DATA : IT_EMP_DETAILS TYPE TABLE OF TY_EMP_DETAILS,
       WA_EMP_DETAILS TYPE TY_EMP_DETAILS.

接著開啟[畫面]的[格式],利用Screen Painter開始製作畫面。點選左方功能wizard拉Table。

image

接下來我們需要完成左邊列出的幾項步驟,[ 繼 續 ]下一步。

image

替[ table control ] 命名。

image

這裡我取的名字是TC_0100,然後繼續。image

將我們先前宣告的Internal Table以及Work Area填入,繼續。image

選擇要顯示在table的欄位,繼續。image

如上圖做勾選,在Selection col. fld填入[sel],Table的line是否能被選取就靠他決定了。image

image

image

雙擊Gender的欄位如圖,將他改成下拉式的Listbox,並且將功能代碼命名為[GEN]。

image

存檔且Active,畫面的製作到此告一段落。

image

打開元素清單,找到OK,將他的名稱取為OK_CODE。

image

點開畫面的[流程邏輯]頁籤,觀看精靈產生的程式碼。

module “TC_0100_CHANGE_TC_ATTR”負責append 一筆single row 給Table。image

點進來這個module後。

image

新增下面這一段程式碼。

IF IT_EMP_DETAILS IS INITIAL.
  APPEND WA_EMP_DETAILS TO IT_EMP_DETAILS.
ENDIF.

畫面->[流程邏輯]在module “tc_0100_get_lines”,我們要在這裡控制該line能不能被input。

We need to write loop at screen logic for modifying a specific cell the table control.

image

點進來後。

image

在結束Module前加入下列程式碼,判斷gender來控制screen的input。

LOOP AT SCREEN.
  IF screen-name = 'WA_EMP_DETAILS-INPUT'.
    IF   wa_emp_details-gender  NE '1'.
      screen-input = '1'.
    ELSE.
      screen-input = '0'.
    ENDIF.
    MODIFY SCREEN.
  ENDIF.

以上重點程式很少吧!因為wizard都幫我們做掉了。

image

將功能鍵的code改成[BACK]。

image

在user_command加入下列程式。

CASE ok_code.
  WHEN 'BACK'.
    SET SCREEN 0.

  WHEN OTHERS.
ENDCASE.

 

大功告成!^(+++++)^

沒有留言:

張貼留言