bdc另外程序

*&---------------------------------------------------------------------*
************************************************************************
*&PROGRAM        :/TDK/CB00120
*&CREATED BY     :Yueming.Li(SAE)
*&DATE           :2011/08/03
*&DESCRIPTION    :This program is used to update selection valiables
*&                which are used in variant for batch job.
*&
************************************************************************
*&CHANGE LOG
*&DATE            NO              CHANGED BY            CONTENTS
*&--------     ---------         -------------    ----------------------
*&
*&---------------------------------------------------------------------*
*& Report  /TDK/CB00120
*&---------------------------------------------------------------------*

REPORT  /TDK/CB00120.

*----------------------------------------------------------------------*
* TABLES
*----------------------------------------------------------------------*
TABLES: TVARVC,
        T001,
        T100.

*----------------------------------------------------------------------*
* TYPES
*----------------------------------------------------------------------*
TYPES: BEGIN OF TYP_VARIANLIST,
         NAME  LIKE TVARVC-NAME,  " Name of Variant Variable
         TYPE  LIKE TVARVC-TYPE,  " Type of selection
         LOW   LIKE TVARVC-LOW,   " Selection value (LOW or HIGH value, external format)
         HIGH  LIKE TVARVC-HIGH,  " Selection value (LOW or HIGH value, external format)
         FLG   TYPE CHAR1,        " Flg for update. T: sucessfully; F: Failed
       END OF TYP_VARIANLIST.
*----------------------------------------------------------------------*
* CONSTANTS
*----------------------------------------------------------------------*
CONSTANTS: C_PLUS   TYPE CHAR1
                    VALUE '+',
           C_X      TYPE CHAR1
                    VALUE 'X',
           C_1      TYPE CHAR1
                    VALUE '1',
           C_2      TYPE CHAR1
                    VALUE '2',
           C_PNAME  TYPE CHAR8       " Program name for BDC
                    VALUE 'SAPMS38V',
           C_1100   TYPE CHAR4       " Screen number 1100
                    VALUE '1100',
           C_1200   TYPE CHAR4       " Screen number 1200
                    VALUE '1200',
           C_OKCODE TYPE CHAR10      " OKCODE
                    VALUE 'BDC_OKCODE',
           C_STVARV TYPE CHAR6
                    VALUE 'STVARV',
           C_1STDAY TYPE CHAR28  " 1st day of current period
                    VALUE 'WAVE_F040_CUR_PERIOD_1ST_DAY',
           C_LSTDAY TYPE CHAR29  " Last day of current period
                    VALUE 'WAVE_F040_CUR_PERIOD_LAST_DAY',
           C_RDAY   TYPE CHAR28  " Range: 1st day - last day of current period
                    VALUE 'WAVE_F040_CUR_PERIOD_1ST_END',
           C_PYEAR  TYPE CHAR18  " Fiscal year for previous month
                    VALUE 'WAVE_F040_PRE_YEAR',
           C_PPOPER TYPE CHAR20  " Fiscal period for previous month
                    VALUE 'WAVE_F040_PRE_PERIOD',
           C_CYEAR  TYPE CHAR18  " Fiscal year for current month
                    VALUE 'WAVE_F040_CUR_YEAR',
           C_CPOPER TYPE CHAR20  " Fiscal period for current month
                    VALUE 'WAVE_F040_CUR_PERIOD',
           C_NYEAR  TYPE CHAR19  " Fiscal year for next month
                    VALUE 'WAVE_F040_NEXT_YEAR',
           C_NPOPER TYPE CHAR21  " Fiscal period for next month
                    VALUE 'WAVE_F040_NEXT_PERIOD'.

*----------------------------------------------------------------------*
* DATA
*----------------------------------------------------------------------*
DATA: W_STR      TYPE STRING,       " Message string
      W_BUKRS    LIKE T001-BUKRS,   " Company Code
      W_SUBRC    LIKE SY-SUBRC,     " Return value
      W_P1STDAY  LIKE SY-DATUM,     " 1 month later for 1st day
      W_PLSTDAY  LIKE SY-DATUM,     " 1 month later for Last day
      W_PP1STDAY LIKE SY-DATUM,     " 2 month later for 1st day
      W_PPLSTDAY LIKE SY-DATUM.     " 2 month later for Last day

