ABAP 的TABLE CONTROL實踐積累

2022-02-15 09:34:58 字數 4552 閱讀 2689

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...