Agrupar datos tabla interna

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • ac050
    Junior Member
    • abr
    • 6

    #1

    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.
  • Raulalsan
    Junior Member
    • sep
    • 25

    #2
    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

    Comentario

    • vic3
      Member
      • mar
      • 33

      #3
      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.
      Editado por última vez por vic3; 14/11/2017, 10:11:53.
      Consultor técnico SAP

      Comentario

      • omegaotaku
        Member
        • nov
        • 43

        #4
        Originalmente publicado por ac050
        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.
        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.

        Comentario

        Trabajando...