DATA: TD_VARIANLIST TYPE STANDARD TABLE OF TYP_VARIANLIST,
      TH_VARIANLIST LIKE LINE OF TD_VARIANLIST,
      TD_BDCDATA TYPE STANDARD TABLE OF BDCDATA,
      TH_BDCDATA TYPE BDCDATA.
*----------------------------------------------------------------------*
* PARAMETERS/SELECT-OPTION
*----------------------------------------------------------------------*
PARAMETERS: P_BUKRS  LIKE T001-BUKRS  OBLIGATORY,  " Company Code
            P_FDATUM LIKE SY-DATUM    OBLIGATORY,  " First day
            P_LDATUM LIKE SY-DATUM    OBLIGATORY.  " Last day

SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME. TITLE TEXT-001. "Selection Variables

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-002.
    PARAMETERS: P_1STDAY LIKE TVARVC-NAME.  " 1st day of current period
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-003.
    PARAMETERS: P_LSTDAY LIKE TVARVC-NAME.  " Last day of current period
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-004.
    PARAMETERS: P_RDAY   LIKE TVARVC-NAME.  " Range: 1st day - last day of current period
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-005.
    PARAMETERS: P_PYEAR  LIKE TVARVC-NAME.  " Fiscal year for previous month
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-006.
    PARAMETERS: P_PPOPER LIKE TVARVC-NAME.  " Fiscal period for previous month
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-007.
    PARAMETERS: P_CYEAR  LIKE TVARVC-NAME.  " Fiscal year for current month
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-008.
    PARAMETERS: P_CPOPER LIKE TVARVC-NAME.  " Fiscal period for current month
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-009.
    PARAMETERS: P_NYEAR  LIKE TVARVC-NAME.  " Fiscal year for next month
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-010.
    PARAMETERS: P_NPOPER LIKE TVARVC-NAME.  " Fiscal period for next month
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN COMMENT (43) TEXT-011.
    PARAMETERS: P_RCPOPE LIKE TVARVC-NAME.  "Range:Current Period
  SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK B1.

*----------------------------------------------------------------------*
* INITIALIZATION
*----------------------------------------------------------------------*
INITIALIZATION.

CLEAR: W_STR,     " Message string
       W_BUKRS,   " Company Code
       W_SUBRC,   " Return value
       W_P1STDAY, " 1 month later for 1st day
       W_PLSTDAY, " 1 month later for Last day
       W_PP1STDAY," 2 month later for 1st day
       W_PPLSTDAY." 2 month later for Last day

CLEAR: TD_VARIANLIST,
       TH_VARIANLIST.

REFRESH: TD_VARIANLIST.
*----------------------------------------------------------------------*
*      AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.

  "Check Input Parameter
  "Check the existence of Company code.
  SELECT SINGLE BUKRS   " Company Code
    INTO W_BUKRS
    FROM T001
   WHERE BUKRS = P_BUKRS.
  IF SY-SUBRC <> 0.
    CONCATENATE 'Company Code'
                P_BUKRS
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Check the existence of Selection Variables.
  "1st day of current period
  PERFORM. FRM_CHECK_VARIAN
             USING
                   P_1STDAY
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_1STDAY
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Last day of current period
  PERFORM. FRM_CHECK_VARIAN
             USING
                   P_LSTDAY
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_LSTDAY
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Range: 1st day - last day of current period
  PERFORM. FRM_CHECK_VARIAN
             USING
                   P_RDAY
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_RDAY
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Fiscal year for previous month
  PERFORM. FRM_CHECK_VARIAN
             USING
                   P_PYEAR
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_PYEAR
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Fiscal period for previous month
  PERFORM. FRM_CHECK_VARIAN
             USING
                   P_PPOPER
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_PPOPER
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Fiscal year for current month
  PERFORM. FRM_CHECK_VARIAN
             USING
                   P_CYEAR
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_CYEAR
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Fiscal period for current month
  PERFORM. FRM_CHECK_VARIAN
             USING
                   P_CPOPER
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_CPOPER
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Fiscal year for next month
  PERFORM. FRM_CHECK_VARIAN
             USING
                   P_NYEAR
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_NYEAR
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Fiscal period for next month
    PERFORM. FRM_CHECK_VARIAN
             USING
                   P_NPOPER
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_NPOPER
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  "Range for Current Period
    PERFORM. FRM_CHECK_VARIAN
             USING
                   P_RCPOPE
             CHANGING
                   W_SUBRC.
  IF W_SUBRC <> 0.
    CONCATENATE 'Selection Variable'
                P_RCPOPE
                'does not exist.'
           INTO W_STR
           SEPARATED BY SPACE.
    MESSAGE W_STR TYPE 'E'.
  ENDIF.

  IF TD_VARIANLIST IS INITIAL.
    MESSAGE 'Please input Selection Variable.' TYPE 'E'.
  ENDIF.

