Ver la Versión Completa : Agrupar datos tabla interna
Hola, tengo una tabla interna it_data1 con tres campos Cliente, saldo y fecha.
cliente saldo fecha
1 10 01.11.2017
1 -3 15.11.2017
2 20 20.11.2017
2 30 30.11.2017
Estoy buscando la forma de agrupar por cliente, el sum del campo saldo y el max del campo fecha.
Este es el resultado que busco.
cliente saldo fecha
1 7 15.11.2017
2 50 30.11.2017
He intentado con (collect it_data1 into it_data2) pero no me sirve para el campo fecha. Alguna idea que me pueda ayudar?
Mucahs gracias.:confused:
Raulalsan
14/11/17, 08:36:55
Acabo de empezar en ABAP y seguro que hay una forma mejor, pero yo haría una lógica propia.
Te dejo una lógica que he implementado y que creo que funcionaría tal como deseas.
CLEAR ls_cliente_aux.
SORT lt_cliente BY cliente date DESCENDING.
DATA(num_rows) = lines( lt_cliente ).
LOOP AT lt_cliente INTO ls_cliente.
IF ls_cliente_aux-cliente NE ls_cliente-cliente AND sy-tabix NE
'1'.
APPEND ls_cliente_aux TO lt_cliente_aux.
ls_cliente_aux-cliente = ls_cliente-cliente.
ls_cliente_aux-date = ls_cliente-date.
ls_cliente_aux-saldo = ls_cliente-saldo.
ELSE.
IF sy-tabix EQ '1'.
ls_cliente_aux-cliente = ls_cliente-cliente.
ls_cliente_aux-date = ls_cliente-date.
ls_cliente_aux-saldo = ls_cliente-saldo.
ELSE.
IF sy-tabix EQ num_rows.
ls_cliente_aux-saldo = ls_cliente-saldo +
ls_cliente_aux-saldo.
APPEND ls_cliente_aux TO lt_cliente_aux.
ELSE.
ls_cliente_aux-saldo = ls_cliente-saldo +
ls_cliente_aux-saldo.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
Saludos
Yo haría lo siguiente:
* Definición de variables: Esto lo haces a tu gusto... :) :)
Supongamos que tu tabla interna donde tienes los datos se llama GT_TABLA
DATA: gt_tabla_suma LIKE gt_tabla,
..........gs_tabla_suma LIKE LINE OF gt_tabla_suma.
TYPES: BEGIN OF ty_clientes,
..cliente TYPE i,
END OF ty_clientes.
DATA: gt_clientes TYPE STANDARD TABLE OF ty_clientes,
..........gs_clientes LIKE LINE OF gt_clientes
DATA: lv_clientes TYPE i.
DATA: lv_suma_saldo TYPE i.
* Nº de clientes: Vamos a ver cuantos clientes diferentes hay :) :)
LOOP AT gt_tabla INTO gs_tabla.
..gs_clientes-cliente = gs_tabla-cliente.
..APPEND gs_clientes TO gt_clientes.
ENDLOOP.
SORT gt_clientes BY cliente ASCENDING.
DELETE ADJACENT DUPLICATES FROM gt_clientes COMPARING ALL FIELDS.
CLEAR lv_clientes.
DESCRIBE TABLE gt_clientes LINES lv_clientes.
* Hacemos la suma de los saldos: Para tu caso, entiendo que solo necesitas sumar los saldos y quedarte con el nº de cliente y con la última fecha (la más reciente) :) :)
SORT gt_tabla BY cliente fecha ASCENDING. (pon el nombre correcto de tus campos en GT_TABLA)
DO lv_clientes TIMES.
..READ TABLE gt_clientes INTO gs_clientes WITH KEY sy-index.
..CLEAR lv_suma_saldo.
..LOOP AT gt_tabla INTO gs_tabla WHERE cliente = gs_clientes-cliente.
....gs_tabla_suma-cliente = gs_tabla-cliente.
....gs_tabla_suma-fecha = gs_tabla-fecha.
....lv_suma_saldo = lv_suma_saldo + gs_tabla-saldo.
....gs_tabla_suma-saldo = lv_suma_saldo.
..ENDLOOP.
..APPEND gs_tabla_suma TO gt_tabla_suma.
ENDDO.
omegaotaku
14/11/17, 17:00:04
Hola, tengo una tabla interna it_data1 con tres campos Cliente, saldo y fecha.
cliente saldo fecha
1 10 01.11.2017
1 -3 15.11.2017
2 20 20.11.2017
2 30 30.11.2017
Estoy buscando la forma de agrupar por cliente, el sum del campo saldo y el max del campo fecha.
Este es el resultado que busco.
cliente saldo fecha
1 7 15.11.2017
2 50 30.11.2017
He intentado con (collect it_data1 into it_data2) pero no me sirve para el campo fecha. Alguna idea que me pueda ayudar?
Mucahs gracias.:confused:
Acá te paso mi desarrollo:
REPORT ytempo1.
TYPES:BEGIN OF ty_data,
cliente TYPE i,
saldo TYPE i,
fecha TYPE sy-datum,
END OF ty_data.
DATA: it_data TYPE STANDARD TABLE OF ty_data,
wa_data TYPE ty_data,
it_data_aux TYPE STANDARD TABLE OF ty_data,
wa_data_aux TYPE ty_data.
INITIALIZATION.
DEFINE m_macro.
wa_data_aux-cliente = &1.
wa_data_aux-saldo = &2.
wa_data_aux-fecha = &3.
append wa_data_aux to it_data_aux.
clear wa_data_aux.
END-OF-DEFINITION.
m_macro: 1 10 '20171101',
1 -3 '20171115',
2 20 '20171120',
2 30 '20171130'.
START-OF-SELECTION.
SORT it_data_aux BY cliente fecha DESCENDING.
LOOP AT it_data_aux INTO wa_data_aux.
IF wa_data-fecha IS INITIAL.
wa_data-fecha = wa_data_aux-fecha.
ENDIF.
wa_data-saldo = wa_data-saldo + wa_data_aux-saldo.
AT END OF cliente.
wa_data-cliente = wa_data_aux-cliente.
APPEND wa_data TO it_data.
CLEAR wa_data.
ENDAT.
ENDLOOP.
Saludos.
www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web