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

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 메서드를 불러오기 전에 추가

눌러서 팝업을 띄우고 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.
그 후 텍스트 필드를 설정한다
가져온 셀 정보를 토대로 해당 데이터 띄우기

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에 저장
언제나 저장하는건 갑갑하다
외않되? 와
이건 왜 돼??? 의 반복

짜잔
전에 한 거라 이게 다인지는 모르겠네
제일 깝깝했던건 저장이 안 된다는 거였음 ㅋㅋ
ALV에 반영은 되는데 DB에 저장이 안 되어서
뒤로 갔다가 해당 페이지를 가거나
프로그램을 껐다가 다시 켰을 경우는 텍스트가 원래대로 다시 돌아와있는거임
FLUSH 위치 때문이었음..!
FLUSH
ALV 표를 새로고침하거나 특정 GUI 컨트롤에 값은 넣은 다음 그 값으로 뭔가를 계산하거나 비교할 때
SAP가 자동으로 FLUSH를 안 해주기 때문에 직접 FLUSH를 해줘야 한다는데
두 군데 중 어디에 해당하는지 모르겠고?
BOUND
CREATE OBJECT를 하지 않은 상태인 거
IF G_TEXTEDIT IS NOT BOUND
= G_TEXTEDIT이 CREATE OBJECT 되지 않았다는 거