*----------------------------------------------------------------------*
*      START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.

  " Calculate the data
  PERFORM. FRM_CALCU_DATA.

  " Execute batch input to update selection variables.
  PERFORM. FRM_UPDATE_DATA.

  " Output result
  PERFORM. FRM_OUTPUT_RESULT.

*----------------------------------------------------------------------*
*      END-OF-SELECTION
*----------------------------------------------------------------------*
END-OF-SELECTION.

*----------------------------------------------------------------------*
*      TOP-OF-PAGE
*----------------------------------------------------------------------*
TOP-OF-PAGE.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&gt  p1        text
*  *----------------------------------------------------------------------*
FORM. FRM_CHECK_VARIAN
         USING
           PI_NAME LIKE TVARVC-NAME
         CHANGING PO_SUBRC LIKE SY-SUBRC.

  DATA: LW_NAME LIKE TVARVC-NAME, " Name of Variant Variable
        LW_TYPE LIKE TVARVC-TYPE. " Type of selection

  CLEAR: TH_VARIANLIST.

  PO_SUBRC = 0.

  IF PI_NAME IS INITIAL.
    EXIT.
  ENDIF.

  SELECT SINGLE
         NAME  " Name of Variant Variable
         TYPE  " Type of selection
    INTO (LW_NAME,
          LW_TYPE)
    FROM TVARVC
   WHERE NAME = PI_NAME.

  PO_SUBRC = SY-SUBRC.
  IF SY-SUBRC = 0.
    TH_VARIANLIST-NAME = LW_NAME.
    TH_VARIANLIST-TYPE = LW_TYPE.
    APPEND TH_VARIANLIST TO TD_VARIANLIST.
  ELSE.
    EXIT.
  ENDIF.

ENDFORM.    " FRM_CHECK_VARIAN

*&---------------------------------------------------------------------*
*&      Form  FRM_CALCU_DATA
*&---------------------------------------------------------------------*
*       text  Calculate the data
*----------------------------------------------------------------------*
*  --&gt  p1        text
*  *----------------------------------------------------------------------*
FORM. FRM_CALCU_DATA.

  CLEAR: W_P1STDAY, " 1 month later for 1st day
         W_PLSTDAY, " 1 month later for Last day
         W_PP1STDAY," 2 month later for 1st day
         W_PPLSTDAY." 2 month later for Last day

  " Calculate 1 month later for 1st day and last day of current period.
  PERFORM. FRM_CALCU_DAY
              USING
                P_FDATUM   " First day
                P_LDATUM   " Last day
                '1'        " Range months
              CHANGING
                W_P1STDAY  " 1 month later for 1st day
                W_PLSTDAY. " 1 month later for Last day

  " Calculate 2 months later for the end date of current period
  PERFORM. FRM_CALCU_DAY
              USING
                P_FDATUM   " First day
                P_LDATUM   " Last day
                '2'        " Range months
              CHANGING
                W_PP1STDAY  " 2 months later for 1st day
                W_PPLSTDAY. " 2 months later for Last day

  " Determine fiscal period and fiscal year of above dates.
  PERFORM. FRM_CALCU_PERIOD_YEAR
              USING
                p_BUKRS     " Company code
                P_FDATUM    " First day
                W_P1STDAY   " 1 month later for 1st day
                W_PP1STDAY. " 2 months later for 1st day

  " 1st day of current period
  CLEAR: TH_VARIANLIST.
  READ TABLE TD_VARIANLIST
       INTO TH_VARIANLIST
       WITH KEY NAME = P_1STDAY.
  IF SY-SUBRC = 0.
    TH_VARIANLIST-LOW = W_P1STDAY. " P_FDATUM. changed by SAE IT zhang on 2011.08.18,required by Abeam Noguchi-san
    MODIFY TD_VARIANLIST INDEX SY-TABIX
                         FROM TH_VARIANLIST
                         TRANSPORTING LOW.
  ENDIF.
