ALV 셀 버튼

펭귄안녕·2025년 7월 17일

abap

목록 보기
13/14

https://non-stop.tistory.com/823
이 티스토리랑
다른 프로그램 참고했음

1. 버튼 추가


ALV 셀에 버튼을 추가해보겠음

  DATA : ls_fieldcat  TYPE lvc_s_fcat.
  DATA : lt_cellstyle TYPE lvc_t_styl,
         ls_cellstyle TYPE lvc_s_styl.

  LOOP AT GT_ZPDCTTST4.

    REFRESH: lt_cellstyle.

      LOOP AT GT_FIELDCAT5 INTO ls_fieldcat.

        CLEAR ls_cellstyle.

        ls_cellstyle-fieldname = ls_fieldcat-fieldname.

        IF ls_cellstyle-fieldname = 'REMARK'.     " 비고

          ls_cellstyle-style = cl_gui_alv_grid=>mc_style_button.
          INSERT ls_cellstyle INTO TABLE lt_cellstyle.

        ENDIF.
      ENDLOOP.

    CLEAR: GT_ZPDCTTST4-IT_BTN.

    INSERT LINES OF lt_cellstyle INTO TABLE GT_ZPDCTTST4-IT_BTN.
    MODIFY GT_ZPDCTTST4 TRANSPORTING IT_BTN.

  ENDLOOP.

FORM SET_CELLSTYLE 을 PBO에 만든 INIT 모듈에다가 추가

  DATA GS_LAYOUT TYPE LVC_S_LAYO.
  
  GS_LAYOCAT5-STYLEFNAME = 'IT_BTN'.  

SET_TABLE_FOR_FIRST_DISPLAY 메서드를 불러오기 전에 추가

2. 이벤트 핸들러


눌러서 팝업을 띄우고 LONG TEXT 작성이 가능하도록 하겠다네요

  DATA: LS_ROW       LIKE GT_ZPDCTTST4,
        LV_ROW_INDEX TYPE LVC_INDEX.

" ALV에서 클릭된 행 번호
  LV_ROW_INDEX = PS_ROW-ROW_ID.

" 클릭된 셀 정보 가져오기
    READ TABLE GT_ZPDCTTST4 INDEX LV_ROW_INDEX INTO LS_ROW.
    IF SY-SUBRC = 0.
      GV_EDIT_ROW     = LS_ROW.  " 클릭된 셀 데이터 복사
      GV_ROW_INDEX    = LV_ROW_INDEX.   " 수정할 행 기억

      CALL SCREEN 511 STARTING AT 7 2 ENDING AT 120 20.

    ENDIF.

이벤트 핸들러 버튼 클릭으로 연결 해서
클릭된 셀 정보를 가져오고
새로 팝업을 띄우기

" 커스텀 컨테이너 
  CREATE OBJECT GV_CONTAINER_511
    EXPORTING
      CONTAINER_NAME = 'GV_CUSTOM_CONTAINER_511'.
      
" 텍스트필드
  IF G_TEXTEDIT IS INITIAL.
    " 텍스트필드 생성
    CREATE OBJECT G_TEXTEDIT
      EXPORTING
        PARENT                     = GV_CONTAINER_511
        WORDWRAP_MODE              = CL_GUI_TEXTEDIT=>WORDWRAP_AT_FIXED_POSITION " 고정된 위치에서 줄바꿈
        WORDWRAP_POSITION          = 100                      " 100자에 줄바꿈
        WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>false.   " 실제로 줄 바꿈 문자를 넣을것인지

     " 조회<>수정모드
    IF G_GRID_510->IS_READY_FOR_INPUT( ) EQ 0.  "조회모드
      G_TEXTEDIT->SET_STATUSBAR_MODE( STATUSBAR_MODE = 0 ).
      G_TEXTEDIT->SET_READONLY_MODE( READONLY_MODE = 1 ).

    ELSE. "수정모드
      G_TEXTEDIT->SET_STATUSBAR_MODE( STATUSBAR_MODE = 1 ).
      G_TEXTEDIT->SET_READONLY_MODE( READONLY_MODE = 0 ).
    ENDIF.
  ENDIF.

