PDA

Ver la Versión Completa : Field Symbols y sus types


gabriela_soria
12/08/09, 11:29:36
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:o

jesusgs12
12/08/09, 11:43:58
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.

abaper_biz
12/08/09, 15:27:19
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>.

:)

Christian Salgado
17/09/10, 20:45:54
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:confused:

Asalcedo
22/09/16, 16:20:13
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.



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:confused:

AlvaroLV
23/09/16, 11:06:17
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.


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

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:

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:

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:

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.