SAP/ABAP 기초

(ABAP) BDC

haramang 2021. 7. 22. 17:35

BDC는 Batch Data Communication의 약자로, Batch 작업으로 Standard table에 있는 마스터성 데이터를 입력, 수정, 삭제를 하거나, Standard process를 진행할 떄 사용된다.

 

- 기본적인 BDC작업 방법과 예시

 

예) 코스트센터 신규 입력, 수정

 

1. KS01에서 리코딩을 먼저 진행한다.

  • SHDB (T-CODE) 에서 리코딩을 시작
  • Recording - 저장 될 리코딩 이름 / Transaction code - 어디서 리코딩 할지.. 현재 예시의 경우 KS01
  • 리코딩이 완성된 화면.

 

- TOP

 

*----------------------------------------------------------------------*

* INCLUDE, TABLES                                                      *

*----------------------------------------------------------------------*

TABLES CSKS.

 

 

*----------------------------------------------------------------------*

* INTERNAL TABLES                                                      *

*----------------------------------------------------------------------*

 

 

*----------------------------------------------------------------------*

* GLOBAL VARIABLES                                                     *

*----------------------------------------------------------------------*

DATA GV_COL_POS    TYPE I.

DATA GV_CHK        TYPE C.

DATA GV_ANSWER     TYPE C.

DATA GV_OKCODE     TYPE SY-UCOMM.

DATA G_RATE        TYPE C LENGTH 3.

 

 

*- ALV Listbox 관련

DATAGT_DROPDOWN TYPE LVC_T_DRAL,

      GS_DROPDOWN TYPE LVC_S_DRAL.

 

 

*- F4 관련 테이블

DATA F4_RETURN  LIKE TABLE OF DDSHRETVAL WITH HEADER LINE,

       LT_DYNMAPP TYPE TABLE OF DSELC      WITH HEADER LINE,

       LT_DYNTAB  TYPE TABLE OF STRING.

 

 

*- BDC 관련

DATA GS_BDC LIKE BDCDATA,

       GT_BDC LIKE TABLE OF BDCDATA.

 

DATA GS_MSG LIKE BDCMSGCOLL,

       GT_MSG LIKE TABLE OF BDCMSGCOLL.

 

DATA GS_OPT     TYPE CTU_PARAMS,

       GV_MOVE    LIKE CTU_PARAMS-DISMODE VALUE 'N',

       GV_MESSAGE LIKE BAPIRETURN-MESSAGE.

 

DATA:  gv_curr_year type sy-datum.

*----------------------------------------------------------------------*

* CONSTANTS                                                            *

*----------------------------------------------------------------------*

CONTROLS TAB_ST       TYPE TABSTRIP.

CONSTANTSC_KOKRS      TYPE KOKRS         VALUE '0001'.

CONSTANTSC_BUKRS      LIKE BKPF-BUKRS    VALUE '0001'.   "회사코드

CONSTANTSC_WAERS      TYPE WAERS         VALUE 'KRW'.    "기본통화키

CONSTANTSC_KRW        TYPE WAERS         VALUE 'KRW'.    "기본통화키

CONSTANTSC_SPRAS      TYPE SPRAS         VALUE '3'.      "언어

CONSTANTSC_99991231   TYPE DATBI         VALUE '99991231'.      "효력종료일

CONSTANTSC_X          TYPE C             VALUE 'X'.

CONSTANTSC_SPACE      TYPE C             VALUE ' '.

CONSTANTSC_1          TYPE C             VALUE '1'.

 

*----------------------------------------------------------------------*

* FIELD-SYMBOL                                                         *

*----------------------------------------------------------------------*

 

*----------------------------------------------------------------------*

* DEFINE                                                               *

*----------------------------------------------------------------------*

DEFINE CATALOG1.

  L_VALUE-KEY &1 .

  L_VALUE-TEXT &2 .

  APPEND L_VALUE TO L_LIST.

  CLEARL_VALUE.

