You are on page 1of 9

************************************************************************

* Objective :
* Author : Leonardo Ferreira
* Date : Sep/19/2003
* Tec.Spec.ID : CCM-075
* Change Req. :
************************************************************************
REPORT zmxm_ccm075.

*----------------------------------------------------------------------*
* Tables
*----------------------------------------------------------------------*
TABLES : mara, t024, rmcp2, marc.

*----------------------------------------------------------------------*
* TYPE-POOLS
*----------------------------------------------------------------------*
TYPE-POOLS: slis. "Used by ALV

*----------------------------------------------------------------------*
* Estruturas
*----------------------------------------------------------------------*
DATA : e_alv_layout TYPE slis_layout_alv, "ALV layout
e_alv_is_variant TYPE disvariant, "Variant
e_alv_is_print TYPE slis_print_alv, "print info
e_t_alv_fc TYPE slis_fieldcat_alv, "Fields catalog
e_t_head_alv TYPE slis_listheader. "Header ALV

*----------------------------------------------------------------------*
* Local Tables
*----------------------------------------------------------------------*
DATA : BEGIN OF t_data OCCURS 0,
matnr LIKE mara-matnr, "Material
werks LIKE marc-werks, "Plant
maktx LIKE makt-maktx, "Description
maabc LIKE marc-maabc, "ABC Indicator
ekgrp LIKE marc-ekgrp, "Purchasing Groups
eisbe LIKE marc-eisbe, "Safety stock
END OF t_data.

DATA : t_mver LIKE mver OCCURS 0 WITH HEADER LINE.

DATA : BEGIN OF t_exit OCCURS 0,


matnr LIKE mara-matnr, "Material
maktx LIKE makt-maktx, "Description
maabc LIKE marc-maabc, "ABC Indicator
ekgrp LIKE marc-ekgrp, "Purchasing Groups
gsv01(13), " LIKE mver-gsv01, "Forecast(current month)
mgv01(13), " LIKE mver-mgv01, "Demand(current month)
diff(13), " LIKE mver-mgv01, "Variation in quantity
gsvpr LIKE mbew-salk3, "Forecast in price
mgvpr LIKE mbew-salk3, "Demand in price
difpr LIKE mbew-salk3, "Varion Forecast-Demand in price
mgv6m(17) TYPE c, "Demand for last six months
eisbe(17) TYPE c, "Safety stock
m1(7) TYPE c, "M1
m2(7) TYPE c, "M2
m3(7) TYPE c, "M3
m4(7) TYPE c, "M4
m5(7) TYPE c, "M5
m6(7) TYPE c, "M6
lbkum LIKE mbew-lbkum, "Unerstricted use in quantity
END OF t_exit.

DATA : BEGIN OF t_mbew OCCURS 0,


matnr LIKE mbew-matnr, "Material
bwkey LIKE mbew-bwkey, "Plant
lbkum LIKE mbew-lbkum, "Total Stock
verpr LIKE mbew-verpr, "Price Unit
END OF t_mbew.

* ALV FIELDS CATALOG


DATA : t_alv_fc TYPE slis_t_fieldcat_alv.

* ALV REPORT ORDER


DATA : t_alv_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.

*----------------------------------------------------------------------*
* Field-Symbols
*----------------------------------------------------------------------*
FIELD-SYMBOLS : <forecast> TYPE mver-gsv01, "Forecast
<demand> TYPE mver-mgv01. "Demand
*----------------------------------------------------------------------*
* Variable
*----------------------------------------------------------------------*
DATA : v_forecast(30),
v_demand(30),
v_date LIKE sy-datum.
*----------------------------------------------------------------------*
* Constants
*----------------------------------------------------------------------*
CONSTANTS : c_m TYPE c VALUE 'M',
c_i TYPE c VALUE 'I',
c_bt(2) TYPE c VALUE 'BT',
c_display(7) TYPE c VALUE 'DISPLAY'.

*----------------------------------------------------------------------*
* Screen of Election
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-001.

SELECT-OPTIONS : s_matnr FOR mara-matnr, "Material number


s_ekgrp FOR t024-ekgrp, "Purchasing Groups
s_price FOR rmcp2-ovwrt. "Price

SELECTION-SCREEN BEGIN OF LINE.


