En sap tengo una tabla, hay filas con el mismo nombre pero con diferente cantidad.
Quiero resumir este filas como esta:

    SELECT c~aufnr
           p~matnr p~bdter p~meins p~baugr p~dbskz p~erfmg p~aufnr
           f~maktx
       INTO CORRESPONDING FIELDS OF TABLE it_tab
       FROM  afpo AS c
         INNER JOIN resb AS p ON c~aufnr = p~aufnr
         INNER JOIN makt AS f ON p~matnr = f~matnr.             

    LOOP AT it_tab INTO fs_tab.
       COLLECT fs_tab INTO it_tab_collected.
    ENDLOOP.
    it_tab = it_tab_collected.

Pero en este caso es la síntesis de sólo absolutamente idéntica filas. Necesito sumar solo las filas con el mismo nombre.

¿Cómo puedo lograr esto?

Saludos,
Alexander.

3 Comentarios

  1. 4

    Como icbytes ya se dijo, COLLECT utiliza los campos clave para determinar qué campos de agregado. Yo sugeriría que la definición de algunos tipos de datos para que coincida con su scenarion:

    TYPES: BEGIN OF t_my_type,
             key_a TYPE foo,
             key_b TYPE foo,
             nokey_c TYPE foo,
             nokey_d TYPE foo,
           END OF t_my_type,
           tt_my_type_list TYPE STANDARD TABLE OF t_my_type WITH DEFAULT KEY,
           tt_my_type_hash TYPE HASHED TABLE OF t_my_type WITH KEY key_a key_b.
    
    DATA: lt_result TYPE tt_my_type_list,
          lt_sums   TYPE tt_my_type_hash.
    
    FIELD-SYMBOLS: <ls_result> TYPE t_my_type.
    
    LOOP AT lt_result ASSIGNING <ls_result>.
      COLLECT <ls_result> INTO lt_sums.
    ENDLOOP.
    

    …o puede que desee utilizar un función de agregado en el primer lugar…

  2. 2

    Me gustaría palo de distancia de COLLECT, incluso tho puede guardar un par de líneas de código, no hay necesidad de utilizar y añade detiene sin razón.

    He tenido problemas para mantener/agregar características a código escrito anteriormente que utiliza COLLECT porque no permitir la clave no no campos numéricos para ser agregado a las tablas internas y a veces me he visto obligado a modificar un montón de COLLECT frases o introducir una complejidad innecesaria para el código (como la utilización de las tablas internas).

    Ejemplo (tomando vwegert el ejemplo de una base, que hizo un buen trabajo explicando cómo utilizar COLLECT correctamente):

    TYPES: BEGIN OF t_my_type,
             key_a TYPE foo,
             key_b TYPE foo,
             """ with COLLECT all 'foo' types **has to be** numeric
             nokey_c TYPE foo,
             nokey_d TYPE foo,
             """ if you ever need to add something like a note field to the table
             """ you'll find out that you have to change all the COLLECT sentences
             """ because this new field wouldn't let the code compile
             nokey_notes(50) type c,
           END OF t_my_type,
    
           tt_my_type_list TYPE STANDARD TABLE OF t_my_type WITH DEFAULT KEY,
           tt_my_type_hash TYPE HASHED TABLE OF t_my_type WITH KEY key_a key_b.
    
    DATA: lt_result TYPE tt_my_type_list,
          lt_sums   TYPE tt_my_type_hash.
    
    FIELD-SYMBOLS: <ls_result> TYPE t_my_type.
    
    
    """ just imagine you need the 'nokey_notes' field for an ALV for user input.
    PERFORM show_alv USING lt_result.
    
    
    """ and you don't care about this new field when doing
    """ the sum/average or whatever you are trying to calculate
    """ well, it won't work with COLLECT...
    LOOP AT lt_result ASSIGNING <ls_result>.
      COLLECT <ls_result> INTO lt_sums.
    ENDLOOP.
    

    Mi recomendación sería el uso de AT... ENDAT (además de SELECT‘s funciones de agregado, lo cual es una buena opción, especialmente si usted no necesita los datos individuales).

    Por supuesto, el código va a ganar un par de líneas, pero en mi opinión/experiencia que vale la pena, porque el código será más fácil de mantener en el futuro.

    TYPES: BEGIN OF t_my_type,
             key_a TYPE foo,
             key_b TYPE foo,
             """ with COLLECT all 'foo' types **has to be** numeric
             nokey_c TYPE foo,
             nokey_d TYPE foo,
             """ without COLLECT you are able to add new non-key non-numeric fields
             nokey_notes(50) type c,
           END OF t_my_type,
    
           tt_my_type_list TYPE STANDARD TABLE OF t_my_type.
    
    DATA: lt_result TYPE tt_my_type_list,
          lt_sum    TYPE tt_my_type_list.
          lwa_sum   TYPE t_my_type.
    
    FIELD-SYMBOLS: <ls_result> TYPE t_my_type.
    
    
    """ just imagine you need the 'nokey_notes' field for an ALV for user input.
    PERFORM show_alv USING lt_result.
    
    
    """ sorting is important when using AT... ENDAT, there are other gotchas too
    """ make sure you read its documentation carefully if you never used it
    """ (like everything right? :P)
    SORT lt_result BY key_a key_b.
    REFRESH lt_sum.
    
    """ and you don't care about 'nokey_notes' field when doing calculation
    LOOP AT lt_result ASSIGNING <ls_result>.
    
      AT NEW key_b.
        """ this get executed when the work area's primary keys
        """ change, good time to prepare the lwa_sum work area.
        CLEAR lwa_sum.
        lwa_sum-key_a = lwa_sum-key_a.
        lwa_sum-key_b = lwa_sum-key_b.
      ENDAT.
    
      """ do whatever math/logic is need with the fields
      lwa_sum-nokey_c = lwa_sum-nokey_c + <ls_result>-nokey_c.
      lwa_sum-nokey_d = lwa_sum-nokey_d + <ls_result>-nokey_d.
    
      AT END OF key_b.
        """ this get executed when the work area's primary keys
        """ is about to change (in next iteration) or at the last
        """ record of the table
        """ good place to save the results to a new internal table
        APPEND lwa_sum to lt_sums.
      ENDAT.
    
    ENDLOOP.
    
  3. 0

    AFAIK recoger utiliza claves, ya que puede decidir qué filas se deberá crear un agregado.
    Si Usted tiene otro carácter-valores anteponiendo valores numéricos, de eliminar en otro itab, así que la única c-como la columna, la cual está llena, será el «nombre». Esto servirá como la única clave para dejar abap procesador agregado.

    ¿ Eso ayuda ?

Dejar respuesta

Please enter your comment!
Please enter your name here