Table of Contents:



REPORT zf_order_budgetload
  NO STANDARD PAGE HEADING LINE-SIZE 255.

*@----------------------------------------------------------------------
*@ Program id    : zf_order_budgetload
*@ Program Desc  : This program uploads budget/bid for "order" to
*@                 the PA system.
*@
*@
*@ Transaction Code - zf_order_budgetload
*@ Input files   : User specified tab delimited text file
*@ Output files  : BDC session
*@
*@ Tables Updated: Table - none
*@
*@
*@ Author      : Ibrahim Jadalowen     (LABK935027)
*@ Date        : May 29, 2003
*@ Requested by: Joyce Homeniuk
*@----------------------------------------------------------------------
*@ Algorithm: The data is read from a tab delimited text file and
*@            loaded through a BDC session as per transaction code
*@            KO12.
*@            First we have to change the controlling area to ACAD
*@            and planning profile to SAP101.
*@            The GL accounts' information is updated, Revenue
*@            GL accounts and Expenses GL accounts
*@----------------------------------------------------------------------

INCLUDE zsmaster.

TABLES: cskb.

CONSTANTS: c_company(4) VALUE '6231',
           c_control_area(4) VALUE 'ACAD',
           c_profile(6) VALUE 'SAP101',
           c_min_rev(10) VALUE '40000',
           c_max_rev(10) VALUE '49999',
           c_min_exp(10) VALUE '50000',
           c_max_exp(10) VALUE '89999'.

DATA: g_field_year(15),
      error(1)    TYPE c VALUE '',
      lin         TYPE i.

DATA: BEGIN OF datatab OCCURS 0,
        glaccount(10),
        amount(15) TYPE p DECIMALS 2,
END OF datatab.

*/ This is the format of the input file:
TYPES: BEGIN OF intype,
        description(30),
        glaccount(10),
        amount(17),
END OF intype.

DATA: rc TYPE STANDARD TABLE OF intype WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-101.
PARAMETERS: p_year(4) DEFAULT sy-datum(4).
PARAMETERS: p_order LIKE codia-aufnr.
SELECTION-SCREEN SKIP.

PARAMETERS: datafile LIKE rlgrap-filename
                     DEFAULT 'C:\'.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(25) text-002.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP.
PARAMETERS: session(12) TYPE c DEFAULT ''.
SELECTION-SCREEN END OF BLOCK blk1.

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

  WRITE: / '*** LOG *** Report -',sy-repid COLOR COL_HEADING.
  WRITE: sy-datum, sy-uzeit.
  SKIP.

  PERFORM load_datatab.

  IF NOT error IS INITIAL.
    WRITE: / 'No batch session created.'.
    WRITE: / 'Programme ended.'.
    EXIT.
  ENDIF.

  IF session IS INITIAL.
    session = sy-repid.
  ENDIF.

  DESCRIBE TABLE datatab LINES lin.
  IF lin > 0.

    PERFORM create_bdc_session.

    SKIP.
    WRITE: / 'Batch session',session,'was created.'.

  ELSE.
    WRITE: / 'No data for processing.  No batch session created.'.
    WRITE: / 'Programme ended.'.
  ENDIF.
*/-------------------------------------------------------------------*\
AT SELECTION-SCREEN ON BLOCK blk1.
  DATA: result(14).

  SELECT SINGLE aufnr
    FROM aufk
    INTO result
    WHERE aufnr = p_order.

  IF sy-subrc <> 0.
    MESSAGE e001(zz) WITH 'Order' p_order
                          'doesnt exist in order master table'.
  ENDIF.

