본문 바로가기
ABAP/소스코드

[BTE] PROCESS_00001120 - 회계전표 품목 텍스트 대체

by name_text 2023. 7. 10.

BTE PROCESS_00001120

회계전표 품목 텍스트 대체

구매입고, 구매송장 회계전표의 품목 텍스트에 "공급업체코드/자재내역" 표기

 

# 소스코드

  DATA: LS_BKPF     LIKE LINE OF T_BKPF,
        LS_BSEG     LIKE LINE OF T_BSEG,
        LS_BSEC     LIKE LINE OF T_BSEC.
  FIELD-SYMBOLS: <LFS_BKPFSUB> LIKE LINE OF T_BKPFSUB,
                 <LFS_BSEGSUB> LIKE LINE OF T_BSEGSUB.
  DATA: LV_TABIX TYPE SY-TABIX.

* 구매오더 정보
  TYPES: BEGIN OF T_EKKO_EKPO,
    EBELN TYPE EKPO-EBELN,
    EBELP TYPE EKPO-EBELP,
    TXZ01 TYPE EKPO-TXZ01,
    LIFNR TYPE EKKO-LIFNR,
    END OF T_EKKO_EKPO.

  DATA: LV_LIFNR    TYPE LFA1-LIFNR,
        LV_LIFNR_T  TYPE LFA1-NAME1,
        LV_TXZ01    TYPE EKPO-TXZ01.
  DATA: LT_EKPO TYPE SORTED TABLE OF T_EKKO_EKPO WITH UNIQUE KEY EBELN EBELP,
        LS_EKPO LIKE LINE OF LT_EKPO.
  DATA: LT_MAKT TYPE SORTED TABLE OF MAKT WITH UNIQUE KEY MATNR SPRAS,
        LS_MAKT LIKE LINE OF LT_MAKT.

  READ TABLE T_BKPF INTO LS_BKPF INDEX 1.
  IF SY-SUBRC NE 0.
    EXIT.
  ENDIF.
