<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
記得剛學ABAP的時候問這問那,問東問西,常常一個可能不怎麼用的東西,扣了好久好久.群裡的大佬就說,學那麼多沒必要,以後是會天天寫ALV , 講真 因為 SAP 很多東西都已經通過設定就可以實現, 我們還真就是做表單相關的東西比較多,不能說全部,也是大部分. 好巧今天看到群友問ALV 相關的內容,這裡整理一下,希望幫助更多的人 ヾ(◍°∇°◍)ノ゙.
第1步:宣告變數
定義ALV所要用到的型別池:TYPE-POOLS: SLIS
針對ALV的控制資訊資料(Layout & Fieldcat)
第2步:定義內表
存放自定義資料檔案的資料,以及在ALV中顯示
第3步:讀取資料
讀取資料存放至Internal Table
第4步:ALV格式控制
建立ALV顯示樣式(layout)和顯示欄位清單(Field Catalogs)
第5步:定義事件
建立事件清單(Event Catalogs)
第6步:顯示ALV
呼叫ALV Function Module
第7步:使用者事件
定義User按鍵處理事件
普通的ALV的流程如上圖,包含所有常規流程.本質上是展示資料的報表. 以及常用語法的熟練使用,資料轉換,邏輯計算等.
ALV組成3大部分
工具列
標題列
顯示資料的網格控制器 (必要時可以隱藏工具列和標題列)
注意事項:
1、在ALV中,需要注意所有需要顯示的列,都必須在相應的內表中有對應的欄位, 欄位名字不能寫錯。
2、在SAP ABAP程式中,字串的大小寫很重要,在單引號包圍的字串中, 一般來說都應該用大寫,特別是在呼叫一些系統的方法時傳入字串引數時。
3、傳入到ALV中的列對應的欄位名稱也必須使用大寫字母,否則資料不會顯示出來。
4、使用宏定義或者子例程可以減少程式碼量,並且儘可能實現程式碼的複用。
5、注意在FORM裡定義的變數在離開FORM後,就會被系統釋放掉,回收記憶體空間。
ALV開發中兩個重要的物件——FIELDCAT和LAYOUT:
在呼叫ALV的函數中,除了定義所輸出使用的內表之外,
還有兩個部分是必需確認的:列欄位屬性和佈局屬性。
列欄位屬性FIELDCAT :
設定輸出中具體欄位的名稱、型別、格式等屬性;
對於系統結構表,函數可參照此結構自動建立列屬性,可以沒有呼叫列欄位屬性
佈局屬性LAYOUT:
設定輸出ALV列表的整體佈局的屬性,如輸出欄位的顏色、表格中的線條等。
沒有呼叫佈局屬性時,系統按默 認佈局輸出,不做任何調整。
兩物件同屬於型別組SLIS,在ALV開發中必須宣告型別組SLIS
佈局控制[layout]
佈局是用來控制整個ALV的一個佈局,比如ALV的標題,是否可編輯,行顏色,列顏色.
參照ALV的控制結構[LVC_S_LAYO],以後的例子我將詳細介紹如何設定行顏色和列顏色.
詳細的結構說明(注意這些欄位的取值,單引號內,' '空格代表否,'X' 代表是)
欄位名 描述 Value range
CWIDTH_OPT 最佳化寬度 SPACE, 'X'
SMALLTITLE 小標題 SPACE, 'X'
GRID_TITLE 標題,在網格和工具條之間 最長70個字元
NO_HEADERS 列標題隱藏 SPACE, 'X'
NO_HGRIDLN 隱藏水平線 SPACE, 'X'
NO_MERGING 禁用單元格合併 SPACE, 'X'
NO_ROWMARK 禁用系統自帶的行選擇'X'為D和A的時候隱藏 SPACE, 'X'
NO_TOOLBAR 隱藏工具條 SPACE, 'X'
NO_VGRIDLN 隱藏垂直線 SPACE, 'X'
SEL_MODE 選擇模式 SPACE, 'A', 'B', 'C', 'D'
EXCP_CONDS 合計例外 SPACE, 'X'
EXCP_FNAME 欄位名稱帶有例外編碼 最長30個字元
EXCP_LED 例外作為 LED SPACE, 'X'
EXCP_ROLLN 例外檔案的資料元素 SPACE, 'X'
CTAB_FNAME 帶有複雜單元格顏色編碼的欄位名稱 最長30個字元
INFO_FNAME 帶有簡單行彩色程式碼的欄位名稱 最長30個字元
ZEBRA 可選行顏色,如果設定了,出現了間隔色帶 SPACE, 'X'
NO_TOTLINE 沒有總計 SPACE, 'X'
NUMC_TOTAL 可以對NUMC欄位進行合計 SPACE, 'X'
TOTALS_BEF 總計輸出在第一行,小計在新的值之前 SPACE, 'X'
STYLEFNAME 設定單元格,比如PUSHBUTTON 最長30個字元
Fieldcat
data: fieldcat type slis_t_fieldcat_alv with header line.
it_fieldcat = fieldcat[]
屬性
(用來定義表單中的各個列的相關資訊)
Fieldcat-col_pos = n. 輸出列
Fieldcat-tabname = ‘FIELDNAME’. 對應的內表欄位名
Fieldcat-seltext_s/m/l = ‘列名’. 輸出列文字( _s:短文字 _l:長文字)
Fieldcat-emphasize = ‘CX10’. 帶有顏色的高亮列(其中X=(1-7)顏色同format)
Fieldcat-hotspot = ‘X’. 作為熱點顯示可觸發滑鼠觸發事件
Fieldcat-currency = ‘CURRKEY’. 表 TCURX 中的貨幣名稱
Fieldcat-quantity(3) 計量單位
Fieldcat-qfieldname 參考計量單位的欄位名稱
Fieldcat-round = n. 四捨五入至小數位數下n 位
Fieldcat-exponent = n. 浮點數的冪指數為n
Fieldcat-key = ‘X’. 關鍵欄位
Fieldcat-icon = ‘X’. 作為圖示輸出
Fieldcat-symbol = ‘X’. 輸出作為符號
Fieldcat-checkbox = ‘X’. 作為核取方塊輸出
Fieldcat-just = SPACE, 'R', 'L', 'C'. 對齊方式
Fieldcat-lzero = ‘X’. 輸出前導零
Fieldcat-no_sign = ‘X’. 輸出抑制符號
Fieldcat-no_zero = ‘X’. 為輸出隱藏零
Fieldcat-edit_mask = SPACE, mask.. 輸出為mask的模式
Fieldcat-fix_column = ‘X’. 固定列
Fieldcat-do_sum = ‘X’. 總計列值總和
Fieldcat-no_out = ‘X’. 列不輸出
Fieldcat-tech = ‘X’. 該欄位為技術欄位
Fieldcat-outputlen = n 列的字元寬度為n
Fieldcat-decimals_out = n 能控制小數點的位數為n
Fieldcat-datatype = C,I,N… 定義資料型別
* 建立事件清單(Event Catalogs) *需定義事件塊,否則出錯 eventcat_ln-name = 'TOP_OF_PAGE'.eventcat_ln-form = 'PAGE_HEADER'. APPEND eventcat_ln TO eventcat. 事件塊: FORM PAGE_HEADER. ENDFORM.
程式碼
REPORT YALVDEMO1. *第一步 :宣告alv相關 變數 TYPE-POOLS:SILS. "引入slis 包 定義 使用專門alv data:LT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV, "儲存fieldcat 內表, 列表標籤相關 LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV, *WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV, "定義使用工作區 *ls_fieldcat like LINE OF LT_FIELDCAT, LS_LAYOUT TYPE SLIS_LAYOUT_ALV, "ALV格式控制的結構體 LT_EVENT TYPE slis_T_event , " 事件的內表 LS_EVENT TYPE slis_alv_event. "事件的工作區 DATA: pgm LIKE sy-repid. DATA LT_SORT TYPE SLIS_T_SORTINFO_ALV . DATA WA_SORT TYPE SLIS_SORTINFO_ALV. DATA LS_SETTING TYPE LVC_S_GLAY. DATA : LV_COLPOS TYPE INT2 .
著重解釋
主要是生命變數
引入slis 包,
建立內表,
定義變數
程式碼
*第二部:定義內表 *定義型別. TYPES:BEGIN OF ty_alvshow, CARRID TYPE SPFLI-CARRID, "航執行緒式碼 CITYFROM type SPFLI-CITYFROM , "起飛城市. CITYTO TYPE SPFLI-CITYTO , "目標城市 FLDATE type SFLIGHT-FLDATE ,"起飛時間 PLANETYPE TYPE SFLIGHT-PLANETYPE ,"飛機型別 SEATSMAX TYPE SFLIGHT-SEATSMAX ,"飛機容量 END OF ty_alvshow. *定義內表和工作區 data : LT_ALVSHOW TYPE TABLE OF ty_alvshow, "定義內表 WA_ALVSHOW TYPE ty_alvshow.
著重解釋
型別 可以直接寫入欄位型別中的 型別
或者乾脆 直接寫表名-欄位 也可以.
程式碼
*第三部:讀取資料 select a~CARRID CITYFROM CITYTO FLDATE PLANETYPE SEATSMAX FROM spfli as a inner join SFLIGHT as b on a~CARRID = b~CARRID into table LT_ALVSHOW "內表需要增加table UP TO 10 ROWS.
程式碼
*第四部: ALV 的格式控制. layout LS_LAYOUT-zebra = 'X'. "列輸出位置 LS_LAYOUT-detail_popup = 'X' ."是否彈出詳細明細視窗 LS_LAYOUT-detail_TITLEBAR = '詳細資訊'. LS_LAYOUT-f2code = '&ETA' . "設定觸發彈窗資訊功能 LS_LAYOUT-colwidth_optimize = 'X' . "設定自動優化列寬. "fieldcat 介面設定 lv_colpos = 1 . "欄位顯示為第幾行 ls_FIELDCAT-fieldname = 'CARRID'. "那個欄位 LS_FIELDCAT-col_pos = LV_COLPOS. LS_FIELDCAT-key = 'X'. LS_FIELDCAT-DATATYPE = 'CHAR' . LS_FIELDCAT-OUTPUTLEN = '10'. LS_FIELDCAT-SELTEXT_M = '飛機id'. APPEND LS_FIELDCAT to LT_FIELDCAT. clear LS_FIELDCAT . "fieldcat 介面設定 lv_colpos = LV_COLPOS + 1 . "欄位顯示為第幾行 ls_FIELDCAT-fieldname = 'CITYFROM'. "那個欄位 LS_FIELDCAT-col_pos = LV_COLPOS. LS_FIELDCAT-key = 'X'. LS_FIELDCAT-DATATYPE = 'CHAR' . LS_FIELDCAT-OUTPUTLEN = '30'. LS_FIELDCAT-SELTEXT_M = '出發城市'. APPEND LS_FIELDCAT to LT_FIELDCAT. clear LS_FIELDCAT . "fieldcat 介面設定 lv_colpos = LV_COLPOS + 1 . "欄位顯示為第幾行 ls_FIELDCAT-fieldname = 'CITYTO'. "那個欄位 LS_FIELDCAT-col_pos = LV_COLPOS. LS_FIELDCAT-key = 'X'. LS_FIELDCAT-DATATYPE = 'CHAR' . LS_FIELDCAT-OUTPUTLEN = '30'. LS_FIELDCAT-SELTEXT_M = '到達城市'. APPEND LS_FIELDCAT to LT_FIELDCAT. clear LS_FIELDCAT . "fieldcat 介面設定 lv_colpos = LV_COLPOS + 1 . "欄位顯示為第幾行 ls_FIELDCAT-fieldname = 'FLDATE'. "那個欄位 LS_FIELDCAT-col_pos = LV_COLPOS. LS_FIELDCAT-key = 'X'. LS_FIELDCAT-DATATYPE = 'DATS' . LS_FIELDCAT-OUTPUTLEN = '8'. LS_FIELDCAT-SELTEXT_M = '到達時間'. APPEND LS_FIELDCAT to LT_FIELDCAT. clear LS_FIELDCAT . "fieldcat 介面設定 lv_colpos = LV_COLPOS + 1 . "欄位顯示為第幾行 ls_FIELDCAT-fieldname = 'PLANETYPE'. "那個欄位 LS_FIELDCAT-col_pos = LV_COLPOS. LS_FIELDCAT-key = 'X'. LS_FIELDCAT-DATATYPE = 'char' . LS_FIELDCAT-EDIT = 'X'. LS_FIELDCAT-OUTPUTLEN = '20'. LS_FIELDCAT-SELTEXT_M = '飛機型別'. APPEND LS_FIELDCAT to LT_FIELDCAT. clear LS_FIELDCAT . "fieldcat 介面設定 *lv_colpos = LV_COLPOS + 1 . "欄位顯示為第幾行 *ls_FIELDCAT-fieldname = 'SEATSMAX'. "那個欄位 *LS_FIELDCAT-col_pos = LV_COLPOS. *LS_FIELDCAT-key = 'X'. *LS_FIELDCAT-DATATYPE = 'int4' . *LS_FIELDCAT-OUTPUTLEN = '20'. *LS_FIELDCAT-SELTEXT_M = '飛機容量'. *APPEND LS_FIELDCAT to LT_FIELDCAT. *clear LS_FIELDCAT . "fieldcat 介面設定 lv_colpos = LV_COLPOS + 1 . "欄位顯示為第幾行 ls_FIELDCAT-fieldname = 'SEATSMAX'. "那個欄位 LS_FIELDCAT-col_pos = LV_COLPOS. LS_FIELDCAT-ref_fieldname = 'SFLIGHT' . LS_FIELDCAT-do_sum = 'X' . LS_FIELDCAT-SELTEXT_M = '飛機容量'. APPEND LS_FIELDCAT to LT_FIELDCAT. Clear LS_FIELDCAT .
首先需要設定layout 相關內容
在設定每個欄位的fieldcat .
注意:顯示列數要設定逐級增加,並且要把內表資料覆蓋內表 ,並清空內表資料.
程式碼
LS_EVENt-name = 'USER_COMMAND' ."使用者響應事件 LS_EVENT-FORM = 'FORM_USER_COMMAND' . APPEND LS_EVENT TO LT_EVENT . CLEAR LS_EVENT . LS_EVENT-name = 'TOP_OF_PAGE' ."顯示標題 LS_EVENT-form = 'FORM_TOP_OF_PAGE' . APPEND LS_EVENT TO LT_EVENT . CLEAR LS_EVENT . LS_EVENt-name = 'PF_STATUS_SET' ."顯示狀態列 LS_EVENT-FORM = 'FORM_PF_STATUS_SET' . APPEND LS_EVENT TO LT_EVENT . CLEAR LS_EVENT .
程式碼
*------第六步 排序 WA_SORT-fieldname = 'SEATSMAX' . WA_SORT-DOWN = 'X'. APPEND WA_SORT TO LT_SORT . CLEAR wa_sort . "清空工作區
操作
遊標要留在資料的位置,然後點 模式-->呼叫功能輸入-->REUSE_ALV_GRID_DISPLAY
-->按回車.-->自動生成程式碼
程式碼
*第七部分顯示alv LS_SETTING-EDT_CLL_CB = 'X' . "編輯單元格之後, 返回給程式編輯後的值. pgm = sy-repid. "回撥物件 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' I_CALLBACK_PROGRAM = pgm I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET' I_CALLBACK_USER_COMMAND = 'USER_COMMAND' I_CALLBACK_TOP_OF_PAGE = 'TOP_OF_PAGE' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = I_GRID_SETTINGS = LS_SETTING "編輯單元格之後, 返回給程式編輯後的值. IS_LAYOUT = LS_LAYOUT IT_FIELDCAT = LT_FIELDCAT * IT_EXCLUDING = * IT_SPECIAL_GROUPS = IT_SORT = LT_SORT * IT_FILTER = * IS_SEL_HIDE = * I_DEFAULT = 'X' * I_SAVE = ' ' * IS_VARIANT = IT_EVENTS = LT_EVENT * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES T_OUTTAB = LT_ALVSHOW EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. * Implement suitable error handling here ENDIF.
解釋
1:生成的程式碼都是註釋的
2:選擇使用的解除註釋並賦值
程式碼
*按鈕 gui FORM FORM_PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB . SET PF-STATUS 'YALVDEMO1_GUI'. ENDFORM. *標題 FORM FORM_TOP_OF_PAGE. *定義資料 內表和工作區 DATA LT_COMMENTARY TYPE SLIS_T_LISTHEADER. DATA WA_COMMENTARY TYPE SLIS_LISTHEADER. WA_COMMENTARY-TYP = 'H' . WA_COMMENTARY-INFO = '飛機飛行清單' . APPEND WA_COMMENTARY TO LT_COMMENTARY . WA_COMMENTARY-TYP = 'S' . WA_COMMENTARY-INFO = '中號標題' . APPEND WA_COMMENTARY TO LT_COMMENTARY . CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING IT_LIST_COMMENTARY = LT_COMMENTARY. * I_LOGO = * I_END_OF_LIST_GRID = * I_ALV_FORM = ENDFORM. *使用者操作按鈕 FORM FORM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD . data : lt_SFLIGHT TYPE table of SFLIGHT , "內表 wa_SFLIGHT type SFLIGHT. "工作區 IF R_UCOMM = 'ZYDD1' . MESSAGE '你觸發了按鈕' TYPE 'I'. ELSEIF R_UCOMM = 'Z_SAVE1' . select * from SFLIGHT into table lt_SFLIGHT for ALL ENTRIES IN LT_ALVSHOW where CARRID = lt_alvshow-CARRID . ENDIF . loop at lt_SFLIGHT into wa_SFLIGHT . "從工作區取數 迴圈 READ TABLE LT_ALVSHOW into WA_ALVSHOW WITH KEY CARRID = wa_SFLIGHT-CARRID . if sy-SUBRC = 0 . *MESSAGE WA_ALVSHOW-PLANETYPE TYPE 'I'. wa_SFLIGHT-PLANETYPE = WA_ALVSHOW-PLANETYPE . MODIFY lt_SFLIGHT from wa_SFLIGHT. "內表更新 ENDIF . CLEAR wa_SFLIGHT . CLEAR WA_ALVSHOW. ENDLOOP. update SFLIGHT from table lt_SFLIGHT. if sy-subrc = 0 . commit work . "資料庫提交 MESSAGE '儲存成功' TYPE 'I'. else . ROLLBACK work . MESSAGE '儲存失敗' TYPE 'I'. ENDIF. ENDFORM .
這個demo 是最簡單的DEMO 使用的是 系統內建表(飛機表) , 其中包含了使用者操作,排序,求和等常規使用者操作和介面優化 .
常規語法的通俗使用. 此demo還可以進一步優化,把常規重複性操作寫入到函數或者宏中,後續會發更優化版本.
作為入門demo 可以讓你充分了解ALV ,及ALV 常規用到的屬性.
以上就是ABAP ALV最常規寫法及常用功能詳解的詳細內容,更多關於ABAP ALV 寫法功能的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45