Method Directive Always Firing for OprSeq = 280

I’ve set up a Method Directive on Erp.EcoOpr (PostProcess of ‘EngWorkBench.ApproveAndCheckInAll’) to detect when ‘OprSeq’ changes. The logic is:

if (row.OrigOprSeq != 0 && row.OrigOprSeq != row.OprSeq)
// OprSeq was changed

In testing, this worked perfectly: changing ‘OprSeq’ in the Workbench triggered the directive.
In production, however, I see the directive always firing on records where ‘OprSeq = 280’, as if it changed from 280 to 270—even though no update was made.

What I’ve observed in my trace:

The problematic record has ‘OprSeq = 280’ and ‘OrigOprSeq = 280’.
Other records that aren’t flagged show ‘OrigOprSeq = 0’.

  1. Am I missing another field that signals a real update to OprSeq?
  2. Is there a better best practice for catching only genuine OprSeq changes in this context?

Any pointers or alternative approaches would be greatly appreciated, thanks in advance!

RowMod = “U” perhaps…

Here is the logic I’ve been using…

Func<string, bool> showMsg = (message) =>
{
    this.PublishInfoMessage(message, Ice.Common.BusinessObjectMessageType.Information, Ice.Bpm.InfoMessageDisplayMode.Individual,"UBAQ", "Advanced");
    return true;
};
//showMsg($"Running update for UD06 partNum: {ipPartNum} = {partNum} revision {ipRevisionNum}");
if (ttECOOpr.Any())
{
  foreach (var ecoOpr in Db.ECOOpr.Where(o => o.OprSeq != o.OrigOprSeq && o.PartNum == partNum && o.RevisionNum == ipRevisionNum && o.OrigOprSeq > 0))
  {
    showMsg($"Found update to oprSeq: {ecoOpr.OrigOprSeq} changed to {ecoOpr.OprSeq}");
    var ud06Rows = (from ud in Db.UD06 where ud.Company == ecoOpr.Company && ud.Key1 == ecoOpr.PartNum && ud.Key2 == ecoOpr.RevisionNum && (ud.Number03 == ecoOpr.OrigOprSeq || ud.ShortChar04 == ecoOpr.OrigOprSeq.ToString()) select ud).ToList();
    if(ud06Rows.Any())
    {
      foreach(var ud06Row in ud06Rows)
      {
        showMsg("Updating UD06 values in table.");
        var opDtl = Db.ECOOpDtl.Where(o => o.OprSeq == o.OrigOprSeq && o.PartNum == partNum).FirstOrDefault();
        var key3Value = ecoOpr.OprSeq.ToString();
        if(opDtl.OpDtlSeq != 0){
          key3Value = string.Format("{0}::{1}", key3Value, opDtl.OpDtlSeq);
        }
        
        if(!string.IsNullOrWhiteSpace(opDtl.AltMethod) && opDtl.OprSeq != 0){
          key3Value = string.Format("{0}::{1}::{2}", key3Value, opDtl.OpDtlSeq, opDtl.AltMethod.Trim());
        }
        showMsg($"Changed values in key3 {key3Value}"); 
        
        ud06Row.Key3 = key3Value;
        ud06Row.ShortChar04 = ecoOpr.OprSeq.ToString();
        ud06Row.Number03 = ecoOpr.OprSeq;
      }
    }
  }   
}

Here is a sample of the trace where OprSeq has changed and the OrigOprSeq has the value it was changed from. RowMod is blank.

