Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Using a dynamic variable in the Import command of a Method call

Former Member
0 Likes
2,745

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

1 ACCEPTED SOLUTION
Read only

naimesh_patel
Active Contributor
0 Likes
1,819

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

6 REPLIES 6
Read only

Former Member
0 Likes
1,819

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.

Read only

valentin_catalin2
Active Participant
0 Likes
1,819

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

Read only

naimesh_patel
Active Contributor
0 Likes
1,820

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

Read only

0 Likes
1,819

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

Read only

0 Likes
1,819

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

Read only

0 Likes
1,819

Ahhh...perfect...that did it. Thanks!!!