Table of Contents

rm25645 AIRS_PRD: Error: PO Finalizer Job auf PRD

https://cust-projects.seeburger.de/redmine/issues/25645

Description

…

TODO

Analyze

Probleme macht folgende OTD-Line:

INSERT INTO tOTDLINE__ 
(COTDLINEID,COTDRELATIONID,COTDOFFICERID,COTDMATERIALID,CBASELINEID,CBASEHEADERID,CKPIHORIZON    ,COVERALLCOLLABSTATUS,CSUPPLIERCOLLABSTATUS,CCUSTOMERCOLLABSTATUS,CGRADING,CINITIALGRADING,CSUPPLIERCOLLABENDDATE,CCUSTOMERCOLLABENDDATE,CSUPPLIERCAUSE    ,CSUPPLIEREVIDENCE                                 ,CCUSTOMERCAUSE,CCUSTOMEREVIDENCE,CSUPPLIERUSERID   ,CSUPPLIERUSERNAME  ,CCUSTOMERUSERID,CCUSTOMERUSERNAME,CSUPPLIERCOLLABTIMESTAMP,CCUSTOMERCOLLABTIMESTAMP,CSCOREDFORKPICALCULATION,CFLEXFIELD1,CFLEXFIELD2,CFLEXFIELD3,CFLEXFIELD4,CFLEXFIELD5,CFLEXFIELD6,CFLEXFIELD7,CFLEXFIELD8,CFLEXFIELD9,CFLEXFIELD10,CDELETIONFLAG,CPURGROUP,CLINEPONUM,CPOSNUM,CRSNUM,CORDERTYPE,CORDERSUBTYPE,CDOCTYPE,CSPARESPRIO,CAGREEDREQDATE ,CAGREEDREQQTY,CRECQTY,CFINALDELIVERY,CLINEDESCR                    ,CFITCUSTMATERIAL,CCOLLABALLOWEDONOTD,CGOODSARRIVALDATE,COTDONTIMEFROM,COTDONTIMETO,CVERYEARLYTO,CEARLYTO       ,CLATEFROM      ,CVERYLATEFROM        ,CCOLLABTIMEFRAMEREFDATE,CSUPPLIERCOLLABORATED,CCUSTOMERCOLLABORATED,COTDMANAGEMENTSTATUS      ,CENDOFREOPENPERIOD,COTDGRADINGVERYEARLYTO,COTDGRADINGVERYLATEFROM,CLASTEXPORTTIMESTAMP,CEXPORTED) VALUES
('365664'  ,'32264'       ,'45885'      ,'1825846'     ,'25677660' ,'7672669'    ,'1496268000000','CLOSED'            ,'REJECTED'           ,'ACCEPTED'           ,'ONTIME','LATE'         ,'1525557599999'       ,'1525730399999'       ,'Customer ERP/MRP','Cartes en SAV date à changer en 2018 et non 2017',NULL          ,NULL             ,'SANDRINESAUVAGET','Sandrine SAUVAGET','SYSTEM'       ,'SYSTEM'         ,'1525243280319'         ,'0'                     ,'1'                     ,NULL       ,NULL       ,NULL       ,NULL       ,NULL       ,NULL       ,NULL       ,NULL       ,'-1'       ,'-1'        ,'0'          ,'8J1'    ,'50660803','00001','0001','OTHER'   ,'-'          ,NULL    ,NULL       ,'1497650399000','8'          ,'8'    ,'0'           ,'CARTE CABLEE HT VES F1299392','4215206'       ,'1'                ,'1517007599000'  ,'3'           ,'1'         ,'0'         ,'1497650399000','1497995999000','9223372036854775807','1524576976148'        ,'1'                  ,'0'                  ,'Collaborated by Supplier','1530914399999'   ,NULL                  ,NULL                   ,'1525802401271'     ,'1'      )
;

In dem Changelog sieht man, dass der Vorgang “Customer modify” am 24.04.2018 14:36:16.291 stattfand. Dieser Vorgang durfte eigentlich nicht stattfinden, da die PO den Status “RECEIVED” hatte und ein Wechsel daraus nur über einen GR oder PO Import möglich ist. Verdacht: der Übergang ist nicht transaktionssicher, da 117 Millisekunden davor (am 24.04.2018 14:36:16.174) der Vorgang “Supplier Accept” stattfand, der Status von CCOR nach RECEIVED geschaltet hat.

Reproduce

1. Import PO

2. Supplier Accept

3. Stock Movement

4. Import PO

5. Breakpoint in POCollabEngine.processCollabFromGUILine() setzen
6. Customer Modify (Req.Date ändern)

7. Supplier Accept

8. Customer Modify Thread laufen lassen


Der Job geht auf Fehler weil er versucht eine neue Line anzulegen, welche die UNIQUE Constraint hat, die bereits existiert (UNIQUE_OTDLINE_PER_POSL= cBaseLineId + cBaseHeaderId). Aber bevor eine neue Line erstellt wird, wird die alte gesucht und gelöscht (s. OTDManagerDAOImpl.initialCreationOTDLine()). Die alte Line wird aber gesucht nur für die Kriterien cBaseLine + cBaseHeaderId + cDeletionFlag=1. D.h. eine solche Situation kann entstehen, wenn wir eine Line haben, bei der cDeletionFlag=0 ist.

Bei dem Update der PO wird geprüft, ob sie OTD-relevant ist, und wenn ja, die alte OTD-Line wird zur Löschung markiert (cDeletionFlag=1). Das wird gemacht, um danach, wenn der PO-Status “final” wird, diese Line zu löschen und mit der anderen zu ersetzen. Genau an dieser Stelle kann passieren, dass die alte Line stehen bleibt. Nämlich in dem Fall, wenn die alte PO OTD-relevant war und die neue nicht.

—-

Burkhard:
Das ist alles was ich aus der Historie entnehmen kann: zuerst geht die PO von NOP auf Received durch eine Goods Receipt Nachricht, dann wieder zurück nach CCOR. Vielleicht hilft das den Fall nachzustellen.

Das kann man reproduzieren, wenn man:

Damit der Finalizer Job auf einen Fehler läuft, müssen 2 Bedingungen erfüllt sein:

Misc:

Misc

1

Some helpful SQL statements:

SELECT * FROM TAIRPOHEADER WHERE cPONUM LIKE 'rm%001'
 
SELECT * FROM TAIRPOSCHEDULE WHERE CLINEPONUM LIKE 'rm25645%001' 
 
SELECT * FROM TAIRCHANGELOG WHERE CSUBOBJECTREFERENCE=5003673
 
SELECT * FROM TAIRCHANGELOG WHERE cActionTime > 1527079088222 
--and cLocalOp like 'Stock%'
 
-- fetch OTD lines:
SELECT * FROM TOTDLINE ORDER BY cOTDLineID;

2

Komischerweise liefert:

collabId = POCollabStatus.getUniqueCollabTransactionId(new Config(IPOConstants.CLIENT_ID), IPOConstants.COLLAB_PROCESS_SM_GR);

im SMManagerEJB:242 den Wert -1. Warum?

3

Wichtige Stelle: SMImportProcessor.processSTA()

Fix

In POCollabEngineEJB.processCollabGUILine() bevor man die Änderungen an der POLine gemacht werden muss das POCollabModel aktualisiert werden (von der DB neu geholt). So wird die Dateninkonsistenz vorgebeugt.

Misc

Result