SELECTION-SCREEN POSITION 2.
SELECTION-SCREEN COMMENT 1(6) text-021.
SELECTION-SCREEN POSITION 33.
PARAMETERS : p_date(2) TYPE n OBLIGATORY,
p_year(4) TYPE n OBLIGATORY.
SELECTION-SCREEN END OF LINE.

SELECT-OPTIONS : s_maabc FOR marc-maabc. "ABC Indicator

SELECTION-SCREEN END OF BLOCK bl1.


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

*----------------------------------------------------------------------*
* Begin of Processing
*----------------------------------------------------------------------*
START-OF-SELECTION.

PERFORM f_valida_tela.
PERFORM f_select_data.
PERFORM f_mounts_field.
PERFORM f_mounts_sort.
PERFORM f_print.

END-OF-SELECTION.
*----------------------------------------------------------------------*
* End of Processing
*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Form f_Select_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_select_data.

SELECT mara~matnr marc~werks makt~maktx marc~maabc marc~ekgrp


marc~eisbe
INTO TABLE t_data
FROM mara
INNER JOIN makt
ON mara~matnr EQ makt~matnr AND
makt~spras EQ sy-langu
INNER JOIN marc
ON mara~matnr EQ marc~matnr
WHERE mara~matnr IN s_matnr AND
marc~maabc IN s_maabc AND
marc~ekgrp IN s_ekgrp.

IF sy-subrc IS INITIAL.
PERFORM f_select_values.
ELSE.
MESSAGE i000(zmxv) WITH text-e01.
*...No register was not found!
STOP.
ENDIF.

ENDFORM. " f_Select_data


*
*&---------------------------------------------------------------------*
*& Form f_select_values
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_select_values.
SELECT matnr bwkey lbkum verpr
FROM mbew
INTO TABLE t_mbew
FOR ALL ENTRIES IN t_data
WHERE matnr EQ t_data-matnr AND
bwkey EQ t_data-werks.

SELECT *
FROM mver
INTO TABLE t_mver
FOR ALL ENTRIES IN t_data
WHERE matnr EQ t_data-matnr AND
werks EQ t_data-werks AND
perkz EQ c_m.

IF sy-subrc IS INITIAL.
PERFORM f_organizes_data.
ELSE.
MESSAGE i000(zmxv) WITH text-e01.
*...No register was not found!
STOP.
ENDIF.

ENDFORM. " f_select_values


*&---------------------------------------------------------------------*
*& Form f_organizes_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_organizes_data.

DATA : w_valor1(13) TYPE p,


w_valor2(13) TYPE p,
w_valor3(13) type p.

SORT t_data BY matnr.


SORT t_mbew BY matnr bwkey.
SORT t_mver BY matnr werks gjahr.

LOOP AT t_data.

READ TABLE t_mver WITH KEY matnr = t_data-matnr


werks = t_data-werks
gjahr = p_year
BINARY SEARCH.

READ TABLE t_mbew WITH KEY matnr = t_data-matnr


bwkey = t_data-werks
BINARY SEARCH.

CLEAR : v_forecast, v_demand, w_valor1, w_valor2.


CONCATENATE 't_mver-gsv' p_date INTO v_forecast.
CONCATENATE 't_mver-mgv' p_date INTO v_demand.

ASSIGN (v_forecast) TO <forecast>.


ASSIGN (v_demand) TO <demand>.

MOVE : t_data-matnr TO t_exit-matnr,


t_data-maktx TO t_exit-maktx,
t_data-maabc TO t_exit-maabc,
t_data-ekgrp TO t_exit-ekgrp,
<forecast> TO w_valor1,
<demand> TO w_valor2,
t_data-eisbe to w_valor3,
w_valor1 TO t_exit-gsv01,
w_valor2 TO t_exit-mgv01,
w_valor3 to t_exit-eisbe,
* t_data-eisbe TO t_exit-eisbe,
t_mbew-lbkum TO t_exit-lbkum.

t_exit-diff = <demand> - <forecast>.


t_exit-gsvpr = t_exit-gsv01 * t_mbew-verpr.
t_exit-mgvpr = t_exit-mgv01 * t_mbew-verpr.
t_exit-difpr = t_exit-diff * t_mbew-verpr.

PERFORM f_average_demand USING v_date.

APPEND t_exit.
CLEAR : t_exit, t_mver, t_mbew.

