SAP中,Table Control是在Screen中用的最廣泛的控件之一了,可以實現對多行數據的編輯。 簡單來說,Table Control是一組屏幕元素在Screen上的重復出現,這就是它與普通屏幕元素的區別。 如果我們對一個Table Control定義其內表為itab,工作區域為wa。那么在PBO中,系統將逐一取itab的某行到wa,然后將wa的內容轉換成屏幕元素,即Table Control的一行,如此反復。 換句話說,Table Control的每一行是跟wa交互的,與itab沒有直接的關聯。 反過來在PAI中,系統將根據Table Control的錄入情況,逐行取數據到wa(前提是該行的內容不為空),然后我們即可根據wa的內容往itab修改或添加一行記錄。
1. 如何設置TC的行數
如果我們定義了TC的名稱為tc_0100,則TC向導將生成如下一行代碼: CONTROLS: tc_0100 TYPE TABLEVIEW USING SCREEN 0100. 調試可知,tc_0100是個Deep Structure,擁有很多屬性,它實現了對表格控件的所有屬性的封裝。 這里我們先介紹屬性:lines。lines代表該表控件一共有多少行可供用戶查看或輸入。 如果是查看狀態,則一般可為其賦值LINES( itab )。如果是編輯狀態,為了允許用戶添加條目,則必須大於itab的行數。 而如果TC的該屬性小於內表行數呢?則只有內表中的前面幾行可以顯示,后面的內容將不會出現在SCREEN中,當然實際中我們不會這么操作。
2. 如何設置TC中某單元格編輯與否
對於普通的屏幕元素,我們都很清楚,用LOOP AT SCREEN可以實現。對於TC,當然也是一樣的。 TC向導會生成如下的Screen Flow Logic: LOOP AT itab INTO wa WITH CONTROL tc_0100 CURSOR tc_0100-current_line. MODULE tc_0100_change_field_attr. ENDLOOP. 這是什么意思呢?事實上,如果我們設置了tc_0100-lines = 50,那么該Module將被執行50次。 所以,只要在tc_0100_change_field_attr中添加LOOP AT SCREEN即可,如下:
MODULE tc_0100_change_field_attr OUTPUT. LOOP AT SCREEN. CASE screen-name. WHEN ‘ITAB-KEYFELD’. IF tc_0100-current_line > db_num. screen-input = ‘1′. ELSE. screen-input = ‘0′. ENDIF. WHEN OTHERS. ENDCASE. MODIFY SCREEN. ENDLOOP. ENDMODULE.
3. 如何更新我們內表的數據
上面已經說過,在PAI處理過程中,系統將根據逐行讀取TC的數據,填充到wa中,而我們的itab與屏幕元素其實沒有直接的關聯,所以簡單而言,可以如下編寫代碼: MODULE tc_0100_modify INPUT. IF tc_0100-current_line <= LINES( itab ). MODIFY itab FROM wa INDEX tc_0100-current_line. ELSE. APPEND wa TO itab. ENDIF. ENDMODULE.
前面說過,如果tc_0100-lines = 50,那么Module tc_0100_change_field_attr將被執行50次。 那么這里的Module tc_0100_modify 是不是也是50次呢?答案是<=50次,這是因為,如果TC中某行完全為空的話,系統是不可能調用tc_0100_modify的,換句話說,此時TC中的該行將視同不存在。
4,滾動到某行某列
如果我們希望,屏幕顯示后展示在用戶面前的最上端或者左端是表內容中的某行某列,則應該修改變量top_line和left_col的值。一般可在PBO的tc_0100_change_tc_attr里設置: tc_0100-top_line = 3. tc_0100-left_col = 3. 后面left_col語句起作用的前提是,內表的字段較多,導致表控件寬度不夠,確有左右滾動的必要。
5,獲取鼠標所在位置
這里要用GET CURSOR語句,比如 DATA: l_line TYPE i, l_field TYPE screen-name. GET CURSOR FIELD l_field LINE l_line.
這樣就取得了鼠標在內表的所在行以及字段名。不過要注意的是,如果希望映射到itab,那可別忘了top_line。正確讀取鼠標所在條目對應於內表哪行數據的語句是: GET CURSOR LINE l_line. l_line = l_line + tc_0100-top_line - 1. READ TABLE itab INTO wa INDEX l_line. 與此類似,希望鼠標定位於內表中某單元格的語句是SET CURSOR FIELD l_field LINE l_line.
6,設置固定列,設置行選擇
有時我們希望Table Control的左邊幾列(一般是關鍵字段),它們在屏幕上是固定的,可以方便用戶的閱讀。要怎么設置呢?首先我們肯定會想到字段的屬性中去找,可惜沒找到。 其實這是Table Control本身的一個屬性,我們只能定義最左邊的某些列不可滾動。在Screen Layout中,雙擊Table Control的右上角,彈出“表控制”屬性,即可設置: ABAP中的Table <wbr>Control編程
這里也可以看到我們對表控件的行選擇進行了設置,允許多重選擇,同時選中與否的信息將更新到wa的mark字段,mark一般定義成c(1)。
7,如何隱藏某列 隱藏屏幕字段,
我們首先想到的肯定是LOOP AT SCREEN,設置ACTIVE或INVISIBLE的字段值。可惜測試后,發現行不通。正確的做法是,通過編程修改tabctrl-cols下的某字段可見長度。
DATA: l_hide TYPE c,
ls_col LIKE LINE OF tc_0100-cols.
LOOP AT tc_0100-cols INTO ls_col WHERE screen-name = ‘WA-FIELD2′.
IF l_hide IS INITIAL.
ls_col-vislength = 6.
ELSE.
ls_col-vislength = 0.
ENDIF.
MODIFY tc_0100-cols FROM ls_col.
ENDLOOP.