*---------------------------------------------------------------------*
*                  Z _ B J H _ R E I C H W E I T E                    *
*                                                                     *
*                 Autor: Bernd Haase (BJH Software)                   *
*---------------------------------------------------------------------*
* Teilauszug aus der Transaktion MD04, Programm SAPMM61R. Es wurden   *
* alle Funktionsbaustein, Tabellen und Strukturen herausfiltriert,    *
* welche benötigt werden, um die Bestandsreichweite mit den Abhängig- *
* keiten und Parametern seitens SAP zu berechnen.                     *
* Achtung: abgespeckte Version !!!                                    *
*                                                                     *
* interne Wertzuweisung (berw1):                                      *
* 999,5: Fehler oder keine Materialnummer vorhanden                   *
* 999,6: Inkonsistenz T439G PPS-Planungsperioden                      *
*---------------------------------------------------------------------*
*                                                                     *
*                   Bestandsreichweitenberechnung                     *
*                                                                     *
*---------------------------------------------------------------------*
* 13.01.2004 BHaa: Programm erstellt                                  *
*---------------------------------------------------------------------*
REPORT z_bjh_reichweite .

INCLUDE .

* echte Datenbanktabellen
* Tabellen für die Bestandsreichweitenbereichnung
TABLES:
 mdkp,     "Kopfdaten Dispositionsbeleg
 plsc,     "Planungsszenarien der Langfristplanung
 t001w,    "Werke/Niederlassungen
 t399d,    "Steuerparameter für Bedarfsplanung
 t439g,    "PPS-Planungsperioden: Kopftabelle
 t450n.    "Transaktionssteuerung Materialdisposition mit Objekt

* Strukturen
TABLES:
 cm61w,    "Steuerungs-KZ Bedarfsplanung -Werksebene
 cm61x,    "Steuerungs-KZ Bedarfsplanung -Transaktionsebene-
 mt61d,    "Materialstamm Disposition
 sfilt.    "Einlesefilter und Anzeige (wird nicht benötigt)

DATA:
 wa_mdkp  TYPE mdkp,
 st_cm61w TYPE cm61w,
 st_cm61x TYPE cm61x,
 st_mt61d TYPE mt61d,

 anzahl(5) TYPE p DECIMALS 0.

* interne Tabelle zur Berechnung der Reichweite. Hier werden
* verschiedene Werte der Bestandsführung (Lagerbestände, Verbräuche,
* Bedarfe) abgespeichert, die dann zur Wertermittlung (neben anderen
* Einflußfaktoren) der Bedarfsreichweite dienen
DATA: BEGIN OF itab_mdps OCCURS 200.
       INCLUDE STRUCTURE mdps.
DATA: END OF itab_mdps.

********
* Werk *
********
DATA:
 BEGIN OF wk_t001w,
   werks LIKE t001w-werks,
   fabkl LIKE t001w-fabkl,
 END OF wk_t001w,
 wktab_t001w LIKE HASHED TABLE OF wk_t001w WITH UNIQUE KEY werks.

**********************************
* Steuerparameter Bedarfsplanung *
**********************************
DATA:
 wa_t399d TYPE t399d,
 itab_t399d LIKE HASHED TABLE OF wa_t399d WITH UNIQUE KEY werks.

********************
* Planungsperioden *
********************
DATA:
 wa_t439g TYPE t439g,
 itab_t439g LIKE HASHED TABLE OF wa_t439g WITH UNIQUE KEY werks mrppp.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Material und Werk für die Bestandreichweite
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
PARAMETER:
* Materialnummer
 pm_matnr TYPE mara-matnr  DEFAULT 'BJH_MAT_01',
* Werk
 pm_werks TYPE t001w-werks DEFAULT '0100'.
SELECTION-SCREEN: END OF BLOCK a1.

INITIALIZATION.
 CLEAR: wk_t001w, wa_t399d, itab_mdps.
 CLEAR: st_cm61w, st_cm61x, st_mt61d.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.
* Besetzung der Parameterleiste (interne Vorbesetzung), sinnvoll beim
* Aufruf der MD04 und gleichzeitigem Umspringen des Auswahlschirmes
 SET PARAMETER ID 'MAT' FIELD pm_matnr.
 SET PARAMETER ID 'WRK' FIELD '0100'.
*  CALL TRANSACTION 'MD04' AND SKIP FIRST SCREEN.

 IF pm_matnr IS INITIAL.
   CLEAR: wa_mdkp.
   MOVE '999.5' TO wa_mdkp-berw1.

   WRITE: / 'Keine Materialnummer eingegeben'.
 ELSE.
   PERFORM upro-bestandsreichweite_init USING sy-datum.

   PERFORM upro-bestandsreichweite
           USING pm_matnr pm_werks.

   IF wa_mdkp-berw1 = '999.5'.
     WRITE: / 'allgemeiner Fehler'.
   ELSE.
* rote Fahne
     IF wa_mdkp-berw1 = '999.6'.
       WRITE: / icon_defect AS ICON,
                'Inkonsistenz. PPS-Planungsperioden'.
     ELSE.