*---------------------------------------------------------------------*
*       FORM LOAD_DATATAB                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM load_datatab.

  DATA: len TYPE i,
        diff TYPE i,
        ddate(10).

  CALL FUNCTION 'WS_UPLOAD'
       EXPORTING
            filename                = datafile
            filetype                = 'DAT'
       TABLES
            data_tab                = rc
       EXCEPTIONS
            conversion_error        = 1
            file_open_error         = 2
            file_read_error         = 3
            invalid_type            = 4
            no_batch                = 5
            unknown_error           = 6
            invalid_table_width     = 7
            gui_refuse_filetransfer = 8
            customer_error          = 9
            OTHERS                  = 10.

  IF sy-subrc <> 0.
    len = strlen( datafile ).
    WRITE: / 'Error opening file:' COLOR COL_NEGATIVE INVERSE ON,
             datafile(len) COLOR COL_NEGATIVE INVERSE ON.
    error = 'Y'.
    EXIT.
  ENDIF.

  DATA: l_glaccount(10).

  LOOP AT rc.

    CLEAR datatab.

    IF rc-glaccount NA 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
       AND rc-glaccount <> ''.

      l_glaccount = rc-glaccount.

      len = strlen( rc-glaccount ).
      diff = 10 - len.
      SHIFT l_glaccount RIGHT BY diff PLACES.
      DO diff TIMES.
        REPLACE '' WITH '0' INTO l_glaccount.
      ENDDO.

      MOVE-CORRESPONDING rc TO datatab.

      SELECT SINGLE * FROM cskb
        WHERE kokrs = c_control_area
          AND kstar = l_glaccount
          AND datbi >= sy-datum.

      IF sy-subrc = 0.
        COLLECT datatab.
      ELSE.
        WRITE: / 'GL Account #',
                 datatab-glaccount COLOR COL_NEGATIVE INVERSE,
                 'does not exist for controlling area',
                 c_control_area,
                 '. Values not accepted.'.
        error = 'Y'.
      ENDIF.
    ENDIF.

  ENDLOOP.

  SKIP 1.
  CHECK error IS INITIAL.
  WRITE: / 'Fiscal Year : ' COLOR COL_NORMAL, p_year.
  WRITE: / 'Order Number: ' COLOR COL_NORMAL, p_order.
  SKIP 1.
  WRITE: / 'Records added to the BDC session:' COLOR COL_HEADING.
  WRITE: /2(12) 'GL Account #' CENTERED COLOR COL_HEADING,
          20(20) 'Amount' CENTERED COLOR COL_HEADING.

ENDFORM.                               " LOAD_DATATAB

*---------------------------------------------------------------------*
*       FORM create_bdc_session                                       *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM create_bdc_session.

  DATA: l_session LIKE apqi-groupid.

  mac_set_status_bar 'Creating BDC Session......'.

  SORT datatab BY glaccount.

  PERFORM find_year_position.

  l_session = session.
  mac_bdc_open_group l_session.

* Set Controlling Area to 'ACAD'
  mac_bdc_refresh_data.
  mac_bdc_screen 'SAPLSPO4' '0300'.
  mac_bdc_position 'SVALD-VALUE(01)' ' '.
  mac_bdc_set_value: 'SVALD-VALUE(01)' 'ACAD'.
  mac_bdc_ok_code '=FURT'.
  mac_bdc_insert 'OKKS'.

* Set Planner profile to 'SAP101'
  mac_bdc_refresh_data.
  mac_bdc_screen 'SAPLKPP6' '1007'.
  mac_bdc_position 'RKPP6-PLPROF' ' '.
  mac_bdc_set_value: 'RKPP6-PLPROF' 'SAP101'.
  mac_bdc_ok_code '=CWEI'.
  mac_bdc_insert 'KP04'.

  mac_bdc_refresh_data.

* load the budget
  mac_bdc_screen 'SAPMKBUD' '0300'.
  mac_bdc_position 'CODIA-AUFNR' ' '.
  mac_bdc_set_value: 'CODIA-AUFNR' p_order.
  mac_bdc_set_value: 'BPDY-VERSN' '0'.
  mac_bdc_ok_code '/00'.

  mac_bdc_screen 'SAPLKBPP' '0300'.
  mac_bdc_position 'BPDY-WERT1(01)' ' '.
  mac_bdc_ok_code '=FULL'.

  mac_bdc_screen 'SAPLKBPP' '0200'.
  mac_bdc_position g_field_year ' '.
  mac_bdc_ok_code '=KAER'.

  LOOP AT datatab WHERE glaccount BETWEEN c_min_rev and c_max_rev.
