業務對象(BO)設計


業務對象(BO)設計

創建數據結構(SE11

業務對象代表具體的業務數據,因此業務對象類型都有相對應的數據字典結構對應

image227

創建業務對象類型(SWO1

業務對象類型就相當於Class的概念

新建業務對象類型

image228

image229

image230

系統已自動引用SAP標准接口IFSAP,並從中繼承了一些默認的屬性和方法新建的對象類型名稱旁邊有一個image231標記,表示對象目前狀態為Modeled

業務對象及組件共有四種狀態

l  Modeled:已建模,業務對象和組件已經創建,但沒有程序實現其功能

l  Implemented:已實現,業務對象和組件的程序已經創建(生成),但還沒有完成

l  Released:已發布,程序代碼完成,該對象及組件可以使用

l  Obsolete:已廢棄,該對象不應繼續使用

將新創建的業務對象狀態修改為Implemented

將光標放在業務對象類型名所在行,選擇以下菜單:

image232

系統提示:

image233image231[1]標記不存在

查看業務對象的實現代碼

點擊“Program”按鈕,則可查看該業務對象類型的程序代碼實現部分ZBO_EMPLOYEE

image234

添加接口

創建業務對象類型時,除自動默認繼承的接口IFSAP

image235外,還可以為業務對象添加(或叫實現吧)其他的SAP接口,業務對象將從接口中自動繼承它里面的屬性或方法,其中的方法大多需要在業務對象中重新實現

將光標放在Interfaces位置,點擊新建按鈕image236,添加IFCREATE接口:

image237

注:添加接口時,這些接口都是已經存在的,否則是不能直接在這里輸入的。這些接口類型也是通過SWO1創建的,只是在初始界面選擇的是“Interface type(相當於接口)”,而不是“Object type(相當於類)”:

image238

同理添加IFEDIT接口,最后結構如下

image239

在添加 IFCREATE接口時,會自動在Methods中將接口中的 Create方法繼承過來;同理,IFEDIT接口中的EDIT方法也會繼承過來

 

通過查看繼承過來的方法屬性,發現只有Create方法是靜態的,與實例無關,這是因為在創建業務對象實例時,相當於工廠方法,是用來產生數據的,與具體業務數據無關:

image240

添加關鍵字段Key

關鍵字段代表着一個業務對象類型的實例,由它來區分各個業務對象在測試業務對象時,從業務對象類型測試界面切換到業務對象實例界面時,需要輸入此Key。另外,在通過Utilties->API Methods->Add Method”菜單添加BAPI方法時,分配的BAPI函中如果定義了關鍵字段作為輸入參數,當在添加該方法時就默認此方法為實例方法,所以不能選中Instance-independent選項

 

將鼠標放在“Key fields”所在位置上,點擊新建按鈕image236[1],系統將提示是否參照ABAP字典中的表結構創建關鍵字段,本例中的業務對象基於數據庫表ZTAB_EMPLOYEE,所以在系統的 Create with Data Dictionary Field Proposals對話框中選擇數據表ZTAB_EMPLOYEE

image241

image242

image243

如果以前一些步驟中未將業務對象的狀態設置為implemented,則該字段的旁邊也會有一個image231[2]標記,可以將光標置於該字段后,選擇以下菜單,將該組件的狀態修改為“implemented”:

image244

將光標置於該關鍵字段處,點擊“Program”按鈕,可以查看其代碼實現,它參照了數據庫表ZTAB_EMPLOYEEID字段:

image245

添加屬性

這里的屬性與上面的關鍵字段實質上等同於Java類里的屬性,因為業務對象類型就是類的概念

 

將光標置於Attributes所在行,點擊新建按鈕image236[2]功能,系統將提示是否參照ABAP字典中的表結構創建關鍵字段,可以按照與添加關鍵字段類似的步驟將全部其他數據庫表字段作為屬性添加到業務對象組件中

image246

並為每一個屬性輸入名稱之后,各字段將出現在Attributes列表中:

image247

image248

同時,選擇屬性字段后,點擊“Program”按鈕,可以查看與之相關的實現代碼,下面是從數據庫表取數據並填充到這些屬性字段的過程:

image249

設置默認屬性和方法

選擇image250可以在Default選項卡中設定對象的默認屬性和方法:

image251

默認屬性與方法有什么用???當訪問一個業務對象類型實例時(如在顯示列表中雙擊一個實例),則會調用此方法及傳遞設置的默認屬性????

通過報表程序來實現業務對象的方法

業務對象類型中的方法與Java類型的方法實質上是同一個概念,只是真正實現這些方法的方式有很多種,如下:

image252

 

例如,可以首先創建一個報表程序或者某個事務代碼,然后在方法中直接提交此報表程序或調用事務;還可以在函數模塊中完成所需要的功能,然后通過借助該功能模塊來實現該方法,將業務對象的屬性作為輸入參數傳遞給功能模塊,並接收功能返回的輸出參數。

image253

在沒有進行重定義之前,這些繼承而來的方法名稱顯示為深紅色:

image254

選中某個方法后,可以點擊“Program”按鈕來查看原有方法的實現,但絕大多數代碼不能直接在當前新的業務對象中使用,需要重新實現。

通過報表程序來實現業務對象的方法

現以報表程序的方式,來重新實現業務對象類型繼承過來原有方法(CreateEditDisplay等),業務對象的這些方法將通過提交到該報表的方式來實現這些方法的功能:

REPORT  zbo_employee_rep.

TABLES: ztab_employee.
PARAMETERS: id LIKE ztab_employee-id OBLIGATORY,
            name
LIKE ztab_employee-name,
            phone
LIKE ztab_employee-phone,
            email
LIKE ztab_employee-email,
            op
.

START-OF-SELECTION.
  ztab_employee
-id = id.
  ztab_employee
-name = name.
  ztab_employee
-phone = phone.
  ztab_employee
-email = email.

 
CASE op.
   
WHEN 'I'."插入數據
     
INSERT ztab_employee.
     
IF sy-subrc = 0.
       
MESSAGE s016(rp) WITH 'One record inserted.'.
     
ELSE.
       
MESSAGE e016(rp) WITH 'No record inserted,ID existed.'.
     
ENDIF.
   
WHEN 'U'."更新數據
     
UPDATE ztab_employee.
     
IF sy-subrc = 0.
       
MESSAGE s016(rp) WITH 'One record updated.'.
     
ELSE.
       
MESSAGE e016(rp) WITH 'No record update,ID not existed.'.
     
ENDIF.
   
WHEN 'V'."顯示數據
     
SELECT SINGLE * FROM ztab_employee WHERE id = ztab_employee-id.
     
IF sy-subrc = 0.
       
WRITE:/ 'Employee No:',ztab_employee-id,
              /
'Employee Name:',ztab_employee-name,
              /
'Employee Phone:',ztab_employee-phone,
              /
'Employee Email:',ztab_employee-email.
     
ENDIF.
 
ENDCASE.

重定義接口方法

將光標置於方法名上,點擊image255(即方法的重定義)按鈕,每個方法都經過該操作后,底色會變為白色:

image256

對這三個從接口繼承過來的方法進行重定義后,再次選擇“Program”功能,將無法看到接口中定義的實現代碼,系統將提示該方法尚未通過程序實現。如果在實現這些方法之前點擊image257按鈕來生成業務對象類型時,則將現在錯誤提示信息:

image258

然后可以通過以下菜單來查看具體錯誤:

image259image260

實現方法

此小節將以上小節三個重定義方法進行實現。

 

將光標置於Display方法名上,點擊“Program”按鈕,提示方法還未進行代碼實現:

image261

Yes后,進行程序代碼實現界面,在業務對象的實現程序中添加以下代碼:

image262

image263

ExistenceCheck方法用於檢查對象實現是否存在,如在對象測試界面中,需要選擇“Instance”按鈕來測試實例相關的一些方法時,如果未實現該方法,則如果輸入一個不存在的ID,系統將仍進入實例測試界面,但實例相關的測試功能不可用。正確實現ExistenceCheck方法后,如果指定關鍵字段的對象不存在,系統將給出消息提示:Object does not exist

 

其中object變量為前面自動生成的變量,相關代碼如下

image264

測試業務對象

注:在每次修改程序后,都需要保存並重新生成image265業務對象類型,才能進行測試。當業務對象類型重新生成成功后:

image266

會出現image267按鈕,點擊此按鈕,進入到測試初始界面,此時對象尚未實例化(即此時只顯示那些與業務對象實例無關的方法如Create方法——該方法不需要傳遞Key值):

image268

點擊Create方法后面的image269按鈕,則會提交到zbo_employee_rep報表程序,此報表程序會運行並顯示選擇屏幕,在選擇屏幕中輸入要插入的數據,繼續運行該報表,即可向數據庫表ZTAB_EMPLOYEE插入一條數據(即一個業務對象),錄入的數據的選擇屏幕如下:

image270

 

當創建完一條數據后,點擊“Instance”,輸入一個存在的ID,即可切換到業務對象實例界面,可以繼續對非靜態方法,如DisplayEdit方法進行繼續測試:

image271 image272

image273image274

image275

為業務對象(BO)添加BAPI方法(通過BAPI函數來實現業務對象方法

本小節將在前面章節的基礎上,為業務對象類型添加兩個BAPI方法:ZEMPLOYEE_obj.GetList(讀取職員列表)和ZEMPLOYEE_obj.GetDetail(讀取職員詳細信息)。

BAPI方法與上節中所添加的普通方法是不同的,那些借助於報表程序來實現的CreateEdit等方法,僅可在SAP系統內部使用,但BAPI不同的是可以供非SAP系統對業務對象進行訪問

 

BAPI方法支持從當前SAP系統的外部進行訪問,並可以就用於工作流、數據對象的ALE、批量傳輸等過程

創建BAPI參數的數據結構

BAPI方法ZEMPLOYEE_obj.GetList需要用到的結構類型BAPI自定義結構類型需要以ZBAPI開頭):

image276

這里只需返回員工IDName

 

BAPI方法ZEMPLOYEE_obj.GetDetail需要用到的結構類型:

image277

創建具有RFC功能的BAPI函數(RFM

BAPI函數是可通過遠程調用RFC的函數

現創建BAPI方法需要調用的兩個RFM遠程函數:ZBAPI_GET_EMPLOYEE_LISTZBAPI_GET_EMPLOYEE_DETAILZEMPLOYEE_obj.GetListZEMPLOYEE_obj.GetDetail兩個BAPI方法將借助於這兩個BAPI函數來實現。

創建函數組 ZEMP

image278_thumb

image279_thumb

創建功能模塊ZBAPI_GET_EMPLOYEE_LIST

BAPI函數名須以Zbapi開頭

image280_thumb

image281_thumb

image282_thumb

image283_thumb

注:BAPI函數中Export必須有return返回參數(約定俗成)

 

image284_thumb

 

由於函數組ZEMP是新創建的,所以在激活剛創建ZBAPI_GET_EMPLOYEE_LIST時,不能只單獨對它進行激活,而是應該點擊image285_thumb按鈕,切換到SE80后,對函數組整體激活,否則激活時出錯

The main program of the function "ZBAPI_GET_EMPLOYEE_LIST" does notbegin with "FUNCTION-POOL".

image286_thumb

image287_thumb

 

Goto->Global Data菜單,或者LZEMPTOP頂層包含文件LZEMPTOP,在此包含文件中定義全局的數據變量

image288_thumb

image289_thumb

 

並為ZBAPI_GET_EMPLOYEE_LIST函數添加以下源碼:

FUNCTION zbapi_get_employee_list.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  EXPORTING
*"     VALUE(RETURN) TYPE  BAPIRETURN
*"  TABLES
*"      ZEMP_LIST STRUCTURE  ZBAPIEMPLIST
*"----------------------------------------------------------------------
 
CLEAR zemp_list.
 
REFRESH zemp_list.
 
CLEAR return.
 
CLEAR ztab_employee.
 
SELECT * FROM ztab_employee INTO  CORRESPONDING FIELDS OF TABLE zemp_list.
 
IF sy-subrc <> 0.
   
CLEAR message.
    message
-msgty = 'E'.
    message
-msgid = 'RP'.
    message
-msgno = 16.
    message
-msgv1 = 'No Employee is available.'.
   
PERFORM set_return_message USING message CHANGING return.
  ENDIF.

ENDFUNCTION.

image290_thumb

 

並雙擊set_return_message方法,創建LZEMPF01包含文件,並在此Include文件中添加此Form方法:

image291_thumb

FORM set_return_message  USING    p_message LIKE message
                        
CHANGING p_return LIKE bapireturn.
 
CHECK NOT message IS INITIAL.
 
CALL FUNCTION 'BALW_BAPIRETURN_GET'
   
EXPORTING
      type
       = p_message-msgty
      cl        
= p_message-
msgid
      number
     = p_message-
msgno
      par1      
= p_message-
msgv1
      par2      
= p_message-
msgv2
      par3      
= p_message-
msgv3
      par4      
= p_message-
msgv4
   
IMPORTING

      bapireturn
= p_return
   
EXCEPTIONS

     
OTHERS     = 1.
ENDFORM.   

 

測試函數:

image292_thumb

創建功能模塊ZBAPI_GET_EMPLOYEE_DETAIL

image293_thumb

image294_thumb

注:如果此RFM函數將用實例化業務對象,則需要在Import設置與業務對象Key一樣的參數,如這里的ID(名稱與類型最好都一致)

 

image295_thumb

 

FUNCTION zbapi_get_employee_detail.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(ID) TYPE  ZTAB_EMPLOYEE-ID
*"  EXPORTING
*"     VALUE(ZEMP_DETAIL) TYPE  ZBAPIEMPDETAIL
*"  TABLES
*"      RETURN STRUCTURE  BAPIRETURN
*"----------------------------------------------------------------------
 
CLEAR zemp_detail.
 
CLEAR return.
 
CLEAR ztab_employee.
 
SELECT SINGLE * FROM ztab_employee INTO  CORRESPONDING FIELDS OF zemp_detail WHERE id = id.
 
IF sy-subrc <> 0.
   
CLEAR message.
   
message-msgty = 'E'.
   
message-msgid = 'RP'.
   
message-msgno = 16.
   
message-msgv1 = 'Employee does not exist.'.
   
PERFORM set_return_message USING message CHANGING return.
  ENDIF.

ENDFUNCTION.

測試:

image296_thumb

BAPI函數綁定到相應的業務對象方法上

創建BAPI的最后一步就是在業務對象中添加BAPI方法,將上面創建BAPI函數分配給這些BAPI方法,為它們提供實現。

 

選擇以下菜單添加BAPI方法,並給它分配BAPI函數:

image297_thumb

注:也可以通過普通方式添加BAPI方法,即將光標置於Methods上后點擊新建按鈕,此時需要手工設定BAPI支持屬性才行。

image298_thumb

image299_thumb

由於BAPI函數中定義了關鍵字段作為輸入參數,當在添加該方法時就默認此方法為實例方法,所以不能選中Instance-independent選項

點擊image300_thumb按鈕進行下一步操作,設置待加BAPI方法的參數,一般使用建議,與BAPI函數參數相對應:

image301_thumb

點擊image300[1]_thumb按鈕進行下一步操作完成

image302_thumb

選中此方法,點擊“Program”按鈕,可以看到其實現代碼。系統調用BAPI函數ZBAPI_GET_EMPLOYEE_DETAIL,並通過宏定義SWC_SET_ELEMENT 設定工作流系統相關的容器元素:

image303_thumb

創建完后,可以雙擊方法,彈出屬性框,在ABAP標簽里發現確實是借助於ABAP函數ZBAPI_GET_EMPLOYEE_DETAIL來實現GetDetail BAPI方法的:

image304_thumb

 

通過相同的方法,創建List BAPI方法,並將ZBAPI_GET_EMPLOYEE_LIST BAPI函數分配給它

image305_thumb

 

image306_thumb

image307_thumbimage308_thumb

測試BAPI方法

當所有BAPI方法添加完后,點擊image309_thumb按鈕,重新生成一下,通過之后,會出現image310_thumb按鈕。

 

對創建的的BAPI方法進行測試,其結果就與在SE37中測試的結果完全相同:

image311_thumb

image312_thumb

image313_thumb

image314_thumb

image315_thumbimage316_thumb


免責聲明!

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



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