2012 Feb 23 3:28 PM
Hi,
I am trying to make a Method call fully dynamic.
I have found out how to make the Method name dynamic, but I am having trouble figuring out how to make the Importing statement dynamic.
in my code below:
CALL METHOD o_main->(v_call)
IMPORTING
it_ekko = i_ekko.
I would like to know if it's possible to make both "it_ekko" AND "i_ekko" dynamic so I can use this same call for various tables.
Hope that makes sense...thanks for your help.
Andy
2012 Feb 23 4:27 PM
You can use the PARAMETER-TABLE. Check out this.
*
CLASS lcl_data DEFINITION.
PUBLIC SECTION.
METHODS: do_something IMPORTING iv_1 TYPE i
RETURNING value(rv_val) TYPE i.
ENDCLASS. "lcl_data DEFINITION
*
START-OF-SELECTION.
DATA: o_data TYPE REF TO lcl_data.
DATA: lv_1 TYPE i VALUE 10.
DATA: lv_out TYPE i.
CREATE OBJECT o_data.
DATA: v_method TYPE string.
DATA: ptab TYPE abap_parmbind_tab.
DATA: lwa_tab LIKE LINE OF ptab.
DATA: lo_data TYPE REF TO data.
DATA: lo_out TYPE REF TO data.
lwa_tab-name = 'IV_1'.
lwa_tab-kind = cl_abap_objectdescr=>exporting.
GET REFERENCE OF lv_1 INTO lo_data.
lwa_tab-value = lo_data.
INSERT lwa_tab INTO TABLE ptab.
* append lwa_tab in table ptab.
lwa_tab-name = 'RV_VAL'.
lwa_tab-kind = cl_abap_objectdescr=>returning.
GET REFERENCE OF lv_out INTO lo_out.
lwa_tab-value = lo_out.
INSERT lwa_tab INTO TABLE ptab.
TRY.
v_method = 'DO_SOMETHING'.
CALL METHOD o_data->(v_method)
PARAMETER-TABLE
ptab.
CATCH cx_root.
ENDTRY.
WRITE: lv_out.
*
CLASS lcl_data IMPLEMENTATION.
METHOD do_something.
rv_val = iv_1 * 12.
ENDMETHOD. "do_something
ENDCLASS. "lcl_data IMPLEMENTATION
Regards,
Naimesh Patel
Hi,
I am trying to make a Method call fully dynamic.
I have found out how to make the Method name dynamic, but I am having trouble figuring out how to make the Importing statement dynamic.
in my code below:
CALL METHOD o_main->(v_call)
IMPORTING
it_ekko = i_ekko.
I would like to know if it's possible to make both "it_ekko" AND "i_ekko" dynamic so I can use this same call for various tables.
Hope that makes sense...thanks for your help.
Andy
2012 Feb 23 3:34 PM
Hi,
An idea: Instead of a typed parameter you could use a data reference (type ref to data) and dereference it within the method...
Kr,
Manu.
2012 Feb 23 4:12 PM
Hi Andrew,
The method call is fully dynamic; not only the parameters can be specified dynamically but also the method name.
This is a help extract:
DATA: line TYPE c LENGTH 80,
text_tab LIKE STANDARD TABLE OF line,
filename TYPE string,
filetype TYPE c LENGTH 10,
fleng TYPE i.
DATA: meth TYPE string,
class TYPE string,
ptab TYPE abap_parmbind_tab,
ptab_line TYPE abap_parmbind,
etab TYPE abap_excpbind_tab,
etab_line TYPE abap_excpbind.
DATA: exc_ref TYPE REF TO cx_sy_dyn_call_error,
exc_text TYPE string.
class = 'CL_GUI_FRONTEND_SERVICES'.
meth = 'GUI_DOWNLOAD'.
filename = 'c:\temp\text.txt'.
filetype = 'ASC'.
ptab_line-name = 'FILENAME'.
ptab_line-kind = cl_abap_objectdescr=>exporting.
GET REFERENCE OF filename INTO ptab_line-value.
INSERT ptab_line INTO TABLE ptab.
ptab_line-name = 'FILETYPE'.
ptab_line-kind = cl_abap_objectdescr=>exporting.
GET REFERENCE OF filetype INTO ptab_line-value.
INSERT ptab_line INTO TABLE ptab.
ptab_line-name = 'DATA_TAB'.
ptab_line-kind = cl_abap_objectdescr=>changing.
GET REFERENCE OF text_tab INTO ptab_line-value.
INSERT ptab_line INTO TABLE ptab.
ptab_line-name = 'FILELENGTH'.
ptab_line-kind = cl_abap_objectdescr=>importing.
GET REFERENCE OF fleng INTO ptab_line-value.
INSERT ptab_line INTO TABLE ptab.
etab_line-name = 'OTHERS'.
etab_line-value = 4.
INSERT etab_line INTO TABLE etab.
TRY.
CALL METHOD (class)=>(meth)
PARAMETER-TABLE
ptab
EXCEPTION-TABLE
etab.
CASE sy-subrc.
WHEN 1.
...
...
ENDCASE.
CATCH cx_sy_dyn_call_error INTO exc_ref.
exc_text = exc_ref->get_text( ).
MESSAGE exc_text TYPE 'I'.
ENDTRY.BR,
Valentin
2012 Feb 23 4:27 PM
You can use the PARAMETER-TABLE. Check out this.
*
CLASS lcl_data DEFINITION.
PUBLIC SECTION.
METHODS: do_something IMPORTING iv_1 TYPE i
RETURNING value(rv_val) TYPE i.
ENDCLASS. "lcl_data DEFINITION
*
START-OF-SELECTION.
DATA: o_data TYPE REF TO lcl_data.
DATA: lv_1 TYPE i VALUE 10.
DATA: lv_out TYPE i.
CREATE OBJECT o_data.
DATA: v_method TYPE string.
DATA: ptab TYPE abap_parmbind_tab.
DATA: lwa_tab LIKE LINE OF ptab.
DATA: lo_data TYPE REF TO data.
DATA: lo_out TYPE REF TO data.
lwa_tab-name = 'IV_1'.
lwa_tab-kind = cl_abap_objectdescr=>exporting.
GET REFERENCE OF lv_1 INTO lo_data.
lwa_tab-value = lo_data.
INSERT lwa_tab INTO TABLE ptab.
* append lwa_tab in table ptab.
lwa_tab-name = 'RV_VAL'.
lwa_tab-kind = cl_abap_objectdescr=>returning.
GET REFERENCE OF lv_out INTO lo_out.
lwa_tab-value = lo_out.
INSERT lwa_tab INTO TABLE ptab.
TRY.
v_method = 'DO_SOMETHING'.
CALL METHOD o_data->(v_method)
PARAMETER-TABLE
ptab.
CATCH cx_root.
ENDTRY.
WRITE: lv_out.
*
CLASS lcl_data IMPLEMENTATION.
METHOD do_something.
rv_val = iv_1 * 12.
ENDMETHOD. "do_something
ENDCLASS. "lcl_data IMPLEMENTATION
Regards,
Naimesh Patel
2012 Feb 23 6:07 PM
Naimesh Patel,
I have tried your suggestion and I can understand most of it, but I still don't have it working correctly.
I am getting an dump with the error message:
When dynamically calling the method "GET_EKKO" of the class "ZCL_ME007I", the
parameter "IT_EKKO" was transferred with the incorrect parameter type.
Can you help me with this?
Thanks,
Andy
2012 Feb 23 7:27 PM
You need to use the Importing type as your parameter is importing.
* CALL METHOD o_main->(v_call)
* IMPORTING
* it_ekko = i_ekko.
lwa_tab-name = 'IT_EKKO'.
lwa_tab-kind = cl_abap_objectdescr=>importing "<<.
get REFERENCE OF i_ekko into lo_Data.
lwa_tab-value = lo_data.
INSERT lwa_tab into table ptab.
..
Regards,
Naimesh Patel
2012 Feb 24 11:31 AM
| User | Count |
|---|---|
| 3 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |