Funciones dinamicas

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • goyleo
    Senior Member
    • sep
    • 102

    #1

    Funciones dinamicas

    Hola! estaba intentando hacer una funcion dinamica pero no me sale!

    La idea es que el nombre de la funcion puede cambiar al igual que los parametros que envia y recibe. Pero no me esta saliendo, alguien lo hizo alguna vez?

    Paso un codigo de ejemplo que me tira error.

    DATA c_funcion(19) TYPE c VALUE 'Z_MM_900_CONV_AKONT'.


    DATA g_akont TYPE akont. "(Se debe declarar dinamicamente)
    DATA g_country(100) TYPE c.
    DATA g_akont_to(100) TYPE c.
    DATA g_akont_from(100) TYPE c.

    MOVE 'country' TO g_country.
    MOVE 'akont_from' TO g_akont_from.
    MOVE 'akont_to' TO g_akont_to.

    CALL FUNCTION c_funcion
    EXPORTING
    g_country = 'AR'
    g_akont_from = 'AKONT'
    IMPORTING
    g_akont_to = g_akont.

    IF sy-subrc = 0.

    ENDIF.
  • Tu amo
    Member
    • oct
    • 40

    #2
    Esta correcta tu forma de llamar dinamicamente a la funcion, pero no los parametros

    Si tienes una version anterior a 6.10, solo puedes usar los parametros estaticamente
    Si tienes alguna version mas nueva, revisa la ayuda de SAP para ver como usar el call function con parameter-table

    Comentario

    • goyleo
      Senior Member
      • sep
      • 102

      #3
      Solucion

      Hola muchachos pude resolver el problema... coloco la solucion asi le sirve a alguien en el futuro

      Si bien el codigo es sobre algo puntual que estoy trabajando si lo explico un poco se entiende.

      Se declara una estructura dinamica y se obtienen los campos claves de la tabla mediante una funcion.

      Luego se vuelcan los valores de un campo llamado VAKEY a la misma.

      Se reccorren dinamicamente los campos y se arma la funcion con el nombre del campo. Se determina si esa funcion existe en la tabla TFDIR, de ser asi se obtienen los parametros de la misma en la tabla FUPARAREF, se agregan a una tabla interna y se llama a la funcion dinamicamente y con los parametros obtenidos de la misma

      SE HIZO MEDIO EXTENSO pero seguramente quien lo necesite lo va a leer

      aca va el codigo

      DATA: lv_tabla TYPE dd02l-tabname,
      lt_campos TYPE STANDARD TABLE OF dfies,
      le_fieldname TYPE dntab-fieldname,
      le_campos TYPE dfies,
      lv_campo TYPE dntab-fieldname,
      lv_generic_table TYPE REF TO data,
      lv_generic_line TYPE REF TO data,
      lv_function TYPE rs38l_fnam,
      lv_vakey TYPE vakey,
      lt_fupararef TYPE STANDARD TABLE OF fupararef,
      le_fupararef TYPE fupararef,
      lt_fieldname TYPE STANDARD TABLE OF dntab-fieldname.

      TYPE-POOLS abap.

      DATA: line TYPE c LENGTH 80,
      text_tab LIKE STANDARD TABLE OF line.

      DATA: func TYPE string,
      ptab TYPE abap_func_parmbind_tab,
      ptab_line TYPE abap_func_parmbind,
      etab TYPE abap_func_excpbind_tab,
      etab_line TYPE abap_func_excpbind.

      * Punteros
      FIELD-SYMBOLS: <fs_wa> TYPE ANY,
      <fs_table> TYPE ANY TABLE,
      <fs_field> TYPE ANY.

      * Se arma el nombre de la tabla
      CONCATENATE p_le_bkond1-kvewe
      p_le_bkond1-kotabnr
      INTO lv_tabla.


      * Se crea una tabla del tipo que viene en el archivo .
      CREATE DATA lv_generic_table TYPE STANDARD TABLE OF (lv_tabla).
      ASSIGN lv_generic_table->* TO <fs_table>.

      * Se crea una estructura
      CREATE DATA lv_generic_line TYPE (lv_tabla).
      ASSIGN lv_generic_line->* TO <fs_wa>.


      * Recupero los campos clave de la tabla.
      REFRESH lt_campos.
      CALL FUNCTION 'GET_KEY_FIELDS_OF_TABLE'
      EXPORTING
      tabname = lv_tabla
      TABLES
      key_fieldtab = lt_campos
      EXCEPTIONS
      not_supported = 1
      OTHERS = 2.
      IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.


      * Se recorren los campos.
      REFRESH lt_fieldname.
      LOOP AT lt_campos INTO le_campos.
      le_fieldname = le_campos-fieldname.
      APPEND le_fieldname TO lt_fieldname.
      ENDLOOP.

      * Se arma el valor de VAKEY
      CONCATENATE sy-mandt
      p_le_bkond1-kappl
      p_le_bkond1-kschl
      p_le_bkond2-vakey
      INTO lv_vakey
      RESPECTING BLANKS.
      <fs_wa> = lv_vakey.

      * Se limpia el campo VAKEY
      CLEAR lv_vakey.


      * Se recorren los datos de dicha tabla
      LOOP AT lt_fieldname INTO le_fieldname.

      * Se arma el campo.
      CONCATENATE '<fs_wa>-' le_fieldname INTO lv_campo.

      * Se asigna el valor del campo que se trabaja.
      ASSIGN (lv_campo) TO <fs_field>.

      * Se arma el nombre de la funcion
      CLEAR lv_function.
      CONCATENATE c_z c_porciento c_900_conv le_fieldname
      INTO lv_function.

      * Se obtienen el nombre de la tabla
      SELECT SINGLE funcname
      FROM tfdir
      INTO lv_function
      WHERE funcname LIKE lv_function.

      * Se verifica si encontro el registro
      IF sy-subrc = 0.

      SELECT *
      FROM fupararef
      INTO TABLE lt_fupararef
      WHERE funcname = lv_function.

      * Se verifica si encontro el registro
      IF sy-subrc = 0.

      LOOP AT lt_fupararef INTO le_fupararef.


      IF le_fupararef-parameter <> 'COUNTRY'
      AND le_fupararef-parameter <> 'MATKL'.
      CLEAR ptab_line.
      CASE le_fupararef-paramtype.

      WHEN 'I'.

      CLEAR ptab_line.
      ptab_line-name = le_fupararef-parameter.
      ptab_line-kind = abap_func_exporting.
      GET REFERENCE OF <fs_field> INTO ptab_line-value.
      INSERT ptab_line INTO TABLE ptab.

      WHEN 'E'.

      CLEAR ptab_line.
      ptab_line-name = le_fupararef-parameter.
      ptab_line-kind = abap_func_importing.
      GET REFERENCE OF <fs_field> INTO ptab_line-value.
      INSERT ptab_line INTO TABLE ptab.

      ENDCASE.

      ELSEIF le_fupararef-parameter = 'COUNTRY'.

      CLEAR ptab_line.
      ptab_line-name = le_fupararef-parameter.
      ptab_line-kind = abap_func_exporting.
      GET REFERENCE OF pa_land1 INTO ptab_line-value.
      INSERT ptab_line INTO TABLE ptab.

      ELSE.
      * CLEAR ptab_line.
      * ptab_line-name = le_fupararef-parameter.
      * ptab_line-kind = abap_func_exporting.
      * GET REFERENCE OF lv_matkl INTO ptab_line-value.
      * INSERT ptab_line INTO TABLE ptab.
      ENDIF.

      ENDLOOP.

      CALL FUNCTION lv_function
      PARAMETER-TABLE
      ptab.

      ENDIF.

      ENDIF.

      * Se determina si se trata del campo KAPPL no se agrega en el VAKEY
      IF le_fieldname = 'KAPPL'.
      p_le_bkond1-kappl = <fs_field>.
      CONTINUE.
      ENDIF.

      * Se determina si se trata del campo KSCHL no se agrega en el VAKEY
      IF le_fieldname = 'KSCHL'.
      p_le_bkond1-kschl = <fs_field>.
      CONTINUE.
      ENDIF.

      * Se arma nuvamente el campo VAKEY
      CONCATENATE lv_vakey <fs_field> INTO lv_vakey.

      ENDLOOP.

      * Se modifica el valor VAKEY
      p_le_bkond2-vakey = lv_vakey.

      Comentario

      Trabajando...