jeudi 2 juillet 2015

Interface Réceptions PO

Quelques notes d'implémentation d'une interface réception des commandes PO dans Oracle Applications v11 (en provenance d'un système externe).
En fonction du type de réception à faire, on alimente les tables d'interface correspondantes.
L'organisation qui réceptionne est l'organisation fille "INVENTORY".


1) Si on créé une réception, il est nécessaire d'alimenter la table d'en-tête PO.RCV_HEADERS_INTERFACE.

-- Identifiant issu de la séquence :
   SELECT PO.RCV_HEADERS_INTERFACE_S.nextval
      INTO l_rcv_header.HEADER_INTERFACE_ID
      FROM DUAL;


   l_rcv_header.TRANSACTION_TYPE:= 'NEW';
     
-- Insertion en-tête :

INSERT INTO PO.RCV_HEADERS_INTERFACE          
 (HEADER_INTERFACE_ID,
  GROUP_ID,
  PROCESSING_STATUS_CODE,
  RECEIPT_SOURCE_CODE,
  TRANSACTION_TYPE,   
  LAST_UPDATE_DATE,LAST_UPDATED_BY,LAST_UPDATE_LOGIN,CREATION_DATE,CREATED_BY,
  VENDOR_ID,
  SHIP_TO_ORGANIZATION_ID,
  SHIPPED_DATE,
  EXPECTED_RECEIPT_DATE,
  COMMENTS,
  EMPLOYEE_ID,
  VALIDATION_FLAG)
VALUES      

 (l_rcv_header.HEADER_INTERFACE_ID,
  1,
  'PENDING',
  'VENDOR',
  l_rcv_header.TRANSACTION_TYPE,
  sysdate,0,0,sysdate,0,
  l_rcv_header.VENDOR_ID,
  l_rcv_header.SHIP_TO_ORGANIZATION_ID,
  sysdate,
  sysdate,
  'Description : -'||r_reception_tmp.num_com||'-T'||r_reception_tmp.num_tiers||'-'||r_reception_tmp.journal_echeance_id,
  l_rcv_header.employee_id,
  'Y');


2) Dans tous les cas, une ou plusieurs lignes sont à insérer au niveau des transactions. Une seule ligne sera crée pour une création de réception. Deux lignes pour une correction ou un retour fournisseur (d'abord le traitement de la délivrance 'DELIVER' puis 'RECEIVE' à corriger  en second). Dans le cas d'une création, on alimente le champ HEADER_INTERFACE_ID pour lier à l'en-tête, dans le cas d'une modification de réception, on alimente à la place les identifiants (PARENT_TRANSACTION_ID) des transactions d'origine de la réception à modifier (nécessite une recherche de l'identifiant dans la table (rcv_transactions).


-- Sélection d'un identifiant
   SELECT PO.RCV_TRANSACTIONS_INTERFACE_S.nextval
     INTO l_rcv_transac.INTERFACE_TRANSACTION_ID
     FROM DUAL;

 l_rcv_transac.TRANSACTION_TYPE:='RECEIVE'; (création)
ou
l_rcv_transac.TRANSACTION_TYPE:='CORRECT'; (correction)

  -- Insertion des lignes
INSERT INTO PO.RCV_TRANSACTIONS_INTERFACE
  (INTERFACE_TRANSACTION_ID
  ,HEADER_INTERFACE_ID
  ,GROUP_ID       

  ,LAST_UPDATE_DATE,LAST_UPDATED_BY,LAST_UPDATE_LOGIN,CREATION_DATE,CREATED_BY
  ,TRANSACTION_TYPE

  ,TRANSACTION_DATE
  ,PROCESSING_STATUS_CODE,PROCESSING_MODE_CODE,TRANSACTION_STATUS_CODE
  ,QUANTITY
  ,UOM_CODE,UNIT_OF_MEASURE
  ,AUTO_TRANSACT_CODE
  ,RECEIPT_SOURCE_CODE,SOURCE_DOCUMENT_CODE
  ,PO_HEADER_ID,PO_LINE_ID,PO_LINE_LOCATION_ID,PO_DISTRIBUTION_ID
  ,TO_ORGANIZATION_ID,SHIP_TO_LOCATION_ID
  ,VALIDATION_FLAG
  ,SHIPMENT_HEADER_ID,SHIPMENT_LINE_ID,PARENT_TRANSACTION_ID)

VALUES
  (l_rcv_transac.INTERFACE_TRANSACTION_ID
  ,l_rcv_header.HEADER_INTERFACE_ID
  ,1
  ,sysdate,0,0,sysdate,0
  ,l_rcv_transac.TRANSACTION_TYPE

  ,sysdate
  ,'PENDING','BATCH','PENDING'
  ,r_reception_tmp.montant/100
  ,l_rcv_transac.UOM_CODE,l_rcv_transac.UNIT_OF_MEASURE
  ,'DELIVER'
  ,'VENDOR','PO'  

  ,r_reception_tmp.po_header_id

  ,l_rcv_transac.PO_LINE_ID
  ,l_rcv_transac.PO_LINE_LOCATION_ID,l_rcv_transac.PO_DISTRIBUTION_ID
  ,l_rcv_header.SHIP_TO_ORGANIZATION_ID,l_rcv_transac.SHIP_TO_LOCATION_ID
  ,'Y'        

  ,l_rcv_transac.shipment_header_id
 ,l_rcv_transac.shipment_line_id,l_rcv_transac.parent_transaction_id);

3) Après insertion des transaction, il faut lancer le processeur des mouvements de réception (Receiving Transaction Processor)
-- Lancement d'un traitement
l_req_id :=apps.fnd_request.submit_request (Application   => 'PO',
                                            Program       => 'RVCTP',  
                                            Argument1     => 'BATCH',
                                            Argument2     => '1'   );
COMMIT;
 
l_code_retour := fnd_concurrent.WAIT_FOR_REQUEST (l_req_id,10,0,l_phase,l_status,l_dev_phase,l_dev_status,l_message);

Le processeur des mouvements est utilisé pour traiter toutes les réceptions en attente, avec différents modes de lancement qui peuvent être définis (transactionnel, lot..).

4) Récupération des transactions en erreur
Les erreurs des imports PO sont stockées dans la table PO_INTERFACE_ERRORS avec
interface_type = 'RCV-856' pour les réceptions.

 SELECT *
   FROM po_interface_errors
  WHERE interface_type = 'RCV-856'
    AND request_id = l_req_id; 



Il existe un état correspondant (Receiving Interface Errors Report) mais il est très moche :
l_req_id := Fnd_Request.SUBMIT_REQUEST(
                     Application     => 'PO',
                     Program         => 'RCVIERR',
                     Argument1       => null,  -- Start Date
                     Argument2       => null,  -- End Date
                     Argument3       => null); -- Purge_Data





Moretto
Comme ta bouche est immense
Quand tu souris et quand tu ris
Je ris aussi, tu aimes tellement la vie
Quel est donc ce froid que l´on sent en toi?