Zum Hauptinhalt springen

Materialverfügbarkeit

Ausgangssituation

Bisher wird die Materialverfügbarkeit eines Netzplanes über die Transaktion CN22 durchgeführt. Diese ermöglicht sämtliche Komponenten über alle Vorgänge hinweg auf Verfügbarkeit zu prüfen. Ist Material Verfügbar wird eine Auslieferung angestoßen.

In diesem Fall lebt ein Netzplan hingegen sehr lange (mehr als ein Jahr). Vorgänge werden zu unterschiedlichen Zeiten angegangen. Daher sollen nicht immer die Komponenten alle Vorgänge geprüft werden sondern nur die Komponenten der zu bestimmenden Vorgänge. Hierzu muss auch die Materialverfügbarkeit angepasst werden, soll aber in Hinblick auf verwendete Prüfregeln gleich funktionieren wie in der Transaktion CN22. Das Programm selber verarbeitet nur ein Netzplan wird aber durch ein weiteres Programm aufgerufen, dass nacheinander eine Liste von Netzplänen abarbeitet.

Die Funktion in der CN22 bleibt bestehen, allerdings wurde ein Z-Programm erstellt der hiervon abweicht. Hier wird auf den Aufruf der Materialverfügbarkeit eingegangen. Die anschließende Verarbeitung des Ergebnisses wird hier nicht weiter betrachtet. Außerdem wird hier nur über Netzpläne gesprochen sollte aber auch auf Fertigungsaufträge zutreffen und funktionieren. Dieser Zusammenhang wurde aber nicht von mir betrachtet und getestet.

Lösungsansatz

FuBa1 Material Verfügbarkeitsprüfung

Für die Verfügbarkeitsprüfung wird folgender Funktionsbaustein genutzt, dieser soll keine Popups oder Ausgaben erzeugen, da der Aufruf im Hintergrund durchgeführt wird. Damit der Aufruf des Funktionsbausteins funktionieren kann, müssen vorab weitere Funktionsbausteine aufgerufen werden (werden im nächsten Punkt aufgezeigt).

    "Verfügbarkeitsprüfung
CALL FUNCTION 'CO_ZA_AVAILABILITY_CHECK'
EXPORTING
FLG_MESS = 'X'
FLG_MESS_OBJ_DEP = 'X'
OPEN_CALL = ' '
REL_CALL = ' '
I_ANWDG = '1'
I_AZERG = '1'
I_MEMO_TP = 'X'
I_FILL_MDVAX = ' '
I_TRTYP = 'V'
SAVE_CALL = ' '
TABLES
RESBVE_TAB = lt_resbve_tab
AUFNR_VPR_TAB = lt_aufnr_tab
EXCEPTIONS
ERROR = 1
OTHERS = 2

Fubas vor der Verfügbarkeitsprüfung

Lese Daten zum Netzplan anhand der Netzplannummer (AUFNR).

    CALL FUNCTION 'CO_SF_CAUFVD_GET'
EXPORTING
AUFNR_IMP = iv_aufnr
IMPORTING
CAUFVD_EXP = ls_caufvd
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2
.

Anhand der RSNUM der Reservierung (Komponeten zum Netzplan) werden intern Tabellen aufgebaut.

    CALL FUNCTION 'CO_BT_RESBBT_CREATE'
EXPORTING
AUFNR_ACT = ls_caufvd-AUFNR
RESB_NUMMER = ls_caufvd-rsnum
EXCEPTIONS
OTHERS = 99
.

Hole alle Komponeten eines Netzplans. Die Verfügbarkeit selber wird immer über alle Komponenten durchgeführt. Verarbeitet werden letztlich nur die Komponenten deren Vorgänge mitgegeben wurden. Der Rest wird verworfen.

    CALL FUNCTION 'CO_BC_GET_RESBV'
EXPORTING
AUFNR_IMP = ls_caufvd-aufnr
IMPORTING
ENTRIES_EXP = lv_entries
TABLES
RESBV_TAB = lt_resbve_tab
.
LOOP AT lt_resbve_tab ASSIGNING FIELD-SYMBOL(<lfs_resbve>).
IF NOT <lfs_resbve>-KZAUS IS INITIAL.
CLEAR <lfs_resbve>-FLMNG.
ENDIF.
<lfs_resbve>-ESMNG = 1.
ENDLOOP.

Baue interne Tabelle LT_AUFNR_TAB auf, die an den FuBa zur Materialverfügbarkeit übergeben wird. Ist 1:1 aus der CN22 kopiert worden.

    "Auftragsposition mit Schlüssel in Belegtabelle nachlesen
