Questo dovrebbe evitare, per esempio, errori di doppia lettura a breve distanza di tempo con le transazioni che impostano lo stato successivo del cartellino.
Ho cercato un Function Module che, dato l'ID di un cartellino kanban, verificasse se può essere effettuato il cambio stato oppure se si deve attendere che passi il tempo previsto.
Non l'ho trovato per cui ne ho costruito uno io.
Intanto vediamo dove si imposta il tempo di attesa, da customizing SPRO:
Nelle strategie di riapprovvigionamento si trova il campo:
Il tempo di default proposto è di 10 minuti, se si azzera non c'è nessun controllo.
Questa la spiegazione del campo da help SAP:
Questo l'esempio di un messaggio di errore:
Vediamo i collegamenti tra le tabelle standard partendo dall'ID del cartellino:
Il campo dell'attesa in minuti (AUSSP) è contenuto in 3 tabelle differenti a seconda del tipo di riapprovvigionamento:
TPK01 Interno
TPK02 Esterno
TPK03 Trasferimento stock
Definizione del FM:
Importazione
Esportazione
Codice del FM:
FUNCTION z_check_kanban.
*"----------------------------------------------------------------------
*"*"Interfaccia locale:
*" IMPORTING
*" VALUE(I_PKKEY) TYPE PKKEY
*" EXPORTING
*" VALUE(ESITO) TYPE CHAR01
*"----------------------------------------------------------------------
* Autore : Fabio Giacobbe - 20/08/2019 |
* Descrizione: Verifica se un kanban può cambiare stato (tempo minimo) |
*----------------------------------------------------------------------+
* Modifiche : by |
* Note : |
*----------------------------------------------------------------------+
* parametri
* ingresso:
* I_PKKEY : ID kanban
*
* uscita:
* ESITO : 0 = il Kanban può cambiare stato
* 1 = il Kanban non può cambiare stato
* 2 = errore lettura PKPS (ID kanban)
* 3 = errore lettura PKHD (ciclo controllo)
* 4 = errore lettura tabelle PK0n: tempo di attesa
* 9 = errore generico.
*----------------------------------------------------------------------+
DATA: wa_pkhd LIKE pkhd,
wa_pkps LIKE pkps,
wa_aussp LIKE tpk01-aussp.
DATA: ok_time LIKE sy-uzeit,
ok_datu LIKE sy-datum.
esito = 9.
SELECT SINGLE * FROM pkps INTO wa_pkps
WHERE pkkey = i_pkkey.
IF sy-subrc <> 0.
esito = 2.
EXIT.
ENDIF.
SELECT SINGLE * FROM pkhd INTO wa_pkhd
WHERE pknum = wa_pkps-pknum.
IF sy-subrc <> 0.
esito = 3.
EXIT.
ENDIF.
IF wa_pkhd-pkste IS NOT INITIAL. "strategia produzione interna
SELECT SINGLE aussp FROM tpk01 INTO wa_aussp
WHERE werks = wa_pkhd-werks
AND pkste = wa_pkhd-pkste.
IF sy-subrc <> 0.
esito = 4.
EXIT.
ENDIF.
ELSEIF wa_pkhd-PKSTF IS NOT INITIAL. "strategia produzione esterna
SELECT SINGLE aussp FROM tpk02 INTO wa_aussp
WHERE werks = wa_pkhd-werks
AND PKSTF = wa_pkhd-PKSTF.
IF sy-subrc <> 0.
esito = 4.
EXIT.
ENDIF.
ELSEIF wa_pkhd-PKSTU IS NOT INITIAL. "strategia trasferimento
SELECT SINGLE aussp FROM tpk03 INTO wa_aussp
WHERE werks = wa_pkhd-werks
AND PKSTU = wa_pkhd-PKSTU.
IF sy-subrc <> 0.
esito = 4.
EXIT.
ENDIF.
ELSE.
esito = 4.
EXIT.
ENDIF.
esito = 0.
* Controllo copiato da standard in LMPKAF40
IF NOT wa_aussp IS INITIAL.
ok_time = ( wa_pkps-saeuz + ( wa_aussp * 60 ) ) MOD 86400.
ok_datu = ( wa_pkps-saeuz + ( wa_aussp * 60 ) ) DIV 86400 +
wa_pkps-saedt.
IF sy-datlo LT ok_datu
OR ( sy-datlo EQ ok_datu AND sy-timlo LT ok_time ).
esito = 1.
ENDIF.
ENDIF.
ENDFUNCTION.
Nessun commento:
Posta un commento