* re-calculate last day of current period.
  DATA: LTH_DURATION TYPE PSEN_DURATION.
  CLEAR: LTH_DURATION.
  LTH_DURATION-DURDD = 1.
  CALL FUNCTION 'HR_99S_DATE_ADD_SUB_DURATION'
    EXPORTING
     IM_DATE = W_PP1STDAY
     IM_OPERATOR = '-'
     IM_DURATION = LTH_DURATION
    IMPORTING
     EX_DATE = W_PLSTDAY.

  " Last day of current period
  CLEAR: TH_VARIANLIST.
  READ TABLE TD_VARIANLIST
       INTO TH_VARIANLIST
       WITH KEY NAME = P_LSTDAY.
  IF SY-SUBRC = 0.
    TH_VARIANLIST-LOW = W_PLSTDAY. " P_LDATUM. changed by SAE IT zhang on 2011.08.18 .required by Abeam Noguchi-san
    MODIFY TD_VARIANLIST INDEX SY-TABIX
                         FROM TH_VARIANLIST
                         TRANSPORTING LOW.
  ENDIF.

  " Last day of current period
  CLEAR: TH_VARIANLIST.
  READ TABLE TD_VARIANLIST
       INTO TH_VARIANLIST
       WITH KEY NAME = P_RDAY.
  IF SY-SUBRC = 0.
    TH_VARIANLIST-LOW  = W_P1STDAY."P_FDATUM.changed by SAE IT zhang on 2011.08.18 .required by Abeam Noguchi-san
    TH_VARIANLIST-HIGH = W_PLSTDAY."P_LDATUM.changed by SAE IT zhang on 2011.08.18 .required by Abeam Noguchi-san
    MODIFY TD_VARIANLIST INDEX SY-TABIX
                         FROM TH_VARIANLIST
                         TRANSPORTING LOW HIGH.
  ENDIF.

ENDFORM.    " FRM_CALCU_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_CALCU_DAY
*&---------------------------------------------------------------------*
*       text  Calculate the data
*----------------------------------------------------------------------*
*  --&gt  p1        text
*  *----------------------------------------------------------------------*
FORM. FRM_CALCU_DAY
         USING
           PI_FDATUM  LIKE SY-DATUM " First day
           PI_LDATUM  LIKE SY-DATUM " Last day
           PI_MM      TYPE I        " Range months
         CHANGING
           PO_1STDAY  LIKE SY-DATUM " PI_MM months later for 1st day
           PO_LSTDAY  LIKE SY-DATUM." PI_MM months later for Last day

  DATA: LTH_DURATION TYPE PSEN_DURATION.

  CLEAR LTH_DURATION.
  LTH_DURATION-DURMM = PI_MM.

  " Calculate PI_MM months later for 1st day.
  CALL FUNCTION 'HR_99S_DATE_ADD_SUB_DURATION'
    EXPORTING
      IM_DATE           = PI_FDATUM
      IM_OPERATOR       = C_PLUS
      IM_DURATION       = LTH_DURATION
    IMPORTING
      EX_DATE           = PO_1STDAY.


  " Calculate PI_MM months later for Last day.
  CALL FUNCTION 'HR_99S_DATE_ADD_SUB_DURATION'
    EXPORTING
      IM_DATE           = PI_LDATUM
      IM_OPERATOR       = C_PLUS
      IM_DURATION       = LTH_DURATION
    IMPORTING
      EX_DATE           = PO_LSTDAY.

ENDFORM.    " FRM_CALCU_DAY