ENDLOOP.

IF NOT s_price IS INITIAL.


LOOP AT t_exit.
IF NOT t_exit-difpr IN s_price.
DELETE t_exit INDEX sy-tabix.
ENDIF.
ENDLOOP.
ENDIF.

ENDFORM. " f_organizes_data


*&---------------------------------------------------------------------*
*& Form f_average_demand
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_average_demand USING date.

*----------------------------------------------------------------------*
* Tables
*----------------------------------------------------------------------*
DATA : BEGIN OF t_demand OCCURS 0,
date LIKE sy-datum,
gsv01 LIKE mver-gsv01,
mgv01 LIKE mver-mgv01,
END OF t_demand.
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Variable
*----------------------------------------------------------------------*
DATA : w_m_end(2) TYPE n,
w_y_end(4) TYPE n,
w_dt_end LIKE sy-datum,
w_demand(20) TYPE c,
w_forecast(20) TYPE c,
w_cont TYPE n,
w_valor(7) TYPE p DECIMALS 2.
*----------------------------------------------------------------------*

MOVE : date(4) TO w_y_end,


date+4(2) TO w_m_end.

DO 6 TIMES.
IF w_m_end > 1.
SUBTRACT 1 FROM w_m_end.
ELSE.
SUBTRACT 1 FROM w_y_end.
w_m_end = 12.
ENDIF.

READ TABLE t_mver WITH KEY matnr = t_data-matnr


werks = t_data-werks
gjahr = w_y_end.

CLEAR : <demand>, <forecast>, w_demand, w_forecast.


CONCATENATE 't_mver-mgv' w_m_end INTO w_demand.
CONCATENATE 't_mver-gsv' w_m_end INTO w_forecast.

ASSIGN (w_demand) TO <demand>.


ASSIGN (w_forecast) TO <forecast>.

t_exit-mgv6m = t_exit-mgv6m + <demand>.

CONCATENATE w_y_end w_m_end '01' INTO t_demand-date.


MOVE : <demand> TO t_demand-mgv01,
<forecast> TO t_demand-gsv01.
APPEND t_demand.
CLEAR t_demand.

ENDDO.

t_exit-mgv6m = t_exit-mgv6m DIV 6.

w_cont = 7.
LOOP AT t_demand.

SUBTRACT 1 FROM w_cont.


CLEAR : w_valor.

IF t_demand-mgv01 NE space AND


t_demand-gsv01 NE space.
w_valor = ( ( t_demand-mgv01 / t_demand-gsv01 ) - 1 ) * 100.
elseif t_demand-mgv01 ne space and
t_demand-gsv01 eq space.
w_valor = '100.00-'.
elseif t_demand-mgv01 eq space and
t_demand-gsv01 ne space.
w_valor = '100.00-'.
ELSEif t_demand-mgv01 eq space and
t_demand-gsv01 eq space.
w_valor = '0.00'.
ENDIF.

CASE w_cont.
WHEN 1.
WRITE : w_valor TO t_exit-m1.
WHEN 2.
WRITE : w_valor TO t_exit-m2.
WHEN 3.
WRITE : w_valor TO t_exit-m3.
WHEN 4.
WRITE : w_valor TO t_exit-m4.
WHEN 5.
WRITE : w_valor TO t_exit-m5.
WHEN 6.
WRITE : w_valor TO t_exit-m6.
ENDCASE.

ENDLOOP.

ENDFORM. " f_average_demand


*&---------------------------------------------------------------------*
*& Form f_mounts_field
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_mounts_field.

REFRESH t_alv_fc.
CLEAR t_alv_fc.

PERFORM f_field USING :