새 팝업창에 커스텀 컨테이너 및 텍스트 필드를 생성 해야함
처음엔 조회 모드라 수정이 불가능
모드 변경을 클릭하면 수정 보드로 변경됨

  DATA: LV_STRING_TEXT TYPE STRING,
        LV_ROW         LIKE GV_EDIT_ROW.

* 해당 행 정보
  LV_ROW         = GV_EDIT_ROW.
  LV_STRING_TEXT = GV_EDIT_ROW-REMARK.

* 화면에 띄우기
  GV_POP_PERNR   = LV_ROW-PERNR.
  GV_POP_DATE    = LV_ROW-PTO_DATE.

* 텍스트 불러오기
  CALL METHOD G_TEXTEDIT->SET_TEXTSTREAM
      EXPORTING
        TEXT      = LV_STRING_TEXT.

그 후 텍스트 필드를 설정한다
가져온 셀 정보를 토대로 해당 데이터 띄우기

3. 텍스트 수정


  DATA LV_TEXT TYPE STRING.

  IF G_TEXTEDIT IS NOT BOUND.         " g_textedit이 create object 되지 않았으면
    RETURN.
  ENDIF.

  " 사용자가 TextEdit에 입력한 값 읽기
  CALL METHOD G_TEXTEDIT->GET_TEXTSTREAM
    IMPORTING
      TEXT = LV_TEXT.

  CALL METHOD CL_GUI_CFW=>FLUSH.      " 동기화

  " 텍스트 저장
  GV_EDIT_ROW-REMARK = LV_TEXT.

  MODIFY GT_ZPDCTTST4 INDEX GV_ROW_INDEX FROM GV_EDIT_ROW TRANSPORTING REMARK.

  CALL METHOD G_GRID_510->REFRESH_TABLE_DISPLAY.
  G_GRID_510->SET_OPTIMIZER( ).

  LEAVE TO SCREEN 0.

저장을 누르면 작성된 텍스트가 저장됨
이건 ALV에 띄우기 위한 저장

OPTIMIZER는 ALV 셀 너비 최적화..! 였던 거 같은데

  DATA: LS_ROW  LIKE GT_ZPDCTTST4,
        LS_SAVE LIKE LINE OF GT_ZPDCTTST4_SAVE.

  PERFORM POPUP_CHECK USING '수정' '해당 정보를 수정하시겠습니까?'
                        CHANGING P_ANSWER.
  IF P_ANSWER = 1.

    READ TABLE GT_ZPDCTTST4 INDEX GV_ROW_INDEX INTO LS_ROW.

    IF SY-SUBRC = 0.
*      GV_EDIT_TEXT = LS_ROW-REMARK.
      CLEAR LS_SAVE.
      MOVE-CORRESPONDING LS_ROW TO LS_SAVE.
      APPEND LS_SAVE TO GT_ZPDCTTST4_SAVE.
    ENDIF.

    MODIFY ZPDCTTST4 FROM TABLE GT_ZPDCTTST4_SAVE.

    CLEAR GV_EDIT_ROW.

    MESSAGE '수정 완료' TYPE 'S'.

  ELSE.

    MESSAGE '작업을 취소하였습니다.' TYPE 'S'.
  ENDIF.

이것은 DB에 저장
언제나 저장하는건 갑갑하다
외않되? 와
이건 왜 돼??? 의 반복

4. 완성


짜잔

전에 한 거라 이게 다인지는 모르겠네
제일 깝깝했던건 저장이 안 된다는 거였음 ㅋㅋ
ALV에 반영은 되는데 DB에 저장이 안 되어서
뒤로 갔다가 해당 페이지를 가거나
프로그램을 껐다가 다시 켰을 경우는 텍스트가 원래대로 다시 돌아와있는거임
FLUSH 위치 때문이었음..!

FLUSH
ALV 표를 새로고침하거나 특정 GUI 컨트롤에 값은 넣은 다음 그 값으로 뭔가를 계산하거나 비교할 때
SAP가 자동으로 FLUSH를 안 해주기 때문에 직접 FLUSH를 해줘야 한다는데

두 군데 중 어디에 해당하는지 모르겠고?

BOUND
CREATE OBJECT를 하지 않은 상태인 거
IF G_TEXTEDIT IS NOT BOUND
= G_TEXTEDIT이 CREATE OBJECT 되지 않았다는 거

0개의 댓글