Suma por varios campos iguales

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • JoNhNaTaN
    Member
    • ene
    • 70

    #1

    Suma por varios campos iguales

    sEÑORES TENGO EL SIGUIENTE DILEMA, LA TABLA SIGUIENTE
    TABLA VIRGEN

    Campo1 | Campo2 | Campo3 | Campo4
    -----------------------------------------------------
    AAA | G111 | SSS1 | 1.20
    AAA | G111 | SSS1 | 2.30
    AAA | G111 | SSS1 | 1.50
    AAA | H555 | SSS1 | 1.30
    BBB | F333 | GG1 | 1.80
    BBB | F333 | GG1 | 1.40
    BBB | F333 | GG1 | 1.60
    CCC | R444 | KK2 | 1.30
    CCC | R444 | KK2 | 1.70
    CCC | R444 | KK2 | 1.60
    CCC | R444 | KK2 | 2.30


    lo que quiero es que se sume el Campo4, mientras el Campo1, el Campo2 y el Campo3 sean iguales; es decir tiene que resultar lo siguiente

    TABLA PROCESADA - RESULTADO

    Campo1 | Campo2 | Campo3 | Campo4
    -------------------------------------------------------
    AAA | G111 | SSS1 | 5.00
    AAA | H555 | SSS1 | 1.30
    BBB | F333 | GGG1 | 4.80
    CCC | R444 | KK2 | 6.90

    he hecho el loop siguiente:

    Código:
       LOOP AT gtd_TABLA0 ASSIGNING <fs_TABLA0>.
          AT FIRST.ENDAT.
            AT NEW CAMPO1.
              WA_1-CAMPO1   = <fs_TABLA0>-CAMPO1.
            ENDAT.
            AT NEW CAMPO2.
              WA_1-CAMPO2   = <fs_TABLA0>-CAMPO2.
            ENDAT.
            AT NEW CAMPO3.
              WA_1-CAMPO3   = <fs_TABLA0>-CAMPO3.
            ENDAT.
    
              SUMAT = SUMAT + <fs_TABLA0>-CAMPO4.
    
            AT END OF CAMPO3. ENDAT.
            AT END OF CAMPO2. ENDAT.
            AT END OF CAMPO1. ENDAT.
           AT LAST.
             WA_1-CAMPO4   = SUMAT.
             APPEND WA_1 TO GTD_TRESULTADO.
             CLEAR SUMAT.
           ENDAT.
        ENDLOOP.
    Pero no funciona, luego hice esto:

    Código:
        gtd_TABLA0 = gtd_TABLA0.
        gtd_TABLA1 = gtd_TABLA0.
        gtd_TABLA2 = gtd_TABLA0.
        gtd_TABLA3 = gtd_TABLA0.
    
        SORT gtd_TABLA0 BY CAMPO1 CAMPO2 CAMPO3.
        SORT gtd_TABLA1 BY CAMPO1 CAMPO2 CAMPO3.
        SORT gtd_TABLA2 BY CAMPO1 CAMPO2 CAMPO3.
        SORT gtd_TABLA3 BY CAMPO1 CAMPO2 CAMPO3.
    
    
      LOOP AT gtd_TABLA0 ASSIGNING <fs_TABLA0>.
        LOOP AT gtd_TABLA1 ASSIGNING <fs_TABLA1> WHERE CAMPO1 = <fs_TABLA0>-CAMPO1.
          LOOP AT gtd_TABLA1 ASSIGNING <fs_TABLA2> WHERE CAMPO2 = <fs_TABLA1>-CAMPO2.
            LOOP AT gtd_TABLA1 ASSIGNING <fs_TABLA3> WHERE CAMPO3 = <fs_TABLA2>-CAMPO3.
              SUMAT_1 = SUMAT_1 + <fs_TABLA3>-CAMPO4.
            ENDLOOP.
            WA_1-BUKRS  = <fs_TABLA3>-BUKRS.
            WA_1-CAMPO1   = <fs_TABLA3>-CAMPO1.
            WA_1-CAMPO2   = <fs_TABLA3>-CAMPO2.
            WA_1-CAMPO3   = <fs_TABLA3>-CAMPO3.
            WA_1-CAMPO4   = SUMAT.
            CLEAR SUMAT.
            APPEND WA_1 TO GTD_TRESULTADO.
          ENDLOOP.
        ENDLOOP.
      ENDLOOP.
    Espero puedan ayudarme.

    Saludos cordiales.
  • vanesamacri
    Senior Member
    • jun
    • 146

    #2
    Hola.

    Dentro del bucle, el cambio controlalo con un:

    AT END OF Campo3.

    lógica

    ENDAT.

    Tomando como referencia el Campo3, al variar este campo o alguno de los otros dos anteriores (Campo1 o Campo2), se disparará la acción dentro del AT END.

    Saludos.

    Comentario

    • Kope
      Member
      • abr
      • 79

      #3
      Hola,

      a mi entender tienes que hacer lo que indican en el otro foro que has consultado:



      Aunque puede probar ambas opciones.
      SAP HANA consultant

      Comentario

      • joau_fedipe
        Member
        • oct
        • 79

        #4
        solo agregar esta parte de código

        Estimado, con estas lineas se soluciona tu inconveniente.

        DATA: lsvez TYPE c,
        kmpo1 LIKE gtd-campo1,
        kmpo2 LIKE gtd-campo2,
        kmpo3 LIKE gtd-campo3,
        gstot LIKE gtd-campo4.
        CLEAR gstot.
        LOOP AT gtd.
        IF lsvez IS INITIAL.
        kmpo1 = gtd-campo1.
        kmpo2 = gtd-campo2.
        kmpo3 = gtd-campo3.
        lsvez = 'X'.
        ENDIF.
        IF gtd-campo1 EQ kmpo1 AND gtd-campo2 EQ kmpo2
        AND kmpo3 EQ gtd-campo3.
        gstot = gstot + gtd-campo4.
        ELSE.
        WRITE: /1 gtd-campo1, gtd-campo2, gtd-campo3, gstot.
        CLEAR gstot.
        kmpo1 = gtd-campo1.
        kmpo2 = gtd-campo2.
        kmpo3 = gtd-campo3.
        gstot = gstot + gtd-campo4.
        ENDIF.
        ENDLOOP.
        WRITE: /1 gtd-campo1, gtd-campo2, gtd-campo3, gstot.

        Avisas como te fué.
        Saludos.

        Comentario

        • JoNhNaTaN
          Member
          • ene
          • 70

          #5
          Originalmente publicado por joau_fedipe
          Estimado, con estas lineas se soluciona tu inconveniente.

          DATA: lsvez TYPE c,
          kmpo1 LIKE gtd-campo1,
          kmpo2 LIKE gtd-campo2,
          kmpo3 LIKE gtd-campo3,
          gstot LIKE gtd-campo4.
          CLEAR gstot.
          LOOP AT gtd.
          IF lsvez IS INITIAL.
          kmpo1 = gtd-campo1.
          kmpo2 = gtd-campo2.
          kmpo3 = gtd-campo3.
          lsvez = 'X'.
          ENDIF.
          IF gtd-campo1 EQ kmpo1 AND gtd-campo2 EQ kmpo2
          AND kmpo3 EQ gtd-campo3.
          gstot = gstot + gtd-campo4.
          ELSE.
          WRITE: /1 gtd-campo1, gtd-campo2, gtd-campo3, gstot.
          CLEAR gstot.
          kmpo1 = gtd-campo1.
          kmpo2 = gtd-campo2.
          kmpo3 = gtd-campo3.
          gstot = gstot + gtd-campo4.
          ENDIF.
          ENDLOOP.
          WRITE: /1 gtd-campo1, gtd-campo2, gtd-campo3, gstot.

          Avisas como te fué.
          Saludos.
          Perfecto gracias a los dos.

          Saludos

          Comentario

          • crisaegrim
            Junior Member
            • may
            • 1

            #6
            Usar COLLECT

            Creo que hubiera sido mas fácil si simplemente usaras la sentencia COLLECT .
            En automático realizaba lo que estabas buscando.

            Saludos!

            Comentario

            Trabajando...