END-OF-DEFINITION.

 

 

 

*----------------------------------------------------------------------*

* SELECT-OPTIONS & PARAMETERS                                          *

*----------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-B01.

 

PARAMETERS P_KOKRS TYPE KOKRS OBLIGATORY DEFAULT '0001'.

PARAMETERS P_KOSTL TYPE CSKS-KOSTL.

PARAMETERS P_KTEXT TYPE CSKT-KTEXT.

 

SELECTION-SCREEN END OF BLOCK B1.

 

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-B02.

 

 

SELECTION-SCREEN BEGIN OF LINE.

 

PARAMETERS P_CREATE RADIOBUTTON GROUP R1 USER-COMMAND UC DEFAULT 'X'.

SELECTION-SCREEN COMMENT 10(20)  TEXT-003 FOR FIELD P_CREATE.

 

 

PARAMETERS P_CHANGE RADIOBUTTON GROUP R1.

SELECTION-SCREEN COMMENT 40(20)  TEXT-004 FOR FIELD P_CHANGE.

SELECTION-SCREEN END OF LINE.

 

SELECTION-SCREEN END OF BLOCK B2.

 

SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TEXT-B03.

 

PARAMETERS P_MODE LIKE RFPDO-ALLGAZMD AS LISTBOX VISIBLE LENGTH 20 DEFAULT 'N'.

 

SELECTION-SCREEN END OF BLOCK B3.

 

**-- LAYOUT 설명

