table control 是乙個結構,
假設我們定義的tc名稱為 ztest_tc (具體結構參照:scxtab_control)
那麼我們定義ztest_tc-curent_line ,ztest_tc-lines 等等都有意義,我們可以將其理解為乙個deep structure.
general tc attributes: | column attributes
1.fixed_cols lines top_line current_line.... | cols | index selected vislength invisible..
|2. screen
| 3. name group1 ... group4 required input output intensified..invisible length active display_3d value_help request...
1是乙個整體的table control結構
2是 ztest_tc-cols的結構內容 也就是我們經常用的loop at screen. ... endloop.
3.是screen結構的屬性。
那麼這些有什麼用呢?
一、現在需求如下(我在實際專案中接觸到的例項):
通過選擇螢幕,將資料庫表a的內容顯示出來,a有乙個審批字段,如果這個審批欄位是對勾(char4 (icon_d) 型別字段 儲存內容: @01@ 就自然被系統裝換成對勾顯示了 ),那麼這些資料在table control中試灰色的,新新增的沒有被審批的資料,就可以修改。
拿導航生成**為例:pbo
我自定義tc輸出內錶名稱為 t_ztest 工作區 wa_ztest
process before output.
*&spwizard: pbo flow logic for tablecontrol 'ztest_tc'
module
ztest_tc_change_tc_attr.
*&spwizard: module ztesttc_change_col_attr.
loop
att_ztest
into
wa_ztest
with
control
ztest_tc
cursor
ztest_tc-current_line .
module
ztest_tc_get_lines.
*&spwizard: module ztesttc_change_field_attr
endloop.
module
status_8000.
最開始接觸abap的時候,看到有這樣的乙個loop語句我發蒙了。除了在pbo裡面,在其他地方使用不了的。
在這裡,我們將 我們在螢幕的上顯示的資料 每一行loop 進工作區中wa_test.
with
control
ztest_tc 說明了這個loop的過程是要和tc繫結loop的 cursor ztest_tc-current_line 。通過我上面羅列的結構為基礎,我們進去 module
ztest_tc_get_lines中,新增一段**:
loop at screen.
if screen-name cs 'wa_ztest' and wa_ztest-status eq '@01@'.
if sy-subrc eq 0.
screen-input eq 0.
modify screen.
endif.
endif
cursor 是游標在控制項中的位置,這時候游標所處的位置為,loop的當前行的資料。
整個邏輯如下: 首先 我們loop 內錶一條資料,然後和tc繫結.隨後loop at screen. 這個時候,tc只會操作current_line這行的屬性。如果這行的標識位為 mailto:‘@01@’那麼就會不能輸入(整行變灰色),如果沒有標示位,則正常。由於cursor的作用,tc的每行屬性是逐行操作的。
二、如何得到tc中更新的資料.(tc-> table control)
在pai的 模板**中加了些**。
loop
att_ztest.
chain.
field
wa_ztest-vkorg.
field
wa_ztest-vkbur.
field
wa_ztest-kunnr module
kunnr_text on
input.
field
wa_ztest-matnr module
matnr_text on
input.
field
wa_ztest-zyear.
.......
module
zhgxs_xsjh_tc_modify on
chain-request.
endchain.
field
wa_zhgxs_xsjh-sel
module
zhgxs_xsjh_tc_mark on
request.
endloop.
field .... moudle ...on
input 就是那個欄位不為空,會觸發這個on input ...module
當有了input操作後,會觸發 module....on
request(響應module).
還有:module
zhgxs_xsjh_tc_modify on
chain-request.
這個moudle的作用,在觸發pai後,要是被chain。。endchain的資料只要有改變,tc會觸發這個module,然後更新最新當前行的最新值。
源**如下 modify
t_ztest
from
wa_ztest index
ztest_tc-current_line.
所以我們利用這個地方,巧妙的定義乙個用來儲存更新資料的內錶,然後
modify
更新內錶統計
from
wa_ztest index
ztest_tc-current_line.
這樣所有改變後值得資料都會在這個內錶出現,
decribe 內錶就知道更新多少行了。
對於tc的內錶,永遠是操作後的資料,非常準確。
因為他的每乙個pai都要出發loop 並且modify改變值 原來的內錶.
那麼就要有乙個疑問了,刪除行時候,會怎樣呢?
假設我使用的是導航本身生成的 - (刪除行)操作,那麼在pai的時候,雖然在我們看來這行資料沒有了,然是,pai的loop檢查會觸發 乙個mark 標識位的操作,然後將內錶的sel打上x。當程式流走到pai的insr控制項觸發的事件時候,將sel = 'x'的資料從內錶刪除。
所以pai 的 chain只會對存在的 操作前的資料進行loop,不會減少內錶資料。主要的精華都在於
module .... on request的控制了。
三。對一些table control的經典動態**進行分析。
field-symbols type
cxtab_control.
field-symbols type
standard
table.
field-symbols type
i.*&spwizard: end of local data------------------------------------------*
assign
(p_tc_name) to
.*&spwizard: get the table, which belongs to the tc *
concatenate
p_table_name ''
into
l_table_name. "table body
assign
(l_table_name) to
. "not headerline
*&spwizard: get looplines of tablecontrol *
concatenate
'g_'
p_tc_name '_lines'
into
l_lines_name.
assign
(l_lines_name) to
.*&spwizard: get current line *
getcursor
line
l_selline.
ifl_selline = -lines
+ 1.
*&spwizard: set top line *
ifl_selline > .
-top_line = l_selline - + 1
.else.
-top_line = 1.
endif.
else. " insert line into table
l_selline = -top_line + l_selline - 1.
l_lastline =
ABAP 中的巨集
report zcp saptest2 data result type i,int1 type i value 1,int2 type i value 2.define operation.result 1 2 3.output 1 2 3 result.end of definition.def...
ABAP 報表的事件
一,首先介紹一下 abap 的程式的型別 program type 程式型別 introductory statement 型別描述 1 report 報表 m program 螢幕程式 f function pool 函式組 k class pool 類組 j class pool 介面組 t t...
ABAP報表的事件
一,首先介紹一下abap的程式的型別 program type 程式型別 introductory statement 型別描述 1 report 報表 m program 螢幕程式 f function pool 函式組 k class pool 類組 j class pool 介面組 t typ...