2014-05-14 2 views
1

수액에 나는 테이블이 있지만, 이름이 같지만 수량이 다른 행이 있습니다. 이 같은이 행을 요약 할 :수액 abap에 행을 요약

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. 

을하지만,이 경우에만 absolutelly 동일하게 행을 요약한다. 같은 이름의 행만을 요약해야합니다.

어떻게하면됩니까?

감사합니다. 알렉산더.

답변

0

AFAIK 수집은 집계를 생성 할 행을 결정할 수있는 키를 사용합니다. 숫자 값 앞에 다른 문자 값이있는 경우, 다른 itab에서 해당 문자를 삭제하십시오. 따라서 채워지는 c와 같은 열만 ​​"이름"이됩니다. 이것은 abap 프로세서 집계를위한 유일한 열쇠가 될 것입니다.

도움이 되었습니까?

4

이미 말했듯이 COLLECT은 키 필드를 사용하여 집계 할 필드를 결정합니다. 나는 당신의 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. 

을 ... 또는 당신이 처음에 aggregate function을 사용할 수 있습니다 ...

1

나는 COLLECT에서 스틱 멀리 거라고 심지어 몇 줄의 코드를 저장할 수 있기 때문에 사용할 필요가 없습니다. 은 아무 이유없이 제지를 추가합니다.

나는/유지가 키가 아닌 숫자가 아닌 필드가 내부 테이블에 추가하고, 때로는 강제했습니다 허용하지 않습니다 때문에 COLLECT을 사용 이전에 작성된 코드에 기능을 추가하는 문제를 했어 COLLECT 문장을 많이 수정하거나 코드에 불필요한 복잡성을 초래할 수 있습니다 (여분의 내부 테이블 사용).

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. 

AT... ENDAT을 사용하는 것입니다 나의 추천 (외에 SELECT의 집계 함수 : 예

는 (제대로 COLLECT을 사용하는 방법을 설명하는 좋은 일을했다 기본으로 vwegert의 예를 복용) 이는 특히 개인 데이터가 필요없는 경우에 좋은 옵션입니다.

당연히 코드는 몇 줄의 추가 라인이 생기 겠지만 내 의견/경험으로는 코드가 미래에 유지하기가 더 쉬워지기 때문에 가치가 있습니다.

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.