SELECTION-SCREEN COMMENT /01(83TEXT-C01 MODIF ID C01,

                   COMMENT /01(83TEXT-C02 MODIF ID C02.

 

 

 

 

 

- F01

*&---------------------------------------------------------------------*

*&      Form  MODIFY_SCREEN

*&---------------------------------------------------------------------*

FORM MODIFY_SCREEN.

 

  LOOP AT SCREEN.

 

    IF SCREEN-GROUP1 'C02'.

      SCREEN-INVISIBLE 0.

    ENDIF.

 

    "관리회계 영역 입력 불가

    CASE SCREEN-NAME.

      WHEN 'P_KOKRS'.

        SCREEN-INPUT 0.

    ENDCASE.

 

 

    "COMMENT 색상변경

    IF SCREEN-GROUP1 'C01'.

      SCREEN-INTENSIFIED '1'.

      SCREEN-COLOR '4'.

    ENDIF.

 

 

    "변경모드일 경우

    IF P_CHANGE 'X' AND SCREEN-GROUP1 'C02'.

      SCREEN-ACTIVE  0.

    ENDIF.

 

    MODIFY SCREEN.

  ENDLOOP.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  POP_UP

*&---------------------------------------------------------------------*

FORM POP_UP  USING    P_TEXT P_TITEL CHANGING P_ANSWER.

 

*- CANC = A, YES = J, NO = N, OPT1 = 1, OPT2 = 2.

 

  CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'

    EXPORTING

      DEFAULTOPTION  'J'                "default 값

      TEXTLINE1      P_TEXT

*     TEXTLINE2      = TEXT-002

      TITEL          P_TITEL

      CANCEL_DISPLAY 'X'

    IMPORTING

      ANSWER         P_ANSWER.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  INIT_DATA

*&---------------------------------------------------------------------*

FORM INIT_DATA.

 

  SY-TITLE '코스트센터 생성 / 변경 프로그램'.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  LISTBOX

*&---------------------------------------------------------------------*

FORM LISTBOX.

 

  DATAL_NAME     TYPE VRM_ID,

        L_LIST     TYPE VRM_VALUES,

        L_VALUE    LIKE LINE OF L_LIST,

        L_TEMP(20).

 

*- Set Listbox

  L_NAME 'P_MODE'.

 

  CATALOG1'A' 'Foreground 실행' ,

            'N' 'Background 실행' ,

            'E' 'Error Check' .

 

  SORT L_LIST DESCENDING.

 

  CALL FUNCTION 'VRM_SET_VALUES'

    EXPORTING

      ID     L_NAME

      VALUES L_LIST.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  BDC_CALL

*&---------------------------------------------------------------------*

FORM BDC_CALL.

 

 

*-- 필수 입력 체크

 

  IF P_KOKRS IS INITIAL.

    MESSAGE I000 WITH '관리회계 영역을 입력하시기 바랍니다.'.

    GV_CHK 'X'.

    EXIT.

  ENDIF.

 

  IF P_KOSTL IS INITIAL.

    MESSAGE I000 WITH '코스트센터를 입력하시기 바랍니다.'.

    GV_CHK 'X'.

    EXIT.

  ENDIF.

 

  IF P_KTEXT IS INITIAL.

    MESSAGE I000 WITH '코스트센터명을 입력하시기 바랍니다.'.

    GV_CHK 'X'.

    EXIT.

  ENDIF.

 

  CHECK GV_CHK IS INITIAL.

 

  CASE 'X'.

    WHEN P_CREATE.            "코스트센터 생성

      PERFORM COST_CREATE.

 

    WHEN  P_CHANGE.           "코스트센터 변경

      PERFORM COST_CHANGE.

  ENDCASE.

 

 

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  DYNPRO

*&---------------------------------------------------------------------*

FORM DYNPRO  USING PV_CHECK PV_NAME PV_VALUE.

 

  CLEAR GS_BDC.

  IF PV_CHECK C_X.

    GS_BDC-DYNBEGIN C_X.

    GS_BDC-PROGRAM  PV_NAME.

    GS_BDC-DYNPRO   PV_VALUE.

    APPEND GS_BDC TO GT_BDC.

  ELSE.

    GS_BDC-FNAM     PV_NAME.

    GS_BDC-FVAL     PV_VALUE.

    APPEND GS_BDC TO GT_BDC.

  ENDIF.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  MESSAGE_TEXT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM MESSAGE_TEXT .

 

  CLEAR GV_MESSAGE.

 

  CALL FUNCTION 'MESSAGE_TEXT_BUILD'

    EXPORTING

      MSGID               GS_MSG-MSGID

      MSGNR               GS_MSG-MSGNR

      MSGV1               GS_MSG-MSGV1

      MSGV2               GS_MSG-MSGV2

      MSGV3               GS_MSG-MSGV3

      MSGV4               GS_MSG-MSGV4

    IMPORTING

      MESSAGE_TEXT_OUTPUT GV_MESSAGE.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  COST_CREATE

*&---------------------------------------------------------------------*

*       코스트센터 생성

*----------------------------------------------------------------------*

FORM COST_CREATE .

 

 

*-- 코스트센터 생성여부 체크

  SELECT SINGLE *

   FROM CSKS

   WHERE KOKRS P_KOKRS

   AND   KOSTL P_KOSTL

   AND   DATBI C_99991231.    "효력 종료일

 

  IF SY-SUBRC 0.

    MESSAGE I000 WITH '이미 존재하는 코스트센터입니다.'.

    GV_CHK 'X'.

  ENDIF.

 

  CHECK GV_CHK IS INITIAL.

 

  PERFORM POP_UP        USING TEXT-001     "코스트센터 생성을 하시겠습니까?

                              TEXT-002     "코스트센터 생성 확인

                        CHANGING GV_ANSWER.

 

  CHECK GV_ANSWER 'J'.

 

  gv_curr_year sy-datum(4&& '0101'.

 

  CLEAR GT_BDCGT_MSG.

 

*-- BDC CALL

 

  PERFORM DYNPRO USING :

     'X' 'SAPLKMA1'          '0200',

     ' ' 'BDC_OKCODE'        '/00',

     ' ' 'CSKSZ-KOKRS'        P_KOKRS,        "관리회계영역

     ' ' 'CSKSZ-KOSTL'        P_KOSTL,        "코스트센터명

     ' ' 'CSKSZ-DATAB_ANFO'   gv_curr_year,   "효력 시작일(FROM)

     ' ' 'CSKSZ-DATBI_ANFO'   C_99991231.     "효력 시작일(TO)

 

 

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'     '0299',

   ' ' 'BDC_OKCODE'   '=ADRE',

   ' ' 'CSKSZ-KTEXT'   P_KTEXT,              "이름

   ' ' 'CSKSZ-LTEXT'   P_KTEXT,              "내역

   ' ' 'CSKSZ-VERAK'   SY-UNAME,             "책임자

   ' ' 'CSKSZ-KOSAR'  'L',                   "코스트센터 범주

   ' ' 'CSKSZ-KHINR'  '0001',                "계층구조 영역

   ' ' 'CSKSZ-WAERS'  'USD' ,                "통화키

   ' ' 'CSKSZ-PRCTR'  '9999'.                "손익센터

 

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'      '0299',

   ' ' 'BDC_OKCODE'    '=KOMM',

   ' ' 'CSKSZ-ANRED'   '프로젝트'.

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'       '0299',

   ' ' 'BDC_OKCODE'    '=BU',

   ' ' 'CSKSZ-SPRAS'   'KO'.

 

 

  CALL TRANSACTION 'KS01'

             USING GT_BDC

              MODE P_MODE

     MESSAGES INTO GT_MSG.

 

  IF GT_MSG IS INITIAL.   "성공시 GT_MSG에 값이 안 들어옴

    GV_MESSAGE '[' && P_KOSTL && '] 코스트센터 생성에 성공했습니다.'.

 

  ELSE.

    READ TABLE GT_MSG INTO GS_MSG WITH KEY MSGTYP 'E'.    "에러

    IF SY-SUBRC 0.

      PERFORM MESSAGE_TEXT.

    ENDIF.

 

  ENDIF.

 

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  COST_CHANGE

*&---------------------------------------------------------------------*

*       코스트센터 변경

*----------------------------------------------------------------------*

FORM COST_CHANGE .

 

*-- 코스트센터 마스터 체크

  SELECT SINGLE *

   FROM CSKS

   WHERE KOKRS P_KOKRS

   AND   KOSTL P_KOSTL

   AND   DATBI C_99991231.    "효력 종료일

 

 

  IF SY-SUBRC NE 0.

    MESSAGE I000 WITH '존재하지 않는 코스트센터입니다.'.

    GV_CHK 'X'.

  ENDIF.

 

  CHECK GV_CHK IS INITIAL.

 

  PERFORM POP_UP        USING TEXT-005     "코스트센터명을 변경 하시겠습니까?

                              TEXT-006     "코스트센터명 변경 확인

                        CHANGING GV_ANSWER.

 

  CHECK GV_ANSWER 'J'.

 

  CLEAR GT_BDCGT_MSG.

 

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'    '0200',

   ' ' 'BDC_OKCODE'  '/00',

   ' ' 'CSKSZ-KOKRS' P_KOKRS,

   ' ' 'CSKSZ-KOSTL' P_KOSTL.

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'    '0299',

   ' ' 'BDC_OKCODE'  '=BU',

   ' ' 'BDC_SUBSCR'  'SAPLKMA1                                0300SUBSCREEN_EINZEL',

   ' ' 'CSKSZ-KTEXT'  P_KTEXT,

   ' ' 'CSKSZ-LTEXT'  P_KTEXT.

 

  CALL TRANSACTION 'KS02' USING GT_BDC MODE P_MODE MESSAGES INTO GT_MSG.

 

 

  IF GT_MSG IS INITIAL.   "성공시 GT_MSG에 값이 안 들어옴

    GV_MESSAGE '[' && P_KOSTL && '] 코스트센터 변경에 성공했습니다.'.

 

  ELSE.

    READ TABLE GT_MSG INTO GS_MSG WITH KEY MSGTYP 'E'.  "에러

    IF SY-SUBRC 0.

      PERFORM MESSAGE_TEXT.

 

    ELSE.

      READ TABLE GT_MSG INTO GS_MSG WITH KEY MSGTYP 'S'"변경사항이 없는 경우

      PERFORM MESSAGE_TEXT.

    ENDIF.

 

  ENDIF.

 

 

ENDFORM.

*&---------------------------------------------------------------------*

*&        FORM   F4_KOSTL

*&---------------------------------------------------------------------*

FORM F4_KOSTL             USING PF_KOSTL.

 

  DATA BEGIN OF LS_KOSTL,

           KOSTL LIKE CSKS-KOSTL,

           KTEXT LIKE CSKT-KTEXT,

         END OF LS_KOSTL,

         LT_KOSTL LIKE TABLE OF LS_KOSTL.

 

  CLEAR LT_DYNMAPPLT_DYNTAB.

 

  LT_DYNMAPP-FLDNAME   'F0001'.      "첫번째값

  LT_DYNMAPP-DYFLDNAME PF_KOSTL.

  APPEND LT_DYNMAPP.

 

 

*- SELECT문

  APPEND 'SPRAS = SY-LANGU'         TO LT_DYNTAB.

  APPEND 'AND KOKRS = P_KOKRS'      TO LT_DYNTAB.

  APPEND 'AND DATBI = C_99991231'   TO LT_DYNTAB.

 

  SELECT KOSTL KTEXT

  INTO CORRESPONDING FIELDS OF TABLE LT_KOSTL

  FROM CSKT

  WHERE (LT_DYNTAB).

 

  SORT LT_KOSTL BY KOSTL.

 

 

*-> CALL FUNCTION

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'

    EXPORTING

      RETFIELD        'KOSTL'

      DYNPPROG        SY-CPROG

      DYNPNR          SY-DYNNR

      DYNPROFIELD     LT_DYNMAPP-DYFLDNAME

      WINDOW_TITLE    '코스트센터'

      VALUE_ORG       'S'

    TABLES

      VALUE_TAB       LT_KOSTL

      DYNPFLD_MAPPING LT_DYNMAPP

    EXCEPTIONS

      PARAMETER_ERROR 1

      NO_VALUES_FOUND 2

      OTHERS          3.

 

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  MODIFY_SCREEN

*&---------------------------------------------------------------------*

FORM MODIFY_SCREEN.

 

  LOOP AT SCREEN.

 

    IF SCREEN-GROUP1 'C02'.

      SCREEN-INVISIBLE 0.

    ENDIF.

 

    "관리회계 영역 입력 불가

    CASE SCREEN-NAME.

      WHEN 'P_KOKRS'.

        SCREEN-INPUT 0.

    ENDCASE.

 

 

    "COMMENT 색상변경

    IF SCREEN-GROUP1 'C01'.

      SCREEN-INTENSIFIED '1'.

      SCREEN-COLOR '4'.

    ENDIF.

 

 

    "변경모드일 경우

    IF P_CHANGE 'X' AND SCREEN-GROUP1 'C02'.

      SCREEN-ACTIVE  0.

    ENDIF.

 

    MODIFY SCREEN.

  ENDLOOP.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  POP_UP

*&---------------------------------------------------------------------*

FORM POP_UP  USING    P_TEXT P_TITEL CHANGING P_ANSWER.

 

*- CANC = A, YES = J, NO = N, OPT1 = 1, OPT2 = 2.

 

  CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'

    EXPORTING

      DEFAULTOPTION  'J'                "default 값

      TEXTLINE1      P_TEXT

*     TEXTLINE2      = TEXT-002

      TITEL          P_TITEL

      CANCEL_DISPLAY 'X'

    IMPORTING

      ANSWER         P_ANSWER.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  INIT_DATA

*&---------------------------------------------------------------------*

FORM INIT_DATA.

 

  SY-TITLE '코스트센터 생성 / 변경 프로그램'.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  LISTBOX

*&---------------------------------------------------------------------*

FORM LISTBOX.

 

  DATAL_NAME     TYPE VRM_ID,

        L_LIST     TYPE VRM_VALUES,

        L_VALUE    LIKE LINE OF L_LIST,

        L_TEMP(20).

 

*- Set Listbox

  L_NAME 'P_MODE'.

 

  CATALOG1'A' 'Foreground 실행' ,

            'N' 'Background 실행' ,

            'E' 'Error Check' .

 

  SORT L_LIST DESCENDING.

 

  CALL FUNCTION 'VRM_SET_VALUES'

    EXPORTING

      ID     L_NAME

      VALUES L_LIST.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  BDC_CALL

*&---------------------------------------------------------------------*

FORM BDC_CALL.

 

 

*-- 필수 입력 체크

 

  IF P_KOKRS IS INITIAL.

    MESSAGE I000 WITH '관리회계 영역을 입력하시기 바랍니다.'.

    GV_CHK 'X'.

    EXIT.

  ENDIF.

 

  IF P_KOSTL IS INITIAL.

    MESSAGE I000 WITH '코스트센터를 입력하시기 바랍니다.'.

    GV_CHK 'X'.

    EXIT.

  ENDIF.

 

  IF P_KTEXT IS INITIAL.

    MESSAGE I000 WITH '코스트센터명을 입력하시기 바랍니다.'.

    GV_CHK 'X'.

    EXIT.

  ENDIF.

 

  CHECK GV_CHK IS INITIAL.

 

  CASE 'X'.

    WHEN P_CREATE.            "코스트센터 생성

      PERFORM COST_CREATE.

 

    WHEN  P_CHANGE.           "코스트센터 변경

      PERFORM COST_CHANGE.

  ENDCASE.

 

 

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  DYNPRO

*&---------------------------------------------------------------------*

FORM DYNPRO  USING PV_CHECK PV_NAME PV_VALUE.

 

  CLEAR GS_BDC.

  IF PV_CHECK C_X.

    GS_BDC-DYNBEGIN C_X.

    GS_BDC-PROGRAM  PV_NAME.

    GS_BDC-DYNPRO   PV_VALUE.

    APPEND GS_BDC TO GT_BDC.

  ELSE.

    GS_BDC-FNAM     PV_NAME.

    GS_BDC-FVAL     PV_VALUE.

    APPEND GS_BDC TO GT_BDC.

  ENDIF.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  MESSAGE_TEXT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM MESSAGE_TEXT .

 

  CLEAR GV_MESSAGE.

 

  CALL FUNCTION 'MESSAGE_TEXT_BUILD'

    EXPORTING

      MSGID               GS_MSG-MSGID

      MSGNR               GS_MSG-MSGNR

      MSGV1               GS_MSG-MSGV1

      MSGV2               GS_MSG-MSGV2

      MSGV3               GS_MSG-MSGV3

      MSGV4               GS_MSG-MSGV4

    IMPORTING

      MESSAGE_TEXT_OUTPUT GV_MESSAGE.

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  COST_CREATE

*&---------------------------------------------------------------------*

*       코스트센터 생성

*----------------------------------------------------------------------*

FORM COST_CREATE .

 

 

*-- 코스트센터 생성여부 체크

  SELECT SINGLE *

   FROM CSKS

   WHERE KOKRS P_KOKRS

   AND   KOSTL P_KOSTL

   AND   DATBI C_99991231.    "효력 종료일

 

  IF SY-SUBRC 0.

    MESSAGE I000 WITH '이미 존재하는 코스트센터입니다.'.

    GV_CHK 'X'.

  ENDIF.

 

  CHECK GV_CHK IS INITIAL.

 

  PERFORM POP_UP        USING TEXT-001     "코스트센터 생성을 하시겠습니까?

                              TEXT-002     "코스트센터 생성 확인

                        CHANGING GV_ANSWER.

 

  CHECK GV_ANSWER 'J'.

 

  gv_curr_year sy-datum(4&& '0101'.

 

  CLEAR GT_BDCGT_MSG.

 

*-- BDC CALL

 

  PERFORM DYNPRO USING :

     'X' 'SAPLKMA1'          '0200',

     ' ' 'BDC_OKCODE'        '/00',

     ' ' 'CSKSZ-KOKRS'        P_KOKRS,        "관리회계영역

     ' ' 'CSKSZ-KOSTL'        P_KOSTL,        "코스트센터명

     ' ' 'CSKSZ-DATAB_ANFO'   gv_curr_year,   "효력 시작일(FROM)

     ' ' 'CSKSZ-DATBI_ANFO'   C_99991231.     "효력 시작일(TO)

 

 

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'     '0299',

   ' ' 'BDC_OKCODE'   '=ADRE',

   ' ' 'CSKSZ-KTEXT'   P_KTEXT,              "이름

   ' ' 'CSKSZ-LTEXT'   P_KTEXT,              "내역

   ' ' 'CSKSZ-VERAK'   SY-UNAME,             "책임자

   ' ' 'CSKSZ-KOSAR'  'L',                   "코스트센터 범주

   ' ' 'CSKSZ-KHINR'  '0001',                "계층구조 영역

   ' ' 'CSKSZ-WAERS'  'USD' ,                "통화키

   ' ' 'CSKSZ-PRCTR'  '9999'.                "손익센터

 

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'      '0299',

   ' ' 'BDC_OKCODE'    '=KOMM',

   ' ' 'CSKSZ-ANRED'   '프로젝트'.

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'       '0299',

   ' ' 'BDC_OKCODE'    '=BU',

   ' ' 'CSKSZ-SPRAS'   'KO'.

 

 

  CALL TRANSACTION 'KS01'

             USING GT_BDC

              MODE P_MODE

     MESSAGES INTO GT_MSG.

 

  IF GT_MSG IS INITIAL.   "성공시 GT_MSG에 값이 안 들어옴

    GV_MESSAGE '[' && P_KOSTL && '] 코스트센터 생성에 성공했습니다.'.

 

  ELSE.

    READ TABLE GT_MSG INTO GS_MSG WITH KEY MSGTYP 'E'.    "에러

    IF SY-SUBRC 0.

      PERFORM MESSAGE_TEXT.

    ENDIF.

 

  ENDIF.

 

 

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  COST_CHANGE

*&---------------------------------------------------------------------*

*       코스트센터 변경

*----------------------------------------------------------------------*

FORM COST_CHANGE .

 

*-- 코스트센터 마스터 체크

  SELECT SINGLE *

   FROM CSKS

   WHERE KOKRS P_KOKRS

   AND   KOSTL P_KOSTL

   AND   DATBI C_99991231.    "효력 종료일

 

 

  IF SY-SUBRC NE 0.

    MESSAGE I000 WITH '존재하지 않는 코스트센터입니다.'.

    GV_CHK 'X'.

  ENDIF.

 

  CHECK GV_CHK IS INITIAL.

 

  PERFORM POP_UP        USING TEXT-005     "코스트센터명을 변경 하시겠습니까?

                              TEXT-006     "코스트센터명 변경 확인

                        CHANGING GV_ANSWER.

 

  CHECK GV_ANSWER 'J'.

 

  CLEAR GT_BDCGT_MSG.

 

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'    '0200',

   ' ' 'BDC_OKCODE'  '/00',

   ' ' 'CSKSZ-KOKRS' P_KOKRS,

   ' ' 'CSKSZ-KOSTL' P_KOSTL.

 

  PERFORM DYNPRO USING :

   'X' 'SAPLKMA1'    '0299',

   ' ' 'BDC_OKCODE'  '=BU',

   ' ' 'BDC_SUBSCR'  'SAPLKMA1                                0300SUBSCREEN_EINZEL',

   ' ' 'CSKSZ-KTEXT'  P_KTEXT,

   ' ' 'CSKSZ-LTEXT'  P_KTEXT.

 

  CALL TRANSACTION 'KS02' USING GT_BDC MODE P_MODE MESSAGES INTO GT_MSG.

 

 

  IF GT_MSG IS INITIAL.   "성공시 GT_MSG에 값이 안 들어옴

    GV_MESSAGE '[' && P_KOSTL && '] 코스트센터 변경에 성공했습니다.'.

 

  ELSE.

    READ TABLE GT_MSG INTO GS_MSG WITH KEY MSGTYP 'E'.  "에러

    IF SY-SUBRC 0.

      PERFORM MESSAGE_TEXT.

 

    ELSE.

      READ TABLE GT_MSG INTO GS_MSG WITH KEY MSGTYP 'S'"변경사항이 없는 경우

      PERFORM MESSAGE_TEXT.

    ENDIF.

 

  ENDIF.

 

 

ENDFORM.

*&---------------------------------------------------------------------*

*&        FORM   F4_KOSTL

*&---------------------------------------------------------------------*

FORM F4_KOSTL             USING PF_KOSTL.

 

  DATA BEGIN OF LS_KOSTL,

           KOSTL LIKE CSKS-KOSTL,

           KTEXT LIKE CSKT-KTEXT,

         END OF LS_KOSTL,

         LT_KOSTL LIKE TABLE OF LS_KOSTL.

 

  CLEAR LT_DYNMAPPLT_DYNTAB.

 

  LT_DYNMAPP-FLDNAME   'F0001'.      "첫번째값

  LT_DYNMAPP-DYFLDNAME PF_KOSTL.

  APPEND LT_DYNMAPP.

 

 

*- SELECT문

  APPEND 'SPRAS = SY-LANGU'         TO LT_DYNTAB.

  APPEND 'AND KOKRS = P_KOKRS'      TO LT_DYNTAB.

  APPEND 'AND DATBI = C_99991231'   TO LT_DYNTAB.

 

  SELECT KOSTL KTEXT

  INTO CORRESPONDING FIELDS OF TABLE LT_KOSTL

  FROM CSKT

  WHERE (LT_DYNTAB).

 

  SORT LT_KOSTL BY KOSTL.

 

 

*-> CALL FUNCTION

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'

    EXPORTING

      RETFIELD        'KOSTL'

      DYNPPROG        SY-CPROG

      DYNPNR          SY-DYNNR

      DYNPROFIELD     LT_DYNMAPP-DYFLDNAME

      WINDOW_TITLE    '코스트센터'

      VALUE_ORG       'S'

    TABLES

      VALUE_TAB       LT_KOSTL

      DYNPFLD_MAPPING LT_DYNMAPP

    EXCEPTIONS

      PARAMETER_ERROR 1

      NO_VALUES_FOUND 2

      OTHERS          3.

 

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

 

ENDFORM.

 

 

- MAIN

*----------------------------------------------------------------------*

* INITIALIZATION                                                       *

*----------------------------------------------------------------------*

INITIALIZATION.

  PERFORM INIT_DATA.

 

*----------------------------------------------------------------------*

* AT SELECTION-SCREEN                                                  *

*----------------------------------------------------------------------*

AT SELECTION-SCREEN.

 

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_KOSTL.

  PERFORM F4_KOSTL           USING 'P_KOSTL'.

 

*----------------------------------------------------------------------*

* AT SELECTION-SCREEN OUTPUT                                           *

*----------------------------------------------------------------------*

AT SELECTION-SCREEN OUTPUT.

  PERFORM MODIFY_SCREEN.

  PERFORM LISTBOX.

 

*----------------------------------------------------------------------*

* START-OF-SELECTION                                                   *

*----------------------------------------------------------------------*

START-OF-SELECTION.

  CHECK GV_CHK ''.

  PERFORM BDC_CALL.

 

*----------------------------------------------------------------------*

* END-OF-SELECTION                                                     *

*----------------------------------------------------------------------*

END-OF-SELECTION.

CHECK GV_CHK IS INITIAL.

WRITE GV_MESSAGE.