Field Symbols y sus types

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • gabriela_soria
    Junior Member
    • mar
    • 12

    #1

    Field Symbols y sus types

    Hola a todos! Tengo una duda, los field symbols para que sirven exactamente? Vi que son mas rapidos -comparados con una work area- a la hora de hacer un loop a una taba interna, pero que otra utilidad tiene? . Otra consulta, a la hora de definirla, en un ejemploi vi esto:

    FIELD-SYMBOLS: <table> TYPE ANY TABLE,
    <xtable> TYPE STANDARD TABLE,
    Los type ANY TABLE y STANDARD TABLE, en que se diferencian? si dice solamente TYPE ANY, puede tomar cualquier valor? inclusive puede usarse como work area o una tabla?

    Les agradecere si me pueden dar información al respecto.

    Saludos,

    Gaby
    ***********************
    Gabriela Soria
    Consultora ABAP
    Email: xfiles1973@gmail.com
  • jesusgs12
    Junior Member
    • oct
    • 14

    #2
    Con un workarea tienes que hacer un modify a la tabla si quieres cambiar datos, con un FS es directo porque es un "puntero" a ese registro.

    Comentario

    • abaper_biz
      Junior Member
      • oct
      • 27

      #3
      Originalmente publicado por jesusgs12
      Con un workarea tienes que hacer un modify a la tabla si quieres cambiar datos, con un FS es directo porque es un "puntero" a ese registro.

      Hola yo utilizo los field symbols, como mencionaste para recorrer tablas internas sin cabecera, creacion de tablas internas dinamicas, y tambien para hacer llamadas a elementos o tablas de programas en ejecucion, por ejemplo utilizo esta sentencia en user exits.


      DATA: program TYPE string.
      FIELD-SYMBOLS: <fs_ebeln> TYPE ANY.
      CLEAR program.
      program = '(SAPLMEGUI)MEPO_TOPLINE-EBELN'.
      ASSIGN (program) TO <fs_ebeln>.

      Jhon Riders Juscamaita Rico
      --------------------------------------------
      CONSULTOR SAP / ABAP4 DEVELOPER

      Comentario

      • Christian Salgado
        Junior Member
        • ene
        • 21

        #4
        Field-symbol

        Amigos una consulta, miren estoy tratando de mejorar los tiempos de respuesta de algunos procesos que tengo y estoy intentando trabajar con FIELD-SYMBOL, estoy haciendo lo siguiente:

        CREATE DATA REF_ITAB TYPE STANDARD TABLE OF BKPF WITH NON-UNIQUE DEFAULT KEY.

        ASSIGN REF_ITAB->* TO <FS_ITAB>.

        SELECT * FROM BKPF
        INTO TABLE <FS_ITAB>
        WHERE BUKRS IN P_BUKRS AND
        BLART IN ('01','07','08') AND
        BLDAT IN P_BLDAT AND
        TCODE = 'MIRO'.

        CREATE DATA REF_WA LIKE LINE OF <FS_ITAB>.
        ASSIGN REF_WA->* TO <FS_WA>.

        Cuando yo declaro el <FS_ITAB> de la siguiente manera: FIELD-SYMBOLS: <FS_ITAB> TYPE ANY TABLE… no hay ningún problema, pero el tema es que yo quiero que este <FS_ITAB> tenga la misma estructura que este temporal:

        DATA: BEGIN OF TI_BKPF OCCURS 0,
        BUKRS LIKE BKPF-BUKRS, " Soceidad
        BELNR LIKE BKPF-BELNR, " Número de un documento contable
        GJAHR LIKE BKPF-GJAHR, " Ejercicio
        BLDAT LIKE BKPF-BLDAT, " Fecha de documento en documento
        BUDAT LIKE BKPF-BUDAT, " Fecha de contabilización en el documento
        BLART LIKE BKPF-BLART, " Clase de documento
        AUGBL LIKE BSEG-AUGBL, " Compensacion
        XBLNR LIKE BKPF-XBLNR, " Número de documento de referencia
        AWKEY LIKE BKPF-AWKEY, " Clave de referencia
        CPUDT LIKE BKPF-CPUDT, " Día del registro
        END OF TI_BKPF.

        Necesito que tenga la misma estructura ya que luego hare otro select a la BSEG donde me permita actualizar el campo AUGBL. Lo estoy haciendo asi:

        LOOP AT <FS_ITAB> INTO <FS_WA>.
        SELECT SINGLE AUGBL
        INTO <FS_WA>-AUGBL
        FROM BSEG
        WHERE BUKRS = <FS_WA>-BUKRS AND
        BELNR = <FS_WA>-BELNR AND
        GJAHR = <FS_WA>-GJAHR.
        Pero me sale que el campo AUGBL no existe…como podría hacerlo por favor?.
        Analizando me doy cuenta que el <FS_ITAB> tiene la estructura de la BKPF porque asi lo he definido pero al momento de definirlo como TI_BKPF me salen errores...

        Gracias por la ayuda

        Csalgado

        Comentario

        • Asalcedo
          Junior Member
          • sep
          • 1

          #5
          Respuesta a error en campo AUGBL

          El problema esta en el Número de un documento contable, Ejercicio y Sociedad que estas seleccionando en tu busqueda. Es por esto que no te da valor en el campo AUGBL. Envia nuevos valores en los parametros solicitados e intenta de nuevo.



          Originalmente publicado por Christian Salgado
          Amigos una consulta, miren estoy tratando de mejorar los tiempos de respuesta de algunos procesos que tengo y estoy intentando trabajar con FIELD-SYMBOL, estoy haciendo lo siguiente:

          CREATE DATA REF_ITAB TYPE STANDARD TABLE OF BKPF WITH NON-UNIQUE DEFAULT KEY.

          ASSIGN REF_ITAB->* TO <FS_ITAB>.

          SELECT * FROM BKPF
          INTO TABLE <FS_ITAB>
          WHERE BUKRS IN P_BUKRS AND
          BLART IN ('01','07','08') AND
          BLDAT IN P_BLDAT AND
          TCODE = 'MIRO'.

          CREATE DATA REF_WA LIKE LINE OF <FS_ITAB>.
          ASSIGN REF_WA->* TO <FS_WA>.

          Cuando yo declaro el <FS_ITAB> de la siguiente manera: FIELD-SYMBOLS: <FS_ITAB> TYPE ANY TABLE… no hay ningún problema, pero el tema es que yo quiero que este <FS_ITAB> tenga la misma estructura que este temporal:

          DATA: BEGIN OF TI_BKPF OCCURS 0,
          BUKRS LIKE BKPF-BUKRS, " Soceidad
          BELNR LIKE BKPF-BELNR, " Número de un documento contable
          GJAHR LIKE BKPF-GJAHR, " Ejercicio
          BLDAT LIKE BKPF-BLDAT, " Fecha de documento en documento
          BUDAT LIKE BKPF-BUDAT, " Fecha de contabilización en el documento
          BLART LIKE BKPF-BLART, " Clase de documento
          AUGBL LIKE BSEG-AUGBL, " Compensacion
          XBLNR LIKE BKPF-XBLNR, " Número de documento de referencia
          AWKEY LIKE BKPF-AWKEY, " Clave de referencia
          CPUDT LIKE BKPF-CPUDT, " Día del registro
          END OF TI_BKPF.

          Necesito que tenga la misma estructura ya que luego hare otro select a la BSEG donde me permita actualizar el campo AUGBL. Lo estoy haciendo asi:

          LOOP AT <FS_ITAB> INTO <FS_WA>.
          SELECT SINGLE AUGBL
          INTO <FS_WA>-AUGBL
          FROM BSEG
          WHERE BUKRS = <FS_WA>-BUKRS AND
          BELNR = <FS_WA>-BELNR AND
          GJAHR = <FS_WA>-GJAHR.
          Pero me sale que el campo AUGBL no existe…como podría hacerlo por favor?.
          Analizando me doy cuenta que el <FS_ITAB> tiene la estructura de la BKPF porque asi lo he definido pero al momento de definirlo como TI_BKPF me salen errores...

          Gracias por la ayuda

          Csalgado

          Comentario

          • AlvaroLV
            Junior Member
            • feb
            • 6

            #6
            Cambios

            Yo creo que te estás complicando la vida, aparte, hay un error en el código.

            El tipo registro no hace falta que lo tipifiques, con que al declararlo pongas lo siguiente, sobra.

            Código:
              FIELD-SYMBOLS:
                <FS_WA> TYPE ANY.
            De esta forma te va a coger el mismo tipo del que sea la tabla sin necesidad de ponerle tipo. Si acaso, el problema de tu código es que has puesto INTO en lugar de ASSIGNING y que, además, deberías añadir el campo al tipo del que sea la tabla grande.

            No sé si es necesario o te has empeñado, por el hecho de usar FIELD-SYMBOLS, que los tipos sean dinámicos, pero ese código se simplificaría mucho haciéndolo de la siguiente forma:

            Declaraciones
            Código:
            TYPES: BEGIN OF tys_bkpf,
              bukrs TYPE bkpf-bukrs, " Soceidad
              belnr TYPE bkpf-belnr, " Número de un documento contable
              gjahr TYPE bkpf-gjahr, " Ejercicio
              bldat TYPE bkpf-bldat, " Fecha de documento en documento
              budat TYPE bkpf-budat, " Fecha de contabilización en el documento
              blart TYPE bkpf-blart, " Clase de documento
              augbl TYPE bseg-augbl, " Compensacion
              xblnr TYPE bkpf-xblnr, " Número de documento de referencia
              awkey TYPE bkpf-awkey, " Clave de referencia
              cpudt TYPE bkpf-cpudt, " Día del registro
            END OF tys_bkpf.
            
            FIELD-SYMBOLS:
              <gs_reg> TYPE tys_bkpf.
            
            DATA:
              gt_tab TYPE STANDARD TABLE OF tys_bkpf.
            Lógica:
            Código:
            SELECT *
              FROM bkpf
              INTO CORRESPONDING FIELDS OF TABLE  gt_tab
              WHERE bukrs IN p_bukrs AND
                    blart IN ('01','07','08') AND
                    bldat IN p_bldat AND
                    tcode EQ 'MIRO'.
            
            LOOP AT gt_tab ASSIGNING <gs_reg>.
              SELECT SINGLE augbl
                INTO <gs_reg>-augbl
                FROM bseg
                WHERE bukrs EQ <gs_reg>-bukrs AND
                      belnr EQ <gs_reg>-belnr AND
                      gjahr EQ <gs_reg>-gjahr.
            ENDLOOP.
            Por otra parte, este código tiene un error funcional grave, y es que la relación BKPF-->BSEG no es 1:1 sino 1:n y, a lo mejor, el registro que estás consultando en la BSEG no es el que tiene el documento de compensación que estás buscando, con lo cual no recomiendo que hagas lo que estás poniendo, pero si es eso lo que quieres, la mejor forma de hacerlo es la siguiente, sin meter SELECTs dentro de LOOPs (esto no se hace si no es estrictamente necesario) y usando el FOR ALL ENTRIES (también puedes hacer alguna JOIN, el tema rendimiento los puedes comprobar antes) que para eso está:

            Definiciones:
            Código:
            TYPES: BEGIN OF tys_bkpf,
              bukrs TYPE bkpf-bukrs, " Soceidad
              belnr TYPE bkpf-belnr, " Número de un documento contable
              gjahr TYPE bkpf-gjahr, " Ejercicio
              bldat TYPE bkpf-bldat, " Fecha de documento en documento
              budat TYPE bkpf-budat, " Fecha de contabilización en el documento
              blart TYPE bkpf-blart, " Clase de documento
              augbl TYPE bseg-augbl, " Compensacion
              xblnr TYPE bkpf-xblnr, " Número de documento de referencia
              awkey TYPE bkpf-awkey, " Clave de referencia
              cpudt TYPE bkpf-cpudt, " Día del registro
            END OF tys_bkpf.
            
            TYPES: BEGIN OF tys_bseg,
              bukrs TYPE bkpf-bukrs, " Soceidad
              belnr TYPE bkpf-belnr, " Número de un documento contable
              gjahr TYPE bkpf-gjahr, " Ejercicio
              augbl TYPE bseg-augbl, " Compensacion
            END OF tys_bseg.
            
            FIELD-SYMBOLS:
              <gs_bseg> TYPE tys_bseg,
              <gs_reg>  TYPE tys_bkpf.
            
            DATA:
              gt_bseg TYPE STANDARD TABLE OF tys_bseg,
              gt_tab  TYPE STANDARD TABLE OF tys_bkpf.
            Lógica:
            Código:
            SELECT bukrs
                   belnr
                   gjahr
                   bldat
                   budat
                   blart
                   xblnr
                   awkey
                   cpudt
              FROM bkpf
              INTO CORRESPONDING FIELDS OF TABLE  gt_tab
              WHERE bukrs IN p_bukrs AND
                    blart IN ('01','07','08') AND
                    bldat IN p_bldat AND
                    tcode EQ 'MIRO'
              ORDER BY PRIMARY KEY.
            
            SELECT bukrs
                   belnr
                   gjahr
                   augbl
              INTO TABLE gt_bseg
              FROM bseg
              FOR ALL ENTRIES IN gt_tab
              WHERE bukrs EQ gt_tab-bukrs AND
                    belnr EQ gt_tab-belnr AND
                    gjahr EQ gt_tab-gjahr
              ORDER BY PRIMARY KEY.
            
            LOOP AT gt_tab ASSIGNING <gs_reg>.
              READ TABLE gt_bseg ASSIGNING <gs_bseg>
                WITH KEY bukrs = <gs_reg>-bukrs
                         belnr = <gs_reg>-belnr
                         gjahr = <gs_reg>-gjahr
                BINARY SEARCH.
              <gs_reg>-augbl = <gs_bseg>-augbl.
            ENDLOOP.

            Comentario

            Trabajando...