CALL FUNCTION 'CO_BI_AFPO_READ_WITH_KEY'
EXPORTING
AUFNR_ACT = ls_caufvd-aufnr
IMPORTING
AFPOD_EXP = ls_afpod
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2
.
IF sy-subrc = 0.
aufnr_tmp-vfmng = ls_afpod-vfmng.
ENDIF.

aufnr_tmp-aufnr = ls_caufvd-aufnr.
aufnr_tmp-prodnet = ls_caufvd-prodnet.
aufnr_tmp-auart = ls_caufvd-auart.
aufnr_tmp-autyp = ls_caufvd-autyp.
aufnr_tmp-werks = ls_caufvd-werks.
aufnr_tmp-rsnum = ls_caufvd-rsnum.
aufnr_tmp-gmein = ls_caufvd-gmein.
aufnr_tmp-gltrp = ls_caufvd-gltrp.
IF aufnr_tmp-gltrp IS INITIAL.
IF ls_caufvd-gltrs GT ls_caufvd-gstrp.
aufnr_tmp-gltrp = ls_caufvd-gltrs.
ELSE.
aufnr_tmp-gltrp = ls_caufvd-gstrp.
ENDIF.
ENDIF.
aufnr_tmp-objnr = ls_caufvd-objnr.
aufnr_tmp-sfcpf = ls_caufvd-sfcpf.
aufnr_tmp-dispo = ls_caufvd-dispo.
aufnr_tmp-fevor = ls_caufvd-fevor.
aufnr_tmp-kzavc = ls_caufvd-kzavc.
aufnr_tmp-stufe = ls_caufvd-stufe.
aufnr_tmp-arsnr = ls_caufvd-arsnr.
aufnr_tmp-arsps = ls_caufvd-arsps.
aufnr_tmp-gasmg = ls_caufvd-gasmg.
* offene Auftragsmenge
IF ls_caufvd-igmng IS INITIAL
AND ls_caufvd-gwemg IS INITIAL.
aufnr_tmp-gamng = ls_caufvd-gamng.
ELSE.
IF ls_caufvd-igmng > ls_caufvd-gwemg.
aufnr_tmp-gamng = ls_caufvd-gamng - ls_caufvd-igmng.
ELSE.
aufnr_tmp-gamng = ls_caufvd-gamng - ls_caufvd-gwemg.
ENDIF.
ENDIF.
IF aufnr_tmp-gamng < 0.
CLEAR aufnr_tmp-gamng.
ENDIF.

APPEND aufnr_tmp TO LT_AUFNR_TAB.

Wenn der Netzplan geändert werden soll, muss dieser gesperrt werden

    "Sperren und Lesen von Aufträgen
CALL FUNCTION 'CO_ZF_ORDER_READ'
TABLES
AUFNR_TAB_IMP = LT_AUFNR_TAB
EXCEPTIONS
ORDER_NOT_FOUND = 1
RELEASE_NO_CHANGE = 2
OTHERS = 3
.

Jetzt kann die Materialverfügbarkeit durchgeführt werden.

Prüfregel übergeben

Beim Aufruf des Funktionsbausteins CO_ZA_AVAILABILITY_CHECK soll auch die Prüfregel mit "übergeben" werden. Dies sieht der FUnktionsbaustein aber nicht vor. Daher wird die Prüfregel ins Memory geschrieben und im Userexit wieder ausgelesen und somit bei der Materialverfügbarkeit genutzt

Schreiben ins Memory:

    "Übergabe Prüfregel für V-Prüfung
lv_pr = IV_PRREG.
EXPORT lv_pruefregel = lv_pr TO MEMORY id 'EWM_NETZPLAN_PR'.

Genutzter Userexit EXIT_SAPLATPC_001:

DATA
: lv_pr TYPE c length 10
.

FIELD-SYMBOLS
: <lfs_atp> LIKE LINE OF t_atpcsx
.

import lv_pruefregel = lv_pr from MEMORY id 'EWM_NETZPLAN_PR'.

if lv_pr = 'ZE'.
loop at t_atpcsx ASSIGNING <lfs_atp>.
<lfs_atp>-PRREG = 'ZE'.
endloop.
CLEAR <lfs_atp>.
FREE <lfs_atp>.
endif.

if lv_pr = 'ZF'.
loop at t_atpcsx ASSIGNING <lfs_atp>.
<lfs_atp>-PRREG = 'ZF'.
endloop.
CLEAR <lfs_atp>.
FREE <lfs_atp>.
endif.

free MEMORY id 'EWM_NETZPLAN_PR'.

  1. FuBa = Funktionsbaustein