* Position in revenue list
    mac_bdc_screen 'SAPLKPP2' '0112'.
    mac_bdc_position 'BK_0101' ' '.
    mac_bdc_ok_code  '=CPOZ'.

    mac_bdc_screen 'SAPLKPP4' '0100'.
    mac_bdc_position 'KPP0B-VALUE(01)' ' '.
    mac_bdc_set_value 'KPP0B-VALUE(01)' datatab-glaccount.
    mac_bdc_ok_code '=CSPA'.

* Enter Revenue Amount
    mac_bdc_screen 'SAPLKPP2' '0112'.
    mac_bdc_position 'BDC03(01)' ' '.
    mac_bdc_set_value: 'BDC03(01)' datatab-amount.

    WRITE: /02(12) datatab-glaccount,
            20(20) datatab-amount.
  ENDLOOP.

  mac_bdc_ok_code '=CBUC'.

* Save
  mac_bdc_screen 'SAPLKBPP' '0200'.
  mac_bdc_position g_field_year ' '.
  mac_bdc_ok_code '=POST'.

  mac_bdc_insert 'KO12'.

* Enter Expenses
  mac_bdc_refresh_data.

  mac_bdc_screen 'SAPMKBUD' '0300'.
  mac_bdc_position 'CODIA-AUFNR' ' '.
  mac_bdc_set_value: 'CODIA-AUFNR' p_order.
  mac_bdc_set_value: 'BPDY-VERSN' '0'.
  mac_bdc_ok_code '/00'.

  mac_bdc_screen 'SAPLKBPP' '0300'.
  mac_bdc_position 'BPDY-WERT1(01)' ' '.
  mac_bdc_ok_code '=FULL'.

* Call the Expenses Screen
  mac_bdc_screen 'SAPLKBPP' '0200'.
  mac_bdc_position g_field_year ' '.
  mac_bdc_ok_code '=KAPR'.

  LOOP AT datatab WHERE glaccount BETWEEN c_min_exp and c_max_exp.
* Position in Expenses list
    mac_bdc_screen 'SAPLKPP2' '0112'.
    mac_bdc_position 'BK_0101' ' '.
    mac_bdc_ok_code  '=CPOZ'.

    mac_bdc_screen 'SAPLKPP4' '0100'.
    mac_bdc_position 'KPP0B-VALUE(01)' ' '.
    mac_bdc_set_value 'KPP0B-VALUE(01)' datatab-glaccount.
    mac_bdc_ok_code '=CSPA'.

* Enter Expense Amount
    mac_bdc_screen 'SAPLKPP2' '0112'.
    mac_bdc_position 'BDC03(01)' ' '.
    mac_bdc_set_value: 'BDC03(01)' datatab-amount.

    WRITE: /02(12) datatab-glaccount,
            20(20) datatab-amount.
  ENDLOOP.

* Save
  mac_bdc_ok_code '=CBUC'.

* Save
  mac_bdc_screen 'SAPLKBPP' '0200'.
  mac_bdc_position g_field_year ' '.
  mac_bdc_ok_code '=POST'.

  mac_bdc_insert 'KO12'.

  mac_bdc_close_group.

ENDFORM.                  "CREATE_BDC_SESSION

*&---------------------------------------------------------------------*
*&      Form  FIND_YEAR_POSITION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM find_year_position.

  DATA: base_year(4),
        position(2).

  base_year = sy-datum(4) - 4.

  position = p_year - base_year.

  CONCATENATE 'BPDY-WERT1(' position ')'
    INTO g_field_year.
ENDFORM.                    " FIND_YEAR_POSITION