* Ampelanzeige entsprechend den Tagen der Reichweite
       IF wa_mdkp-berw1 < 7.
         WRITE: / icon_red_light AS ICON,
                  wa_mdkp-berw1.
       ELSE.
         IF wa_mdkp-berw1 < 28.
           WRITE: / icon_yellow_light AS ICON,
                    wa_mdkp-berw1.
         ELSE.
           WRITE: / icon_green_light AS ICON,
                    wa_mdkp-berw1.
         ENDIF.
       ENDIF.
     ENDIF.
   ENDIF.
 ENDIF.

*----------------------------------------------------------------------*
*                                                                      *
*                    Bestandsreichweitenberechnung                     *
*                                                                      *
*----------------------------------------------------------------------*
*            B E S T A N D S R E I C H W E I T E _ I N I T             *
*----------------------------------------------------------------------*
* Alle Tabellen mit nicht zu vielen Einträgen in interne Tabellen      *
* übertragen, um eine bessere Performanz bei der verarbeitung zu       *
* erzielen, natürlich zieht das nur bei einem Massendurchlauf.         *
*----------------------------------------------------------------------*
FORM upro-bestandsreichweite_init
    USING p_sttag.

* alle Werke lesen und in internen Tabellen vorhalten
 SELECT * FROM t001w
 INTO CORRESPONDING FIELDS OF TABLE wktab_t001w.

 SELECT * FROM t399d
 INTO CORRESPONDING FIELDS OF TABLE itab_t399d.

* alle Planungsperioden, die zum Stichtag gültig sind. Natürlich
* variiert dieser, dann alle Einträge nehmen oder einzeln lesen
 SELECT * FROM t439g
 INTO CORRESPONDING FIELDS OF TABLE itab_t439g
 WHERE datuv <= p_sttag
 AND   datub => p_sttag.

ENDFORM.

*----------------------------------------------------------------------*
*                 B E S T A N D S R E I C H W E I T E                  *
*----------------------------------------------------------------------*
* Achtung: Die Reihenfolge muß so beibehalten werden, da ermittelte    *
* Werte des einen Funktionsbaustein weitergereicht werden              *
*----------------------------------------------------------------------*
FORM upro-bestandsreichweite
    USING p_matnr
          p_werks.

* Einlesen des Dispobeleges. Achtung: Schlüsselfelder DTART (Art der
* Dispositionsliste) und PLSCN (Planungsszenario der Langfristplanung)
* werden NICHT berücksichtigt.
* bei Fehler 999,5 als Wert => da wird keine Ampel erzeugt
 SELECT SINGLE * FROM mdkp INTO wa_mdkp
 WHERE plwrk = p_werks
 AND matnr   = p_matnr.
 IF sy-subrc <> 0.
   CLEAR: wa_mdkp.
   MOVE '999.5' TO wa_mdkp-berw1.
 ELSE.
   IF wa_mdkp-mrppp IS INITIAL.
     MOVE 0 TO sy-subrc.
   ELSE.
* PPS-Planungsperioden: gegenprüfen, wenn kein Eintrag vorhanden,
* bricht der Funktionsbaustein das gesamte Programm !!!! ab
     READ TABLE itab_t439g TRANSPORTING NO FIELDS
     WITH TABLE KEY werks = p_werks
                    mrppp = wa_mdkp-mrppp.
   ENDIF.

   IF sy-subrc <> 0.
     MOVE '999.6' TO wa_mdkp-berw1.
   ELSE.
     PERFORM upro-bestandsreichweite_mat
             USING p_matnr p_werks.
     PERFORM upro-bestandsreichweite_cm61x.
     PERFORM upro-bestandsreichweite_cm61w USING p_werks.
     IF wa_mdkp-berw1 <> '999.5'.
       PERFORM upro-bestandsreichweite_mdpsx.

* Berechnung der Bestandsreichweite, nachdem alle Werte
* und Tabelle, die dringend benötigt werden, gefüllt sind
* Das Ergebnis ist über wa_mdkp-berw1 abrufbar.
* wenn Esfilt (Datumgrenzen) nicht gesetzt sind, werden im
* Funktionsbaustein Unter-/Obergrenze gesetzt
       CALL FUNCTION 'STOCK_COVERAGE_GET'
            EXPORTING
                 emdkp  = wa_mdkp
                 ecm61w = st_cm61w
*                 ESFILT =
            IMPORTING
                 imdkp  = wa_mdkp
            TABLES
                 mdpsx  = itab_mdps.
     ENDIF.
   ENDIF.
 ENDIF.

ENDFORM.

*----------------------------------------------------------------------*
*             B E S T A N D S R E I C H W E I T E _ M A T              *
*----------------------------------------------------------------------*
* Materialdaten einlesen (Materialnummer und Werk vorbesetzt) über     *
* diese Methodik, um zu gewährleisten, daß alle Werte für die Reich-   *
* weitenberechnung gefüllt werden                                      *
*----------------------------------------------------------------------*
FORM upro-bestandsreichweite_mat
    USING p_matnr
          p_werks.

 CALL FUNCTION 'MD_READ_MATERIAL_SIMPLE'
      EXPORTING
           ewerks                      = p_werks
           ematnr                      = p_matnr