<ECOOpr>
	  <Company>T300</Company>
	  <PartNum>7422690</PartNum>
	  <RevisionNum>001</RevisionNum>
	  <OprSeq>100</OprSeq>
	  <OpCode>53801</OpCode>
	  <OpStdID></OpStdID>
	  <EstSetHours>0</EstSetHours>
	  <EstProdHours>0</EstProdHours>
	  <ProdStandard>0</ProdStandard>
	  <StdFormat>HP</StdFormat>
	  <StdBasis>E</StdBasis>
	  <OpsPerPart>0</OpsPerPart>
	  <QtyPer>1</QtyPer>
	  <Machines>1</Machines>
	  <SetUpCrewSize>1</SetUpCrewSize>
	  <ProdCrewSize>1</ProdCrewSize>
	  <EstScrap>0</EstScrap>
	  <EstScrapType>%</EstScrapType>
	  <SubContract>false</SubContract>
	  <IUM></IUM>
	  <EstUnitCost>0</EstUnitCost>
	  <DaysOut>0</DaysOut>
	  <SubPartNum></SubPartNum>
	  <VendorNum>0</VendorNum>
	  <PurPoint></PurPoint>
	  <CommentText></CommentText>
	  <SchedRelation>FS</SchedRelation>
	  <RunQty>1.00000000</RunQty>
	  <AddlSetupHours>0</AddlSetupHours>
	  <AddlSetUpQty>0</AddlSetUpQty>
	  <APSPrepOp>0</APSPrepOp>
	  <APSNextOp>-1</APSNextOp>
	  <APSAltOp>0</APSAltOp>
	  <APSSpecificResource></APSSpecificResource>
	  <APSCycleTime>0</APSCycleTime>
	  <APSConstantTime>0</APSConstantTime>
	  <APSSetupGroup>1</APSSetupGroup>
	  <APSMakeFactor>1</APSMakeFactor>
	  <APSContainerSize>0</APSContainerSize>
	  <APSSchedulerName></APSSchedulerName>
	  <APSMaxLength>0</APSMaxLength>
	  <APSTransferTime>0</APSTransferTime>
	  <APSEffectiveness>0</APSEffectiveness>
	  <APSOperationClass>D</APSOperationClass>
	  <APSAuxResource></APSAuxResource>
	  <APSAddResource></APSAddResource>
	  <LaborEntryMethod>T</LaborEntryMethod>
	  <FAQty>0</FAQty>
	  <RFQNeeded>false</RFQNeeded>
	  <RFQVendQuotes>0</RFQVendQuotes>
	  <GroupID>NADCAP</GroupID>
	  <OrigOprSeq>60</OrigOprSeq>
	  <SetupGroup></SetupGroup>
	  <AnalysisCode></AnalysisCode>
	  <PrimarySetupOpDtl>10</PrimarySetupOpDtl>
	  <PrimaryProdOpDtl>10</PrimaryProdOpDtl>
	  <AltMethod></AltMethod>
	  <OpDesc>INSP - BURR/BLEND B38</OpDesc>
	  <StageNumber></StageNumber>
	  <BaseMethodOverridden>false</BaseMethodOverridden>
	  <ParentAltMethod></ParentAltMethod>
	  <ParentOprSeq>0</ParentOprSeq>
	  <BrkQty01>0</BrkQty01>
	  <BrkQty02>0</BrkQty02>
	  <BrkQty03>0</BrkQty03>
	  <BrkQty04>0</BrkQty04>
	  <BrkQty05>0</BrkQty05>
	  <BrkQty06>0</BrkQty06>
	  <BrkQty07>0</BrkQty07>
	  <BrkQty08>0</BrkQty08>
	  <BrkQty09>0</BrkQty09>
	  <BrkQty10>0</BrkQty10>
	  <PBrkCost01>0</PBrkCost01>
	  <PBrkCost02>0</PBrkCost02>
	  <PBrkCost03>0</PBrkCost03>
	  <PBrkCost04>0</PBrkCost04>
	  <PBrkCost05>0</PBrkCost05>
	  <PBrkCost06>0</PBrkCost06>
	  <PBrkCost07>0</PBrkCost07>
	  <PBrkCost08>0</PBrkCost08>
	  <PBrkCost09>0</PBrkCost09>
	  <PBrkCost10>0</PBrkCost10>
	  <PBrkStdRate01>0</PBrkStdRate01>
	  <PBrkStdRate02>0</PBrkStdRate02>
	  <PBrkStdRate03>0</PBrkStdRate03>
	  <PBrkStdRate04>0</PBrkStdRate04>
	  <PBrkStdRate05>0</PBrkStdRate05>
	  <PBrkStdRate06>0</PBrkStdRate06>
	  <PBrkStdRate07>0</PBrkStdRate07>
	  <PBrkStdRate08>0</PBrkStdRate08>
	  <PBrkStdRate09>0</PBrkStdRate09>
	  <PBrkStdRate10>0</PBrkStdRate10>
	  <SNRequiredOpr>false</SNRequiredOpr>
	  <SNRequiredSubConShip>false</SNRequiredSubConShip>
	  <Weight>0</Weight>
	  <WeightUOM>KG</WeightUOM>
	  <SendAheadType>PIECES</SendAheadType>
	  <SendAheadOffset>0</SendAheadOffset>
	  <PrjRoleList></PrjRoleList>
	  <UseAllRoles>true</UseAllRoles>
	  <ExternalMES>false</ExternalMES>
	  <PctReg>0</PctReg>
	  <SetupMaterial>0</SetupMaterial>
	  <MaterialColorRating>0</MaterialColorRating>
	  <MiscInfo1></MiscInfo1>
	  <MiscInfo2></MiscInfo2>
	  <SetupURL></SetupURL>
	  <ExpPctUp>0</ExpPctUp>
	  <ExpCycTm>0</ExpCycTm>
	  <ExpGood>0</ExpGood>
	  <NonProdLimit>0</NonProdLimit>
	  <AutoSpcEnable>false</AutoSpcEnable>
	  <AutoSpcPeriod>0</AutoSpcPeriod>
	  <PartQualEnable>false</PartQualEnable>
	  <AutoSpcSubgroup>0</AutoSpcSubgroup>
	  <SysRevID>17988472376</SysRevID>
	  <SysRowID>6d8141a9-e1ef-47b5-a8d0-2f58cde37d8e</SysRowID>
	  <PulsesPerCycle>0</PulsesPerCycle>
	  <QtyPerCycle>0</QtyPerCycle>
	  <AutoReceive>false</AutoReceive>
	  <DspBillAddr></DspBillAddr>
	  <EnableSNReqSubConShip>false</EnableSNReqSubConShip>
	  <EnableSNRequiredOpr>false</EnableSNRequiredOpr>
	  <FinalOpr>false</FinalOpr>
	  <HasPriceBreaks>false</HasPriceBreaks>
	  <IsPartOpr>false</IsPartOpr>
	  <OldOprSeq>0</OldOprSeq>
	  <OpStdDescription></OpStdDescription>
	  <PrimaryResourceGrpDesc>B38</PrimaryResourceGrpDesc>
	  <PrimaryResourceGrpID>538</PrimaryResourceGrpID>
	  <RefreshResources>false</RefreshResources>
	  <SetHoursPerMach>0</SetHoursPerMach>
	  <StdFrmtDesc></StdFrmtDesc>
	  <UseStaging>false</UseStaging>
	  <PLMChar03></PLMChar03>
	  <BitFlag>0</BitFlag>
	  <AnalysisCdDescription></AnalysisCdDescription>
	  <APSSchedulerNameAPSSchedulerName></APSSchedulerNameAPSSchedulerName>
	  <GroupIDDescription>CHANGES REQUIRED</GroupIDDescription>
	  <OpCodeOpDesc>B38</OpCodeOpDesc>
	  <PartNumIUM>EA</PartNumIUM>
	  <PartNumTrackDimension>false</PartNumTrackDimension>
	  <PartNumTrackLots>false</PartNumTrackLots>
	  <PartNumSellingFactor>1.00000000</PartNumSellingFactor>
	  <PartNumTrackSerialNum>false</PartNumTrackSerialNum>
	  <PartNumPricePerCode>E</PartNumPricePerCode>
	  <PartNumPartDescription>LH</PartNumPartDescription>
	  <PartNumSalesUM>EA</PartNumSalesUM>
	  <RevisionNumRevDescription></RevisionNumRevDescription>
	  <RevisionNumRevShortDesc>CREATED</RevisionNumRevShortDesc>
	  <RevisionNumPartDescription>LH</RevisionNumPartDescription>
	  <SetupGroupDescription></SetupGroupDescription>
	  <StageNoDescription></StageNoDescription>
	  <SubPartNumPricePerCode></SubPartNumPricePerCode>
	  <SubPartNumTrackDimension>false</SubPartNumTrackDimension>
	  <SubPartNumTrackSerialNum>false</SubPartNumTrackSerialNum>
	  <SubPartNumSellingFactor>0</SubPartNumSellingFactor>
	  <SubPartNumTrackLots>false</SubPartNumTrackLots>
	  <SubPartNumSalesUM></SubPartNumSalesUM>
	  <SubPartNumPartDescription></SubPartNumPartDescription>
	  <SubPartNumIUM></SubPartNumIUM>
	  <VendorNumDefaultFOB></VendorNumDefaultFOB>
	  <VendorNumCurrencyCode></VendorNumCurrencyCode>
	  <VendorNumCity></VendorNumCity>
	  <VendorNumVendorID></VendorNumVendorID>
	  <VendorNumName></VendorNumName>
	  <VendorNumState></VendorNumState>
	  <VendorNumAddress1></VendorNumAddress1>
	  <VendorNumZIP></VendorNumZIP>
	  <VendorNumTermsCode></VendorNumTermsCode>
	  <VendorNumAddress3></VendorNumAddress3>
	  <VendorNumAddress2></VendorNumAddress2>
	  <VendorNumCountry></VendorNumCountry>
	  <RowMod></RowMod>
</ECOOpr>

image
This marks the start of the process

image
This is the value I changed

image
This was not changed, by me…

Filtering by GroupID fixed the issue of the code picking on 280 being changed.