mercoledì 21 agosto 2019

Kanban - FM check cambio stato effettuabile.

Nel kanban di SAP si può impostare un tempo minimo di attesa che deve esserci tra un cambio stato e l'altro di un cartellino.

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