Select語句的使用 關鍵字into后可以加 structure(結構體), internal table(內表) 和 field list(字段列表) Authority 權限 程序員可以根據權限對象創建權限實例 而basic 負責將權限分配給其他用戶 At selection-screen 在選擇屏幕中輸入值后,點擊屏幕左上角的運行按鈕 或 按回車鍵時,可以對輸入的數據進行有效性校驗. 重點: at selection-screen 最大的作用是檢查當前用戶是否具有對輸入數據進行操作的權限 程序中 第一個事件塊是 load-of-program 也可以附加使用initialization 但是不能只 程序中事件的啟動順序 1. Load-of-program 2. (Initialization) (optional event block 可選事件塊) 3. At selection-screen 4. Start-of-selection (default event block 缺省事件塊) 5. At line-selection 注意:當程序中沒有指定任何事件塊時, 系統默認為 start-of-selection事件 用戶雙擊basic list screen的一條數據時,系統從隱藏域中查找相應的數據. 並將數據回傳給全局變量中去. 當雙擊一條數據的時候 sy-lsind + 1 當沒找到at line-selection事件塊時,sy-lsind又自動減1 Selection screen選擇屏幕 選擇屏幕的屬性 1. Input help 輸入幫助Possible entries help 可輸入值幫助 2. Value entry 定制字段可選擇范圍 3. Type checks Multilingual capacity 多語言 4. Variants 變式 變式的創建 1. 將選擇屏幕中的輸入域填寫完畢 2. 將其保存為變式 1) 輸入變式名 2) 輸入變式描述 3) 為變式設定相關屬性 注意:一定要將屏幕中的值填寫完畢以后再保存變式 變式的特點 1. 可以簡化輸入 2. 可以用於后台自動運行程序, 而不需要用戶自己輸入值 重點: variant 變式 是 client-specifc client依賴的. Seletion screen 選擇屏幕 定義選擇屏幕上的字段有兩種方式 1. single value input單值輸入選擇屏幕, 使用parameters 關鍵字 定義 . 2. multiple value input 多值輸入選擇屏幕,使用 select-options 關鍵字 定義 parameters功能: 用戶可以通過選擇屏幕輸入查詢條件對數據庫進行訪問. 使用parameters 定義選擇屏幕的兩點限制 1. 變量名的字數長度不可以超過8個字符. 2. 給定義的時候賦值 需要 用關鍵字 default 而不能用 value 定義語法: parameters <變量名> type <類型>. 注:如果使用data element定義變量,則該變量也具有語義意義. Selction screen 的執行順序: 1. 程序啟動時,觸發load-of-program 事件. 2. 顯示層彈出屏幕 3. 用戶輸入值並確定屏幕后,觸發start-of-selection事件 4. 輸入的值被傳到內存中,進一步處理 執行順序實例: Parameters pa_carr type spfli-carrid. Load-of-program. Pa_carr = ‘LH’. Start-of-selection. Pa_carr=’DL’. Write pa_carr. 屏幕彈出時, 輸入域中為 LH , 確定屏幕后, 顯示值為 DL. Value Sets(SELECT-OPTIONS) 多值輸入屏幕 Parameters 與 select-options 的區別 1. parameters 定義的變量是不可分解的變量 2. select-options ,表面上定義的是一個字段, 實際上定義的是字段取值范圍的內表 select-options功能: 根據用戶輸入的 value range 取值范圍 到數據庫中查找符合范圍的數據 Select-options 定義的內表 重要: Select-options 內表具有表頭行 該內表有4個字段 1. Sign 符號標示 取值: I (included 被包含) , E (excluded 不被包含). 2. Option 操作 取值: BT(between 在范圍之間) , EQ(equal 等於) 3. Low 最小值 取值: 用戶輸入的最小值 4. High 最大值 取值: 用戶輸入的最大值 當屏幕彈出后, 點擊mulitple selction按鈕 可以加入其他選擇范圍 范圍包括 1. single value include 單值包含 2. range inculde 范圍包含 3. single value exclude 單值不包含 4. range exculde 范圍不包含 select-options 運行原理 1. 程序運行后, select-options創建的內表中沒有數據 2. 屏幕彈出后,用戶輸入數據 3. 此時,系統將字段范圍保存到該內表中 4. 用戶確定屏幕后,系統將內表中的信息翻譯成對應的native SQL 5. 數據庫將符合用戶輸入范圍的數據返回給用戶 注意:使用loop at 循環一個帶有head line 的內表, 不需要加[]. Selction screen events 選擇屏幕事件 事件啟動流程 1. 程序啟動后,觸發load-of-program或initialization 事件對變量進行初始化 2. 如果有parameters 或 select-options屏幕變量,則會彈出選擇屏幕 3. 用戶輸入值后,點擊 回車 或 運行(F8)(有區別,見下文) 完成屏幕輸入 4. 如果程序中有 at selection-screen 事件的話, 這時它就會被觸發,它的功能是 對用戶輸入的值進行校驗, 而最主要的功能是,判斷用戶是否具有對該數據進行操作的權限. 5. 當校驗成功后, start-of-selection 別觸發.並顯示Basic list screen 6. 雙擊其中一條數據, 則會觸發 at line-selection…….. 重點: 回車 和 運行(F8)的區別 1. 回車: 僅僅具有校驗功能, 無論校驗成功與否, 程序都不會往下執行 2. 運行(F8): 校驗成功后 程序才能往下運行, 如果校驗失敗,程序無法繼續運行 注意: at selection screen 的主要功能 是authority check 權限校驗 , 如果校驗失敗,則應該生成一個E (error)類型的message 以通知用戶校驗失敗. User Dialog screen 用戶會話屏幕(或稱為Dynpro Screen ,standard screen) Dynpro screen 功能: 用戶可以通過屏幕錄入或修改數據 Dynpro screen 參數 1. Attributes屏幕屬性: screen number short text next screen screen type 2. Layout 屏幕布局: 屏幕屬性的擺放順序 3. Element list 元素列表: 所有元素的集合 4. Flow control 控制流程: flow logic 流邏輯(dynpro screen PBO 和 PAI事件中所調用的module模塊). Dypro screen Attributes屬性 1. Screen number: 屏幕編號 3位 2. short text : 屏幕描述 3. Nex screen: 下一屏幕編號, 當該屏幕結束后所執行的屏幕, 編號為0時, 程序將會在調用屏幕的語句后繼續運行. 4. Screen type :屏幕類型 normal一般屏幕,subscreen子屏幕,modal dialog box 模態窗口 Dypro screen 運行流程 1. 使用call screen 100(屏幕編碼), 調用一個屏幕 2. 屏幕彈出之前, 啟動PBO事件 3. 用戶在屏幕輸入值並確定后,輸入的值會被傳入到內存變量當中 4. 當屏幕關閉時,PAI事件觸發 5. PAI結束以后, 程序將會根據該屏幕的next screen 跳到下一屏幕 6. 當next screen 為本屏幕的編號, 則需要使用自定義按鈕退出屏幕,否則會出現屏幕死循環現象. PBO module: PBO 事件對應的模塊 PAI module. PAI 事件對應的模塊 Next screen 的配置 1. 靜態配置: 通過dynpro screen 自身屬性配置next screen 2. 動態配置: 在程序的PAI事件中 使用關鍵字 SET screen 200(下一屏幕編號)定義下一屏幕, 當PAI運行到該語句時, 該屏幕的靜態配置 則會被 動態配置所覆蓋 使用T CODE 運行屏幕 功能: 使用T CODE可以使ABAP以外的配置人員 在work bench 以外運行屏幕. Dynrpo screen 在程序中可以使用的位置 1. 觸發Start-of-selection,生成basic list screen 2. 雙擊單條數據 3. 觸發 at line-selection 事件 4. 在這個事件中 call screen 100. 5. 彈出dynpro screen, 用戶輸入相關值 6. 點擊 save 保存到數據庫 ,點擊back 返回到basic list screen Screen painter 屏幕繪制器 功能:專門繪制 ABAP屏幕的程序,可以繪制dynpro screen 注意:必須在安裝GUI的時候選擇並安裝. 可以通過screen 屏幕上的 LAYOUT 鍵 ,可以進入 screen painter ,通過Graphical layout editor 布局編輯器 對布局進行編輯 Dynpro Screen 具體操作 1. 根據spfli-carrid字段建立paramters選擇屏幕 2. 根據 spfli 建立結構體變量wa_spfli 3. 在start-of-selection事件中 打印Basic list screen屏幕 4. 在 at line-selection 事件中 call screen 100 5. 建立屏幕100 , 填寫描述 和next screen 6. 通過 screen painter 編輯screen 100的布局 7. 通過 字典庫結構體sdyn_conn 在屏幕上批量加入字段 8. 創建兩個 push button,名字分別為 SAVE 和 BACK ,描述以及Fcode 都於按鈕名相同 9. 在屏幕的Element list 選項卡中, 在最后一行添加字段 OK_CODE 10. 保存屏幕 並激活 11. 在程序中聲明變量OK_CODE與屏幕字段相對應, 注: TYPE ok_code LIKE sy-ucomm. 12. 在屏幕 Flow logic 選項卡中打開PBO注釋中的 module ,並且將module創建在主程序內 13. 在主程序中創建結構體變量sdyn_conn, 使內存中的字段變量能夠與屏幕中的字段同名對應 注:TABLES sdyn_conn 14. 在PBO module中, 首先清空OK_CODE 通過hide area隱藏域回傳的字段到數據庫中查找相應的數據,並將數據傳遞到sdyn_conn結構體變量中. 15. 打開PAI module的注釋並將module創建到主程序中. 16. 對OK_CODE進行CASE判斷,如果為SAVE則提示message信息,如果為BACK,則通過關鍵字 SET SCREEN <屏幕編號> 跳轉到指定的屏幕中去 17. 保存整個程序 並激活. 重點:在PBO事件中第一步一定要清空OK_CODE (CLEAR ok_code) 1. 假如ok_code沒有清空. 2. 當用戶第一次進入屏幕並點擊保存按鈕時(例如:SAVE),這時ok_code 的值為 SAVE, 3. 當用戶第二次進入屏幕時, 由於ok_code沒有被清空,所以ok_code依然為SAVE, 4. 當屏幕數據還沒有輸入完整時, 用戶可能會通過點擊push button 以外的方式 結束屏幕. 5. 這時,程序觸發PAI事件, 而PAI事件會進入CASE 中的WHEN ‘SAVE’語句, 此時很可能對數據庫產生誤操作. 6. 所以,PBO中一定要清空ok_code 以避免以上情況 暫時消息:可以使用 message ‘hello’ type ‘I’. Global modularization 全局模塊化 Function module : 屬於repositiry 中對對象, 封裝了最為常用的代碼. Fuction group 1. 是多個function module的集合 2. 擁有組內所有module 可以共享的對象 Function group 工作原理: 1. 當一個Function group中某一個Function module,被程序第一次調用的時候 2. Function group 中所有的組成部分(包括共享對象 和modual) 都會被調入內存. 3. 當第二個程序再一次調用group中的module 時, 就可以直接從內存中調用module了 4. 當程序完成並不再使用module時, funtion group就會在內存中被清除 注意:Function group不能太大,粒度不適合過大. 每一次調用,都會將group所有部分調入到內存, 如果過大 ,則會降低系統運行效率. Function group 共享性 如果group 中的一個module 修改了group 中的屬性, 那么當組內的module再次訪問該屬性時,顯示的屬性就是已經修改后的屬性 Function group 需要通過接口來調用 Function module Fucntion module 類型 1. normal Fucntion module 一般類型 2. Remote-enabled module 可被遠程調用類型 3. Update module 更新類型 Function module interface 參數 1. Import 輸入參數 2. Export 輸出參數 3. Changing 更改參數 重要: 聲明module 時, 參數要以 module 內部為參照體, 進來的數據為 import , 出去的數據為 export. 而當程序調用module時, 則需要以程序內部為參照體, 出去的數據為 export, 進來的的數據為inport 注意:Import 和 export 參數都是可選的, 也可以設定為pass value值傳, 缺省以及推薦傳送方式 是 引用傳. 由於調用module 時, 需要調用group的整個數據, 數據量較大, 所以選擇引用傳能提高效率. Function module 的創建 1. 右鍵package--- create ----function group 創建function group 注意: function group 不能重名 2. 在function group下創建function module 3. 設定fuction module interface 參數 4. 在source code 中寫入執行的代碼 5. 建立程序調用function module 6. 點擊 Pattern 按鈕, 在 CALL FUNCTION 選項中 輸入module名,確定 7. 修改參數值 注意: 一定要將程序中的參數 與 module中的參數相對應 8. 當function 調用成功后, 系統變量sy-subrc = 0. Classes and Objects 類和對象 ABAP 可以創建一個引用類型的數據類型 DATA ref1 TYPE REF TO class. 注:Class是數據類型 DATA ref2 TYPE REF TO class. 定義兩個能指向 class 的指針 CREATE OBJECT ref1 CREATE OBJECT 相當於java 中的new 方法的調用 CALL METHOD ref1 -> meth1 (方法名) EXPORTING IMPORTING EXCEPTIONS 面向對象中封裝了很多組件 1. 一個BOR business object repositiry 包含多個 BO business object 2. 一個商業對象 business object 包含多個BAPI Business API BAPI: 屬於全局調用的方法,業務層的函數 Standardlized BAPIs ---標准化的 BAPIs 1. GetList 2. GetDetail 3. Create Change, Delete Cancel 4. Addlem RemoveItem. BAPI 就是 function module , 相當於business function module Calling programs調用程序 程序之間的調用. Insertion(謙讓式) 當程序A調用程序B時, 程序B占據棧頂,程序A壓在下面, 當程序B執行完畢后,程序A繼續執行 Restart(搶占式) 當程序A調用程序B時,程序A在棧頂被移出而被程序B所占據 程序調用語句: 在程序中使用 submit關鍵字 調用 下一個程序 1) Submit prog_name_2 (restart) 2) Submit prog_name_2 and return (insertion) 3) Submit prog_name_2 via selection-screen and return (insertion) via selection-screen作用: 如果程序2中有選擇屏幕,則程序2被調用時 會彈出屏幕 Restart Leave to transaction <T-code>: 功能相當於 輸入”/n<T-code>”,當程序執行該語句時,該程序就會在內存被清空,接着轉到相應的TCODE程序中去 insertion call transaction <T_CODE> [and skip first screen 忽略被調用程序的第一個屏幕] 執行下一個程序, 當前程序會被壓到棧的下一個位置而不會被清空 重點: and skip first screen 忽略被調用程序的第一個屏幕 ,但是 PBO 和 PAI 的Module還會被執行. Memory management內存管理 重要:當R/3 用戶登陸系統的時候, 整個系統環境被稱作 user terminal session. 其中包含: 1. Internal session. 程序執行窗口 2. External session. 用戶的窗口 Session流程 1. 用戶登陸系統時的系統環境為terminal session 2. 此時系統開辟了一個External session,用戶可以自主創建 , 重要:最大數為6 3. 當一個程序運行的時候,該程序所占的區域為internal session, 相當於程序的內存區域 Memory 1. ABAP memory 屬於一個External session 的內存區域 2. SAP memory 屬於一個 terminal session 的內存區域 在一個External session中 , 程序A將數據存放至ABAP memory中, 程序B可以從中取出存放的數據. 在同一個terminal session(同一個操作用戶)的前提下, 程序A數據存放到 SAP memory中, 程序B可以共享內存中的數據. 在同一個External session 中, (External session相當於一個堆棧) Insertion 程序A 調用 程序B , 程序B 調用 程序C 此時 internal session 從上到下的位置為 C – B -- A Restart 程序A 調用 程序B, 程序A會在棧頂被拿掉, 被程序B占據位置 注意: 例如,在restart情況下,堆棧中已經有程序A , B, C 三個程序, C在棧頂, 此時程序C調用了使用程序D所創建的TCODE,此時程序D將占據整個窗口, 與此同時,堆棧將全部被清空,ABAP memory也會被 clear.