Table of Contents:


REPORT zvsales_by_shipto
       LINE-SIZE 83
       NO STANDARD PAGE HEADING.
*@----------------------------------------------------------------------
*@ Program id    :
*@
*@ Program Desc  : This Report lists Sales by ship-to customer.
*@
*@ Transaction Code - zvsalesbyshipto
*@ Input files   : ID - none
*@ Output files  : ID - none
*@
*@ Tables Updated: Table - none
*@
*@
*@ Author      : IJADALOW         LABK934444
*@ Date        : February 26, 2003
*@ Requested by: Joyce Homeniuk, Ophelia Tik
*@----------------------------------------------------------------------
*@----------------------------------------------------------------------

*-----------------------------------------------------------------------
* Includes
*-----------------------------------------------------------------------
INCLUDE zsmaster.

*-----------------------------------------------------------------------
* Tables
*-----------------------------------------------------------------------
TABLES: ce1anoc,
        adrc,
        vbpa,
        t001,    "Co code
        t009b.   "Fiscal year variant periods

** Structure
TABLES: zsalesbyshipto.

*-----------------------------------------------------------------------
* Internal Tables
*-----------------------------------------------------------------------
DATA: i_output LIKE zsalesbyshipto OCCURS 0 WITH HEADER LINE.

DATA: BEGIN OF itab OCCURS 0,
        kndnr LIKE ce1anoc-kndnr,               "sold-to
        name1 LIKE kna1-name1,
        perio LIKE ce1anoc-perio,
        zmonth LIKE zsalesbyshipto-zmonth,
        kaufn LIKE ce1anoc-kaufn,
        kdpos LIKE ce1anoc-kdpos,
        kunnr LIKE vbpa-kunnr,                  "Ship-to
        adrnr LIKE vbpa-adrnr,                  "address no.
        city1 LIKE adrc-city1,
        artnr LIKE ce1anoc-artnr,               "product
        arktx LIKE vbap-arktx,
        revenue LIKE zsalesbyshipto-revenue,
        erlpr LIKE ce1anoc-erlpr,
        erleq LIKE ce1anoc-erleq,
        rabat LIKE ce1anoc-rabat,
        kursf LIKE ce1anoc-kursf,
        drcos LIKE ce1anoc-drcos,
        totalpm LIKE zsalesbyshipto-totalpm,
        totalpmper LIKE zsalesbyshipto-totalpmper,
        absmg LIKE ce1anoc-absmg,
        belnr LIKE ce1anoc-belnr,
        vkorg LIKE ce1anoc-vkorg,
      END OF itab.

*----------------------------------------------------------------------
* Data for alv display
*----------------------------------------------------------------------
* Type pools
*----------------------------------------------------------------------
TYPE-POOLS: slis.

DATA: gs_layout TYPE slis_layout_alv.
DATA: fcat TYPE slis_fieldcat_alv OCCURS 0 WITH HEADER LINE.
DATA: gt_list_top_of_page TYPE slis_t_listheader.
DATA: gt_events TYPE slis_t_event.
DATA: alv_repid LIKE sy-repid.
DATA: alv_ddic LIKE dd02l-tabname.

CONSTANTS:
gc_formname_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE'.

alv_ddic = 'ZSALESBYSHIPTO'.

*/-- Selection Criteria --------------------------------------------*\
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_comp  FOR ce1anoc-vkorg OBLIGATORY NO INTERVALS
                                                  NO-EXTENSION,
                s_cust  FOR vbpa-kunnr,                       "customer
                s_perio FOR ce1anoc-perio OBLIGATORY.         "Period

SELECTION-SCREEN END OF BLOCK blk1.

SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE text-002.
SELECTION-SCREEN: SKIP.
PARAMETERS: rb_cad RADIOBUTTON GROUP rad1 DEFAULT 'X'.
PARAMETERS: rb_usd RADIOBUTTON GROUP rad1.
SELECTION-SCREEN END OF BLOCK blk2.
*/-------------------------------------------------------------------\*

START-OF-SELECTION.

  PERFORM get_data.

END-OF-SELECTION.

  mac_set_status_bar 'Preparing output......'.

* Layout
  PERFORM init_layout.
* Fieldcatalog
  PERFORM get_fieldcat.
  PERFORM init_fieldcat.
* Top of page comment
  REFRESH: gt_events, gt_list_top_of_page.
  PERFORM eventtab_build USING gt_events[].

  PERFORM output_list.

*/-------------------------------------------------------------------\*
FORM get_data.
  DATA: l_exrate LIKE itab-kursf,
        l_index like sy-tabix.
  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE itab
    FROM ce1anoc
    WHERE perio IN s_perio
      AND vkorg IN s_comp
      AND kndnr IN s_cust.

  SORT itab BY kaufn kdpos artnr perio.

  LOOP AT itab.
    SELECT SINGLE name1 FROM kna1
       INTO itab-name1
      WHERE kunnr = itab-kndnr.

*   Get the ship-to customer and address num.
    SELECT SINGLE kunnr adrnr FROM vbpa
      INTO (itab-kunnr, itab-adrnr)
     WHERE vbeln = itab-kaufn
       AND parvw = 'WE'.

    SELECT SINGLE city1 FROM adrc
      INTO itab-city1
     WHERE addrnumber = itab-adrnr.
