Asignación dinamica de campos

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

    #1

    Asignación dinamica de campos

    Hola queria saber como acceder a un campo de una estructura, que fue declarada dinamicamente.


    por ejemplo, si yo declaro una estructura

    * Se crea una estructura generica
    lv_tabla = 'MARA'.
    CREATE DATA lv_generic_line TYPE (lv_tabla).
    ASSIGN lv_generic_line->* TO <wa>.
    A continuacion obtengo datos dinamicamente en una tabla dinamica declarada igual que la estructura

    * Se obtienen valores dinamicamente.
    SELECT (lt_fieldname)
    FROM (lv_tabla)
    INTO CORRESPONDING FIELDS OF TABLE <table>.
    Luego realizo un LOOP para trabajar los valores.


    * Se recorre los datos.
    LOOP AT <table> INTO <wa>.

    ¿<wa>-matnr?

    ENDLOOP.
    quiero acceder a el valor que contiene <wa>-matnr me dice que no puedo porque no existe el campo matnr, pero por debbug puedo ver que le asigno la estructura MARA y el campo matnr esta! pero no se como acceder directamente a esa info.

    Muchas gracias a todos !


    Por las dudas dejo el codigo en el que estoy trabajando

    *&---------------------------------------------------------------------*
    *& Form f_get_data
    *&---------------------------------------------------------------------*
    * Se obtienen información armando un select dinámico.
    *----------------------------------------------------------------------*
    * -->P_GT_RELACIONES Tabla de relaciones
    * <--P_GT_SALIDA Tabla de salida.
    *----------------------------------------------------------------------*
    FORM f_get_data USING p_gt_relaciones TYPE tyt_relaciones
    CHANGING p_gt_salida TYPE tyt_salida.

    * Variables locales
    DATA: le_relaciones TYPE tye_relaciones,

    * Estructuras para select dinámico
    lv_tabla TYPE dd02l-tabname,
    lt_campos TYPE STANDARD TABLE OF dfies,
    le_campos TYPE dfies,
    lt_fieldname TYPE STANDARD TABLE OF dntab-fieldname,
    le_fieldname TYPE dntab-fieldname,
    le_salida TYPE tye_salida,
    lv_generic_line TYPE REF TO data,
    lv_aux TYPE char40,
    lt_valores TYPE tyt_salida,
    lv_generic_table TYPE REF TO data.

    * Punteros
    FIELD-SYMBOLS: <wa> TYPE ANY,
    <table> TYPE ANY TABLE,
    <field> TYPE ANY.

    * Se recorren los valores de las tablas
    LOOP AT p_gt_relaciones INTO le_relaciones.

    lv_tabla = le_relaciones-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 <table>.

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


    * Recupero los campos clave de la tabla.
    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.
    LOOP AT lt_campos INTO le_campos.
    le_fieldname = le_campos-fieldname.
    APPEND le_fieldname TO lt_fieldname.
    ENDLOOP.

    * Se obtienen valores dinamicamente.
    SELECT (lt_fieldname)
    FROM (lv_tabla)
    INTO CORRESPONDING FIELDS OF TABLE <table>.

    * Se recorre los datos.
    LOOP AT <table> INTO <wa>.

    ***********PROBLEMA*************

    ENDLOOP.

    ENDLOOP.

    ENDFORM. " f_get_da
  • goyleo
    Senior Member
    • sep
    • 102

    #2
    Hola muchas gracias a los que leyeron, ya puede solucionar el problema paso el codigo asi le sirve a cualquiera que quiera obtener datos y trabajarlos de manera dinamica. Saludos y gracias (Especialmente a los que moleste por msn jajaj)

    Saludos

    *Recorro tabla declarada dinamicamente con estructura dinamica
    LOOP AT <fs_tabla_dinamica> ASSIGNING <fs_wa_dinamica>.

    * Armo el field symbol con estructura y campo dinamico
    CONCTENATE '<fs_wa_dinamica>' Lv_campo_variable INTO lv_campo.

    * Asigno el valor al puntero
    ASSIGN (lv_campo) TO <fs_field>.

    * Cambio el valor del campo.
    <fs_field> = 1.

    ENDLOOP.

    Saludos Gente!!!

    Comentario

    • ezeargen
      Junior Member
      • ago
      • 9

      #3
      Fiera

      Fiera, máquina, mostro, Darín!! Sos el David Hasselhoff de los abapers!

      Abrazo

      Comentario

      Trabajando...