ABAP 表格控制(Table Control)和 步循環(STEP-LOOP)


ABAP 表格控制(Table Control)和 步循環(STEP-LOOP)

 

ZZ "http://moonfly2004.javaeye.com/blog/200328"

 

 

表格控制(Table Control)和步循環
 
 
1.  兩個標准Demo: SAPMTZ60,  SAPMTZ61
2.  簡介
3.  建立Table Control程序的基本流程
4.  使用步循環
5.  表格控制(Table Control)和步循環注意事項
6.  在屏幕表格中循環和在內表與屏幕表格中同時循環的區別
7.  確定屏幕循環的記錄條目
8.  MODIFY
 
 
2.  簡介
 
表格控制  和步循環是用於屏幕表格顯示的對象。表格控制只是增強了的步循環,它可以使用桌面應用程序中表格工具的“Look” 和“Feel”來顯示數據 。表格控制還提供使表格易於查看和使用的專用格式化功能
步循環的  一個特點是它們的表行能夠在屏幕上跨越多行。 相反,表格控制中的行總是單行,但可以很長。(表格控制的行能夠滾動。)
通常表格控制所提供的許多特征由系統的 SAPGUI 前端操縱, 因此,不必在ABAP/4 事務中編制 任何特征( 除了豎直滾 動)。
LOOP  語句的任務
LOOP  語句負責讀取往返傳遞於屏幕和 ABAP/4 程序之間的屏幕表格值 。  因此必須同時在 PBO 和 PAI 事件中為屏幕中的每一個表格編制LOOP語句。至少在此應有一個空LOOP...ENDLOOP語句。  LOOP  語 句還用於驅動滾動。在PBO事件中,LOOP使用一個參數告訴從表格的何處開 始循環。該參數因此導致下一個屏幕表格顯示的更新(對於表格控制,該參數是表格控制結構中的TOP_LINE 字段;對於步循環,該參數為用於LOOP語句的CURSOR參數。)。ABAP/4 程序和系統都可以設置該參數。
注意,屏幕表格中所顯示的行數可以改變。當屏幕表格可調整並且用戶更改窗口的高度時就會出現這種情況。在這種情況下,PAI中的下一個LOOP就更改PAI中傳到ABAP/4程序的表格行數。
LOOP  語句有兩種重要的格式 :
LOOP
如果正在使用表格控制,就必須包括附加的 WITH CONTROL參數:
LOOP WITH CONTROL <table-control>.
       <actions>...
ENDLOOP  .
該語句在屏幕表格行中循環(  Table Control  有多少行就循環多少次)  ,同時在每個塊和程序的對應 ABAP/4 字段之間往復傳送數據 。可以在 ABAP/4 中將屏幕表格字段聲明為任何類型(數據庫表 格、結構或 單個字段) ,內表字段除外。
對於步循環,如果正在執行本身的滾動(例如,使用 F21-F24) ,則必須使用該語句。
LOOP AT <internal table>.
該語句可同時在內表和屏幕表格行中循環。常常將此屏幕表格字段聲明為內表字段,但不是非得如此。
對於該 LOOP,步循環顯示都帶有滾動條。該滾動由系統自動操縱。
7.         controls  聲明的時候對應的  screen  中可以對  controls  定義的對象進行操作
Eg.
 
在屏幕表格中直接循環
在 ABAP/4 模塊中,使用  SY-STEPL  以查找當前正在處理的屏幕表格行的索引。每循環一次,系統就設置一次該變量。SY-STEPL 的值總是介於 1與當前所顯示的行數之間。您可以在程序中聲明表格偏移量(常稱為 BASE,並通常用  SY-LOOPC  初始化)並用它同SY-STEPL 一起獲得與當前屏幕表格行相對應的內表行。(IND = BASE + SY-STEPL - 1.)
請記住,SY-STEPL只在LOOP...ENDLOOP處理的范圍之內才有意義。
在內表中循環
LOOP AT <internal table> [CURSOR <scroll-var>]
                            [WITH CONTROL <table-control>]
                            [FROM <line1>] [TO <line2>].
    ...<actions>...
    ENDLOOP.
表示同時在內表和屏幕表格中循環。
該形式的 LOOP語句在內表中循環,對每行都執行 <actions>。對於每個內表行,系統將相應程序 字段傳送到對應的屏幕表格行,或將相應的屏幕表格行傳送回對應的程序字段。
使用步循環時,在PAI事件中省略CURSOR 參數。FROM和TO參數只能用於步循環。WITH CONTROL參數只能用於表格控制。
設置  <scroll-var>    告訴系統從何處開始顯示  。對於表格控制,<scroll-var> 是TABLEVIEW 結構中的TOP_LINE字段(省略的話系統會自動設置)。對於步循環,請聲明局部程序變量以用作CURSOR參數。
 
 
建立Table Control程序的基本流程.
//  主程序
1.       聲明表格控制
Eg. CONTROLS: CTRL1 TYPE TABLEVIEW USING SCREEN 0901.
2.       定義要show出來的itab
DATA SP1 LIKE SPFL1 OCCURS 0 WITH HEADER LINE.
DATA SP1 LIKE TABLE OF SPFL1 WITH HEADER LINE.(  等價)
3.       增加itab數據
//  邏輯流
4.       循環讀取itab逐行寫入Table Control當前行.(BPO)
LOOP WITH CONTROL <table-control> [cursor tab1-CURRENT_LINE].
5.       當數據有改變時更新itab
LOOP  AT <ITAB>
 CHAIN.