*   when the sales order number is '54xxxxxx', get the corresponding
*   order number from vbap.
    IF itab-kaufn(4) = '0054'.
      SELECT SINGLE vgbel vgpos arktx FROM vbap
        INTO (itab-kaufn, itab-kdpos, itab-arktx)
       WHERE vbeln = itab-kaufn
         AND posnr = itab-kdpos.
    ELSE.
      SELECT SINGLE arktx FROM vbap
        INTO itab-arktx
       WHERE vbeln = itab-kaufn
         AND posnr = itab-kdpos.
    ENDIF.

    CLEAR l_exrate.
    IF itab-kursf >= '1.0'.
      PERFORM get_exchange_rate USING itab-perio l_exrate.
    ELSE.
      l_exrate = itab-kursf.
    ENDIF.

    IF rb_cad = 'X'.
      itab-revenue = ( itab-erlpr + itab-erleq + itab-rabat ) /
                       l_exrate.
      itab-drcos = itab-drcos / l_exrate.
    ELSE.
      itab-revenue = ( itab-erlpr + itab-erleq + itab-rabat ).
    ENDIF.

    itab-totalpm = itab-revenue - itab-drcos.

*   Get Month name
    mac_get_month_str_for_period itab-vkorg itab-perio+4(3) itab-zmonth.

    CLEAR i_output.
    READ TABLE i_output WITH KEY kaufn = itab-kaufn
                          kdpos = itab-kdpos
                                 artnr = itab-artnr
                                 perio = itab-perio.
    l_index = sy-tabix.
    IF itab-perio = i_output-perio AND
       itab-kaufn = i_output-kaufn AND
       itab-kdpos = i_output-kdpos AND
       itab-artnr = i_output-artnr.

      ADD: i_output-revenue    TO itab-revenue,
           i_output-drcos      TO itab-drcos,
           i_output-totalpm    TO itab-totalpm,
           i_output-absmg      TO itab-absmg.
*     Get the Total PM percentage
      IF itab-revenue <> 0.
        itab-totalpmper = itab-totalpm / itab-revenue * 100.
      ELSE.
        itab-totalpmper = 0.
      ENDIF.

      MOVE-CORRESPONDING itab TO i_output.
      MODIFY i_output INDEX l_index.

    ELSE.

*     Get the Total PM percentage
      IF itab-revenue <> 0.
        itab-totalpmper = itab-totalpm / itab-revenue * 100.
      ELSE.
        itab-totalpmper = 0.
      ENDIF.

      MOVE-CORRESPONDING itab TO i_output.
      APPEND i_output.
    ENDIF.

    MODIFY itab.

  ENDLOOP.

  SORT i_output BY kndnr kunnr perio kaufn.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  INIT_LAYOUT
*&---------------------------------------------------------------------*
FORM init_layout.

  gs_layout-colwidth_optimize = 'X'.

ENDFORM.                    " INIT_LAYOUT

*&---------------------------------------------------------------------*
*&      Form  GET_FIELDCAT
*&---------------------------------------------------------------------*
FORM get_fieldcat.

  CLEAR fcat[].
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
       EXPORTING
            i_structure_name       = alv_ddic
       CHANGING
            ct_fieldcat            = fcat[]
       EXCEPTIONS
            inconsistent_interface = 1
            program_error          = 2
            OTHERS                 = 3.

ENDFORM.                    " GET_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  INIT_FIELDCAT
*&---------------------------------------------------------------------*
FORM init_fieldcat.

  LOOP AT fcat.
    fcat-ddictxt = 'L'.
    MODIFY fcat.
  ENDLOOP.

ENDFORM.                    " INIT_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  EVENTTAB_BUILD
*&---------------------------------------------------------------------*
FORM eventtab_build USING p_events TYPE slis_t_event.

  DATA: ls_event TYPE slis_alv_event.

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
       EXPORTING
            i_list_type = 0
       IMPORTING
            et_events   = p_events.
  READ TABLE p_events WITH KEY name =  slis_ev_top_of_page
                           INTO ls_event.
  IF sy-subrc = 0.
    MOVE gc_formname_top_of_page TO ls_event-form.
    APPEND ls_event TO p_events.
  ENDIF.

ENDFORM.                    " EVENTTAB_BUILD

*---------------------------------------------------------------------*
*       FORM TOP_OF_PAGE                                              *
*---------------------------------------------------------------------*
FORM top_of_page.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
       EXPORTING
            it_list_commentary = gt_list_top_of_page.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  OUTPUT_LIST
*&---------------------------------------------------------------------*
FORM output_list.

* sort i_output by vkorg kunnr pernr.

  alv_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
      EXPORTING
           i_callback_program       = alv_repid
*           i_callback_user_command  = 'USER_COMMAND'
           it_fieldcat              = fcat[]
           it_events                = gt_events[]
           is_layout                = gs_layout
       TABLES
            t_outtab                = i_output.

ENDFORM.                    " OUTPUT_LIST

*&---------------------------------------------------------------------*
*&      Form  GET_EXCHANGE_RATE
*&---------------------------------------------------------------------*
FORM get_exchange_rate USING pc_period CHANGING pc_rate.

  DATA:   l_temp_year   TYPE mac_t_year,
          l_temp_period TYPE mac_t_period,
          l_temp_end    LIKE sy-datum,
          l_temp_strt    LIKE sy-datum.

  CLEAR: l_temp_year, l_temp_period, l_temp_end.
  l_temp_year   = pc_period(4).
  l_temp_period = pc_period+4(3).
  mac_get_dates_for_period '1000' l_temp_year l_temp_period
                                  l_temp_strt l_temp_end.


  CALL FUNCTION 'READ_EXCHANGE_RATE'
       EXPORTING
            date             = l_temp_strt
            foreign_currency = 'CAD'
            local_currency   = 'USD'
            type_of_rate     = 'M'
       IMPORTING
            exchange_rate    = pc_rate.

  IF sy-subrc <> 0.
    pc_rate = 1.
  ENDIF.

ENDFORM.                    " GET_EXCHANGE_RATE