본문 바로가기

ABAP 물타기/ALV

fieldcatalog 순서지정

순서를 지정하는 cbo 테이블이 필요함
컬럼은 필드명으로, 데이터에는 순서가 들어있으면 됨

아래는 필드카탈로그설정을 완료 후 cbo에서 순서를 찾아와 변형하는 로직임.


  FORM CHANGE_DISPLAY_SEQ .

  DATA : L_COL LIKE GO_FIELDCAT_S-COL_POS,
         L_COL_MAX LIKE GO_FIELDCAT_S-COL_POS.

  DATA : BEGIN OF LT_SEQ OCCURS 0,
           FIELDNAME LIKE GO_FIELDCAT_S-FIELDNAME,
           COL_POS   LIKE GO_FIELDCAT_S-COL_POS,
         END OF LT_SEQ.

  DATA : L_FIELD(30).
  FIELD-SYMBOLS <LF719>.

  CHECK GT_ITAB[] IS NOT INITIAL.

* 시작 위치를 찾음.
  CLEAR GO_FIELDCAT_S.
  READ TABLE GO_FIELDCAT_T WITH KEY FIELDNAME = 'ZRANK'
  INTO GO_FIELDCAT_S.
  CHECK SY-SUBRC = 0.

  L_COL = GO_FIELDCAT_S-COL_POS.


* 해당 STRUCTURE를 읽음.
  READ TABLE GT_ZSDT719 WITH KEY HLGUB = P_HLGUB ZYTGN = P_ZYTGN.


* 순서를 찾음.
  CLEAR GO_FIELDCAT_S.
  LOOP AT GO_FIELDCAT_T INTO GO_FIELDCAT_S
    WHERE NO_OUT = SPACE
      AND COL_POS > L_COL
      AND FIELDNAME NE 'ZBIGO'"비고는 제일 뒤에 나오도록 제거함.
    CLEAR : L_FIELD.
    CONCATENATE 'GT_ZSDT719-' GO_FIELDCAT_S-FIELDNAME INTO L_FIELD.
    ASSIGN (L_FIELD) TO <LF719>.

    LT_SEQ-FIELDNAME = GO_FIELDCAT_S-FIELDNAME.
    LT_SEQ-COL_POS   = <LF719>.

    IF L_COL_MAX < LT_SEQ-COL_POS.
      L_COL_MAX = LT_SEQ-COL_POS.
    ENDIF.

    APPEND LT_SEQ.
  ENDLOOP.


* 순서가 없는항목은 제일 뒤로 이동함 (0인 값)
  L_COL_MAX = L_COL_MAX + 1.
  LOOP AT LT_SEQ WHERE COL_POS = 0.
    LT_SEQ-COL_POS = L_COL_MAX.
    MODIFY LT_SEQ.
  ENDLOOP.


* 순서대로 정렬함.
  SORT LT_SEQ BY COL_POS.


* 신규순서를 지정함.
  LOOP AT LT_SEQ.

    L_COL = L_COL + 1.
    CLEAR : GO_FIELDCAT_S.
    READ TABLE GO_FIELDCAT_T WITH KEY FIELDNAME = LT_SEQ-FIELDNAME
      INTO GO_FIELDCAT_S.
    IF SY-SUBRC = 0.
      GO_FIELDCAT_S-COL_POS = L_COL.
      MODIFY GO_FIELDCAT_T FROM GO_FIELDCAT_S INDEX SY-TABIX.

    ENDIF.

  ENDLOOP.

ENDFORM.                    " CHANGE_DISPLAY_SEQ


'ABAP 물타기 > ALV' 카테고리의 다른 글

CL_ALV_CHANGED_DATA_PROTOCOL  (0) 2011.07.04
ALV : SELECTED_ROWS  (0) 2011.05.19
function alv f4 (커스터마이징)  (0) 2011.01.26
ALV : Popup ALV  (0) 2011.01.04
ALV : Function ALV Tip  (0) 2011.01.04