FIELD SP1-CARRID.
        MODULE TAB1_MODIFY ON CHAIN-REQUEST.
     ENDCHAIN.
   ENDLOOP.
使用步循環.
步循環分為兩類:靜態的和動態的。靜態步循環有固定的大小,運行時無法更改。動態步循環大小可變 。如果用戶重置窗口的大小,系統就會自動地增加或減小所顯示的步循環塊的個數。可以定義任意數量的靜態步循環,但動態步循環只能有一個。
可 以在屏幕制作器中指定步循環的類型。屏幕中的每一個循環都有“循環類型”(fixed= 靜態, variable= 動態)和“ 循環次數” 屬性。如果循環是固定的,“循環次數”告訴 系統用於顯 示的循環塊的數量。該數值可以永久不變。編制動態和靜態步循環的方法完全一樣。兩種類型都可以使用 LOOP 和 LOOP AT 語句。
屏幕操作如圖
1.     放入field
2.     選擇要編組的field,將field定義組
 
表格控制(Table Control)和步循環注意事項
1.       在layout設計器中放置的I/O field可以是來自dbtab,也可以是來自itab,其實是個screen可以識別的<work area>
2.       screen  上放置的I/O field和其它控件如Table Control一定要和主程序中聲明的名稱一致,如果放置之前沒有定義的field,將會出現runtime error或者根本無法激活.
3.       無論是觸發滾動條還是向下按鈕,都會觸發PBO/PAI邏輯流.
 
4.  在屏幕表格中循環和在內表與屏幕表格中同時循環的區別
     只在屏幕表格中循環,會以屏幕表格為主,在顯示的時候需要使所要顯示的內表適應屏幕,如果屏幕表格的行數比內表的行數多的話仍然會顯示一些空行 如
//  邏輯流
LOOP WITH CONTROL CTRL1.
   MODULE DISPLAY_CTRL1_101 .
ENDLOOP.
//  程序
READ TABLE IMAKT INDEX CTRL1-CURRENT_LINE.
 IF SY-SUBRC = 0.
     MAKT-SPRAS = IMAKT-SPRAS.
    MAKT-MAKTX = IMAKT-MAKTX.
    CTRL1-FLAG = IMAKT-CKBOX.
 ENDIF.
     在內表與屏幕表格中同時循環可以使屏幕表格和內表同時循環.不必嚴格控制內表要讀取那一行(個人效率較前者要高,因為不用再次搜索和判斷),而且,不會顯示多於的空白行.
//  邏輯流
LOOP AT IMAKT WITH CONTROL CTRL1 CURSOR CTRL1-TOP_LINE.
   MODULE DISPLAY_CTRL1_101 .
ENDLOOP.
//  程序
    MAKT-SPRAS = IMAKT-SPRAS.
     MAKT-MAKTX = IMAKT-MAKTX.
CTRL1-FLAG = IMAKT-CKBOX.
5.  在屏幕表格中放入內表  (  工作區  ).  是屏幕表格和程序內表關聯  .
l            所要放入的itab一定要使有表頭的(其實屏幕要的是wa)
l         注意選擇的時候要寫入內表名稱,選擇后面的按鈕
l         操作的時候直接modify那個內表系統就能自動識別user的更新.只是循環的時候要注意指針的運動,盡量使屏幕和內表一起循環.
l         由於屏幕表格和程序內表關聯,所以在PAI中LOOP AT <ITAB>的時候仍然可以使用屏幕表格的各種參數eg. index ctrl1-current_line
//  邏輯流(PAI)
LOOP AT IMAKT.
    MODULE SET_LINE_COUNT_0901.
ENDLOOP.
//  程序
module SET_LINE_COUNT_0901 input
MODIFY IMAKT index ctrl1-current_line.
endmodule. 
 
再說表格控制器
1.       在layout中設置的表格控制器和.net中的gridview有點類似  ,  其中的各個列必須和要和與之關聯的內表的字段名稱一樣,  否則將無法訪問,或者是置無法取出.
2.       另外,那個    /SelColumn選項可以和itab中的一個C類型的字段關聯以判斷表格行的選中情況.
 
 
ABAP---  讀取DB中前n行
    SELECT * UP TO <N> ROWS  ………
 
 
在屏幕編輯器中設置必須輸入的欄位 
確定屏幕循環的記錄條目
使用  SY-STEPL  以查找當前正在處理的屏幕表格行的索引。每循環一次,系統就設置一次該變量。SY-STEPL 的值總是介於 1與當前所顯示的行數之間。您可以在程序中聲明表格偏移量(常稱為 BASE,並通常用  SY-LOOPC  初始化)並用它同SY-STEPL 一起獲得與當前屏幕表格行相對應的內表行。(IND = BASE + SY-STEPL - 1.)
MODIFY
MODIFY <itab> [FROM <wa>] [INDEX <idx>].
FROM  選項中指定的工作區域  <wa>  代替  <itab>  中的行。如果表格有表頭行,可以忽略  FROM  選項。這樣,表格工作區域就代替 行。
如果使用  INDEX  選項,則新  行代替索引為  <idx>  的現有行。如果替換成功,則將  SY-SUBRC  設置為  0    如果內表包含的行少於 <idx>  ,則不更改任何行並且  SY-SUBRC  包含  4 
如果使用沒    INDEX  選項的  MODIFY  語句,則系統只能在  LOOP - ENDLOOP  塊中通過更改當前行(  例如由  SY-TABIX  返回其索引的行)來處理它。


免責聲明!

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



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