Compile function WO_MAT_Services(@Service, @Params) /*********************************************************************************************************************** Name : WO_MAT_Services Description : Handler program for all WO_MAT services. Notes : Application errors should be logged using the Error Services module. There are a few methodological assumptions built into way errors are managed which are important to understand in order to properly work with Error Services: - The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger this will appear backwards since the originating procedure always appears at the bottom of the list and the current routine appears at the top of the list. We are using this orientation because it is common to refer to the process of calling other procedures as 'drilling down'. - The reason for defining the orientation of the call stack is because Error_Services allows for multiple error conditions to be appended to an original error. In most cases this will happen when a procedure at the bottom of the stack generates an error condition and then returns to its calling procedure. This higher level procedure can optionally add more information relevant to itself. This continues as the call stack 'bubbles' its way back to the top to where the originating procedure is waiting. - Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus) preserve their error state until explicitly cleared. This can hinder the normal execution of code since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists. Our philosophy is that error conditions should automatically be cleared before a new procedure is executed to avoid this problem. However, the nature of Basic+ does not make this easy to automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our philosophy then it should include a call into the 'Clear' service request at the top of the program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.) - Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any error conditions that were set before. 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 Controller (MCP) or requesting procedure Metadata : History : (Date, Initials, Notes) 05/14/18 djs Added VerifyWOLogWOMatKeyColumn service. ***********************************************************************************************************************/ #pragma precomp SRP_PreCompiler $insert LOGICAL $Insert APP_INSERTS $insert WO_MAT_EQUATES $Insert WO_LOG_EQUATES $Insert SERVICE_SETUP $Insert DICT_EQUATES Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services Declare function Datetime, Rds_Services, GetTickCount, SRP_Array Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract Declare subroutine Transaction_Services LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat\InvActionsSyncUp' LogDate = Oconv(Date(), 'D4/') LogTime = Oconv(Time(), 'MTS') LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' InvActionsSyncUpLog.csv' Headers = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'Missing Signature' : @FM : 'Missing Signature Dtm' : @FM : 'Message' objSyncLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM IsProd = Environment_Services('IsProd') If IsProd EQ True$ then MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_WOMATSERVICES' end else MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_WOMATSERVICES' end GoToService else Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') end Return Response or "" //----------------------------------------------------------------------------- // SERVICES //----------------------------------------------------------------------------- Service ConvertRecordToJSON(WOMatKey, Record, ItemURL) jsonRecord = '' IF WOMatKey NE '' then If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) If Error_Services('NoError') then @DICT = Database_Services('GetTableHandle', 'DICT.WO_MAT') @ID = WOMatKey @RECORD = Record objJSON = '' If SRP_JSON(objJSON, 'New', 'Object') then objWOMat = '' If SRP_JSON(objWOMat, 'New', 'Object') then SRP_JSON(objWOMat, 'SetValue', 'KeyId', @ID) SRP_JSON(objWOMat, 'SetValue', 'WoNo', {WO_NO}) SRP_JSON(objWOMat, 'SetValue', 'CassNo', {CASS_NO}) SRP_JSON(objWOMat, 'SetValue', 'Ver', {REC_VER}) SRP_JSON(objWOMat, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO}) SRP_JSON(objWOMat, 'SetValue', 'SapBatchNo', {SAP_BATCH_NO}) SRP_JSON(objWOMat, 'SetValue', 'SapTxDtm', OConv({SAP_TX_DTM}, 'DT')) SRP_JSON(objWOMat, 'SetValue', 'ReactorType', {REACTOR_TYPE}) SRP_JSON(objWOMat, 'SetValue', 'CustInfo', {CUST_INFO}) SRP_JSON(objWOMat, 'SetValue', 'LotNo', {LOT_NO}) SRP_JSON(objWOMat, 'SetValue', 'WaferQty', {WAFER_QTY}) SRP_JSON(objWOMat, 'SetValue', 'CustPartNo', {CUST_PART_NO}) SRP_JSON(objWOMat, 'SetValue', 'SubPartNo', {SUB_PART_NO}) SRP_JSON(objWOMat, 'SetValue', 'ProdVerNo', {PROD_VER_NO}) SRP_JSON(objWOMat, 'SetValue', 'ShipNo', {SHIP_NO}) SRP_JSON(objWOMat, 'SetValue', 'Hold', {HOLD}) SRP_JSON(objWOMat, 'SetValue', 'Makeup', {MAKEUP_BOX}) SRP_JSON(objWOMat, 'SetValue', 'HotLot', {HOT_LOT}) SRP_JSON(objWOMat, 'SetValue', 'Cancelled', {CANCELLED}) SRP_JSON(objWOMat, 'SetValue', 'Void', {VOID}) SRP_JSON(objWOMat, 'SetValue', 'RetReject', {RET_REJECTS}) SRP_JSON(objWOMat, 'SetValue', 'CassShipQty', {CASS_SHIP_QTY}) SRP_JSON(objWOMat, 'SetValue', 'GrQty', {SAP_GR_QTY}) SRP_JSON(objWOMat, 'SetValue', 'SapYield', {SAP_YIELD}) SRP_JSON(objWOMat, 'SetValue', 'SapMuQty', {SAP_MU_QTY}) SRP_JSON(objWOMat, 'SetValue', 'SapRawScrapQty', {SAP_RAW_SCRAP_QTY}) SRP_JSON(objWOMat, 'SetValue', 'SapScrapQty', {SAP_CONFIRM_SCRAP}) objInvActions = '' If SRP_JSON(objInvActions, 'New', 'Array') then InventoryActions = {INV_DTM} If InventoryActions NE '' then for each InvAction in InventoryActions using @VM setting vPos //Add in each indv. inventory action InvTimestamp = {INV_DTM}<1, vPos> InvWhCd = {INV_WH}<1, vPos> InvWarehouse = {INV_WH_DESC}<1, vPos> InvLocCd = {INV_LOCATION}<1, vPos> InvLocation = {INV_LOC_DESC}<1, vPos> InvAction = {INV_ACTION}<1, vPos> InvUserId = {INV_USER}<1, vPos> InvTag = {INV_TAG}<1, vPos> InvToolId = {INV_TOOL_ID}<1, vPos> objInvAction = '' If SRP_JSON(objInvAction, 'New', 'Object') then SRP_JSON(objInvAction, 'SetValue', 'InvTimestamp', Oconv(InvTimeStamp, 'DT')) SRP_JSON(objInvAction, 'SetValue', 'InvWhCd', InvWhCd) SRP_JSON(objInvAction, 'SetValue', 'InvWarehouse', InvWarehouse) SRP_JSON(objInvAction, 'SetValue', 'InvLocCd', InvLocCd) SRP_JSON(objInvAction, 'SetValue', 'InvLocation', InvLocation) SRP_JSON(objInvAction, 'SetValue', 'InvAction', InvAction) SRP_JSON(objInvAction, 'SetValue', 'InvUserId', InvUserId) SRP_JSON(objInvAction, 'SetValue', 'InvTag', InvTag) SRP_JSON(objInvAction, 'SetValue', 'InvToolId', InvToolId) SRP_JSON(objInvActions, 'Add', objInvAction) SRP_JSON(objInvAction, 'Release') end Next InvAction end else SRP_JSON(objWOMat, 'SetValue', 'InventoryActions', '') end SRP_JSON(objWOMat, 'Set', 'InventoryActions', objInvActions) SRP_JSON(objInvActions, 'Release') end objSlots = '' If SRP_JSON(objSlots, 'New', 'Array') then SlotCount = 25 for Slot = 1 to SlotCount SlotNo = Slot WaferId = {SLOT_WAFER_ID}<1, Slot> NcrId = {SLOT_NCR}<1, Slot> MetNo = {SLOT_MET_NO}<1, Slot> MovedToSlot = {SLOT_MOVED_TO}<1, Slot> MuWaferId = {SLOT_REP_WAFER_ID}<1, Slot> MovedFromSlot = {SLOT_MOVED_FROM}<1, Slot> objSlot = '' If SRP_JSON(objSlot, 'New', 'Object') then SRP_JSON(objSlot, 'SetValue', 'SlotNo', SlotNo) SRP_JSON(objSlot, 'SetValue', 'WaferId', WaferId) SRP_JSON(objSlot, 'SetValue', 'NcrId', NcrId) SRP_JSON(objSlot, 'SetValue', 'MetNo', MetNo) SRP_JSON(objSlot, 'SetValue', 'MovedToSlot', MovedToSlot) SRP_JSON(objSlot, 'SetValue', 'MuWaferId', MuWaferId) SRP_JSON(objSlot, 'SetValue', 'MovedFromSlot', MovedFromSlot) SRP_JSON(objSlots, 'Add', objSlot) SRP_JSON(objSlot, 'Release') end Next Slot SRP_JSON(objWOMat, 'Set', 'Slots', objSlots) SRP_JSON(objSlots, 'Release') end objNCRs = '' If SRP_JSON(objNCRs, 'New', 'Array') then NCRs = {NCR_KEYS} if DCount(NCRs, @VM) GT 0 then for each NCRKey in NCRs setting nPos NcrId = NCRKey NcrStatus = {NCR_STATUS}<1, nPos> NcrQty = {NCR_REJ_CNT}<1, nPos> NcrResp = {NCR_LOSS_BY}<1, nPos> NcrStage = {NCR_LOSS_STAGE}<1, nPos> NcrLossDesc = {NCR_LOSS_DESC}<1, nPos> NcrLossComment = {NCR_LOSS_COMMENT}<1, nPos> objNCR = '' If SRP_JSON(objNCR, 'New', 'Object') then SRP_JSON(objNCR, 'SetValue', 'NcrId', NcrId) SRP_JSON(objNCR, 'SetValue', 'NcrStatus', NcrStatus) SRP_JSON(objNCR, 'SetValue', 'NcrQty', NcrQty) SRP_JSON(objNCR, 'SetValue', 'NcrResp', NcrResp) SRP_JSON(objNCR, 'SetValue', 'NcrStage', NcrStage) SRP_JSON(objNCR, 'SetValue', 'NcrLossDesc', NcrLossDesc) SRP_JSON(objNCR, 'SetValue', 'NcrLossComment', NcrLossComment) SRP_JSON(objNCRs, 'Add', objNCR) SRP_JSON(objNCR, 'Release') end Next NCRKey SRP_JSON(objWOMat, 'Set', 'NCRs', objNCRs) SRP_JSON(objNCRs, 'Release') end else SRP_JSON(objWOMat, 'SetValue', 'NCRs', '') end objHolds = '' If SRP_JSON(objHolds, 'New', 'Array') then HoldDtms = {HOLD_START_DTM} if DCount(HoldDtms, @VM) GT 0 then for each HoldDtm in HoldDtms setting hPos OnHoldDtm = OConv(HoldDtm, 'DT') HoldUser = {HOLD_START_USER}<1, hPos> OnHoldReason = {HOLD_START_REASON}<1, hPos> OffHoldDtm = {HOLD_STOP_DTM}<1, hPos> OffHoldUser = {HOLD_STOP_USER}<1, hPos> OffHoldReason = {HOLD_STOP_REASON}<1, hPos> HoldEntity = {HOLD_ENTITY}<1, hPos> HoldEntityId = {HOLD_ENTITY_ID}<1, hPos> objHold = '' If SRP_JSON(objHold, 'New', 'Object') then SRP_JSON(objHold, 'SetValue', 'OnHoldDtm', OnHoldDtm) SRP_JSON(objHold, 'SetValue', 'HoldUser', HoldUser) SRP_JSON(objHold, 'SetValue', 'OnHoldReason', OnHoldReason) SRP_JSON(objHold, 'SetValue', 'OffHoldDtm', OffHoldDtm) SRP_JSON(objHold, 'SetValue', 'OffHoldUser', OffHoldUser) SRP_JSON(objHold, 'SetValue', 'OffHoldReason', OffHoldReason) SRP_JSON(objHold, 'SetValue', 'HoldEntity', HoldEntity) SRP_JSON(objHold, 'SetValue', 'HoldEntityId', HoldEntityId) SRP_JSON(objHolds, 'Add', objHold) SRP_JSON(objHold, 'Release') end Next HoldDtm SRP_JSON(objWOMat, 'Set', 'Holds', objHolds) SRP_JSON(objHolds, 'Release') end else SRP_JSON(objWOMat, 'SetValue', 'Holds', '') end end SRP_JSON(objJSON, 'Set', 'WO_Mat', objWOMat) SRP_JSON(objWOMat, 'Release') end end If itemURL NE '' then // The itemURL was passed in so add HAL+JSON properties. // Create the _links property and then all link objects needed for this resource. objLinks = '' If SRP_JSON(objLinks, 'New', 'Object') then // Create a self link. objLink = '' If SRP_JSON(objLink, 'New', 'Object') then SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String') SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String') SRP_JSON(objLinks, 'Set', 'self', objLink) SRP_JSON(objLink, 'Release') end SRP_JSON(objJSON, 'Set', '_links', objLinks) SRP_JSON(objLinks, 'Release') end // Create the _class property for this resource. SRP_JSON(objJSON, 'SetValue', '_class', 'resource') end jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled') SRP_JSON(objJSON, 'Release') end else Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.') end end end else Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.') end Response = jsonRecord End Service //---------------------------------------------------------------------------------------------------------------------- // GetWaferMap // // Returns a @VM delimited array of boolean values, which represents which slots are filled. // Note: The response is in the slot order 25, 24, ..., 2, 1. //---------------------------------------------------------------------------------------------------------------------- Service GetWaferMap(WOMatKey) WaferMap = '' ErrorMsg = '' If WOMatKey NE '' then If RowExists('WO_MAT', WOMatKey) then ReactType = Xlate('WO_MAT', WOMatKey, 'REACTOR_TYPE', 'X') If ReactType NE 'EPP' then SlotWaferIDs = Xlate('WO_MAT', WOMatKey, 'SLOT_WAFER_ID', 'X') WaferMap = '' For SlotIndex = 1 to 25 SlotWaferID = SlotWaferIDs<0, SlotIndex> WaferMap = Insert(WaferMap, 0, 1, 0, (SlotWaferID NE '') ) Next SlotIndex end else ErrorMsg = 'Error in ':Service:' service. EpiPro is not supported by this service. Use WM_OUT_SERVICES instead.' end end else ErrorMsg = 'Error in ':Service:' service. WO_MAT record ':WOMatKey:' does not exist.' end end else ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed in.' end If ErrorMsg EQ '' then Response = WaferMap end else Error_Services('Add', ErrorMsg) Response = False$ end end service Service CheckInvActionsSignatureSync() hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') Lock hSysLists, ServiceKeyID then Script = "SELECT WO_MAT_SIG_PROFILE.WO_NO, WO_MAT_SIG_PROFILE.CASS_NO,WO_MAT_SIG_PROFILE.CASS_ID_SAP, WO_MAT_SIG_PROFILE.SIG_DTM, WO_MAT_SIG_PROFILE.SIGNATURE, WMSP.SIG_PROFILE FROM WO_MAT_SIG_PROFILE " Script := "Left JOIN WO_MAT_SIG_PROFILE_AUDIT WMSP ON WO_MAT_SIG_PROFILE.WO_NO = WMSP.WO_NO AND WO_MAT_SIG_PROFILE.CASS_NO = WMSP.CASS_NO AND WO_MAT_SIG_PROFILE.SIG_PROFILE = WMSP.SIG_PROFILE " Script := "WHERE SIG_DTM != '' AND (WMSP.SIG_PROFILE IS NULL OR WMSP.SIG_PROFILE = '') AND WO_MAT_SIG_PROFILE.SIG_DTM > DATEADD(day, -1, GETDATE()) AND WO_MAT_SIG_PROFILE.SIGNATURE != 'AUTO_FQA' AND WO_MAT_SIG_PROFILE.SIGNATURE IS NOT NULL order by WO_NO desc" Connection = '' RecordSetResult = '' If SRP_Com(Connection, "CREATE", "ADODB.Connection") then ConnectionString = Environment_Services('GetSQLScrapeConnectionString') If SRP_Com(Connection, "CALL", "Open", ConnectionString) EQ "" then RecordSetResult = SRP_Com(Connection, "CALL", "Execute", Script) Records = SRP_Com(RecordSetResult, "CALL", "GetString", 2, -1, @VM, @FM) SRP_Com(RecordSetResult, "RELEASE") end else Ans = 'Unable to open connection to SQL server. SQL connection error: ':SRP_Com(Connection, "ERROR") end SRP_Com(Connection, "CALL", "Close") SRP_Com(Connection, "RELEASE") end else Ans = "Unable to create ADO connection." end if Records then for each WOMatRecord in Records using @FM WO = WOMatRecord<1,1> CassNo = WOMatRecord<1,2> WOMatKey = WO : '*' : CassNo WO_MAT_SERVICES('SyncWOMatInvActionsAndSigProfile', WoMatKey) Next WOMatRecord end Unlock hSysLists, ServiceKeyID else Null end end service Service SyncWOMatInvActionsAndSigProfile(WOMatKey) If RowExists('WO_MAT', WOMatKey) then OrigWOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) WOMatRec = OrigWOMatRec SigProfile = WOMatRec Sigs = WOMatRec SigDtms = WOMatRec OrigInvActions = WOMatRec For each Stage in SigProfile using @VM setting vPos if SigDtms<0, vPos> NE '' then Locate Stage in OrigInvActions using @VM setting dummy else // Stage missing from material log InvDtms = WOMatRec StageSigDtm = SigDtms<0, vPos> Done = False$ For each InvDtm in InvDtms using @VM setting Pos If InvDtm _GTX StageSigDtm then Done = True$ Until Done Next InvDtm // Insert stage into material log WOMatRec = INSERT(WOMatRec,WO_MAT_INV_WH$,Pos,0,'CR') WOMatRec = INSERT(WOMatRec,WO_MAT_INV_LOCATION$,Pos,0,'FE') WOMatRec = INSERT(WOMatRec,WO_MAT_INV_ACTION$,Pos,0,Stage) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_DTM$,Pos,0,StageSigDtm) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_USER$,Pos,0,Sigs<0, vPos>) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TAG$,Pos,0,'') WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TOOL_ID$,Pos,0,'') WOMatRec = INSERT(WOMatRec,WO_MAT_INV_SCAN_ENTRY$,Pos,0,0) LogData = '' LogData<1> = LoggingDtm LogData<2> = WOMatKey LogData<3> = Stage LogData<4> = StageSigDtm LogData<5> = 'Adding To Record.' Logging_Services('AppendLog', objSyncLog, LogData, @RM, @FM) end end Next Stage If WOMatRec NE OrigWOMatRec then Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$) If Error_Services('NoError') then LogData = '' LogData<1> = LoggingDtm LogData<2> = WOMatKey LogData<3> = '' LogData<4> = '' LogData<5> = 'Successfully Wrote WO_Mat Record' Logging_Services('AppendLog', objSyncLog, LogData, @RM, @FM) end else LogData = '' LogData<1> = LoggingDtm LogData<2> = WOMatKey LogData<3> = '' LogData<4> = '' LogData<5> = 'Error writing WO_MAT record.' Logging_Services('AppendLog', objSyncLog, LogData, @RM, @FM) end end end else LogData = '' LogData<1> = LoggingDtm LogData<2> = WOMatKey LogData<3> = '' LogData<4> = '' LogData<5> = 'WO_MAT record did not exist in OpenInsight.' Logging_Services('AppendLog', objSyncLog, LogData, @RM, @FM) end end service Service CassetteIsLastInWo(WoMatKey) StartTick = GetTickCount() MetricName = 'CassetteIsLastInWo' IsLastInWo = False$ If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then Error_Services('Add', 'invalid WO_MAT key') end WO = Field(WoMatKey, '*', 1) If WO EQ '' then Error_Services('Add', 'WO# not found in WO_MAT record') end If Error_Services('NoError') and Num(WO) EQ False$ then Error_Services('Add', 'WO# is not numeric') end CassNo = Field(WoMatKey, '*', 2) If Error_Services('NoError') and CassNo EQ '' then Error_Services('Add', 'Cassette# not found in WO_MAT record') end If Error_Services('NoError') and Num(CassNo) EQ False$ then Error_Services('Add', 'Cassette# is not numeric') end If Error_Services('NoError') then WoMatKeys = Xlate('WO_LOG', WO, WO_LOG_WO_MAT_KEY$, 'X') If Error_Services('NoError') and WoMatKeys NE '' then TotalCassettes = DCount(WoMatKeys, @VM) IsLastInWo = TotalCassettes EQ CassNo end end If Error_Services('HasError') then ErrMsg = Error_Services('GetMessage') LogData = '' LogData<1> = LoggingDtm LogData<2> = WOMatKey LogData<3> = '' LogData<4> = '' LogData<5> = 'Error in ' : Service:': ' : ErrMsg Logging_Services('AppendLog', objSyncLog, LogData, @RM, @FM) Error_Services('Add', ErrMsg) end Response = IsLastInWo EndTick = GetTickCount() Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick) end service Service SetWoMatVoidFlag(WoMatKey, Username) ErrorMessage = '' If RowExists('WO_MAT', WoMatKey) then WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$) If Error_Services('NoError') then WoMatRec = True$ HaveLock = Database_Services('GetKeyIDLock', 'WO_MAT', WoMatKey, True$) If HaveLock then Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False, False$) If Error_Services('NoError') then Set_Status(0) WONo = Field(WoMatKey, '*', 1) CassNo = Field(WoMatKey, '*', 2) WOMLParms = '' LogFile = 'WO_MAT' ; WOMLParms = LogFile:@RM LogDTM = OConv(Datetime(), 'DT') ; WOMLParms := LogDTM:@RM Action = 'VOID' ; WOMLParms := Action:@RM WhCd = 'CR' ; WOMLParms := WhCd:@RM LocCd = 'VOID' ; WOMLParms := LocCd:@RM WONos = WONo ; WOMLParms := WONos:@RM CassNos = CassNo ; WOMLParms := CassNos:@RM UserID = Username ; WOMLParms := UserID:@RM Tags = '' ; WOMLParms := Tags:@RM ToolID = '' ; WOMLParms := ToolID:@RM WOMLParms := '' obj_WO_Mat_Log('Create',WOMLParms) IF Get_Status(errCode) THEN ErrorMessage = 'Error writing inventory transactions' end end else ErrorMessage = 'Failed to write to the WO_MAT record ' : WoMatKey : ' while attempting to set void status.' end end else ErrorMessage = 'Failed to get lock on WO_MAT record ' : WoMatKey : ' while attempting to set void status.' end end else ErrorMessage = 'Failed to read WO_MAT record ' : WoMatKey : ' while attempting to set void status.' end end else ErrorMessage = 'Invalid WoMat Key ' : WoMatKey : ' passed to SetWoMatVoidFlag routine.' end If ErrorMessage NE '' then Error_Services('Add', ErrorMessage) end end service Service MakeupFlagOn(RDSNo) EpiCheck = Rds_Services('IsEpiPro', RDSNo) BioRadDown = False$ Bio4Down = False$ Bio5Down = False$ Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X') Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X') Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X') Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X') If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$ If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$ If (Bio4Down) AND (Bio5Down) then BioRadDown = True$ If EpiCheck EQ False$ then WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X') PropRow = WOMatQARec<3> If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then CurrentStage = Rds_Services('GetCurrentStage', RDSNo) If CurrentStage EQ 'COMP' then Signature_Services('UnsignFQAStage', RDSNo) end Rds_Services('ApplyQA100PercentADE', RDSNo) end end end service Service GetWOMatData(WOMatKeys, Columns) Response = '' ErrorMsg = '' If ( (WOMatKeys NE '') and (Columns NE '') ) then For each Column in Columns using @VM setting ColPos Vals = Xlate('WO_MAT', WOMatKeys, Column, 'X') Conv = Xlate('DICT.WO_MAT', Column, DICT_CONV$, 'X') If Conv EQ '' then Response = Vals end else Response = OConv(Vals, Conv) end Next Column end else ErrorMsg = 'Error in ':Service:' service. Null WOMatKeys or Columns passed into service' end If ErrorMsg NE '' then Error_Services('Add', ErrorMsg) end service Service GetWOMatKeys(WONo) Response = '' ErrorMsg = '' If (WONo NE '') then If RowExists('WO_LOG', WONo) then Open 'DICT.WO_MAT' to hDict then Query = 'WO_NO':@VM:WONo:@FM WOMatKeys = '' Flag = '' ErrCode = '' Btree.Extract(Query, 'WO_MAT', hDict, WOMatKeys, 'E', Flag) If Not(Get_Status(ErrCode)) then If WOMatKeys NE '' then Response = SRP_Array('SortRows', WOMatKeys, 'AR2', 'LIST', @VM, '*') end end else ErrorMsg = 'Error in ':Service:' service. Error calling Btree.Extract. Error code: ':ErrCode end end end else ErrorMsg = 'Error in ':Service:' service. WO_LOG ':WONo:' does not exist.' end end else ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service.' end If ErrorMsg NE '' then Error_Services('Add', ErrorMsg) end service Service VerifyWOLogWOMatKeyColumn(WOMatKey) LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_MAT' LogDate = Oconv(Date(), 'D4/') LogTime = Oconv(Time(), 'MTS') LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' WO_MAT WO_LOG{WO_MAT_KEY} Log.csv' Headers = 'Logging DTM':@FM:'WOMatKey':@FM:'Result' objVerifyWOMatKeysLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$) LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM LogData = '' LogData<1> = LoggingDtm LogData<2> = WOMatKey LogData<3> = 'Begin ':Service Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM) ErrorMsg = '' If WOMatKey NE '' then If RowExists('WO_MAT', WOMatKey) then WONo = Field(WOMatKey, '*', 1, 1) If WONo NE '' then If RowExists('WO_LOG', WONo) then WOLogWOMatKeys = Database_Services('ReadDataColumn', 'WO_LOG', WONo, WO_LOG_WO_MAT_KEY$, True$, 0) If Error_Services('NoError') then Locate WOMatKey in WOLogWOMatKeys using @VM setting vPos then LogData<3> = 'WOMatKey found in WO_LOG record. Nothing to update.' Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM) end else LogData<3> = 'WOMatKey not found in WO_LOG record. Posting transaction to update column.' Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM) WOLogWOMatKeys<0, -1> = WOMatKey WOLogWOMatKeys = SRP_Array('SortRows', WOLogWOMatKeys, 'AR2', 'LIST', @VM, '*') Transaction_Services('PostWriteFieldTransaction', 'WO_LOG', WONo, WO_LOG_WO_MAT_KEY$, WOLogWOMatKeys) end end else ErrorMsg = 'Error in ':Service:' service. ':Error_Services('GetMessage') end end else ErrorMsg = 'Error in ':Service:' service. WO_LOG ':WONo:' does not exist.' end end else ErrorMsg = 'Error in ':Service:' service. WO_NO is null.' end end else ErrorMsg = 'Error in ':Service:' service. WO_MAT ':WOMatKey:' does not exist.' end end else ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed into service.' end LogData<3> = 'End ':Service Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM) If ErrorMsg NE '' then LogData<3> = ErrorMsg Logging_Services('AppendLog', objVerifyWOMatKeysLog, LogData, @RM, @FM) end If ErrorMsg NE '' then Error_Services('Add', ErrorMsg) end service