Declarar tabla interna dinamicamente

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • pepe500
    Junior Member
    • dic
    • 17

    #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.
  • ballan
    Senior Member
    • oct
    • 671

    #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

    Comentario

    • pepe500
      Junior Member
      • dic
      • 17

      #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.

      Comentario

      • ballan
        Senior Member
        • oct
        • 671

        #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.

        Comentario

        • crounly
          Senior Member
          • nov
          • 227

          #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.
          http://codigoderetorno.blogspot.com.es/

          Comentario

          • pepe500
            Junior Member
            • dic
            • 17

            #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?
            Editado por última vez por pepe500; 16/04/2007, 07:46:35.

            Comentario

            • crounly
              Senior Member
              • nov
              • 227

              #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
              http://codigoderetorno.blogspot.com.es/

              Comentario

              • pepe500
                Junior Member
                • dic
                • 17

                #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.

                Comentario

                • crounly
                  Senior Member
                  • nov
                  • 227

                  #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
                  http://codigoderetorno.blogspot.com.es/

                  Comentario

                  • pepe500
                    Junior Member
                    • dic
                    • 17

                    #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.

                    Comentario

                    • sponsor
                      Senior Member
                      • may
                      • 108

                      #11
                      Originalmente publicado por pepe500
                      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.

                      Tengo el mismo problema que el usuario...

                      Comentario

                      Trabajando...