Ayuda sap, sumas por fecha

Amigos buenas tardes, vengo a pedirles una consulta es que tengo un rato pensando y aun no se como hacer algo, me piden que sume por fecha de contabilizacion una tabla interna , les pondre mas o menos las busquedas por la se16n para que mas o menos vean jeje:

SELECT AUFNR GAMNG GSTRP
  FROM AFKO
  INTO TABLE it_valid
  WHERE GSTRP IN s_budat.

  IF sy-subrc EQ 0.

    SELECT aufnr
      FROM AUFK
      INTO TABLE IT_aufnr1
      FOR ALL ENTRIES IN it_valid
      WHERE aufnr = it_valid-aufnr
*      AND ERDAT = it_valid-GSTRP
      AND AUART EQ p_auart
      AND WERKS = p_werks.

      IF sy-subrc EQ 0.

* Cantidad de Aves
        SELECT AUFNR GAMNG GSTRP AUFPL
          FROM AFKO
          INTO TABLE it_cantave
          FOR ALL ENTRIES IN it_aufnr1
          WHERE AUFNR = it_aufnr1-aufnr.

* Mortalidad , Descarte y Error en Sexo
         SELECT aufnr XMNGA BUDAT
           FROM AFRU
           INTO TABLE it_mix1
           FOR ALL ENTRIES IN it_aufnr1
           WHERE AUFNR = it_aufnr1-aufnr
           AND   GRUND = 'G001' OR GRUND = 'G002' OR GRUND = 'G003'
           AND   WERKS = p_werks.
*     Ubicarlo en almacen
            IF SY-SUBRC EQ 0.

              SELECT AUFNR LGORT
               INTO TABLE it_afpo
               FROM AFPO
               FOR ALL ENTRIES IN it_mix1
               WHERE AUFNR = it_mix1-aufnr.
            ENDIF.

los valores serian mas o menos asi:

it_valid

it_aufnr1

it_cantave

it_mix1

Lo que quiero hacer si ven la ultima tabla it_mix1 quiero sumar por fecha de contabilizacion pero al mismo tiempo por orden para cada tipo de motivo (G001 , 6002, g003), supongamos que para la orden 200100000021, lo primero pienso que deberia hacer algo como un

LOOP AT IT_aufnr1 ASSIGNING <FS_AUFNR>.
    READ TABLE it_cantave  into wa_cantave WITH KEY AUFNR = <FS_AUFNR>-AUFNR.
     IF SY-SUBRC EQ 0.
       LOOP AT it_mix1 ASSIGNING <FS_MIX1> WHERE AUFNR = wa_cantave-AUFNR.
             IF it_mix1-grund = 'G001'. " Mortalidad

quien me dice mas o menos como podria hacerlo?

Lo que me piden es esto:
Total: debe representar la sumatoria de las mortalidades por fecha de contabilización.
% mortalidad real: resulta de la operación (Total * 100 ) / (Cantidad de aves – Total)
% acumulado real: resulta un acumulado de % mortalidad real.

Bueno y otras busqueda spero la difernecia es el G001, G002 y G003 pero con que haga una lo demas es igual pero aun no me viene una idea. Saludos y muchas gracias por cualquier ayuda.

Hola buenas, para la parte en la que quieres sumar por subtotales, yo sin duda empezaría trabajando con un ALV orientados a objetos (salv en google) el cual tiene entre sus metodos uno que permite hacer subtotales por el criterio que le apliquemos (en tu caso la fecha).

Con una simple llamada al metodo tendrías el TOTAL, el subtotal por fechas, el % de acumulados reales y el % de mortalidad real ya tendrías que implementar la operación que tu mismo pones dentro de un loop.

Lee un poco sobre los ALV orientados a objetos, intenta montarte uno y ponle el metodo que te indico, no me acuerdo del nombre pero en todas las guias de documentacion tiene que venir.

Siento no darte la solucion en código, pero menos es nada jejeje

Un saludo!

1 me gusta

el problema es que no lo quieren al final ni nada , lo quieren por registro por eso lo necesito asi jeje pero gracias por tu sugerencia

Ah por registro? Pensaba que era en ALV y subtotalizado. Entonces olvida lo que te he dicho :wink:

Si no he entendido mal la tabla que va a hacer los criterios es la it_mix1 por tanto lo primero sería ordenar esta tabla según te piden.

Esto no me cuadra, será en base a la fecha de contabilización (IT_MIX1) y que luego se relacione por orden con la IT_AUFNR1?

Si lo que quieres es la cantidad (entiendo que es la Ctd. Teorica de la it_cantave) a priori lo que veo es que solo necesitaria IT_MIX1 & IT_CANTAVE no? Porque veo que la IT_AUFNR1 & IT_VALID es solamente una tabla que usas para rellenar estas tablas con un FOR ALL ENTRIES

Un saludo :wink:

1 me gusta

si, amigo , segun mi funcional me informo como es algo diario tendre que ordenar por fecha pero estoy esperando que me responda porque esta el caso en que la condicion que quiero G001 y fecha coincidan pero sean ordenes distintas, tendria que ver si en ese caso las sumaria o no.

Por otra parte si amigo tienes razon con lo de it_aufnr e it_valid

Creo que podria hacer lo de las sumas ocn un at end of it_mix1-fecha_contabilizacion, y si es de la misma condicion G001 voy sumando a todas las fechas pero tengo que esperar a ver si en el caso de que se cumpla eso y las ordenes sean distitnas como aqui:

Hola @abapero,
Pero cual es el criterio de sumatoria?
Primero: fecha contable
Segundo: orden
Tercero Motivo?

Si fuera así, la tabla it_mix1 por ejemplo que no tenga centro y usas la instrucción collect que suma sola.

Por ejemplo para una tabla it_mix1, la tabla collect (lt_col) tendría:

Como ves, de la tabla it_mix1 hay 7 entradas y en la lt_col sólo hay 5, porque ha sumado por fecha contable igual, orden igual y luego motivo igual.

El código sería algo así:

types: begin of tabla,
        fec type budat,
        rec type i,
        mot type c LENGTH 4,
        ord type aufnr,
   END OF tabla.

data: lt_int type TABLE OF tabla,
      ls_int like LINE OF lt_int.

DATA  lt_col type HASHED TABLE OF tabla
                WITH UNIQUE KEY fec ord mot .

START-OF-SELECTION.
* Se asume que aquí la tabla esta rellena
LOOP AT lt_int into ls_int.
  write: / ls_int-fec,ls_int-rec, ls_int-mot,ls_int-ord.
  collect ls_int into lt_col.
ENDLOOP.
5 Me gusta

Hola @abapero yo haría tal cual indica @Salco lo único a tener en cuenta el tipo de datos a utilizar en el collect que a veces no deja utilizar valores no númericos en la clave, o a mi me tiene dado esos problemas por lo demás tal cual te indican.

Un saludo.

Muchas gracias salco vi y creo que si aplicare esto :smiley: :smiley: :smiley: te ganaste n pedacito del cielo, sorry por la tardanza, mucho trabajo jejejje

1 me gusta

Buenos días @abapero, si te ha ayudado alguna respuesta, por favor, márcala como solución.