Realización de Select con SUM (ABAP)

Algunas veces debemos hacer consultas a tablas para obtener la suma de campos númericos, en especifico los referidos a pesos y costo, pero ¿Cómo es que realizamos dicha consulta? pues para explicarlo aplicaremos un ejemplo:

Al igual que con los comandos del SQL, vamos a realizar un SELECT con el empleo del comando SUM, el cual permite sumar todos los valores del campo indicado, siguiendo las condiciones puestas y alvergandolo en una variable.

Como ejemplo tenemos lo siguiente:

SELECT SUM( hwbas ), SUM( hwste )
INTO (lv_hwbas, lv_hwste)
FROM BSET
WHERE bukrs = p_bukrs AND
gjahr = p_gjahr.

Podemos apreciar que en el ejemplo vamos a sumar 2 campos de la tabla BSET, para lo cual se han colocado como filtros la sociedad y el año, automaticamente el programa sumara los datos que cumplan con la consulta y devolvera dicho valores en las 2 variables que se encuentran dentro de parentesis (lv_hwbas, lv_hwste).

Anuncios

4 pensamientos en “Realización de Select con SUM (ABAP)

    • Hola José,
      Por tu consulta entiendo lo siguiente:
      1- La operación SUM no puedes usar con “las comas” (me imagino te refieres a las sentencias con HANA). Te comento que con Hana si puedes emplear la operación SUM, la unica distinción es que debes dar un alias (nombre) a la columna de SUM para que durante la creación de la tabla interna se cree dicha columna con el valor respectivo. Te copio un ejemplo simple leyendo la tabla bseg:

      SELECT bukrs, belnr, gjahr, sum( dmbtr ) AS suma INTO TABLE
      @DATA(lt_bseg) FROM bseg
      WHERE belnr = ‘9400000000’
      AND gjahr = ‘2017’
      GROUP BY bukrs, belnr, gjahr.

      Si realizas un debug, notaras que la tabla interna que se crea tras la consulta tiene la siguiente estructura:

      |BUKRS|BELNR|GJAHR|SUMA|

      2- Cuando te refieres al “into doble”, entiendo que te refieres a la lectura con FOR ALL ENTRIES, me indicas si entendi bien este punto. En el caso de FOR ALL ENTRIES es correcto que la operación SUM no funcione, solamente se permite la operación COUNT. ¿Qué hacer en dicho caso?, puedes realizar las operaciones con LOOPS, armando la lógica adecuada o si deseas unir ambas tablas en una sola lectura, obteniendo a su vez la operación SUM, se puede emplear el comando INNER JOIN, que igual enlaza tablas y permite la sumatoria.

      SELECT a~bukrs, a~belnr, a~gjahr, sum( b~dmbtr ) AS suma
      INTO TABLE @DATA(lt_tabla) FROM bkpf AS a
      INNER JOIN bseg AS b ON b~bukrs = a~bukrs
      AND b~belnr = a~belnr
      AND b~gjahr = a~gjahr
      WHERE a~belnr = ‘9400000000’
      AND a~gjahr = ‘2017’
      GROUP BY a~bukrs, a~belnr, a~gjahr.

      Si realizas el debug notarás que obtienes el mismo resultado que la anterior consulta, con la posibilidad de obtener columnas de las diversas tablas del INNER JOIN.

      *Para los debugs, reemplazas el número de documento y ejercicio por valores que tengas en tu sistema.

      Espero halla sido de ayuda mi comentario.

      Saludos.

      • Hola luislokox gracias por tu explicacion, excelente. ya logré resolver el reporte acumulando en un loop los dos montos ya que no los puedo sumar directamente en el select, con las siguiente consultas:

        SELECT DISTINCT vbeln ” Números de Facturas
        INTO TABLE it_vbrp
        FROM vbrp “Tabla de pocisión de la factura
        WHERE werks = so_gsber-low AND kursk_dat IN so_fecha
        %_HINTS ORACLE ‘INDEX( VBRP “Z2” )’.

        IF sy-subrc EQ 0.
        SELECT netwr mwsbk “estos son los dos campos que queria sumar
        FROM vbrk
        INTO TABLE it_vbrk
        FOR ALL ENTRIES IN it_vbrp
        WHERE fkart = ‘FP’ AND rfbsk = ‘C’ AND vbeln EQ it_vbrp-vbeln.
        ELSE.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.

        DESCRIBE TABLE it_vbrk LINES n.
        IF sy-subrc EQ 0.
        LOOP AT it_vbrk INTO wa_vbrk.
        wa_vbrk-suma = wa_vbrk-suma + wa_vbrk-netwr + wa_vbrk-mwsbk. “aqui el acumulador
        IF sy-tabix EQ n.
        EXIT.
        ENDIF.
        ENDLOOP.
        ELSE.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.

        Siempre estoy pendiente de los post sobre abap, saludos.

  1. Excelente José, que bueno que hallas podido resolver el tema y agradecerte por copiar tu ejemplo. Espero pronto volver con el contenido y estar atento a responder consultas y también de paso seguir aprendiendo con ustedes.
    Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s