2017-03-09 2 views
2

배경 : cl_salv_table 클래스를 사용하여 ALV를 생성하고 수정합니다. 이 ALV는 유형이 zpm_et_qual_notif_s 인 테이블을 표시합니다. 여기서 모든 짝수 행은 이름이 DELIM1, DELIM2 ... CHAR 길이가 1 인 구분자 필드입니다. 구분 기호 열을 ALV에 표시 할 이유가 없으므로이를 제거하고 싶습니다.데이터 형식에 따라 ALV 열을 동적으로 숨기기

참고 : ABAP 사전 구조 나 내가 정의한 내부 테이블의 열 개수를 결정하는 것이 아니기 때문에 제목에 "ABAP 사전/내부 구조"일반을 남겼습니다. 현재 15 개 구분 필드가 있기 때문에


나를 위해 쉬운 솔루션이 15 일 문을하는 것입니다 :

lv_alv->get_columns()->get_column('DELIM1')->set_visible(if_salv_c_bool_sap=>false). 
lv_alv->get_columns()->get_column('DELIM2')->set_visible(if_salv_c_bool_sap=>false). 
lv_alv->get_columns()->get_column('DELIM3')->set_visible(if_salv_c_bool_sap=>false). 
lv_alv->get_columns()->get_column('DELIM4')->set_visible(if_salv_c_bool_sap=>false). 
lv_alv->get_columns()->get_column('DELIM5')->set_visible(if_salv_c_bool_sap=>false). 
... 

이것에 문제가 있음을 새 필드가 테이블에 추가하는 경우, 내 프로그램도 업데이트해야합니다. 이런 이유로,이 접근법은 많은 중복 라인을 필요로하는데, 나는 이것이 험난한 해결책이라고 생각한다.

" Dynamically hide delimiter columns 
DATA lv_idx TYPE syst_index VALUE 1. 
WHILE lv_idx < 16. " Number of delimiters 
    lv_alv->get_columns()->get_column(|DELIM{ lv_idx }|)->set_visible(if_salv_c_bool_sap=>false). 
    lv_idx = lv_idx + 1. 
ENDWHILE. 

이 좋은이 간단한 솔루션 소개합니다을 때문에 : 나는 믿고 무엇


는 청소기 솔루션은 동적 그래서 같은 방식으로 구분 모든 컬럼의 가시성을 설정하는 것입니다 할 수 최소한의 오버 헤드. 그러나 구분 기호 열 수를 하드 코딩해야하는 문제가 여전히 있습니다. 이상적인 해결책은 다음과 같이 할 수 있습니다.

" Dynamically hide delimiter columns 
DATA lv_idx TYPE syst_index VALUE 1. 
WHILE lv_idx < (columns('ZPM_ET_QUAL_NOTIF_S')/2). " Number of delimiters 
    lv_alv->get_columns()->get_column(|DELIM{ lv_idx }|)->set_visible(if_salv_c_bool_sap=>false). 
    lv_idx = lv_idx + 1. 
ENDWHILE. 

... 물론 물론 그런 것은 아닙니다.

내 내부 테이블 또는이 테이블이 기반으로하는 ABAP 사전 구조의 열 수를 어떻게 동적으로 가져올 수 있습니까? 확실히 여기에 일부 동적 솔루션이 있습니다. 이 문제를 직접 풀려고하면 cl_abap_structdescrcl_abap_tabledescr으로 나를 둘러 보았습니다. 내 모든 접근 방식이 나쁘다면 좋은 습관을 따르기 위해 그것을 변경하는 것이 편합니다.

+0

이 테이블을 채우기 위해 파일에서 데이터를 업로드하려고하십니까? – jhamu

+0

@jhamu 아니요, 입력 데이터는 고객 데이터베이스 테이블에서 가져옵니다. – gkubed

답변

4

우선, 전체적으로 표시되는 것을 방지하기 위해이 열에 set_technical으로 태그를 지정합니다. set_visible(abap_false)은 현재/초기 디스플레이에서 이들을 숨기지 만 사용자는이 열을 표시하도록 선택하여 혼동을 줄 수 있습니다.

그런 다음이 열을 위치가 아닌 데이터 요소로 구분하려고합니다. (의사) 코드, 테스트되지 않음 :

DATA(columns) = my_alv->get_columns(). 
DATA(column_list) = columns->get(). 
LOOP AT column_list ASSIGNING FIELD-SYMBOL(<column>). 
    IF <column>-r_column->get_ddic_rollname() = 'Z_IRRELEVANT_DELIMITER'. 
    <column>-r_column->set_technical(). 
    ENDIF. 
ENDLOOP. 
+0

많은 훌륭한 아이디어 - 감사합니다. 나는'set_technical()'을 사용하기 위해 코드를 수정했고, 구분 기호 필드의 데이터 유형을'CHAR' 대신'DELIM'으로 변경했습니다. 길이는'1'입니다. 장소). 'my_alv-> get_columns()'는 테이블이 아닌'TYPE REF TO CL_SALV_COLUMNS_TABLE'의 객체를 반환하기 때문에 실제로 열을 반복하는 법을 알아 내려고합니다. – gkubed

+2

원래 코드는'GET()'에 대한 호출이 누락 된 것처럼 보였습니다. 이것은 TYPE REF TO CL_SALV_COLUMNS_TABLE'에서 테이블을 가져옵니다. –

+1

Yup - 내가 쓴 것처럼 :-) 헤드 업에 감사드립니다. 통화가 추가되었습니다. – vwegert

1

다음 코드 단편은 데이터 사전 구조 또는 테이블의 활성 버전에있는 열 수를 결정합니다.

SELECT COUNT(*) INTO @DATA(num_cols) 
        FROM dd03l 
        WHERE tabname EQ @p_struct 
        AND as4local EQ 'A'. " Active 

다른 솔루션은 RTTS framework를 사용하거나 ASSIGN COMPONENT을 이용하여 제조 될 수있다.

+3

API가있는 경우 저장소/사전 테이블에 직접 액세스하지 말 것을 권장합니다.이 경우 여러 가지 대안이 있습니다. 또한 (이 특정 질문과 관련이 없지만) 디스플레이가 DDIC 구조를 기반으로하지 않고 프로그램에 로컬 인 유형 인 경우이 작업은 실패합니다. – vwegert