#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 __________________ |
#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. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|