2015-03-13 94 views
3

我是abap(OO)中的新成員,但之前在java中開發並編寫了類abap「cl_caretaker」,它應處理數據庫表和本地副本(實例表)它。在方法調用中將abap方法調用作爲參數

我想提出以下方法調用:

caretaker->show_table(caretaker->get_users()) . 

有:

caretaker = cl_caretaker=>get_instance(). "singleton instance 

METHODS: 

"! get a list of all user which registrated for FCP 
"! 
"! @parameter rt_users | users which are registrated for FCP 
    get_users 
     RETURNING value(rt_users) TYPE itty_users, 


"! shows the content of a table 
"! 
"! @parameter it_table    | the table we want to visualize 
    show_table 
     IMPORTING 
     value(it_table) TYPE ANY TABLE. 

,如果我一分爲二的電話和get_users的結果存儲在TMP變量它的工作原理。

DATA: 
    gt_tmp_users TYPE caretaker->itty_users. 

    gt_tmp_users = caretaker->get_users(). 
    caretaker->show_table(gt_tmp_users). 

所以我的問題是:

1)是調用,比如:caretaker->show_table(caretaker->get_users()). 可能,如果怎麼樣?

2)我也嘗試創建一個通用變量,它存儲所有種類的表。 因爲我不想爲每個表創建類型,所以我使用了一個tmp/help變量。 但是我得到的信息只有(德語:Formalparameter)方法定義的虛擬參數被允許爲泛型類型(例如,TYPE任何TABLE)。

這裏是一些東西,我已經嘗試過:

DATA: 
* tmpanytable TYPE TABLE OF any. 
* tmpAnyTable TYPE any. 
    tmpanytable TYPE REF TO data. 

" needed to store a temporal table 
FIELD-SYMBOLS: <tmpanytable> TYPE ANY TABLE. 

* ASSIGN caretaker->get_users() TO <tmpAnyTable>. 
* <tmpAnyTable> = caretaker->get_users(). 
* caretaker->get_users(). 
*caretaker->show_table(<tmpAnyTable>). 
*caretaker->show_table(caretaker->get_users()). 

*CALL METHOD: caretaker->show_table(IMPORTING it_table = caretaker->get_users). 
*CALL METHOD: caretaker->show_table(it_table = caretaker->get_users()). 

*COMPUTE caretaker->show_table(it_table = caretaker->get_users()). 

*ASSIGN caretaker->get_users() ->* to <tmpAnyTable>. 
*Caretaker->show_table(<tmpAnyTable>). 

*call METHOD caretaker->show_table 
*    Exporting It_table = caretaker->get_users(). 

* CREATE DATA tmpanytable TYPE STANDARD TABLE OF (dbtab) 
*       WITH NON-UNIQUE DEFAULT KEY. 
* ASSIGN tmpanytable->* TO <tmpanytable>. 

* CREATE DATA tmpanytable TYPE tabkind OF any Table . 
* ASSIGN tmpanytable->* TO <tmpanytable>. 

*GET REFERENCE OF caretaker->get_users() INTO tmpAnyTable. 
*caretaker->show_table(tmpAnyTable) . 
+0

您使用的是什麼SAP_ABA版本? – vwegert 2015-03-13 12:27:28

+0

Softwarecomponent:SAP_ABA \t 發佈:701 \t 等級:0004 \t 最高支持包:SAPKA70104 – cpoliwoda 2015-03-13 13:35:26

回答

1

Method chaining是可能的,methods in operand positions也是可能的,但你需要至少SAP_ABA 702。

您可以使用泛型類型來傳遞表,而不必在運行時知道它的類型。但是,您不能在不知道其類型的情況下創建表。將它與OO原則相比較,您可以處理對抽象超類的引用並將它們在組件之間傳遞,但不能實例化抽象超類。 CREATE DATA語句需要一個「具體數據類型」來處理,而不是「抽象超類型STANDARD TABLE」。這裏最困難的部分是決定誰將知道類型並創建數據對象。

順便說一句,你可能想看看內置的Object Services - 也許沒有必要再重新創建數據庫訪問層輪。

+0

感謝,您的答案和提示。 - 「方法鏈接」的示例尋找我喜歡的_Builder_ _Design_ _Pattern_,但不用於按照我的要求嵌套方法。 - 但我會仔細看看「對象服務」。 – cpoliwoda 2015-03-16 09:31:53

+0

德文維基百科中的方法或表達式鏈接信息[http://de.wikipedia.org/wiki/ABAP#Seit_Release_7.1_.2F_7.02](http://de.wikipedia.org/wiki/ABAP#Seit_Release_7.1_ .2F_7.02) – cpoliwoda 2015-03-31 12:43:46