ABAP面试
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- report
- 內表
- 創建內表
- 獲取內表行數
- 不用modify直接更新內表
- 選擇屏幕
- 屏幕元素創建
- 1、select-options
- 2、parameters
- 3、輸入值的控制
- 4、選擇屏幕事件流
- 5、選擇屏幕動態展示
- 6、選擇屏幕兩個按鈕同一行顯示
- opensql
- for all entries in
- alv
- function alv
- fieldcat 字段設置
- 設置單元格顏色
- 設置某單元格可編輯
- layout 布局控制
- 如何做到單擊跳轉事務
- GUI狀態欄
- dialog
- 常用標準T-CODE
- 常用bapi
- bapi_po_create1
- bapi_po_change
- bapi_goodsmvt_creaate :
- BAPI_TRANSACTION_ROLLBACK
- BAPI_TRANSACTION_COMMIT
- BAPI_MATERIAL_SAVEDATA 創建物料主數據
- BAPI_SALESORDER_CREATEFROMDAT2
- 常用表
- BDC錄屏
- 增強
- 一代增強
- 查找一代增強的方法
- 二代增強
- 查找二代增強的方法
- 第二代增強主要包括四類:
- 按照用途分類:
- 三代增強 badi
- 查找badi的方法
- 四代增強
- RFC函數
- 防止重復調用
- 調用日志
- RFC通訊模式
- 同步通信
- 異步通信
- smartform ----0331:面試
- 模板與table的區別
- 模板分頁如何操作
- smartform打斷點
- webservice
- 內存
- 程序優化
- 優化程序性能的基本原則
- 優化程序性能的方法
- 雙LOOP循環優化
- 指針
- 總結
report
內表
創建內表
1、第一種方式
先定義types ,然后再type table of 定義內表
types : begin of <typ_name>, end of <typ_name>. dara : <itab> type table of <typ_name>.4、第四種方法
引用標準表創建內表
data : <i_tab> type table of mara .5、第五種方法,
引用標準表并且添加自定義字段創建內表
data : begin of <itab>, include structure mara. data : clr type char4, end of <itab>.獲取內表行數
通過describe獲得內表行數。
describe table <itab> line n.不用modify直接更新內表
LOOP AT ASSIGNING FIELD SYMBOL
loop at gt_alv assigning field-symbol(<fs_output>). fs_output-waers = ls_prcd_elements-waers. endloop.選擇屏幕
屏幕元素創建
1、select-options
對象名稱for參考對象,定義范圍選擇條件
select-options : s_bukrs for bukrs.? 生成一個含有4個字段的內表: sign option low high
ranges : s_bukrs for bukrs.sign : 標志位 值為I或者E 意義為option運算符是否取反,I表示包含,E表示排除
option: 運算符 如果high不為空,這可以使用bt(between and) 或者nb(not between)。
2、parameters
對象名稱 type/ like 對象名稱,定義單選條件。
屏幕輸入域顯示參數控制
obligatory : 必輸
no-display: 顯示控制
no-extension : 多行輸入控制
as CheckBox : 創建復選框
visible length vlen : 顯示控制長度
parameters 對象名 as listbox visible length vlen 創建下拉列表
3、輸入值的控制
default : 默認值
lower case 允許輸入小寫字母(sap 屏幕會默認把輸入后的字母轉換為大寫)
matchcode object search_help : 為屏幕對象加上指定的F4幫助對象. se11 定義搜索幫助對象
memory id : 定義select-option 內存參數,可以講屏幕對象輸入的值保存到指定的內在參數中,通過get parameter 方法直接從內存讀取該對象的值。
4、選擇屏幕事件流
load-of-program 程序執行時,自動觸發該事件
initialization 該事件在屏幕未顯示前執行,初始化程序
at selection-screen output 選擇屏幕PBO事件,顯示選擇屏幕之前觸發
at selection-screen 選擇屏幕PAI事件,在選擇屏幕上點擊執行后觸發。
start-of-selection 數據選擇行開始
end-of-selection數據選擇行結束
top-of-page 頁眉控制
end-of-page 頁腳控制
at line-selection 行選擇控制,用戶選擇或者雙擊某行是觸發
at user-command 用戶交互控制,用戶選擇某個GUI功能是觸發
5、選擇屏幕動態展示
拿沖銷和過賬舉例子
先設置過賬和沖銷兩個單選按鈕 RADIOBUTTON r1 / r2 按鈕需要分配user-command 屬性
然后給需要動態顯示的項設置不同的組 MODIF ID md1/md2
在選擇屏幕的pbo事件中 判斷screen-group1 = ‘md1’ screen-active = ‘0’. 就把md1下所有項都隱藏掉了
IF r_cancel = 'X'.LOOP AT SCREEN.IF screen-group1 = 'MD1'.screen-active = '0'.ENDIF.MODIFY SCREEN.ENDLOOP.ELSEIF r_run = 'X'.LOOP AT SCREEN.IF screen-group1 = 'MD2' .screen-active = '0'.ENDIF.MODIFY SCREEN.ENDLOOP.ENDIF.6、選擇屏幕兩個按鈕同一行顯示
comment xx(Y): 、 這條語句的作用是講該語句后面的第一個screen element 定位在這一行的XX位置,長度為y
selection-screen begin of line.selection-screen comment(10) for field but1.selection-screen comment(15) for field but1. selection-screen end of line。opensql
inner 和left,right 是且與或的關系
1、不要使用select * ,會占用大量abap 內存
2、 不要使用select distinct 使用 sort + delete adjacent duplicates
3、不要使用嵌套select 。。。 endselect。
4、確定只查詢一條數據時,應用select single
5、需要統計時,可以使用sql+聚合函數
6、盡可能的使用abap sort 排序 不使用order by
7、使用二分法查詢內表數據速度
read table itab with key binary search.for all entries in
1、in 條件所在內表不能為空(空值相當于沒有任何條件,會取出所有數據)
2、in條件內表數據大于5000時不建議使用,一定要使用盡量每次使用3000,循環方式
3、該語句會自動去重,相當于distinct ,使用時盡量帶出主鍵
alv
alv 是 abap list view 是abap報表顯示工具,它把內表中的內容以設定的格式顯示出來,并且可以添加自定義的功能,比如打印出來
alv 分為兩種 function alv 和oo alv
function alv
reuse_alv_grid_displary 網格展示 (常用)
reuse_alv_list_displary 列表展示
類型池slis
fieldcat 字段設置
gs_field type slis_t_fieldcat_alv
wa_field type slis_fieldcat_alv
常用的field設置
wa_field-fieldname :內表字段名稱
? seltext : 展示名稱 (seltext_l 長 seltext_m 中 seltext_s 短)
? du-sum : 總計列值
? edit : 可編輯
? just : 對齊 R L C
? emphasize 設置列顏色 使用4位字符代表顏色
? 首位C(color)
? 二位1-7數字代表顏色 3黃色,5綠色 6紅色
? 三位 1/0 代表反轉顏色啟用
? 四位 1/0 增強顏色啟用
設置單元格顏色
內標準含有字段
color TYPE LVC_S_scol.
設置某單元格可編輯
FIELD_STYLE TYPE LVC_T_STYL, " 為結果內表添加設置編輯狀態所需的字段
DATA STYLELIN TYPE LVC_S_STYL.
STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 循環內表設置為不可編輯狀態
DATA: BEGIN OF ITAB OCCURS 0,ZQRFH_ICON TYPE STRING,ZLDATE TYPE ZLDATE,ZLUSR TYPE ZLUSR,K TYPE STRING,FIELD_STYLE TYPE LVC_T_STYL, " 為內表添加設置編輯狀態所需的字段 END OF ITAB.S_FIELDCAT-FIELDNAME = 'ZBQFS'. " 設置列可編輯S_FIELDCAT-EDIT = 'X'.APPEND S_FIELDCAT TO T_FIELDCAT.DATA STYLELIN TYPE LVC_S_STYL.LOOP AT ITAB.IF ITAB-ZXMDM = 'D' OR ITAB-ZXMDM = 'F' OR ITAB-ZXMDM = 'H'.STYLELIN-FIELDNAME = 'ZBQFS'. " 需要編輯的列名STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 設置為不可編輯狀態APPEND STYLELIN TO ITAB-FIELD_STYLE.CLEAR STYLELIN.MODIFY ITAB.ENDIF.endloop.layout 布局控制
gs_layout type slis_layout_alv
常用layout設置
gs_layout-colwidth_optimize = ‘X’ 自動設置列寬
? coltab_fieldname = ‘CELLCOLOR’ 設置某個字段值顯示顏色
? info_fieldname = ‘CLR’ 設置行顯示顏色 ,CLR為結果內表里的字段
? zebra = ‘X’ 設置斑馬線條顯示顏色
? box_fieldname = ‘XH’ alv 選中行 ,XH為結果內表里的字段
call function ’REUSE_ALV_GRID_DISPLAY‘
exporting
i_callback_program = g_repid? is_layout = gs_layout
? it_fieldcat = gs_fieldcat
? it_sort = lt_sort : 排序
i_save = ’A‘ 生成布局? i_callback_pf_status_set = ‘FRM_ALV_PF_STATUS’ : gui狀態
? i_callback_user_command = ‘FRM_ALV_USER_COMMAND’ : 用戶pai事件
tables
? t_outtab = it_out[]
it_sort-fieldname = ‘’ 設置需要排序的字段名
it_sort-up = ‘X’ 設置升序
或者
it_sort-down = ‘X’ 設置降序
如何做到單擊跳轉事務
1、首先在fieldcat中設置hotspot = ’X‘
2、然后再user_command事件中加入
case r_ucomm
wuth ‘&IC1’
? set parameter id ‘GJR’ p_gjahr. 設置參數
? call transaction ‘MM03’ and skip firsy screen.調用mm03事務碼
GUI狀態欄
隱藏gui狀態欄按鈕: excluding
DATA : lt_exfcode TYPE TABLE OF sy-ucomm.IF p_aqkcsq <> 'X'.append 'SAVE' to lt_exfcode.ENDIF.SET PF-STATUS 'STANDARD' EXCLUDING lt_exfcode.dialog
對話框事件和邏輯流
調用時首先觸發PBO->子屏幕PBO,然后顯示屏幕,在屏幕上點擊按鈕后,觸發PAI事件->子屏幕PAI,觸發結束后又會執行PBO->子屏幕PBO
字段輸入事件
ON INPUT:指定某子工程只在給定字段具有非初始化值時才被調用。
ON REQUEST:當屏幕中文本輸入字段的值發生變化
會觸發該程序所定義的子程序。該事件適合于屏幕中所有字段值的變化時檢查更新。
CHAIN-INPUT | CHAIN-REQUEST :該語法可以同時控制屏幕中多個字段的輸入事件。
屏幕退出事件
module exit at exit-command。
leave to screen 0.
常用標準T-CODE
me21n : 創建采購訂單
me22n : 更改采購訂單
me23n : 查看采購訂單
me41 : 創建詢價
mir4 : 查看發票信息
mm03 : 查看物料主數據
cs03 : 查看bom
mb52 : 批量查詢庫存
mb51 : 查看物料移動記錄
mb03 : 查詢物料憑證
常用bapi
bapi_po_create1
: 創建采購訂單
bapi_po_change
: 更改采購訂單
bapi_goodsmvt_creaate :
物料移動,創建物料憑證
call function 'BAPI_GOODSMVT_CREATE'exportinggoodsmvt_header = '' 抬頭goodsmvt_code = '' 移動貨物代碼 importinggoodsmvt_headret = '' 返回包含憑證編號和憑證日期的結構 tablegoodsmvt_items = '' 明細數據return = '' 返回值GOODSMVT_CODE就控制了對應哪個事物碼的功能,下面給出該參數的值和對應的事務碼:
01 MB01 : 采購訂單收貨
02 MB31 : 訂單收貨
03 MB1A : 發貨過賬
04 MB1B : 轉移過賬
05 MB1C : 投料
06 MB11 :
07 MB04
數據存放在表T158G 中。
BAPI_TRANSACTION_ROLLBACK
BAPI_TRANSACTION_COMMIT
BAPI_MATERIAL_SAVEDATA 創建物料主數據
BAPI_SALESORDER_CREATEFROMDAT2
創建銷售訂單
LOGIC_SWITCH-PRICING = ‘G'A 復制價格組件和重新確定等級
B 執行新的定價
C 復制手工定價因素且重新確定其它因素
D 復制不變的定價因素
E 采用價格組件和固定值
F 復制價格元素,調整價值與固定
G 復制不變定價因素且重定稅款
H 重新確定運費條件
J 重新確定確認的采購凈價格/價值(KNTYP=D)
K 采納價格組件和重新確定稅收
M 復制價格要素,轉換值
N 傳輸定價組件未更改, 新成本
O 重新確定變式條件(KNTYP=0)
Q 重新確定計算條件(KNTYP=Q)
R 應用價格部分和獎金條件
U 重新確定貴重金屬條件(KNTYP=U)
S 裝運&借方 (IBU HiTec)
常用表
1、MARA: 常規物料數據
2、MARC: 物料的工廠數據
3、MAKT: 物料描述
9、LFA1: 供應商主數據(一般數據)
10、LFB1: 供應商主數據(公司代碼)
23、KNA1: 客戶主數據(一般數據)
24、KNB1: 客戶主數據(公司代碼)
14、EKKO: 采購訂單抬頭
15、EKPO: 采購訂單行項目
16、MKPF:物料憑證抬頭
17、MSEG : 物料憑證行項目
BDC錄屏
CALL TRANSACTION ‘ME41’ USING bdcdata
* OPTIONS FROM BDCOPT
? MESSAGES INTO bdcmsg
? UPDATE ‘S’
? MODE lv_mode. .MODE ‘N’ . "顯示模式:A ;N 后臺 ;E
增強
常用增強:出口 userexit badi ,隱式增強 ;前兩種可以用程序找,也可以找到程序對應的包,然后包里搜索;隱式增強就是觸發事件,需要debug在標準程序里找地方加代碼
一代增強
基于源代碼的增強
第一代增強基于源代碼,是SAP系統提供一個空代碼的子過程,在這個子過程中用戶可以添加自己的代碼。
這類增強需要修改SAP標準代碼,他們發布時都是空的,集中在一些文件名倒數第二個字符為Z的包含過程中,由于實在標準程序中,所以所有程序的全局數據都可以使用,而且系統升級時會被覆蓋掉。所以一般不用此類增強。
查找一代增強的方法
1、在主程序中查找倒數第二個字符為Z的包含程序
2、在程序中搜索userexit_開頭的子程序
二代增強
基于函數模塊的增強
用增強管理smod和增強編輯cmod 維護。在標準程序中,使用call customer-function 'XXX’調用函數模塊,
查找二代增強的方法
所以可以通過在程序中搜索customer-function來查找二代增強,第二代增強函數名構成是exit_ 程序名_‘XXX’ (XXX是call function中的編號)。
針對數據表的增強出口是“CL”打頭的結構,這些結構將以.include結構的形式包含到相應的數據表中,用戶可以通過向這些結構中添加字段從而達到對數據表字段的增加。
第二代增強主要包括四類:
函數增強:E.Ehancement Exits(函數增強) : 這些出口以exit_程序名 _‘編號’ ,可以在se37中查看,也可以在數據字典TFDIR中查詢Exit_開頭的函數。
GUI增強:C.GUI codes : 用于區域菜單和工具欄菜單的增強
屏幕增強 : S.Subscreens : 用于子屏幕設計增強
表結構增強 : include structure : 用于表結構的增強
按照用途分類:
功能模塊出口(Function Module exits) : 在SAP標準事務中添加業務邏輯,一般用于驗證標準事務中的字段
屏幕出口(Screen Exits) : 定義自己的子屏幕或激活屏蔽標準事務中的菜單項
關鍵字出口(keyword exits) : 在
三代增強 badi
se18 創建及維護badi對象
se19 維護badi實例,badi功能的實現
1、先創建增強點
2、在增強點元素定義標簽創建badi
3、然后在菜單中的“接口" 創建接口 ,并且維護方法和參數。
4、然后就可以創建BADI實施
調用方法
method baid~方法名. endmethod.創建的badi可以在程序中直接調用
badi1 type ref to zbadi_test_F01. 參照接口對象 badi2 type ref of zbadi_test001_class. 參照實施類.查找badi的方法
通過SE24,輸入CL_EXITHANDLER,然后在方法GET_INSTANCE中設置斷點,然后運行事務代碼判斷 exit_name的值
四代增強
RFC函數
1、任何一個abap程序都可以調用一個遠程調用函數,使用語句:CALL FUNCTION …DESTINATION. sm59 創建abap鏈接
無論是in update task 還是in background task的函數。
都是遇到了commit work語句之后才調用的,
如果沒有commit work,
函數不會被觸發。
防止重復調用
未有答案
調用日志
未有答案
RFC通訊模式
DESTINATION
同步通信
異步通信
smartform ----0331:面試
模板與table的區別
1、table可以動態添加行,數據輸出時會根據列寬自動換行,可以固定列寬,但是默認情況下控制不了行高,如果想要模板一樣固定行高,需要將table的無換頁屬性打鉤
2、模板是靜態的,固定列寬,行高,當輸出數據過長時會自動截斷,通常用于靜態表單開發,模板與loop嵌套使用,可以實現固定行高,列寬的表單表單開發。
模板分頁如何操作
首先創建一個loop循環
然后創建一個可選邏輯流,用于判斷變量值是否需要分頁,判斷條件結果為true
smartform打斷點
可以在程序行里面輸入 斷點語句 break-point
webservice
公司結構 FI SD MM PP basia
內存
EXPORT p1 FROM ekko-submi TO MEMORY ID ‘ZXRMM04’.放入內存
IMport p1 from ekko-submi from memory id ‘’ 從內存中讀取
程序優化
優化程序性能的基本原則
1、減少對數據庫的訪問
訪問數據庫會消耗非常多的時間,頻繁的訪問數據庫,對程序性能的影響是顯而易見的。
2、減少循環次數
循環會增加CPU的負載。雖然每次循環執行的時間比較短,但是隨著循環的次數增加,累計的處理時間就很長
3、減少網絡往返傳輸的數據量
網絡傳輸也很明顯的影響程序的執行時間。數據量越大,網絡延遲的時間就會很明顯
優化程序性能的方法
1、確定影響程序性能的主要原因
要解決問題,就要先確定問題出在哪里
2、通過內表處理減少對數據庫的訪問
? 2.1、使用select。。。into table 一次性的把要處理的數據讀入到內表中進行處理
? 2.2、如果表字段很多的情況下,盡量不要使用select * 返回所以字段值,只返回指定的字段值,
? 盡量避免CORRESPONDING。因為CORRESPONDING存在系統內部存在隱式操作,影響性能。
- 檢查元素名稱匹配;
- 檢查元素類型匹配;
- 元素類型轉換。
? 2.3、盡量在where語句中使用索引字段限定數據的范圍,索引字段按順序排列。
- where 語句中盡量使用 = 、IN
- 控制使用>、<、>=、<=、between and
- 避免使用<> 、 like、not like
? 2.4、如果要取一批數據的最大值,最小值,平均數、總數,可以使用select+聚合函數來取值,而不是將數據取到內表中再進行處理。
? 2.5、如果確定返回只有一條記錄,使用select single 或者select 。。up to 1 rows讀取記錄
? 2.6、使用for all entries 減少批量條件下對數據庫的訪問次數,條件內表需要根據結合條件排序并刪除重復數據,并判斷不能為空。
? 2.7、需要排序是,不要使用order by進行排序,應當用sort操作內表排序
? 2.8、更新\插入\刪除數據表數據時,盡量使用內表一次更新。
雙LOOP循環優化
指針
此方法 標準程序可以獲得任何字段
ASSIGN (‘(SAPMV45A)VBAK-AUART’) TO <LS_AUART>. "獲取訂單類型
總結
記錄 提升 有問題還請大姑們指出
總結
- 上一篇: 手把手教你轻松下载百度网盘超大文件
- 下一篇: 美团点评2020校招运维方向笔试题(附答