Per il controllo ATP su ordini di vendita esistono report e BAPI specifiche da utilizzare ma certe volte vi potrebbe capitare di dover eseguire un controllo all’interno di un flusso dell’ordine o addirittura eseguire il controllo in un altro processo particolare per aggiornare la disponibilità.
Le funzioni centrali del server ATP sono nel gruppo programmi SAPLATP, questo è il core del calcolo sui segmenti, quelli che eseguono la disponibilità sull’ordine di vendita sono all’interno del gruppo programmi SAPMV45 e nello specifico si tratta dei form FCODE_BVFP per ATP sull’intero documento e form FCODE_PORE per il singolo item.
Se siete all’interno dell’elaborazione dell’ordine di vendita ( VA01 o VA02) e quindi avete gia caricato in memoria le tabelle potrete semplicemente richiamare queste due funzioni tenendo sempre in grande considerazione il flusso del programma.
Per poter eseguire la disponibilità al di fuori dell’elaborazione dell’ordine di vendita dovete sapere alcune regole nella logica SD di SAP, come ad esempio il fatto che la disponibilità è sempre una condizione sottostante ad un controllo credito positivo del BP e che il credito impegnato totale standard è calcolato sulla merce che ha conferma di disponibilità.
Per questo per poter eseguire con successo l’ATP su un documento o un singolo item al di fuori dell’elaborazione ordine di vendita, dovreste prima caricare i dati del documento di vendita e poi fare sempre il controllo credito che predispone il server ATP, una volta fatto questo potete caricare i dati dell’item in memoria per poi eseguire il controllo su quest’ultimo.
Questo un esempio di esecuzione:
IF lv_vbeln NE '' AND lv_posnr NE '000000'
CALL FUNCTION 'SD_SALES_DOCUMENT_READ'
EXPORTING
document_number = lv_vbeln
IMPORTING
evbak = vbak
evbakkom = vbakkom
EXCEPTIONS
error_message = 01.
IF sy-subrc NE 0.
CHECK 1 = 0.
ENDIF.
IF vbakkom-lifsk EQ '01'.
CALL FUNCTION 'SD_SALES_DOCUMENT_PERFORM'
EXPORTING
in_program = 'SAPFV45K'
perform = 'KREDITLIMIT_PRUEFEN_BEI_CALL'
EXCEPTIONS
error_message = 01.
IF sy-subrc NE 0.
CHECK 1 = 0.
ENDIF.
ENDIF.
ENDON.
CALL FUNCTION 'SD_SALES_ITEM_READ'
EXPORTING
item_number = lv_posnr
IMPORTING
evbap = vbap
evbapkom = vbapkom
EXCEPTIONS
error_message = 01
item_number_missing = 02.
CALL FUNCTION 'SD_SALES_ITEM_TABLES_READ'
EXPORTING
item_number = lv_posnr
TABLES
exvbep = xvbep
EXCEPTIONS
error_message = 01
item_number_missing = 02.
IF vbakkom-lifsk NE vbak-lifsk.
da_save = charx.
ENDIF.
" ATP sulla posizione
IF vbak-lifsk EQ ' '.
CALL FUNCTION 'SD_SALES_DOCUMENT_PERFORM'
EXPORTING
in_program = 'SAPMV45A'
perform = 'FCODE_PORE'
EXCEPTIONS
error_message = 01.
IF sy-subrc NE 0.
IF p_spool = abap_true.
CLEAR ls_pos_log.
MOVE-CORRESPONDING ls_pos_odv TO ls_pos_log.
ls_pos_log-type = 'FCODE_PORE(SAPMV45A)'.
ls_pos_log-id = sy-msgid .
ls_pos_log-number = sy-msgno.
MOVE 'Errore disponibilità ATP' TO ls_pos_log-message.
APPEND ls_pos_log TO p_t_pos_odv_log[].
ENDIF.
CHECK 1 = 0.
ENDIF.
da_save = charx.
ENDIF.