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’.
- Am I missing another field that signals a real update to OprSeq?
- 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!
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>

This marks the start of the process

This is the value I changed

This was not changed, by me…
Filtering by GroupID fixed the issue of the code picking on 280 being changed.