Ayuda con query tablas BSEG y BSID

Buenas tardes tengo el siguiente query, ¿alguien me puede ayudar a mejorarlo?Lo que sucede es que hay registros con el mismo “BELNR” y pues al momento de asignar los valores a “VALES” solo asigna un valor y no el total de los valores, tengo hecho algunas pruebas pero me dice que es una tabla cluster y no permite usar funciones agregadas. :cold_sweat:

Clear VALES.
SELECT * FROM BSEG where BUKRS  EQ '1000' and BELNR = BSID-BELNR AND
GJAHR = BSID-GJAHR.
IF BSEG-HKONT = 11130003. VALES = BSEG-DMBTR.
ENDIF.
ENDSELECT.

Por el momento ve cambiando esto.

Clear VALES.
SELECT HKONT  FROM BSEG 
            where BUKRS  EQ '1000' 
                  and BELNR = BSID-BELNR
                     AND GJAHR = BSID-GJAHR.

IF BSEG-HKONT = 11130003. 
          VALES = BSEG-DMBTR.
ENDIF.

ENDSELECT.

Lo que estas haciendo es un loop entre todos los documentos que cumplan con la condicion where.
el campo bseg tambien podrias tenerlo en la condicion where ya que es porpio de la bseg.
en cuanto al campo vale, donde esta ese campo? y que quieres hacer con el.
Veo que lo intentas modificar pero parece un campo interno, muestra un poco mas del codigo o explicame un poco mas para ver que mas sacamos.

Cuando pongo el codigo que mencionas me sale esto :frowning:

Te explico existe un reporte (el cual no diseñe), donde trae el monto de los diferentes vales que proporciona la empresa, pero sucede que este reporte no considera que cada Cuenta(HKONT) puede tener varios documentos(BELNR), entonces al momento de ejecutar el reporte solo trae el importe del primer documento que encuentre y no la suma de todos. Coméntame si me explique bien

Gracias!

1 me gusta
DATA: l_dmbtr TYPE dmbtr.
DATA: l_HKONT type HKONT.


Clear VALES.
SELECT HKONT 
       DMBTR  
     FROM BSEG  into (  l_HKONT, l_dmbtr )
        where BUKRS  EQ '1000' 
                  and BELNR = BSID-BELNR
                     AND GJAHR = BSID-GJAHR.

IF  L_HKONT = 11130003. 
          VALES = VALES + L_DMBTR. "Esto dara el total de vale, cuya cuenta sea 1130003
ENDIF.

ENDSELECT.

Requerimiento:

  • Mostrar el total de los vales por cuenta

Nota: si no uso el * y prefiero los campos, es porque suele ser mucho mas rapida la seleccion.
Verifica y dime los resultados.

3 Me gusta

Muchas gracias @smota, probaré y te aviso. :smile:

Muchísimas gracias @smota, efectivamente funciono algo así tenia en mente, soy nuevo con SAP y me dio un poco de trabajo la sintaxis jeje en la empresa ya me pasaron pequeño manual ABAP para las sentencias SQL veo que cambian un poco. De nuevo gracias!

Excelente @Elvis. Que todo siga bien.

@SidV ya puedes cerrar este tema :smile:

Re-abierto a solicitud en este tema.

creo que @canuto tenía por ahí un aporte importante que hacer en este tema

Aquí lo que yo iba a comentar es que el select endselect, es una practica algo vieja y no es tan optima…por que ?? porque cuando haces eso, es como hacer un loop a una tabla interna pero haciéndolo directamente a la base de datos, osea, pegarle varias veces una tabla de diccionario !! y si esto lo hacemos a una tabla cluster, buehhhhhh (recordemos que las tablas cluster son tablas con demasiado volumen de datos) si vamos a hacer select, por lo menos a estas tablas en FI lo recomendable es hacerlo por los campos claves y en el mismo orden.

3 Me gusta

Tienes toda la razon @canuto, el select endselect puede ser problematicos pero hay maneras de condicionarlo, ya mencionaste una, y la otra seria poner la cantidad de registro en la cual se verificara la data, up to 1 row.
De todos modo el select que se ha constituido esta usando los campos claves y filtra por cuenta, bien se podria mejorar colocando en el where la cuenta a la cual se hara el calculo de vale.
Aun asi este select esta lejos de ser letal para el sistema.

Gran aporte, de por si, me gustaria un tema especifico para que tratemos optimizaciones de codigos y mejoras de queries. Siempre salen cosas buenas.

1 me gusta

totalmente de acuerdo con @canuto, la sentencia select…endselect aunque aun es soportada practicamente esta en desuso hace un tiempo ya. existen maneras mas optimas para accesar a las tablas transparentes, es preferible hacer un vaciado de la data a tratar en una tabla interna en memoria y luego hacer un recorrido de la misma con un bucle loop. por supuesto como dice @smota siempre hay que tener cuidado al momento de hacer el select a la tabla transparente cuidando siempre hacer uso de la clave primaria o alguno de los indices que tenga

2 Me gusta

@canuto, @smota, @MarcosJaimes, pues les comento el query así como esta no afecta mucho no tuvo mucho impacto, ahora ¿como puedo mejorarlo?, la sugerencia de Marcos me llama mucho la atención ¿Me puedes explicar un poco mejor como hacerlo?. Saludos

Sin recurrir a tablas internas esta es mi nueva propuesta :smile:

   DATA: l_dmbtr TYPE dmbtr.
   DATA: l_hkont TYPE hkont.

   CLEAR vale.

 "Se trae un solo campo, lo cual ayuda a mejorar el espacio en memoria
    SELECT dmbtr
        FROM bseg  INTO l_dmbtr
            WHERE bukrs  EQ '1000'
                 AND belnr = bsid-belnr
                     AND gjahr = bsid-gjahr
                        AND hkont = '0011130003'. "Condicion por la cuenta, lo cual limita los resultados

             vales = vales + l_dmbtr. "Esto dara el total de vale, cuya cuenta sea 1130003

   ENDSELECT.

@canuto @MarcosJaimes vengan muestren sus propuestas.

1 me gusta

Algo asi, ahorita ando algo ocupado…puedes probar con el collect en el loop pero creo que esto es solo cuando hay campos claves y tienen que estar ordenados y tiene que ser iguales

DATA: lt_bseg TYPE TABLE OF bseg.

FIELD-SYMBOLS: <lf_bseg> TYPE bseg.

SELECT dmbtr INTO CORRESPONDING FIELDS OF TABLE lt_bseg FROM bseg
WHERE bukrs EQ '1000'AND belnr = bsid-belnr AND gjahr = bsid-gjahr
AND hkont = '0011130003'. "Condicion por la cuenta, lo cual limita los resultados

LOOP AT lt_bseg ASSIGNING <lf_bseg>.

  vales = vales + <lf_bseg>-dmbtr.
ENDLOOP.

trabajar con FIELD-SYMBOLS, te permite un poco mas rapido el recorrido al loop ya que trabajar mas o menos como los apuntadores !!

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.