*S> 구매 입고 및 송장의 GR/IR 품목 라인 및 부가세 라인 텍스트(SGTXT) 자동 설정
  "GR/IR 및 기타 계정 텍스트 : 공급업체/자재내역
  "부가세 텍스트 : 공급업체/공급업체명
  IF LS_BKPF-GLVOR EQ 'RMRP'      "송장
    OR LS_BKPF-GLVOR EQ 'RMWE'.   "입고
    CLEAR: LV_LIFNR, LV_LIFNR_T.
    "구매처 정보
    READ TABLE T_BSEG INTO LS_BSEG WITH KEY KOART = 'K'.
    IF SY-SUBRC EQ 0 AND LS_BSEG-LIFNR IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
        EXPORTING
          INPUT         = LS_BSEG-LIFNR
        IMPORTING
          OUTPUT        = LV_LIFNR
                .
      IF T_BSEC[] IS NOT INITIAL.
        READ TABLE T_BSEC INTO LS_BSEC INDEX 1.
        IF SY-SUBRC EQ 0.
          MOVE LS_BSEC-NAME1 TO LV_LIFNR_T.
        ENDIF.
      ENDIF.
      IF LS_BSEG-LIFNR IS NOT INITIAL AND LV_LIFNR_T IS INITIAL.
        SELECT SINGLE
          NAME1
        FROM LFA1
        WHERE LIFNR EQ @LS_BSEG-LIFNR
        INTO @LV_LIFNR_T.
      ENDIF.

      CONDENSE: LV_LIFNR, LV_LIFNR_T.
    ENDIF.
    "구매오더 품목 텍스트
    CLEAR LT_EKPO[].
    DATA(LT_TMP) = T_BSEG[].
    DELETE LT_TMP WHERE EBELN IS INITIAL OR EBELP IS INITIAL OR SGTXT IS NOT INITIAL.
    SORT LT_TMP BY EBELN EBELP.
    DELETE ADJACENT DUPLICATES FROM LT_TMP COMPARING EBELN EBELP.
    IF LT_TMP[] IS NOT INITIAL.
      SELECT
        A~EBELN, A~EBELP, A~TXZ01, B~LIFNR
      FROM EKPO AS A
        INNER JOIN EKKO AS B ON A~EBELN EQ B~EBELN
        FOR ALL ENTRIES IN @LT_TMP
      WHERE A~EBELN EQ @LT_TMP-EBELN
        AND A~EBELP EQ @LT_TMP-EBELP
      INTO CORRESPONDING FIELDS OF TABLE @LT_EKPO.
    ENDIF.
    "회계전표의 자재코드 텍스트
    CLEAR LT_MAKT[].
    DATA(LT_TMP2) = T_BSEG[].
    DELETE LT_TMP2 WHERE MATNR IS INITIAL OR SGTXT IS NOT INITIAL.
    SORT LT_TMP2 BY MATNR.
    DELETE ADJACENT DUPLICATES FROM LT_TMP2 COMPARING MATNR.
    IF LT_TMP2[] IS NOT INITIAL.
      SELECT
        MATNR, SPRAS, MAKTX
      FROM MAKT
        FOR ALL ENTRIES IN @LT_TMP2
      WHERE MATNR EQ @LT_TMP2-MATNR
      INTO CORRESPONDING FIELDS OF TABLE @LT_MAKT.
    ENDIF.
    "BSEG-SGTXT 대체
    LOOP AT T_BSEG INTO LS_BSEG WHERE SGTXT IS INITIAL.
      LV_TABIX = SY-TABIX.
      READ TABLE T_BSEGSUB ASSIGNING <LFS_BSEGSUB> WITH KEY TABIX = LV_TABIX.
      IF SY-SUBRC NE 0.
        CONTINUE.
      ENDIF.
      CASE LS_BSEG-KTOSL.
        WHEN 'VST'.   "부가세
          IF LV_LIFNR IS NOT INITIAL AND LV_LIFNR_T IS NOT INITIAL.
            CONCATENATE LV_LIFNR LV_LIFNR_T INTO <LFS_BSEGSUB>-SGTXT SEPARATED BY '/'.
          ENDIF.
        WHEN OTHERS.
          CLEAR: LV_TXZ01, LS_EKPO, LS_MAKT.
          IF LS_BSEG-EBELN IS NOT INITIAL AND LS_BSEG-EBELP IS NOT INITIAL.    "PO기준 입고 및 송장의 경우 구매오더의 품목 텍스트 이용
            READ TABLE LT_EKPO INTO LS_EKPO WITH TABLE KEY EBELN = LS_BSEG-EBELN
                                                           EBELP = LS_BSEG-EBELP.
            IF SY-SUBRC EQ 0.
              MOVE LS_EKPO-TXZ01 TO LV_TXZ01.
            ENDIF.
          ENDIF.
          IF LV_TXZ01 IS INITIAL AND LS_BSEG-MATNR IS NOT INITIAL.            "자재코드로 송장처리시 자재 마스터 내역 이용
            READ TABLE LT_MAKT INTO LS_MAKT WITH TABLE KEY MATNR = LS_BSEG-MATNR
                                                           SPRAS = SY-LANGU.
            IF SY-SUBRC NE 0.
              READ TABLE LT_MAKT INTO LS_MAKT WITH TABLE KEY MATNR = LS_BSEG-MATNR
                                                             SPRAS = '3'.
              IF SY-SUBRC NE 0.
                READ TABLE LT_MAKT INTO LS_MAKT WITH TABLE KEY MATNR = LS_BSEG-MATNR
                                                               SPRAS = 'E'.
              ENDIF.
            ENDIF.
            MOVE LS_MAKT-MAKTX TO LV_TXZ01.
          ENDIF.

          IF LV_LIFNR IS NOT INITIAL.
            CONCATENATE LV_LIFNR LV_TXZ01 INTO <LFS_BSEGSUB>-SGTXT SEPARATED BY '/'.
          ELSEIF LS_EKPO-LIFNR IS NOT INITIAL.     "회계문서에 구매처가 없을 경우 PO의 구매처 정보 이용
            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
              EXPORTING
                INPUT         = LS_EKPO-LIFNR
              IMPORTING
                OUTPUT        = LS_EKPO-LIFNR
                      .
            CONDENSE LS_EKPO-LIFNR.
            CONCATENATE LS_EKPO-LIFNR LV_TXZ01 INTO <LFS_BSEGSUB>-SGTXT SEPARATED BY '/'.
          ELSE.
            MOVE LV_TXZ01 TO <LFS_BSEGSUB>-SGTXT.
          ENDIF.
      ENDCASE.
    ENDLOOP.
  ENDIF.
*E> 구매송장의 GR/IR 품목 라인 및 부가세 라인 텍스트(SGTXT) 자동 설정
ABAP

 

댓글