SALV

조유영·2023년 3월 15일
0

운영서버 반영모습

구현

코드

USER-COMMAND - GUI

USER-COMMAND - ALV

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = G_PROGRAM
      I_CALLBACK_PF_STATUS_SET = C_STATUS_SET
      I_CALLBACK_USER_COMMAND  = C_USER_COMMAND "
      IS_LAYOUT                = G_LAYOUT_S
      IT_FIELDCAT              = G_FIELDCAT_T
      IT_SORT                  = G_SORT_T
      IT_EVENTS                = G_EVENTS_T
      I_SAVE                   = G_SAVE
      IS_VARIANT               = G_VARIANT_S
      IS_PRINT                 = G_PRINT
      I_GRID_SETTINGS          = G_GRIDSET
    TABLES
      T_OUTTAB                 = LT_DISP_TAB
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

USER-COMMAND

FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD.

  DATA: LR_TABLE   TYPE REF TO CL_SALV_TABLE,
        LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE,
        LR_COLUMN  TYPE REF TO CL_SALV_COLUMN_TABLE,
        LR_DISPLAY TYPE REF TO CL_SALV_DISPLAY_SETTINGS.

  CASE R_UCOMM.
    WHEN 'VMIOD'.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.                    "user_command

SALV - 라인 선택

      IF RS_SELFIELD-TABINDEX IS NOT INITIAL.
        READ TABLE LT_DISP_TAB INDEX RS_SELFIELD-TABINDEX.

        IF SY-SUBRC EQ 0 AND LT_DISP_TAB-BOX EQ C_X.
          PERFORM ZDKB_ZDKE_QUAN "SELECT DATA
            USING LT_DISP_TAB-KUNNR LT_DISP_TAB-MATNR.
        ELSE.
          MESSAGE E000 WITH '라인을 선택해주세요' DISPLAY LIKE 'S'.
        ENDIF.

SALV - 테이블 이동

        CL_SALV_TABLE=>FACTORY(
          IMPORTING
            R_SALV_TABLE = LR_TABLE
          CHANGING
            T_TABLE = GT_VMI[] ).

SALV - FIELD TEXT

        LR_DISPLAY = LR_TABLE->GET_DISPLAY_SETTINGS( ).
        LR_DISPLAY->SET_LIST_HEADER( 'VMI 오더 현황' ).

        LR_COLUMNS = LR_TABLE->GET_COLUMNS( ).
        LR_COLUMNS->SET_OPTIMIZE( ).
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'VBELN' ).
        LR_COLUMN->SET_SHORT_TEXT( 'ZDKB 오더' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'ZDKB 오더' ).
        LR_COLUMN->SET_LONG_TEXT( 'ZDKB 오더' ).
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'POSNR' ).
        LR_COLUMN->SET_SHORT_TEXT( 'ZDKB 품목' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'ZDKB 품목' ).
        LR_COLUMN->SET_LONG_TEXT( 'ZDKB 품목' ).
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'BFIMG' ).
        LR_COLUMN->SET_SHORT_TEXT( 'ZDKB 출고' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'ZDKB 출고수량' ).
        LR_COLUMN->SET_LONG_TEXT( 'ZDKB 출고수량' ).
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'EFIMG' ).
        LR_COLUMN->SET_SHORT_TEXT( 'ZDKE 출고' ).
        LR_COLUMN->SET_MEDIUM_TEXT( 'ZDKE 출고수량' ).
        LR_COLUMN->SET_LONG_TEXT( 'ZDKE 출고수량' ).
        LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'REMAIN' ).
        LR_COLUMN->SET_SHORT_TEXT( '잔여수량' ).
        LR_COLUMN->SET_MEDIUM_TEXT( '잔여수량' ).
        LR_COLUMN->SET_LONG_TEXT( '잔여수량' ).

SALV - POPUP

        LR_TABLE->SET_SCREEN_POPUP(
          START_COLUMN = 1
          END_COLUMN  = 60
          START_LINE  = 1
          END_LINE    = 10 ).

SALV - DISPLAY

        LR_TABLE->DISPLAY( ).

DATA


