*---------------------------------------------------------------------*
* 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