*           EBERID                      = ' '
*           EKZRFB                      = ' '
*           ENOVOR                      = ' '
      CHANGING
           cmt61d                      = st_mt61d
*           CCM61B                      =
*      EXCEPTIONS
*           MATERIAL_MRP_AREA_NOT_FOUND = 1
*           MISSING_PARAMETER           = 2
*           MATERIAL_PLANT_NOT_FOUND    = 3
*           MATERIAL_MRP_AREA_DELETED   = 4
*           OTHERS                      = 5
           .
 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.

*----------------------------------------------------------------------*
*           B E S T A N D S R E I C H W E I T E _ C M 6 1 X            *
*----------------------------------------------------------------------*
* Einlesen Werte der Transaktionssteuerung Materialdisposition         *
*----------------------------------------------------------------------*
FORM upro-bestandsreichweite_cm61x.
* Transkation MD04 Bedarfs-/Bestandsliste
 SELECT SINGLE * FROM t450n
 WHERE tcode = 'MD04'.

* Steuerungskennzeichen aus Eingabe übernehmen
 MOVE t450n-mdobj TO st_cm61x-plobj.
 MOVE t450n-mdaty TO st_cm61x-plauf.
 MOVE t450n-mdakt TO st_cm61x-plakt.
 MOVE sy-datlo    TO st_cm61x-dispd.
 MOVE wa_mdkp-plscn TO st_cm61x-plscn.
 IF NOT st_cm61x-plscn IS INITIAL.
   SELECT SINGLE * FROM plsc
   WHERE plscn = st_cm61x-plscn.
   IF sy-subrc = 0.
     MOVE plsc-sbflg TO st_cm61x-sbflg.
   ENDIF.
 ENDIF.

 CLEAR st_cm61x-anzls.
ENDFORM.

*----------------------------------------------------------------------*
*           B E S T A N D S R E I C H W E I T E _ C M 6 1 W            *
*----------------------------------------------------------------------*
* Kommunikationsworkarea für Transaktion / Werk erstellen              *
*----------------------------------------------------------------------*
FORM upro-bestandsreichweite_cm61w
    USING p_werks.

* Werksdaten einlesen, benötigt wird der Fabrikskalender
 READ TABLE wktab_t001w INTO wk_t001w
 WITH TABLE KEY werks = p_werks.
 IF sy-subrc <> 0.
   CLEAR: wk_t001w, wa_mdkp.
   MOVE '999.5' TO wa_mdkp-berw1.
 ELSE.
   MOVE wk_t001w-fabkl TO st_cm61w-fabkl.

   READ TABLE itab_t399d INTO wa_t399d
   WITH TABLE KEY werks = p_werks.
   IF sy-subrc > 0.
     CLEAR: wa_t399d, wa_mdkp.
     MOVE '999.5' TO wa_mdkp-berw1.
   ENDIF.
 ENDIF.

* Umterminierungshorizont übernehmen
 MOVE wa_t399d-umthz TO st_cm61w-umthz.
 MOVE st_cm61x-dispd TO st_cm61w-dispd.
 MOVE wa_t399d-gterm TO st_cm61w-gterm.
* Welche Zugänge gehen in Bestandsreichweite 2 ein ?
 MOVE wa_t399d-selfe TO st_cm61w-selfe.
 MOVE wa_t399d-selbe TO st_cm61w-selbe.
 MOVE wa_t399d-selqm TO st_cm61w-selqm.
 MOVE wa_t399d-selba TO st_cm61w-selba.
 MOVE wa_t399d-selpa TO st_cm61w-selpa.
 MOVE wa_t399d-selpz TO st_cm61w-selpz.
 MOVE wa_t399d-selzr TO st_cm61w-selzr.
 MOVE wa_t399d-sella TO st_cm61w-sella.

ENDFORM.

*----------------------------------------------------------------------*
*           B E S T A N D S R E I C H W E I T E _ M D S P X            *
*----------------------------------------------------------------------*
* einlesen der verschiedenen Parameter zur Berechnung der  Bestands-   *
* reichweite. Interne Tabelle dafür ist die MDSP                       *
*----------------------------------------------------------------------*
FORM upro-bestandsreichweite_mdpsx.

 CALL FUNCTION 'AUFBAUEN_MDPSX_ANZEIGEN '
      EXPORTING
           ecm61w = st_cm61w
           ecm61x = st_cm61x
           emt61d = st_mt61d
           et399d = wa_t399d
*           ECM61B =
*           ESFILT =
      IMPORTING
*           ICM61M =
           imdkp  = wa_mdkp
*           IMDSTA =
      TABLES
           mdpsx  = itab_mdps
*           LORTX  =
*           EQUKX  =
*           EQUMX  =
*           EQUPX  =
      EXCEPTIONS
           error  = 1
           OTHERS = 2.

 IF sy-subrc <> 0.
   MOVE '999.5' TO wa_mdkp-berw1.
 ENDIF.

ENDFORM.

*****  E n d e  *****
* Copyright BJH Software, Datei überarbeitet am: 26.5.2005