#1
|
|||
|
|||
Declarar tabla interna dinamicamente
Saludos, me gustaría saber si hay alguna manera de declararme una tabla interna cuya estructura solo sepa en tiempo de ejecución.
He probado esto: DATA: BEGIN OF li_tabla OCCURS 0. INCLUDE STRUCTURE <tbl>. DATA: END OF li_tabla. donde <tbl> tiene el nombre de una tabla, pero me da fallo de compilación. |
#2
|
|||
|
|||
Una manera de hacer es utilizando el metodo CREATE_DYNAMIC_TABLE de la clase CL_ALV_TABLE_CREATE, creo recordar que solo hay que rellenar el fieldcat con los campos que deseas y el te crea la tabla
|
#3
|
|||
|
|||
Gracias ballan por contestar, pero la verdad es que de objetos en SAP no tengo idea. Si me pudieraís especificar más o si supiese de alguna otra forma ...
Un saludo. |
#4
|
|||
|
|||
Aqui te dejo un ejemplo, haz un poco de pruebas para adaptarlo a tus necesidades y si tienes alguna duda preguntalo aqui
un saludo REPORT zprueba003. DATA: t_fieldcat TYPE lvc_t_fcat, t_fieldcat_wa TYPE LINE OF lvc_t_fcat. DATA: tabla TYPE REF TO data. START-OF-SELECTION. t_fieldcat_wa-col_pos = '1'. t_fieldcat_wa-fieldname = 'DOCUM'. t_fieldcat_wa-ref_table = 'VBAK'. t_fieldcat_wa-ref_field = 'VBELN'. APPEND t_fieldcat_wa TO t_fieldcat. CLEAR t_fieldcat_wa. t_fieldcat_wa-col_pos = '2'. t_fieldcat_wa-fieldname = 'POSIC'. t_fieldcat_wa-ref_table = 'VBAP'. t_fieldcat_wa-ref_field = 'POSNR'. APPEND t_fieldcat_wa TO t_fieldcat. CLEAR t_fieldcat_wa. t_fieldcat_wa-col_pos = '3'. t_fieldcat_wa-fieldname = 'STATU'. t_fieldcat_wa-ref_table = 'VBUK'. t_fieldcat_wa-ref_field = 'WBSTK'. APPEND t_fieldcat_wa TO t_fieldcat. CLEAR t_fieldcat_wa. CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING * I_STYLE_TABLE = it_fieldcatalog = t_fieldcat * I_LENGTH_IN_BYTE = IMPORTING ep_table = tabla * E_STYLE_FNAME = * EXCEPTIONS * GENERATE_SUBPOOL_DIR_FULL = 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. |
#5
|
||||
|
||||
Aqui va otro sin objetos, espero que te sirva
DATA: pv_tabla TYPE dd02l-tabname, generic_table TYPE REF TO data, generic_line TYPE REF TO data. FIELD-SYMBOLS: <table> TYPE ANY TABLE, <wa> TYPE ANY, <field> TYPE ANY. *& en pv_tabla almacenamos el nombre de la tabla del diccionario pv_tabla = 'spfli'. *& Referenciamos la estructura de la tabla CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla). ASSIGN generic_table->* TO <table>. *& Referenciamos la cabecera de la tabla CREATE DATA generic_line TYPE (pv_tabla). ASSIGN generic_line->* TO <wa>. *& Rellenamos la tabla interna creada dinamicamente SELECT * INTO CORRESPONDING FIELDS OF TABLE <table> FROM (pv_tabla). *& Recorremos la tabla creada dinamicamente LOOP AT <table> INTO <wa>. DO. *& Como no conocemos los campos de la tabla hasta la ejecucion *& assignamos a <field> un campo de la estructura en cada bucle *& cuando sy-index supere el nº de campos de la estructura *& sy-subrc = 4 con lo que sale del bucle ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <field>. IF sy-subrc <> 0. EXIT. ENDIF. WRITE <field>. ENDDO. NEW-LINE. ENDLOOP. |
#6
|
|||
|
|||
Hola crounly, en la respuesta que me has dado me da fallo de compilación en la línea:
CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla). He probado de esta manera: DATA: generic_table TYPE STANDARD TABLE OF (pv_tabla). pero me dice que el tipo (pv_tabla) es desconocido. Por otro lado, en esa tabla querría guardar el resultado de una select. Me dejará hacer un into table a una de estas tablas genéricas? Úlima edición por pepe500 fecha: 16/04/07 a las 07:46:35. |
#7
|
||||
|
||||
pv_tabla contiene el nombre de la tabla a la que quieres atacar, pero que hasta que ejecutes el programa no lo sabras. Si no contiene nada o no existe la tabla que contiene, dara ese error.
Si as manejado punteros en C, esto es parecido pero aqui se llaman FIELD-SYMBOLS. En el ejemplo hay 3 punteros: <table> TYPE ANY TABLE, "Para apuntar a una tabla <wa> TYPE ANY, "Para apuntar a la wa de la tabla <field> TYPE ANY. "Para apuntar a un campo de la tabla La idea es que cuando el programa se ejecute y por las acciones del usuario si que sepamos a que tabla atacar <table> apuntara a esa tabla CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla). ASSIGN generic_table->* TO <table>. Y <wa> a la wa o cabecera de esa tabla: CREATE DATA generic_line TYPE (pv_tabla). ASSIGN generic_line->* TO <wa>. Si lo que queremos es introducir datos en una tabla: pv_tabla = 'ztutabladesconocida'. CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla). ASSIGN generic_table->* TO <table>. CREATE DATA generic_line TYPE (pv_tabla). ASSIGN generic_line->* TO <wa>. Select SINGLE * INTO <wa> FROM spfli WHERE carrid EQ p_carrid. INSERT <table> FROM <wa> Si entiendes bien lo de los FIELD-SYMBOLS como punteros lo demas es facil. Suerte |
#8
|
|||
|
|||
Hola, yo lo que pretendo no es meter los datos en la cabecera de la tabla, si no poder declararme una tabla interna con la misma estructura que la tabla que solo sabre en tiempo de ejecución, y en dicha tabla interna (que no se como declararla) meter los datos con el select into.
|
#9
|
||||
|
||||
Entonces igual mas facil...
cuando ya sepas que tabla es pv_tabla = 'SPFLI'. la asignas al FIELD-SYMBOL. CREATE DATA generic_table TYPE STANDARD TABLE OF (pv_tabla). ASSIGN generic_table->* TO <table>. y la declaras: DATA: BEGIN OF ZNUEVATABLA OCCURS 0 INCLUDE STRUCTURE <tabla>, END OF ZNUEVATABLA. Esto seria lo mismo que: DATA: BEGIN OF ZNUEVATABLA OCCURS 0 INCLUDE STRUCTURE spfli, END OF ZNUEVATABLA. podrias ordenarlo todo dentro de una subrutina y pasarle en nombre de la tabla de la que vas a copiar la structura y asi la llamas cuando quieras. suerte |
#10
|
|||
|
|||
La instrucción,
CREATE DATA generic_table ... sigue dando error. Por otro lado tampoco me daja declarar una tabla interna haciendo un include structure a un field symbol, también me da error. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|