PDA

Ver la Versión Completa : Suma por varios campos iguales


JoNhNaTaN
08/08/13, 21:43:10
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:


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:


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
09/08/13, 14:37:07
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.

Kope
09/08/13, 17:22:08
Hola,

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

http://www.forosap.com/showthread.php?p=19513

Aunque puede probar ambas opciones. :D

joau_fedipe
09/08/13, 17:30:17
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.:)

JoNhNaTaN
12/08/13, 21:04:27
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

crisaegrim
14/08/13, 23:43:10
Creo que hubiera sido mas fácil si simplemente usaras la sentencia COLLECT .
En automático realizaba lo que estabas buscando.

Saludos!