¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Consejos para optimizar la lectura eficiente de la tabla BSEG en ABAP

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 120 Vistas
0
Cargando...

Hola comunidad,

Sé que esta pregunta 'Cómo leer BSEG eficientemente' ha sido formulada varias veces aquí. Aunque he encontrado algunas sugerencias, aún no logro optimizar de manera considerable mi programa ABAP. Por eso estoy aquí en busca de nuevos consejos. Aquí hay algunas buenas respuestas que he encontrado:

"Como BSEG es una tabla de cluster, la tabla BSEG consiste en datos de las tablas BSIS, BSAS, BSID, BSAD, BSIK y BSAK.

BSIS: Partidas abiertas de G/L

BSAS: Partidas cerradas de G/L

BSID: Partidas abiertas de clientes (Cuentas por cobrar)

BSAD: Partidas cerradas de clientes (Cuentas por cobrar)

BSIK: Partidas abiertas de proveedores (Cuentas por pagar)

BSAK: Partidas cerradas de proveedores (Cuentas por pagar)

Es mejor recuperar datos de las tablas anteriores según los datos (proveedor, cliente, cuenta de G/L). De lo contrario, se pueden presentar problemas de rendimiento si se utiliza BSEG en producción y puede generar errores en tiempo de ejecución. Por favor, utilice las tablas anteriores para evitar errores en tiempo de ejecución en Producción." (No, en realidad necesitamos recuperar datos de la tabla BSEG)

Otra sugerencia:

"En lugar de seleccionar de BSEG por vbel2 = 'xxx' y posn2 = 'yyy', debería: a. obtener una lista de todas las claves de BSEG que cumplan mi condición de búsqueda en la tabla BSID: seleccionar burks, belnr, gjahr, buzel de BSID donde vbel2 = 'xxx' y posn2 = 'yyy' b. seleccionar todos los datos que necesito de BSEG usando sus campos clave: seleccionar * de BSEG donde burks = … y belnr = … y gjahr = .. y buzel = … Dado que BSID es una tabla de base de datos normal, puedo definir un índice en las columnas vbel2, posn2, y dado que selecciono de BSEG por sus columnas clave (en las que hay un buen índice de base de datos único), este fragmento de código se ejecutará bastante rápido." (usamos esto)

Algunos sugieren leerlo como una tabla ordenada (¡incluso una tabla hash!)... No puedo añadir un índice allí ya que es una tabla de cluster -Sé que hay una nota que describe cómo transformar esta tabla de cluster en una transparente (para que puedas añadir índices) pero esto no se recomienda y podría generar muchos volcados de memoria- y así sucesivamente...

A pesar de todo, nuestro programa sigue tardando mucho tiempo. Me pregunto si tienen otras soluciones que puedan optimizar el proceso de consulta.

¡Muchas gracias!

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola Barbel,

¡En realidad, la idea de recuperar los datos en paquetes realmente hizo una gran diferencia! No seguí los pasos exactos que has descrito, pero ahora puedo cargar en 2 días lo que solía cargar en una semana.

Muchas gracias, has sido de gran ayuda.

Saludos

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Hasnae,

aquí está lo que hice cuando necesitaba seleccionar una gran cantidad de datos de BSEG:

  1. Seleccionar datos relevantes de BKPF (u otra tabla adecuada para darte una lista de claves de BSEG necesarias) en una tabla interna (itab1) que contenga solo las claves requeridas para la recuperación posterior de datos de BSEG
  2. Definir un parámetro en la pantalla de selección en el que ingresar un "tamaño de paquete", como por ejemplo 1000
  3. Copiar el primer "paquete" en otra tabla interna (AÑADIR LÍNEAS DE itab1 DE 1 A 1000 A itab2)
  4. Hacer uso de un bucle DO
  5. Seleccionar y procesar datos de BSEG dentro del bucle solo para (por ejemplo) 1000 entradas
  6. Determinar el índice de inicio y fin para el próximo paquete agregando el valor del tamaño del paquete (asegúrate de establecer el valor de fin al número máximo de líneas en itab1 si el valor calculado es mayor que eso)
  7. Salir del bucle si el índice de inicio es mayor que el número máximo de líneas en itab1
  8. Copiar el próximo "paquete" de itab1 a itab2
  9. Seleccionar el siguiente "paquete" de BSEG

Hacerlo con "paquetes" solo tiene sentido si realmente necesitas procesar muchos datos. Especificar el tamaño a través de la pantalla de selección te da la opción de probar la lógica con un número bastante bajo en desarrollo y luego aumentarlo en QA o PROD para ver cuántas entradas se pueden procesar de una vez y aún así ser eficientes.

Descargo de responsabilidad: Como no encontré rápidamente un ejemplo real del código que utilicé hace algún tiempo, la descripción puede no ser 100% completa. Deberás tener especial cuidado para no crear una situación de bucle infinito. Sin embargo, recuerdo que recuperar los datos en paquetes como se describe arriba, hizo que fuera sorprendentemente rápido recuperar datos de BSEG para todo un año (si no más).

¡Espero que esto te ayude!

Saludos

Baerbel

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Veo que tienes un rendimiento deficiente en el informe. Dado que hay muchas razones posibles, asegúrate de que el informe tarda mucho tiempo en la consulta de BSEG al hacer esta pregunta.

Además, ¿puedes proporcionar más detalles sobre tu consulta actual, el tamaño de BSEG, qué método intentaste antes, si tu consulta mejoró su rendimiento entonces (incluso algunos microsegundos)?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Hasnae,

aquí está lo que hice cuando necesitaba seleccionar una gran cantidad de datos de BSEG:

  1. Selecciona datos relevantes de BKPF (u otra tabla adecuada para darte una lista de claves BSEG necesarias) en una tabla interna (itab1) que contenga solo las claves requeridas para la recuperación posterior de datos BSEG
  2. Define un parámetro en la pantalla de selección en el que ingresar un "tamaño de paquete", como por ejemplo 1000
  3. Copia el primer "paquete" en otra tabla interna (APPEND LINES OF itab1 FROM 1 TO 1000 TO itab2)
  4. Utiliza un bucle DO
  5. Selecciona y procesa datos BSEG dentro del bucle solo para (por ejemplo) 1000 entradas
  6. Determina el índice de inicio y fin para el siguiente paquete agregando el valor del tamaño del paquete (asegúrate de establecer el valor de fin al número máximo de líneas en itab1 si el valor calculado es mayor que eso)
  7. Sal del bucle si el índice de inicio es mayor que el número máximo de líneas en itab1
  8. Copia el siguiente "paquete" de itab1 a itab2
  9. Selecciona el siguiente "paquete" de BSEG

Hacerlo con "paquetes" solo tiene sentido si realmente necesitas procesar muchos datos. Especificar el tamaño a través de la pantalla de selección te da la opción de probar la lógica con un número bastante bajo en desarrollo y luego aumentarlo en QA o PROD para ver cuántas entradas se pueden procesar de una vez y seguir siendo eficientes.

Descargo de responsabilidad: Como no encontré rápidamente un ejemplo real para el código que usé hace algún tiempo, la descripción puede no ser 100% completa. Debes tener especial cuidado de no crear una situación de bucle infinito. Sin embargo, recuerdo que recuperar los datos en paquetes como se describe anteriormente, hizo que fuera sorprendentemente rápido recuperar los datos BSEG de todo un año (si no más).

¡Espero que esto ayude!

Saludos

Baerbel

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?