*&---------------------------------------------------------------------*
*&      Form  FRM_CALCU_PERIOD_YEAR
*&---------------------------------------------------------------------*
*       text  Determine fiscal period and fiscal year of above dates.
*----------------------------------------------------------------------*
*  --&gt  p1        text
*  *----------------------------------------------------------------------*
FORM. FRM_CALCU_PERIOD_YEAR
              USING
                PI_BUKRS     TYPE BUKRS     " Company code
                PI_FDATUM    LIKE SY-DATUM  " First day
                PI_P1STDAY   LIKE SY-DATUM  " 1 month later for 1st day
                PI_PP1STDAY  LIKE SY-DATUM. " 2 months later for 1st day


  DATA: LW_GJAHR TYPE GJAHR, " Fiscal year
        LW_MONAT TYPE MONAT. " Fiscal period

  CLEAR: LW_GJAHR, " Fiscal year
         LW_MONAT. " Fiscal period
  " Fiscal year and period of 1st day.
  CALL FUNCTION 'FI_PERIOD_DETERMINE'
    EXPORTING
      I_BUDAT              = PI_FDATUM
      I_BUKRS              = PI_BUKRS
    IMPORTING
      E_GJAHR              = LW_GJAHR
      E_MONAT              = LW_MONAT
    EXCEPTIONS
      FISCAL_YEAR          = 1
      PERIOD               = 2
      PERIOD_VERSION       = 3
      POSTING_PERIOD       = 4
      SPECIAL_PERIOD       = 5
      VERSION              = 6
      POSTING_DATE         = 7
      OTHERS               = 8.

  IF SY-SUBRC = 0.
    " Fiscal year for previous month
    CLEAR TH_VARIANLIST.
    READ TABLE TD_VARIANLIST
         INTO TH_VARIANLIST
         WITH KEY NAME = P_PYEAR.
    IF SY-SUBRC = 0.
      TH_VARIANLIST-LOW = LW_GJAHR.
      MODIFY TD_VARIANLIST INDEX SY-TABIX
                           FROM TH_VARIANLIST
                           TRANSPORTING LOW.
    ENDIF.

    " Fiscal period for previous month
    CLEAR TH_VARIANLIST.
    READ TABLE TD_VARIANLIST
         INTO TH_VARIANLIST
         WITH KEY NAME = P_PPOPER.
    IF SY-SUBRC = 0.
      TH_VARIANLIST-LOW = LW_MONAT.
      MODIFY TD_VARIANLIST INDEX SY-TABIX
                           FROM TH_VARIANLIST
                           TRANSPORTING LOW.
    ENDIF.
  ELSE.
    MESSAGE 'Failed to determine fiscal year and period.' TYPE 'E'.
  ENDIF.

  CLEAR: LW_GJAHR, " Fiscal year
         LW_MONAT. " Fiscal period
  " Fiscal year and period of 1 month later for 1st day.
  CALL FUNCTION 'FI_PERIOD_DETERMINE'
    EXPORTING
      I_BUDAT              = PI_P1STDAY
      I_BUKRS              = PI_BUKRS
    IMPORTING
      E_GJAHR              = LW_GJAHR
      E_MONAT              = LW_MONAT
    EXCEPTIONS
      FISCAL_YEAR          = 1
      PERIOD               = 2
      PERIOD_VERSION       = 3
      POSTING_PERIOD       = 4
      SPECIAL_PERIOD       = 5
      VERSION              = 6
      POSTING_DATE         = 7
      OTHERS               = 8.

  IF SY-SUBRC = 0.
    " Fiscal year for current month
    CLEAR TH_VARIANLIST.
    READ TABLE TD_VARIANLIST
         INTO TH_VARIANLIST
         WITH KEY NAME = P_CYEAR.
    IF SY-SUBRC = 0.
      TH_VARIANLIST-LOW = LW_GJAHR.
      MODIFY TD_VARIANLIST INDEX SY-TABIX
                           FROM TH_VARIANLIST
                           TRANSPORTING LOW.
    ENDIF.

    " Fiscal period for current month
    CLEAR TH_VARIANLIST.
    READ TABLE TD_VARIANLIST
         INTO TH_VARIANLIST
         WITH KEY NAME = P_CPOPER.
    IF SY-SUBRC = 0.
      TH_VARIANLIST-LOW = LW_MONAT.
      MODIFY TD_VARIANLIST INDEX SY-TABIX
                           FROM TH_VARIANLIST
                           TRANSPORTING LOW.
    ENDIF.
    " Range for current period
    CLEAR TH_VARIANLIST.
    READ TABLE TD_VARIANLIST
         INTO TH_VARIANLIST
         WITH KEY NAME = P_RCPOPE.
    IF SY-SUBRC = 0.
      TH_VARIANLIST-LOW = LW_MONAT.
      TH_VARIANLIST-HIGH = LW_MONAT.
      MODIFY TD_VARIANLIST INDEX SY-TABIX
                           FROM TH_VARIANLIST
                           TRANSPORTING LOW HIGH.
    ENDIF.
  ELSE.
    MESSAGE 'Failed to determine fiscal year and period.' TYPE 'E'.
  ENDIF.

  CLEAR: LW_GJAHR, " Fiscal year
         LW_MONAT. " Fiscal period
  " Fiscal year and period of 2 months later for 1st day.
  CALL FUNCTION 'FI_PERIOD_DETERMINE'
    EXPORTING
      I_BUDAT              = PI_PP1STDAY
      I_BUKRS              = PI_BUKRS
    IMPORTING
      E_GJAHR              = LW_GJAHR
      E_MONAT              = LW_MONAT
    EXCEPTIONS
      FISCAL_YEAR          = 1
      PERIOD               = 2
      PERIOD_VERSION       = 3
      POSTING_PERIOD       = 4
      SPECIAL_PERIOD       = 5
      VERSION              = 6
      POSTING_DATE         = 7
      OTHERS               = 8.

  IF SY-SUBRC = 0.
    " Fiscal year for previous month
    CLEAR TH_VARIANLIST.
    READ TABLE TD_VARIANLIST
         INTO TH_VARIANLIST
         WITH KEY NAME = P_NYEAR.
    IF SY-SUBRC = 0.
      TH_VARIANLIST-LOW = LW_GJAHR.
      MODIFY TD_VARIANLIST INDEX SY-TABIX
                           FROM TH_VARIANLIST
                           TRANSPORTING LOW.
    ENDIF.

    " Fiscal period for previous month
    CLEAR TH_VARIANLIST.
    READ TABLE TD_VARIANLIST
         INTO TH_VARIANLIST
         WITH KEY NAME = P_NPOPER.
    IF SY-SUBRC = 0.
      TH_VARIANLIST-LOW = LW_MONAT.
      MODIFY TD_VARIANLIST INDEX SY-TABIX
                           FROM TH_VARIANLIST
                           TRANSPORTING LOW.
    ENDIF.
  ELSE.
    MESSAGE 'Failed to determine fiscal year and period.' TYPE 'E'.
  ENDIF.

