venerdì 9 agosto 2019

Gestione tempi di carico nei trasporti.

Si vuole aggiornare in modo semplice la data-ora di inizio e di fine carico nella gestione trasporti di SAP.

L'idea è quella di costruire una nuova transazione molto semplice, da utilizzare nei terminali in radio frequenza, in modo che l'operatore possa registrare facilmente l'inizio dell'operazione di carico del camion e la fine dell'operazione; in questo modo si può avere evidenza del tempo effettivo di carico nei trasporti.

Esiste una BAPI di aggiornamento dei trasporti BAPI_SHIPMENT_CHANGE, non è molto ben documentata e si trovano pochi esempi on-line, per cui sono stati necessari diversi tentativi e test, ma alla fine ho trovato il modo di usarla.


Bisogna anche precisare che la nota OSS 1083509 - FAQ : LE-TRA  specifica che la BAPI in questione non sarebbe rilasciata per i clienti:

5. BAPI "BAPI_SHIPMENT_CHANGE" is not released for Customers.

per cui la cosa funziona, ma se dovessero nascere problemi, magari dopo qualche aggiornamento di release, si dovrà cercare qualche altra soluzione (per esempio tramite CALL TRANSACTION o altro).

Questi i campi nella testata trasporto che si vogliono gestire, da VT02N:


Se si vuole solo cambiare lo stato, prendendo la data-ora attuale del sistema, è sufficiente impostare i dati nelle strutture di testata:

headerdata-STATUS_LOAD_START = 'X'.
headerdataaction-STATUS_LOAD_START = 'C'.

headerdata-STATUS_LOAD_END = 'X'.
headerdataaction-STATUS_LOAD_END = 'C'.

Se invece si vuole impostare una data e ora ben precisa allora si devono usare anche le tabelle HEADERDEADLINE e HEADERDEADLINEACTION con una codifica particolare dei campi data da aggiornare.

Questa la codifica dei campi

HDRSTPLDT  = Status planned
HDRSTCIPDT = Status checkin plan
HDRSTCIADT = Status checkin act
HDRSTLSPDT = Status load start plan
HDRSTLSADT = Status load start act
HDRSTLEPDT = Status load end plan
HDRSTLEADT = Status load end act
HDRSTCPDT  = Status complete plan
HDRSTCADT  = Status copmlete act
HDRSTSSPDT = Status ship start plan
HDRSTSSADT = Status ship start act
HDRSTSEPDT = Status ship end plan
HDRSTSEADT = Status shipmnt end act
HDRTNDEPDT = Tender earliest pick
HDRTNDLPDT = Tendering latest pick
HDRTNDEDDT = Tender early delivery
HDRTNDLDDT = Tender latest delivery
STLSTPDT   = Stage start plan
STLSTADT   = Stage start act
STLENDPT   = Stage end plan
STLENADT   = Stage end act

Esempio per impostare la data di inizio carico:

headerdeadline-time_type = 'HDRSTLSADT'.
CONCATENATE <data> <time> INTO headerdeadline-time_stamp_utc.
headerdeadline-time_zone = sy-zonlo.
APPEND headerdeadline.

headerdeadlineaction-time_type = 'C'.
headerdeadlineaction-time_stamp_utc = 'C'.
headerdeadlineaction-time_zone = 'C'.
APPEND headerdeadlineaction.

Esempio di programma per aggiornamento (prende data-ora del sistema):

REPORT nnnn.

*----------------------------------------------------------------------*
* Parametri di selezione
*----------------------------------------------------------------------*
PARAMETERS: i_tknum LIKE vttk-tknum.

DATA: headerdata           LIKE bapishipmentheader,
      headerdataaction     LIKE bapishipmentheaderaction,
      headerdeadline       LIKE bapishipmentheaderdeadline
                  OCCURS 0 WITH HEADER LINE,
      headerdeadlineaction LIKE bapishipmentheaderdeadlineact
                  OCCURS 0 WITH HEADER LINE,
      return               LIKE bapiret2
                  OCCURS 0 WITH HEADER LINE.

*----------------------------------------------------------------------*
* Inizio programma
*----------------------------------------------------------------------*
START-OF-SELECTION.

* verifico se esiste il trasporto
  DATA: wa_vttk LIKE vttk,
        wa_ts(40).
  SELECT SINGLE * FROM vttk INTO wa_vttk
                 WHERE tknum = i_tknum.
  IF sy-subrc <> 0.
    MESSAGE 'Non trovo trasporto' TYPE 'S'.
    STOP.
  ENDIF.

  headerdata-shipment_num = wa_vttk-tknum.

* Verifico se non è ancora iniziato il carico.
  IF wa_VTTK-DALBG IS INITIAL.
    HEADERDATA-STATUS_LOAD_START       = 'X'.
    headerdataaction-STATUS_LOAD_START = 'C'.
* Verifico se il carico non è terminato.    
  ELSEIF wa_VTTK-DALEN IS INITIAL.
    HEADERDATA-STATUS_LOAD_END       = 'X'.
    headerdataaction-STATUS_LOAD_END = 'C'.
  ELSE.
    MESSAGE 'Tempo carico già impostato!' TYPE 'S'.
    STOP.
  ENDIF.

  CALL FUNCTION 'BAPI_SHIPMENT_CHANGE'
    EXPORTING
      headerdata                 = headerdata
      headerdataaction           = headerdataaction
    TABLES
      HEADERDEADLINE             = headerdeadline
      HEADERDEADLINEACTION       = headerdeadlineaction
      return                     = return
            .
   IF sy-subrc = 0.
     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
       EXPORTING
         WAIT          = abap_true.
   ENDIF.

Nessun commento:

Posta un commento