created transaction queue to process database writes and deletes in first in first out order
This commit is contained in:
@ -30,7 +30,7 @@ Return Response else ''
|
||||
|
||||
|
||||
Service RunMonitors()
|
||||
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
|
||||
@ -52,6 +52,12 @@ Service RunMonitors()
|
||||
GoSub ClearCursors
|
||||
Mona_Services('SendMetric', 'GRP_OPENINSIGHT_MES_OP_FE_SERVICE_MANANGER', 'PROC_QUEUE', QueueCount)
|
||||
|
||||
Query = 'SELECT TRANSACTION_QUEUE'
|
||||
RList(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||
QueueCount = @RecCount
|
||||
GoSub ClearCursors
|
||||
Mona_Services('SendMetric', 'GRP_OPENINSIGHT_MES_OP_FE_SERVICE_MANANGER', 'TRANSACTION_QUEUE', QueueCount)
|
||||
|
||||
GoSub SAPHeartbeat
|
||||
GoSub MonitorMetrologyDirs
|
||||
|
||||
|
@ -865,108 +865,20 @@ return
|
||||
|
||||
WRITE_RECORD:
|
||||
|
||||
StartTick = GetTickCount()
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'WriteRecord'
|
||||
|
||||
WONo = Record<RDS_WO$>
|
||||
|
||||
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
|
||||
EpiPro = (ReactType EQ 'EPP')
|
||||
GaN = (ReactType EQ 'GAN')
|
||||
NonEpiPro = ( (ReactType NE 'EPP') and (ReactType NE 'GAN') )
|
||||
|
||||
If NonEpiPro then
|
||||
// Sync up VER, LOAD, UNLOAD, POST, and QA signatures with WO_MAT signature profile.
|
||||
// The goal of signature services was to remove any dependency on the WO_MAT signature profile,
|
||||
// however Fabtime relies on this data being replicated to the Scrape SQL DB.
|
||||
WOMatKey = {WO_MAT_KEY}
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
WOMatSigProf = obj_WO_Mat('CassSigProfile', WOMatKey)
|
||||
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$>
|
||||
WOMatSigDTM = WOMatRec<WO_MAT_SIG_DTM$>
|
||||
|
||||
// Update WO_MAT signature profile to match for the "1VER" stage
|
||||
Stage = '1VER'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_PRE_EPI_SIG$>
|
||||
PreEpiDate = Record<RDS_PRE_EPI_SIG_DATE$>
|
||||
If PreEpiDate NE '' then
|
||||
PreEpiTime = Record<RDS_PRE_EPI_SIG_TIME$>
|
||||
PreEpiSigDTM = PreEpiDate + (PreEpiTime/86400)
|
||||
end else
|
||||
PreEpiSigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = PreEpiSigDTM
|
||||
end
|
||||
|
||||
// Update WO_MAT signature profile to match for "1LOAD" stage
|
||||
Stage = '1LOAD'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_OPERATOR_IN$>
|
||||
DateIn = Record<RDS_DATE_IN$>
|
||||
If DateIn NE '' then
|
||||
LoadTime = Record<RDS_TIME_IN$>
|
||||
LoadSigDTM = DateIn + (LoadTime/86400)
|
||||
end else
|
||||
LoadSigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = LoadSigDTM
|
||||
end
|
||||
|
||||
// Update WO_MAT signature profile to match for the "1UNLOAD" stage
|
||||
Stage = '1UNLOAD'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_OPERATOR_OUT$>
|
||||
DateOut = Record<RDS_DATE_OUT$>
|
||||
If DateOut NE '' then
|
||||
TimeOut = Record<RDS_TIME_OUT$>
|
||||
TimeOutSigDTM = DateOut + (TimeOut/86400)
|
||||
end else
|
||||
TimeOutSigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = TimeOutSigDTM
|
||||
end
|
||||
|
||||
// Update WO_MAT signature profile to match for the "1POST" stage
|
||||
Stage = '1POST'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_POST_EPI_SIG$>
|
||||
PostSigDate = Record<RDS_POST_EPI_SIG_DATE$>
|
||||
If PostSigDate NE '' then
|
||||
PostSigTime = Record<RDS_POST_EPI_SIG_TIME$>
|
||||
PostSigDTM = PostSigDate + (PostSigTime/86400)
|
||||
end else
|
||||
PostSigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = PostSigDTM
|
||||
end
|
||||
|
||||
// Update WO_MAT signature profile to match for the "1QA" stage
|
||||
Stage = '1QA'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_SUP_VER_SIG$>
|
||||
FQADate = Record<RDS_SUP_VER_SIG_DATE$>
|
||||
If FQADate NE '' then
|
||||
FQASigTime = Record<RDS_SUP_VER_SIG_TIME$>
|
||||
FQASigDTM = FQADate + (FQASigTime/86400)
|
||||
end else
|
||||
FQASigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = FQASigDTM
|
||||
end
|
||||
|
||||
WOMatRec<WO_MAT_SIG_PROFILE$> = WOMatSigProf
|
||||
WOMatRec<WO_MAT_SIGNATURE$> = WOMatSig
|
||||
WOMatRec<WO_MAT_SIG_DTM$> = WOMatSigDTM
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
|
||||
end
|
||||
Service_Services('PostProcedure', 'RDS_SERVICES', 'PushSigProfileToWoMat':@VM:Name)
|
||||
|
||||
OrigDateOut = OrigRecord<RDS_DATE_OUT$>
|
||||
NewDateOut = Record<RDS_DATE_OUT$>
|
||||
|
||||
If ( ( (OrigDateOut EQ '') and (NewDateOut NE '') ) ) then
|
||||
// Mark this cassette as processed in the schedule event record
|
||||
WONo = Record<RDS_WO$>
|
||||
DatetimeOut = {DATETIME_OUT}
|
||||
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
|
||||
EpiPro = (ReactType EQ 'EPP')
|
||||
If EpiPro then
|
||||
WMIKeys = {WM_IN_KEY}
|
||||
For each WMIKey in WMIKeys using @VM setting vPos
|
||||
@ -1062,5 +974,3 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
@ -115,7 +115,7 @@ AutoDisplayErrors = FALSE$ ; // Set this to True$ when debugging so all erro
|
||||
Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON, Logging_Services
|
||||
Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_SI_Keys, Obj_WO_Mat, Obj_WO_Mat_Log
|
||||
Declare subroutine Dialog_Box, Obj_Notes, RList, Set_Status, Errmsg, Obj_React_Status , Reactor_Services
|
||||
Declare subroutine Rds_Services, Obj_Post_Log, Mona_Services
|
||||
Declare subroutine Rds_Services, Obj_Post_Log, Mona_Services, Transaction_Services
|
||||
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
||||
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
||||
Declare function Memberof, Obj_WO_Mat, Obj_WO_Mat_Log, SRP_Array, DateTime, Dialog_Box, obj_Prod_Spec
|
||||
@ -144,15 +144,12 @@ end
|
||||
|
||||
Return Response else ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Service Parameter Options
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
Options BOOLEAN = True$, False$
|
||||
Options STAGES = 'PRE', 'FWI', 'LWI', 'QA', 'LOAD', 'UNLOAD'
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Services
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -198,6 +195,7 @@ Service GetCurrentStage(RDSNo)
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetComments
|
||||
//
|
||||
@ -233,6 +231,7 @@ End Service
|
||||
// to an RDS record.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service AddComment(RDSNo, Comment, UsernameOpt)
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'AddComment'
|
||||
|
||||
@ -259,6 +258,7 @@ Service AddComment(RDSNo, Comment, UsernameOpt)
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
@ -297,10 +297,10 @@ Service GetFinalQAStatus(RDSNo)
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
Service IsPackaged(RDSNo, RDSType)
|
||||
|
||||
isPackaged = False$
|
||||
//ReactType = XLATE('RDS', RDSNo, 'REACTOR_TYPE', '')
|
||||
// Check to see if the Final QA signature is in place.
|
||||
If RDSType EQ 'EPP' then
|
||||
Convert '.' TO '*' in RDSNo
|
||||
@ -323,7 +323,9 @@ Service IsPackaged(RDSNo, RDSType)
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
Service GetHoldStatus(RDSNo, RDSType)
|
||||
|
||||
Response = False$
|
||||
If Error_Services('NoError') then
|
||||
IF RDSType EQ 'EPP' then
|
||||
@ -362,8 +364,7 @@ End Service
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetRDSList(WorkOrderNo, KeysOnly=BOOLEAN)
|
||||
|
||||
RDSList = ''
|
||||
|
||||
RDSList = ''
|
||||
If WorkOrderNo NE '' then
|
||||
rv = Set_Status(0)
|
||||
RDSKeys = ''
|
||||
@ -413,8 +414,7 @@ Service GetRDSList(WorkOrderNo, KeysOnly=BOOLEAN)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'WorkOrderNo argument was missing from the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
end
|
||||
Response = RDSList
|
||||
|
||||
end service
|
||||
@ -432,7 +432,6 @@ end service
|
||||
Service GetRDSData(WorkOrderNo, Columns, ShowGasGauge, RDSOverrideList)
|
||||
|
||||
RDSList = ''
|
||||
|
||||
If ( (WorkOrderNo NE '') or (RDSOverrideList NE '') ) then
|
||||
If ShowGasGauge NE True$ then ShowGasGauge = False$
|
||||
rv = Set_Status(0)
|
||||
@ -523,6 +522,7 @@ end service
|
||||
// <1,2> Column Text Supplement Instructions
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service SetSupplement(SupplementList, Username)
|
||||
|
||||
RDSNotificationListAdd = ''
|
||||
RDSNotificationListRemove = ''
|
||||
Action = ''
|
||||
@ -581,7 +581,7 @@ Service SetSupplement(SupplementList, Username)
|
||||
Error_Services('Add', 'SupplementList argument was missing from the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
* //Now send an email notification
|
||||
// Now send an email notification
|
||||
IF RDSNotificationListAdd NE '' then
|
||||
Instructions = XLATE('RDS', RDSNotificationListAdd<1>, RDS_SUPPL_INST$, 'X')
|
||||
PSN = XLATE('RDS', RDSNotificationListAdd<1>, RDS_PROD_SPEC_ID$, 'X')
|
||||
@ -637,6 +637,7 @@ Service SetSupplement(SupplementList, Username)
|
||||
Parms = Recipients:@RM:SendFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -701,6 +702,7 @@ end service
|
||||
// Returns True$ if RDS is valid
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service IsValidRDS(RDSNo, RDSType)
|
||||
|
||||
IsValid = False$
|
||||
FirstChar = RDSNo[1,1]
|
||||
*debug
|
||||
@ -727,12 +729,14 @@ Service IsValidRDS(RDSNo, RDSType)
|
||||
End Case
|
||||
|
||||
Response = IsValid
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service IsValidSubLot(RDSNo, RDSType, SupplierLot)
|
||||
|
||||
IsValid = False$
|
||||
rec = ''
|
||||
*debug
|
||||
Begin Case
|
||||
|
||||
Case RDSType EQ 'SIC'
|
||||
@ -755,12 +759,14 @@ Service IsValidSubLot(RDSNo, RDSType, SupplierLot)
|
||||
IsValid = True$
|
||||
end
|
||||
|
||||
End Case
|
||||
|
||||
End Case
|
||||
Response = IsValid
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'GetRDSRunHistoryByReactorAndWO'
|
||||
|
||||
@ -800,10 +806,12 @@ Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service IsTWLoggingReqd(RDSNo)
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'IsTWLoggingReqd'
|
||||
|
||||
@ -870,9 +878,12 @@ Service IsTWLoggingReqd(RDSNo)
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service TestWaferRanAfterLoad(RDSNo)
|
||||
|
||||
TestWaferRanAfterLoad = False$
|
||||
TestWaferKeys = Test_Run_Services('GetTestRunKeysByRDS', RDSNo)
|
||||
for each Key in TestWaferKeys using @VM
|
||||
@ -891,8 +902,10 @@ Service TestWaferRanAfterLoad(RDSNo)
|
||||
Next Key
|
||||
|
||||
Response = TestWaferRanAfterLoad
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// VerifyEPPMetrology
|
||||
//
|
||||
@ -1027,11 +1040,6 @@ Service VerifyEPPMetrology(RDSNo)
|
||||
IF LayerList<I,COL$THICK_AVG_Z1> = '' AND LayerList<I,COL$RRHO_AVG_Z1> = '' AND LayerList<I,COL$MET_NO_Z1> NE '' THEN
|
||||
ErrorMsg = 'Zone 1 Metrology is Incomplete for RDS: ':RDSNo
|
||||
END
|
||||
//Added check for missing res avg data - JRO
|
||||
/*IF LayerList<I,COL$THICK_AVG_Z1> NE '' AND LayerList<I,COL$RRHO_AVG_Z1> = '' AND LayerList<I,COL$MET_NO_Z1> NE '' THEN
|
||||
If Error_Services('NoError') then Error_Services('Add', 'Zone 1 Metrology is missing Resistivity data for RDS: ':RDSNo)
|
||||
END
|
||||
*/
|
||||
END
|
||||
END
|
||||
END
|
||||
@ -1048,20 +1056,13 @@ Service VerifyEPPMetrology(RDSNo)
|
||||
|
||||
IF NOT(obj_RDS_Test('TestComplete',MetNo:@RM:MetRec)) THEN
|
||||
ErrorMsg = 'Zone 2 Metrology is Incomplete for RDS: ':RDSNo
|
||||
END ELSE
|
||||
|
||||
END ELSE
|
||||
IF ( (obj_RDS_Test('OutOfSpec',MetNo:@RM:MetRec) = 1) and (Zone2Scrapped EQ False$) ) THEN
|
||||
ErrorMsg = 'Zone 2 Metrology is Out of Spec for RDS: ':RDSNo
|
||||
END ELSE
|
||||
IF LayerList<I,COL$THICK_AVG_Z2> = '' AND LayerList<I,COL$RRHO_AVG_Z2> = '' AND LayerList<I,COL$MET_NO_Z2> NE '' THEN
|
||||
ErrorMsg = 'Zone 2 Metrology is Incomplete for RDS: ':RDSNo
|
||||
END
|
||||
/*
|
||||
//Added check for missing res avg data - JRO
|
||||
IF LayerList<I,COL$THICK_AVG_Z2> NE '' AND LayerList<I,COL$RRHO_AVG_Z2> = '' AND LayerList<I,COL$MET_NO_Z2> NE '' THEN
|
||||
If Error_Services('NoError') then Error_Services('Add', 'Zone 2 Metrology is missing Resistivity data for RDS: ':RDSNo)
|
||||
END
|
||||
*/
|
||||
END
|
||||
END
|
||||
END
|
||||
@ -1122,6 +1123,7 @@ end service
|
||||
|
||||
|
||||
Service CopyRDSLayerParameters(RDSNo)
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'CopyRDSLayerParameters'
|
||||
|
||||
@ -1178,6 +1180,7 @@ Service CopyRDSLayerParameters(RDSNo)
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -1208,6 +1211,7 @@ end service
|
||||
|
||||
|
||||
Service ConvertRecordToJSON(KeyID, Record, itemURL)
|
||||
|
||||
jsonRecord = ''
|
||||
If KeyID NE '' then
|
||||
|
||||
@ -1385,8 +1389,7 @@ Service ConvertRecordToJSON(KeyID, Record, itemURL)
|
||||
end
|
||||
|
||||
If itemURL NE '' then
|
||||
// The itemURL was passed in so add HAL+JSON properties.
|
||||
|
||||
// The itemURL was passed in so add HAL+JSON properties.
|
||||
// Create the _links property and then all link objects needed for this resource.
|
||||
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||
// Create a self link.
|
||||
@ -1398,8 +1401,7 @@ Service ConvertRecordToJSON(KeyID, Record, itemURL)
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||
SRP_JSON(objLinks, 'Release')
|
||||
end
|
||||
|
||||
end
|
||||
// Create the _class property for this resource.
|
||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||
end
|
||||
@ -1412,7 +1414,6 @@ Service ConvertRecordToJSON(KeyID, Record, itemURL)
|
||||
end else
|
||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
Response = jsonRecord
|
||||
|
||||
end service
|
||||
@ -1722,12 +1723,13 @@ Service UnsignLoadExtra2(RDSNo, LSLUserName)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ApplyQA100PercentADE(RDSNo)
|
||||
|
||||
Result = False$
|
||||
ErrorMsg = ''
|
||||
If RDSNo NE '' then
|
||||
// Change the QA metrology requirements to all wafers
|
||||
// Change the QA metrology requirements to all wafers
|
||||
WoNo = Xlate('RDS', RDSNo, RDS_WO$, 'X')
|
||||
CassNo = Xlate('RDS', RDSNo, 'CASS_NO', 'X')
|
||||
WoMatQaKey = WoNo : '*' : CassNo
|
||||
@ -1801,6 +1803,7 @@ Service ApplyQA100PercentADE(RDSNo)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ApplyAbortMetrology(RdsKeys)
|
||||
|
||||
Result = False$
|
||||
@ -1840,7 +1843,9 @@ Service ApplyAbortMetrology(RdsKeys)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service DetachRDSFromWO(RDSNo)
|
||||
|
||||
ErrorMessage = ''
|
||||
If RowExists('RDS', RDSNo) then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
@ -1860,6 +1865,127 @@ Service DetachRDSFromWO(RDSNo)
|
||||
If ErrorMessage NE '' then
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service PushSigProfileToWoMat(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
If (RDSNo NE '') then
|
||||
If RowExists('RDS', RDSNo) then
|
||||
Record = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
If Error_Services('NoError') then
|
||||
WONo = Record<RDS_WO$>
|
||||
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
|
||||
EpiPro = (ReactType EQ 'EPP')
|
||||
GaN = (ReactType EQ 'GAN')
|
||||
NonEpiPro = ( (ReactType NE 'EPP') and (ReactType NE 'GAN') )
|
||||
If NonEpiPro then
|
||||
// Sync up VER, LOAD, UNLOAD, POST, and QA signatures with WO_MAT signature profile.
|
||||
// The goal of signature services was to remove any dependency on the WO_MAT signature profile,
|
||||
// however Fabtime relies on this data being replicated to the Scrape SQL DB.
|
||||
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||
If WOMatKey NE '' then
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
WOMatSigProf = obj_WO_Mat('CassSigProfile', WOMatKey)
|
||||
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$>
|
||||
WOMatSigDTM = WOMatRec<WO_MAT_SIG_DTM$>
|
||||
|
||||
// Update WO_MAT signature profile to match for the "1VER" stage
|
||||
Stage = '1VER'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_PRE_EPI_SIG$>
|
||||
PreEpiDate = Record<RDS_PRE_EPI_SIG_DATE$>
|
||||
If PreEpiDate NE '' then
|
||||
PreEpiTime = Record<RDS_PRE_EPI_SIG_TIME$>
|
||||
PreEpiSigDTM = PreEpiDate + (PreEpiTime/86400)
|
||||
end else
|
||||
PreEpiSigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = PreEpiSigDTM
|
||||
end
|
||||
|
||||
// Update WO_MAT signature profile to match for "1LOAD" stage
|
||||
Stage = '1LOAD'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_OPERATOR_IN$>
|
||||
DateIn = Record<RDS_DATE_IN$>
|
||||
If DateIn NE '' then
|
||||
LoadTime = Record<RDS_TIME_IN$>
|
||||
LoadSigDTM = DateIn + (LoadTime/86400)
|
||||
end else
|
||||
LoadSigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = LoadSigDTM
|
||||
end
|
||||
|
||||
// Update WO_MAT signature profile to match for the "1UNLOAD" stage
|
||||
Stage = '1UNLOAD'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_OPERATOR_OUT$>
|
||||
DateOut = Record<RDS_DATE_OUT$>
|
||||
If DateOut NE '' then
|
||||
TimeOut = Record<RDS_TIME_OUT$>
|
||||
TimeOutSigDTM = DateOut + (TimeOut/86400)
|
||||
end else
|
||||
TimeOutSigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = TimeOutSigDTM
|
||||
end
|
||||
|
||||
// Update WO_MAT signature profile to match for the "1POST" stage
|
||||
Stage = '1POST'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_POST_EPI_SIG$>
|
||||
PostSigDate = Record<RDS_POST_EPI_SIG_DATE$>
|
||||
If PostSigDate NE '' then
|
||||
PostSigTime = Record<RDS_POST_EPI_SIG_TIME$>
|
||||
PostSigDTM = PostSigDate + (PostSigTime/86400)
|
||||
end else
|
||||
PostSigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = PostSigDTM
|
||||
end
|
||||
|
||||
// Update WO_MAT signature profile to match for the "1QA" stage
|
||||
Stage = '1QA'
|
||||
Locate Stage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSig<0, vPos> = Record<RDS_SUP_VER_SIG$>
|
||||
FQADate = Record<RDS_SUP_VER_SIG_DATE$>
|
||||
If FQADate NE '' then
|
||||
FQASigTime = Record<RDS_SUP_VER_SIG_TIME$>
|
||||
FQASigDTM = FQADate + (FQASigTime/86400)
|
||||
end else
|
||||
FQASigDTM = ''
|
||||
end
|
||||
WOMatSigDTM<0, vPos> = FQASigDTM
|
||||
end
|
||||
|
||||
Transaction_Services('PostWriteFieldTransaction', 'WO_MAT', WOMatKey, WO_MAT_SIG_PROFILE$, WOMatSigProf)
|
||||
Transaction_Services('PostWriteFieldTransaction', 'WO_MAT', WOMatKey, WO_MAT_SIGNATURE$, WOMatSig)
|
||||
Transaction_Services('PostWriteFieldTransaction', 'WO_MAT', WOMatKey, WO_MAT_SIG_DTM$, WOMatSigDTM)
|
||||
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WO_MAT_KEY returned for RDS ':RDSNo:'.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. RDS ':RDSNo:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null RDSNo passed into service.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
|
||||
end service
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -1874,12 +2000,3 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
232
LSL2/STPROC/TRANSACTION_SERVICES.txt
Normal file
232
LSL2/STPROC/TRANSACTION_SERVICES.txt
Normal file
@ -0,0 +1,232 @@
|
||||
Compile function Transaction_Services(@Service, @Params)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from Infineon Technologies.
|
||||
|
||||
Name : Transaction_Services
|
||||
|
||||
Description : Handler program for all module related services.
|
||||
|
||||
Notes : Service module to support environmental state issues. Environmental refers to the state of the
|
||||
operating system, which includes version, client vs. server, and path to critical systems.
|
||||
|
||||
Parameters :
|
||||
Service [in] -- Name of the service being requested
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
Response [out] -- Response to be sent back to the requesting procedure
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
06/24/25 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert TRANSACTION_QUEUE_EQUATES
|
||||
|
||||
EQU COMMA$ to ','
|
||||
|
||||
Declare function Datetime, RTI_CreateGuid, Error_Services, SRP_Encode, SRP_Decode, Database_Services
|
||||
Declare function Environment_Services, Logging_Services
|
||||
Declare subroutine Database_Services, Error_Services, Logging_Services
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service PostWriteFieldTransaction(Table, Key, FieldNo, FieldVal)
|
||||
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (Table EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case (Key EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Key passed into service.'
|
||||
Case (FieldNo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case Not(Num(FieldNo))
|
||||
ErrorMsg = 'Error in ':Service:' service. FieldNo ':FieldNo:' is not a number.'
|
||||
Case Otherwise$
|
||||
TransKey = RTI_CreateGuid()
|
||||
TransRec = ''
|
||||
TransRec<TRANSACTION_QUEUE.TRANSACTION_DTM$> = Datetime()
|
||||
TransRec<TRANSACTION_QUEUE.ACTION$> = 'WRITE_FIELD'
|
||||
TransRec<TRANSACTION_QUEUE.TABLE$> = Table
|
||||
TransRec<TRANSACTION_QUEUE.KEY$> = Key
|
||||
TransRec<TRANSACTION_QUEUE.COLUMN$> = FieldNo
|
||||
TransRec<TRANSACTION_QUEUE.VALUE$> = FieldVal
|
||||
Database_Services('WriteDataRow', 'TRANSACTION_QUEUE', TransKey, TransRec)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service PostWriteRecordTransaction(Table, Key, Record)
|
||||
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (Table EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case (Key EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Key passed into service.'
|
||||
Case (Record EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Record passed into service.'
|
||||
Case Otherwise$
|
||||
TransKey = RTI_CreateGuid()
|
||||
TransRec = ''
|
||||
TransRec<TRANSACTION_QUEUE.TRANSACTION_DTM$> = Datetime()
|
||||
TransRec<TRANSACTION_QUEUE.ACTION$> = 'WRITE_RECORD'
|
||||
TransRec<TRANSACTION_QUEUE.TABLE$> = Table
|
||||
TransRec<TRANSACTION_QUEUE.KEY$> = Key
|
||||
TransRec<TRANSACTION_QUEUE.RECORD$> = SRP_Encode(Record, 'BASE64')
|
||||
Database_Services('WriteDataRow', 'TRANSACTION_QUEUE', TransKey, TransRec)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service PostDeleteRecordTransaction(Table, Key)
|
||||
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (Table EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case (Key EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Key passed into service.'
|
||||
Case Otherwise$
|
||||
TransKey = RTI_CreateGuid()
|
||||
TransRec = ''
|
||||
TransRec<TRANSACTION_QUEUE.TRANSACTION_DTM$> = Datetime()
|
||||
TransRec<TRANSACTION_QUEUE.ACTION$> = 'DELETE_RECORD'
|
||||
TransRec<TRANSACTION_QUEUE.TABLE$> = Table
|
||||
TransRec<TRANSACTION_QUEUE.KEY$> = Key
|
||||
Database_Services('WriteDataRow', 'TRANSACTION_QUEUE', TransKey, TransRec)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ProcessTransactionQueue()
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Transaction'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Transaction Queue Log.csv'
|
||||
Headers = 'Logging DTM':@FM:'Result':@FM:'Action':@FM:'Table':@FM:'Key':@FM:'Base64Record'
|
||||
Headers := @FM:'Column':@FM:'Value'
|
||||
objQueueLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
Select 'TRANSACTION_QUEUE' by 'TRANSACTION_DTM' setting Cursor then
|
||||
EOF = False$
|
||||
Loop
|
||||
LogData = ''
|
||||
DeleteTrans = False$
|
||||
ErrorMsg = ''
|
||||
ReadNext TransId using Cursor By At else EOF = True$
|
||||
Until EOF
|
||||
TransRec = Database_Services('ReadDataRow', 'TRANSACTION_QUEUE', TransId)
|
||||
If Error_Services('NoError') then
|
||||
Action = TransRec<TRANSACTION_QUEUE.ACTION$>
|
||||
Table = TransRec<TRANSACTION_QUEUE.TABLE$>
|
||||
Key = TransRec<TRANSACTION_QUEUE.KEY$>
|
||||
HaveLock = Database_Services('GetKeyIDLock', Table, Key)
|
||||
If HaveLock then
|
||||
Begin Case
|
||||
Case Action EQ 'WRITE_FIELD'
|
||||
FieldNo = TransRec<TRANSACTION_QUEUE.COLUMN$>
|
||||
FieldVal = TransRec<TRANSACTION_QUEUE.VALUE$>
|
||||
LogData<7> = FieldNo
|
||||
LogData<8> = FieldVal
|
||||
Open Table to hTable then
|
||||
WriteV FieldVal on hTable, Key, FieldNo then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling WriteV. '
|
||||
ErrorMsg := 'File error: ':@File_Error
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error opening ':Table:'.'
|
||||
end
|
||||
Case Action EQ 'WRITE_RECORD'
|
||||
Record = SRP_Decode(TransRec<TRANSACTION_QUEUE.RECORD$>, 'BASE64')
|
||||
LogData<6> = Record
|
||||
Database_Services('WriteDataRow', Table, Key, Record, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Case Action EQ 'DELETE_RECORD'
|
||||
Database_Services('DeleteDataRow', Table, Key, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Case Otherwise$
|
||||
DeleteTrans = True$
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid Action ':Action:'.'
|
||||
End Case
|
||||
Database_Services('ReleaseKeyIDLock', Table, Key)
|
||||
If DeleteTrans then Database_Services('DeleteDataRow', 'TRANSACTION_QUEUE', TransId)
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to get lock on ':Table:' ':Key:'.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<3> = Action
|
||||
LogData<4> = Table
|
||||
LogData<5> = Key
|
||||
If ErrorMsg EQ '' then
|
||||
// Log success
|
||||
LogData<2> = 'Successfully processed transaction ':TransId:'.'
|
||||
end else
|
||||
// Log failure
|
||||
LogData<2> = 'Failed to process transaction ':TransId:'. Error message: ':ErrorMsg
|
||||
end
|
||||
Logging_Services('AppendLog', objQueueLog, LogData, @RM, @FM)
|
||||
Repeat
|
||||
end
|
||||
Unlock hSysLists, ServiceKeyID else Null
|
||||
end
|
||||
|
||||
end service
|
||||
|
Reference in New Issue
Block a user