ENDFORM.    " FRM_CALCU_PERIOD_YEAR

*&---------------------------------------------------------------------*
*&      Form  FRM_UPDATE_DATA
*&---------------------------------------------------------------------*
*       text  Execute batch input to update selection variables.
*----------------------------------------------------------------------*
*  --&gt  p1        text
*  *----------------------------------------------------------------------*
FORM. FRM_UPDATE_DATA.
  DATA: LW_INDEX LIKE SY-TABIX.

  IF NOT TD_VARIANLIST IS INITIAL.
    CLEAR LW_INDEX.
    LOOP AT TD_VARIANLIST INTO TH_VARIANLIST.
      LW_INDEX = SY-TABIX.
      PERFORM. FRM_CALL_TCODE
                  USING
                    TH_VARIANLIST-NAME
                    TH_VARIANLIST-TYPE
                    TH_VARIANLIST-LOW
                    TH_VARIANLIST-HIGH
                  CHANGING
                    TH_VARIANLIST-FLG.

      MODIFY TD_VARIANLIST
             INDEX LW_INDEX
             FROM TH_VARIANLIST
             TRANSPORTING FLG.
    ENDLOOP.
  ELSE.
  ENDIF.
ENDFORM.    " FRM_UPDATE_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_CALL_TCODE
*&---------------------------------------------------------------------*
*       text  Call t-code STVARV to update.
*----------------------------------------------------------------------*
*  --&gt  p1        text
*  *----------------------------------------------------------------------*
FORM. FRM_CALL_TCODE
         USING
           PI_NAME LIKE TVARVC-NAME  " Name of Variant Variable
           PI_TYPE LIKE TVARVC-TYPE  " Type of selection
           PI_LOW  LIKE TVARVC-LOW   " Selection value (LOW or HIGH value, external format)
           PI_HIGH LIKE TVARVC-HIGH  " Selection value (LOW or HIGH value, external format).
         CHANGING
           PO_FLG  TYPE CHAR1.

  DATA: LTD_MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE,
        LW_LINES    TYPE I.

  REFRESH TD_BDCDATA.
  CLEAR TD_BDCDATA.
  PO_FLG = 'T'.
  " selection variable is parameter
  IF PI_TYPE = 'P'.
    " Screen 1
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.

    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=TOGGLE'.
    " Screen 2
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=SEARCH'.
    " Screen 3
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1200.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=ENTER'.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  'SEARCH_NAME'
                  PI_NAME.
    " Screen 4
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=CHNG'.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  'I_TVARVC_PARAMS-MARK(01)'
                  C_X.
    " Screen 5
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=SAVE'.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  'I_TVARVC_PARAMS-LOW(01)'
                  PI_LOW.
  ENDIF.

  " selection variable is parameter
  IF PI_TYPE = 'S'.
    " Screen 1
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.

    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=TOGGLE'.
    " Screen 2
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=SELOP'.
    " Screen 3
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=SEARCH'.
    " Screen 4
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1200.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=ENTER'.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  'SEARCH_NAME'
                  PI_NAME.
    " Screen 5
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=CHNG'.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  'I_TVARVC_SELOPS-MARK(01)'
                  C_X.
    " Screen 6
    PERFORM. FRM_CREATE_BDC
                USING
                  C_1
                  C_PNAME
                  C_1100.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  C_OKCODE
                  '=SAVE'.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  'I_TVARVC_SELOPS-LOW(01)'
                  PI_LOW.
    PERFORM. FRM_CREATE_BDC
                USING
                  C_2
                  'I_TVARVC_SELOPS-HIGH(01)'
                  PI_HIGH.
  ENDIF.

  IF NOT TD_BDCDATA IS INITIAL.
    CALL TRANSACTION C_STVARV   " STVARV
         USING TD_BDCDATA
         MODE  'N'
         UPDATE 'S'
         MESSAGES INTO LTD_MESSTAB.

    LW_LINES = 0.
    DESCRIBE TABLE LTD_MESSTAB LINES LW_LINES.
    IF LW_LINES > 0.
      PO_FLG = 'F'.
      EXIT.
    ENDIF.

  ENDIF.
