Problema con asignación dinámica de campos

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • bolivar716
    Junior Member
    • jul
    • 13

    #1

    Problema con asignación dinámica de campos

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


    por ejemplo, si yo declaro una estructura

    Cita:
    * 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

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


    Cita:
    * 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

    Cita:
    *&---------------------------------------------------------------------*
    *& 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
    __________________
  • vanesamacri
    Senior Member
    • jun
    • 146

    #2
    Hola.

    El problema está en que la estructura está siendo definida en tiempo de ejecución. Para acceder al campo <wa>-matnr vas a tener que hacer una asignación dinámica. Algo así como:

    FIELD-SYMBOLS: <fs_campo> TYPE any.

    ASSIGN ('<WA>-MATNR') TO <fs_campo>. (esta asignación tenés que hacerla posterior a haber creado los datos dinámicos)

    Luego, dentro de: "LOOP AT <table> INTO <wa>." usar el puntero <fs_campo> para referenciar al campo <wa>-matnr.

    Por las dudas y para evitar un dump por error de asignación, te sugiero hacer la siguiente validación:

    IF <fs_campo> IS ASSIGNED.

    ...


    ENDIF.

    Saludos.

    Comentario

    Trabajando...