'1' 'MATNR' 'T_EXIT' 'X' text-002 text-002 text-002 'C' '18',
'2' 'MAKTX' 'T_EXIT' ' ' text-003 text-003 text-003 'L' '35',
'3' 'MAABC' 'T_EXIT' ' ' text-004 text-004 text-004 'C' '10',
'4' 'EKGRP' 'T_EXIT' ' ' text-005 text-005 text-005 'L' '10',
'5' 'GSV01' 'T_EXIT' ' ' text-006 text-006 text-006 'R' '20',
'6' 'MGV01' 'T_EXIT' ' ' text-007 text-007 text-007 'R' '20',
'7' 'DIFF' 'T_EXIT' ' ' text-008 text-008 text-008 'R' '20',
'8' 'GSVPR' 'T_EXIT' ' ' text-009 text-009 text-009 'R' '20',
'9' 'MGVPR' 'T_EXIT' ' ' text-010 text-010 text-010 'R' '20',
'10' 'DIFPR' 'T_EXIT' ' ' text-011 text-011 text-011 'R' '20',
'11' 'MGV6M' 'T_EXIT' ' ' text-012 text-012 text-012 'R' '20',
'12' 'EISBE' 'T_EXIT' ' ' text-013 text-013 text-013 'R' '20',
'13' 'M6' 'T_EXIT' ' ' text-019 text-019 text-019 'C' '10',
'14' 'M5' 'T_EXIT' ' ' text-018 text-018 text-018 'C' '10',
'15' 'M4' 'T_EXIT' ' ' text-017 text-017 text-017 'C' '10',
'16' 'M3' 'T_EXIT' ' ' text-016 text-016 text-016 'C' '10',
'17' 'M2' 'T_EXIT' ' ' text-015 text-015 text-015 'C' '10',
'18' 'M1' 'T_EXIT' ' ' text-014 text-014 text-014 'C' '10',
'19' 'LBKUM' 'T_EXIT' ' ' text-020 text-020 text-020 'L' '10'.

ENDFORM. " f_mounts_field


*&---------------------------------------------------------------------*
*& Form f_field
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_field USING col campo table key textl textm texts just outputlen.

e_t_alv_fc-col_pos = col.
e_t_alv_fc-fieldname = campo.
e_t_alv_fc-tabname = table.
e_t_alv_fc-key = key.
e_t_alv_fc-seltext_l = textl.
e_t_alv_fc-seltext_m = textm.
e_t_alv_fc-seltext_s = texts.
e_t_alv_fc-just = just.
e_t_alv_fc-outputlen = outputlen.
APPEND e_t_alv_fc TO t_alv_fc.

ENDFORM. " f_field


*&---------------------------------------------------------------------*
*& Form f_mounts_sort
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_mounts_sort.

t_alv_sort-spos = '1'.
t_alv_sort-fieldname = 'MATNR'.
t_alv_sort-up = 'X'.
APPEND t_alv_sort.
CLEAR t_alv_sort.

ENDFORM. " f_mounts_sort


*&---------------------------------------------------------------------*
*& Form f_print
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_print.

DATA : e_alv_layout TYPE slis_layout_alv, "ALV layout


e_alv_is_print TYPE slis_print_alv, "print info
e_alv_is_variant TYPE disvariant.

CLEAR : e_alv_is_print, e_alv_is_variant, e_alv_layout.

e_alv_is_print-no_print_selinfos = 'X'.
e_alv_is_print-no_print_listinfos = 'X'.

e_alv_is_variant-report = sy-repid.

e_alv_layout-default_item = 'X'.
e_alv_layout-f2code = c_display.
e_alv_layout-colwidth_optimize = 'X'.
e_alv_layout-zebra = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
i_callback_program = e_alv_is_variant-report
* i_callback_user_command = 'F_USER_COMMAND'
is_layout = e_alv_layout
it_fieldcat = t_alv_fc[]
it_sort = t_alv_sort[]
i_save = 'U'
i_default = 'X'
is_variant = e_alv_is_variant
is_print = e_alv_is_print
TABLES
t_outtab = t_exit
EXCEPTIONS
program_error = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " f_print


*&---------------------------------------------------------------------*
*& Form f_valida_tela
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM f_valida_tela.

IF p_date IS INITIAL AND


p_year IS INITIAL.
v_date = sy-datum.
p_date = sy-datum+4(2).
p_year = sy-datum(4).
ELSEIF p_date NE space AND
p_year IS INITIAL.
MESSAGE w000(zmxv) WITH text-e02.
*...Fill the two fields
STOP.
ELSEIF p_date IS INITIAL AND
p_year NE space.
MESSAGE w000(zmxv) WITH text-e02.
*...Fill the two fields
STOP.
ELSEIF p_date NE space AND
p_year NE space.
CONCATENATE p_year p_date '01' INTO v_date.
ENDIF.

ENDFORM. " f_valida_tela

You might also like