ENDFORM.    " FRM_CALL_TCODE

*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_BDC
*&---------------------------------------------------------------------*
*       text  Create BDC
*----------------------------------------------------------------------*
*  --&gt  p1        text
*  *----------------------------------------------------------------------*
FORM. FRM_CREATE_BDC
         USING
           PI_FLG  TYPE CHAR1
           PI_VAR1 TYPE ANY
           PI_VAR2 TYPE ANY.

  CLEAR: TH_BDCDATA.
  " Program information
  IF PI_FLG = '1'.
    TH_BDCDATA-PROGRAM  = PI_VAR1.
    TH_BDCDATA-DYNPRO   = PI_VAR2.
    TH_BDCDATA-DYNBEGIN = C_X.
  ENDIF.

  " Field information
  IF PI_FLG = '2'.
    TH_BDCDATA-FNAM = PI_VAR1.
    TH_BDCDATA-FVAL = PI_VAR2.
  ENDIF.

  APPEND TH_BDCDATA TO TD_BDCDATA.
ENDFORM.    "   FRM_CREATE_BDC

*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT_RESULT
*&---------------------------------------------------------------------*
*       text  Output result
*----------------------------------------------------------------------*
*  --&gt  p1        text
*  *----------------------------------------------------------------------*
FORM. FRM_OUTPUT_RESULT.
  DATA: LW_TCOUNT TYPE I,
        LW_FCOUNT TYPE I.

  WRITE:/ 'Result:'.
  SKIP 1.

  IF TD_VARIANLIST IS INITIAL.
    WRITE:/ '0 Selection valiables are updated.'.
    EXIT.
  ENDIF.

  LW_TCOUNT = 0.
  LW_FCOUNT = 0.
  LOOP AT TD_VARIANLIST INTO TH_VARIANLIST.
    CLEAR W_STR.
    " Selection variable sucessfully updated.
    IF TH_VARIANLIST-FLG = 'T'.
      CONCATENATE 'Selection Variable'
                  TH_VARIANLIST-NAME
                  'sucessfully updated.'
             INTO W_STR
             SEPARATED BY SPACE.
      WRITE:/ W_STR.
      LW_TCOUNT = LW_TCOUNT + 1.
    ENDIF.

    " Failed to update selection variable
    IF TH_VARIANLIST-FLG = 'F'.
      CONCATENATE 'Failed to update selection variable'
                  TH_VARIANLIST-NAME
                  '.'
             INTO W_STR
             SEPARATED BY SPACE.
      WRITE:/ W_STR.
      LW_FCOUNT = LW_FCOUNT + 1.
    ENDIF.
  ENDLOOP.

  SKIP 2.
  W_STR = LW_TCOUNT.
  CONCATENATE W_STR
              'Selection valiables are updated.'
         INTO W_STR
         SEPARATED BY SPACE.
  WRITE:/ W_STR.

ENDFORM.    " FRM_OUTPUT_RESULT

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13973563/viewspace-752285/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/13973563/viewspace-752285/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值