*1. VMI 자재 연관 ZDKB 오더 + 출고 SELECT ------------------------------
  _ALPHA_I: P_KUNNR P_KUNNR, P_MATNR P_MATNR. _CLEARIT GT_ZDKBGI.

  SELECT A~VBELN A~POSNR C~LFIMG AS BFIMG C~MEINS "ZDKB

  INTO CORRESPONDING FIELDS OF TABLE GT_ZDKBGI
  FROM VBAP AS A
       JOIN VBAK AS B ON A~VBELN = B~VBELN "ZDKB
                     AND B~KUNNR = P_KUNNR
       JOIN LIPS AS C ON A~VBELN = C~VGBEL "ZDKB
                     AND A~POSNR = C~VGPOS

 WHERE A~PSTYV EQ 'ZKBN'
   AND A~ABGRU EQ C_SPACE
   AND A~MATNR EQ P_MATNR.



*2. ZDKB 오더 연관 ZDKE 오더 + 출고 SELECT -----------------------------
  IF GT_ZDKBGI[] IS NOT INITIAL.
    _CLEARIT GT_ZDKEGI.
    SELECT A~VGBEL AS VBELN A~VGPOS AS POSNR "ZDKB
           B~LFIMG AS EFIMG B~MEINS          "ZDKE

      INTO CORRESPONDING FIELDS OF TABLE GT_ZDKEGI
      FROM VBAP AS A
           JOIN LIPS AS B ON A~VBELN = B~VGBEL "ZDKE
                         AND A~POSNR = B~VGPOS

       FOR ALL ENTRIES IN GT_ZDKBGI
     WHERE A~VGBEL = GT_ZDKBGI-VBELN "ZDKB
       AND A~VGPOS = GT_ZDKBGI-POSNR

       AND A~PSTYV EQ 'ZKEN'
       AND A~ABGRU EQ C_SPACE.
  ENDIF.



*3. 출고 수량 COLLECT : 부분 납품건 수량 합계 --------------------------
  _CLEARIT: GT_ZDKBCOL, GT_ZDKECOL.

  LOOP AT GT_ZDKBGI.
    COLLECT GT_ZDKBGI INTO GT_ZDKBCOL. CLEAR: GT_ZDKBGI, GT_ZDKBCOL.
  ENDLOOP.

  LOOP AT GT_ZDKEGI.
    COLLECT GT_ZDKEGI INTO GT_ZDKECOL. CLEAR: GT_ZDKEGI, GT_ZDKECOL.
  ENDLOOP.



*4. 잔여 수량 계산 -----------------------------------------------------
  SORT GT_ZDKECOL BY VBELN POSNR. _CLEARIT GT_VMI.

  LOOP AT GT_ZDKBCOL.
    MOVE-CORRESPONDING GT_ZDKBCOL TO GT_VMI.
    GT_VMI-REMAIN = GT_ZDKBCOL-BFIMG.

    READ TABLE GT_ZDKECOL WITH KEY VBELN = GT_ZDKBCOL-VBELN
                                   POSNR = GT_ZDKBCOL-POSNR
                                   BINARY SEARCH.
    IF SY-SUBRC EQ 0.
      "잔여 수량 = ZDKB 출고수량 - ZDKE 출고수량
      GT_VMI-REMAIN = GT_ZDKBCOL-BFIMG - GT_ZDKECOL-EFIMG.
      GT_VMI-EFIMG  = GT_ZDKECOL-EFIMG. "ZDKE 출고수량
    ENDIF.

	"단위 환산
    CASE C_X.
      WHEN RB_M3.
        PERFORM GET_CHANGE_RATE_POPUP USING 'RB_M3' P_MATNR
       CHANGING GT_VMI-BFIMG GT_VMI-EFIMG GT_VMI-REMAIN GT_VMI-MEINS.
      WHEN RB_SA.
        PERFORM GET_CHANGE_RATE_POPUP USING 'RB_SA' P_MATNR
       CHANGING GT_VMI-BFIMG GT_VMI-EFIMG GT_VMI-REMAIN GT_VMI-MEINS.
    ENDCASE.

    APPEND GT_VMI. CLEAR: GT_ZDKBCOL, GT_ZDKECOL, GT_VMI.
  ENDLOOP.


  "ZDKE 잔량 0, 출고량 0이 아닌 경우 삭제
  DELETE GT_VMI WHERE REMAIN EQ 0 AND EFIMG NE 0.

0개의 댓글