Compile function Hold_Services(@Service, @Params) /*********************************************************************************************************************** Name : Hold_Services Description : Handler program for all Hold 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) 6/28/24 djm Original programmer. ***********************************************************************************************************************/ #pragma precomp SRP_PreCompiler $insert LOGICAL $Insert SERVICE_SETUP $Insert MSG_EQUATES $Insert DICT_EQUATES $Insert WO_MAT_EQUATES $INSERT NOTIFICATION_EQU Declare function Database_Services, Error_Services, Obj_Wm_In, Obj_Wm_Out, Unassigned, Wm_In_Services, Wm_Out_Services Declare function PSN_Services, SRP_Rotate_Array, Datetime, Hold_Services, Memberof, Error_Services, Rds_Services Declare subroutine Database_Services, Error_Services, Obj_notes, Hold_Services, Obj_Wm_In, Obj_Wm_Out, Wm_In_Services Declare subroutine Wm_Out_Services, Rds_Services GoToService else Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') end Return Response or "" //----------------------------------------------------------------------------- // SERVICES //----------------------------------------------------------------------------- //---------------------------------------------------------------------------------------------------------------------- // ToggleHold // // WOMatKey - [Required] // HoldEntity - [Required] // HoldEntityID - [Required] // CtrlEntID - [Optional] *Required for ship hold checks // OriginFlag - [Optional] // HoldData - [Optional] // OperatorID - [Optional] // // Toggles hold status from on to off, or from off to on. //---------------------------------------------------------------------------------------------------------------------- Service ToggleHold(WOMatKey, HoldEntity, HoldEntityID, CtrlEntID, OriginFlag, HoldData, OperatorID) If ( (WOMatKey EQ '') or (HoldEntity EQ '') or (HoldEntityID EQ '') ) then Error_Services('Add', 'Null parameter WOMatKey, HoldEntity, or HoldEntityID passed to service.') end else HoldCheck = Hold_Services("CheckForHold", WOMatKey, CtrlEntID) If Unassigned(OperatorID) then OperatorID = '' Begin Case Case Index(CtrlEntID,'SHIP_HOLD',1) ; HoldType = 'SHOLD' ; * Ship Hold Case Otherwise$ ; HoldType = 'HOLD' ; * Production or Engineering Hold End Case If Error_Services("NoError") then If HoldCheck = False$ then Hold_Services("OnHold", WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorID, OriginFlag) end else Hold_Services("OffHold", WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorID, OriginFlag) end If Error_Services("NoError") then Response = True$ end else Response = Error_Services("GetMessage") end end else Response = Error_Services("GetMessage") end end End Service //---------------------------------------------------------------------------------------------------------------------- // ToggleMultipleHolds // // WOMatKeys - [Required] @FM delimited array, count must match HoldEntityIDs // HoldEntity - [Required] // HoldEntityIDs - [Required] @FM delimited, count must match WOMatKeys // CtrlEntID - [Required] // OriginFlag - [Optional] // HoldData - [Required] // // Toggles hold status for multiple lots from on to off, or from off to on. //---------------------------------------------------------------------------------------------------------------------- Service ToggleMultipleHolds(WOMatKeys, HoldEntity, HoldEntityIDs, CtrlEntID, OriginFlag, HoldData) IF WOMatKeys = '' or HoldEntity = '' or HoldEntityIDs = '' or CtrlEntID = '' or HoldData = '' THEN Error_Services('Add', 'Null parameter WOMatKeys, HoldEntity, HoldEntityIDs, CtrlEntID, or HoldData passed to service.') end else BEGIN CASE CASE INDEX(CtrlEntID,'SHIP_HOLD',1) ; HoldType = 'SHOLD' ; * Ship Hold CASE 1 ; HoldType = 'HOLD' ; * Production or Engineering Hold END CASE WOMatCount = DCount(WOMatKeys, @FM) HoldEntityCount = Dcount(HoldEntityIDs, @FM) Reason = HoldData<2> If WOMatCount NE HoldEntityCount then Error_Services('Add', 'WOMatKeys count must match HoldEntityIDs count.') end else For I = 1 to WOMatCount Hold_Services('ToggleHold', WOMatKeys, HoldEntity, HoldEntityIDs, CtrlEntID, OriginFlag, HoldData) If Error_Services("NoError") then Hold_Services("HoldNotification", HoldEntity, HoldEntityIDs, Reason, HoldCheck, HoldType) end else Response = Error_Services("GetMessage") end Next I end end end service //---------------------------------------------------------------------------------------------------------------------- // EnableMultipleHolds // // WOMatKeys - [Required] @FM delimited array, count must match HoldEntityIDs // HoldEntity - [Required] // HoldEntityIDs - [Required] @FM delimited, count must match WOMatKeys // CtrlEntID - [Required] // OriginFlag - [Optional] // HoldData - [Required] // // Toggles hold status for multiple lots from off to on. //---------------------------------------------------------------------------------------------------------------------- Service EnableMultipleHolds(WOMatKeys, HoldEntity, HoldEntityIDs, CtrlEntID, OriginFlag, HoldData) IF WOMatKeys = '' or HoldEntity = '' or HoldEntityIDs = '' or HoldData = '' THEN Error_Services('Add', 'Null parameter WOMatKeys, HoldEntity, HoldEntityIDs, CtrlEntID, or HoldData passed to service.') end else BEGIN CASE CASE INDEX(CtrlEntID,'SHIP_HOLD',1) ; HoldType = 'SHOLD' ; * Ship Hold CASE 1 ; HoldType = 'HOLD' ; * Production or Engineering Hold END CASE Reason = HoldData<2> WOMatCount = DCount(WOMatKeys, @FM) HoldEntityCount = Dcount(HoldEntityIDs, @FM) If WOMatCount NE HoldEntityCount then Error_Services('Add', 'WOMatKeys count must match HoldEntityIDs count.') end else If CtrlEntID EQ 'NDW_RDS_QUERY' OR CtrlEntID EQ 'NDW_WM_OUT_QUICK_QUERY' then Def = "" Def = "Processing..." Def = "G" Def = HoldEntityCount Def = 400 Def = -2 ;* message h-pos in pixels, or -2 (center screen, the default), -1 (center parent) Def = -2 ;* message v-pos in pixels MsgUp = Msg(@window, Def) end For I = 1 to WOMatCount If Hold_Services('CheckForHold', WOMatKeys) EQ False$ then Hold_Services('OnHold', WOMatKeys, HoldEntity, HoldEntityIDs, HoldType, HoldData) * If Error_Services("NoError") then * Hold_Services("HoldNotification", HoldEntity, HoldEntityIDs, Reason, True$, HoldType) * end else * Response = Error_Services("GetMessage") * end end If CtrlEntID EQ 'NDW_RDS_QUERY' OR CtrlEntID EQ 'NDW_WM_OUT_QUICK_QUERY' then Msg(@window, MsgUp, I, MSGINSTUPDATE$) Next I If CtrlEntID EQ 'NDW_RDS_QUERY' OR CtrlEntID EQ 'NDW_WM_OUT_QUICK_QUERY' then retval = Msg(@window, MsgUp) ;* take down the gauge end end end service //---------------------------------------------------------------------------------------------------------------------- // DisableMultipleHolds // // WOMatKeys - [Required] @FM delimited array, count must match HoldEntityIDs // HoldEntity - [Required] // HoldEntityIDs - [Required] @FM delimited, count must match WOMatKeys // CtrlEntID - [Required] // OriginFlag - [Optional] // HoldData - [Required] // // Toggles hold status for multiple lots from on to off. //---------------------------------------------------------------------------------------------------------------------- Service DisableMultipleHolds(WOMatKeys, HoldEntity, HoldEntityIDs, CtrlEntID, OriginFlag, HoldData) IF WOMatKeys = '' or HoldEntity = '' or HoldEntityIDs = '' or HoldData = '' THEN Error_Services('Add', 'Null parameter WOMatKeys, HoldEntity, HoldEntityIDs, CtrlEntID, or HoldData passed to service.') end else BEGIN CASE CASE INDEX(CtrlEntID,'SHIP_HOLD',1) ; HoldType = 'SHOLD' ; * Ship Hold CASE 1 ; HoldType = 'HOLD' ; * Production or Engineering Hold END CASE WOMatCount = DCount(WOMatKeys, @FM) HoldEntityCount = Dcount(HoldEntityIDs, @FM) Reason = HoldData<2> If WOMatCount NE HoldEntityCount then Error_Services('Add', 'WOMatKeys count must match HoldEntityIDs count.') end else If CtrlEntID EQ 'NDW_RDS_QUERY' OR CtrlEntID EQ 'NDW_WM_OUT_QUICK_QUERY' then Def = "" Def = "Processing..." Def = "G" Def = HoldEntityCount Def = 400 Def = -2 ;* message h-pos in pixels, or -2 (center screen, the default), -1 (center parent) Def = -2 ;* message v-pos in pixels MsgUp = Msg(@window, Def) end For I = 1 to WOMatCount If Hold_Services('CheckForHold', WOMatKeys) EQ True$ then Hold_Services('OffHold', WOMatKeys, HoldEntity, HoldEntityIDs, HoldType, HoldData) * If Error_Services("NoError") then * Hold_Services("HoldNotification", HoldEntity, HoldEntityIDs, Reason, False$, HoldType) * end else * Response = Error_Services("GetMessage") * end end If CtrlEntID EQ 'NDW_RDS_QUERY' OR CtrlEntID EQ 'NDW_WM_OUT_QUICK_QUERY' then Msg(@window, MsgUp, I, MSGINSTUPDATE$) Next I If CtrlEntID EQ 'NDW_RDS_QUERY' OR CtrlEntID EQ 'NDW_WM_OUT_QUICK_QUERY' then retval = Msg(@window, MsgUp) ;* take down the gauge end end end service //---------------------------------------------------------------------------------------------------------------------- // OnHold // // WOMatKey - [Required] // HoldEntity - [Required] // HoldEntityID - [Required] // HoldType - [Required] // HoldData - [Optional] // OperatorID - [Optional] // // Places a lot on hold. //---------------------------------------------------------------------------------------------------------------------- Service OnHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorID, OriginFlag) IF WOMatKey = '' or HoldEntity = '' or HoldEntityID = '' or HoldType = '' THEN Error_Services('Add', 'Null parameter WOMatKey, HoldEntity, HoldEntityID, or HoldType passed to service.') end else If Hold_Services('CheckForHold', WOMatKey) EQ False$ then //Turn hold on CustInfo = XLATE('WO_MAT',WOMatKey,'CUST_NAME','X') WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, '', '', '') If HoldData EQ '' then Begin Case Case OriginFlag EQ 'P' ;*Packaging form HoldData<1> = OperatorID HoldData<2> = 'Packaging scanned data mismatch.' HoldData<3> = False$ Case OriginFlag EQ 'PTO' ;*PTO/PSVER form HoldData<1> = OperatorID HoldData<2> = 'PTO/PSVER scanned data mismatch.' HoldData<3> = False$ Case OriginFlag EQ 'H' ;*Auto-hold service HoldData<1> = OperatorID HoldData<2> = 'Makeup box is older than three years.' HoldData<3> = False$ End Case end UserID = HoldData<1> Reason = HoldData<2> Extended = HoldData<3> CurrDate = OCONV(Date(),'D4/') CurrTime = OCONV(Time(),'MTS') CurrDTM = ICONV(CurrDate:' ':CurrTime,'DT') IF HoldType = 'HOLD' THEN WOMatRec = 1 WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_START_DTM$,1,0,CurrDTM) WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_START_USER$,1,0,UserID) WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_START_REASON$,1,0,Reason) WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_EXTENDED$,1,0,Extended) WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_STOP_DTM$,1,0,'') WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_STOP_USER$,1,0,'') WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_STOP_REASON$,1,0,'') WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_ENTITY$,1,0,HoldEntity) WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_ENTITY_ID$,1,0,HoldEntityID) *********************************************************** // - djs - 10/29/2019 // Updated material log entry method to be more reliable. // Material log entries in quick succession were failing to be recorded. NumTimestamps = Dcount(WOMatRec, @VM) NewEntryPos = NumTimestamps + 1 CurrWH = WOMatRec ;* WH before hold CurrLoc = WOMatRec ;* LOC before hold CurrTool = WOMatRec ;* ToolID before hold WOMatRec = INSERT(WOMatRec, WO_MAT_INV_WH$, NewEntryPos, 0, CurrWH) WOMatRec = INSERT(WOMatRec, WO_MAT_INV_LOCATION$, NewEntryPos, 0, CurrLoc) WOMatRec = INSERT(WOMatRec, WO_MAT_INV_ACTION$, NewEntryPos, 0, 'HOLD_ON') WOMatRec = INSERT(WOMatRec, WO_MAT_INV_DTM$, NewEntryPos, 0, CurrDTM) WOMatRec = INSERT(WOMatRec, WO_MAT_INV_USER$, NewEntryPos, 0, UserID) WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TAG$, NewEntryPos, 0, '') WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TOOL_ID$, NewEntryPos, 0, CurrTool) END ELSE WOMatRec = 1 WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_START_DTM$,1,0,CurrDTM) WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_START_USER$,1,0,UserID) WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_START_REASON$,1,0,Reason) WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_EXTENDED$,1,0,Extended) WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_STOP_DTM$,1,0,'') WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_STOP_USER$,1,0,'') WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_STOP_REASON$,1,0,'') END IF HoldEntity = 'WM_OUT' THEN WOMatRec = 'HOLD' ;* JCH 7/14/2009 END IF HoldEntity = 'WM_IN' THEN WOMatRec = 'HOLD' ;* JCH 7/14/2009 END Database_Services("WriteDataRow", "WO_MAT", WOMatKey, WOMatRec, True$, False$, '') If Error_Services("NoError") then Hold_Services("HoldNotification", HoldEntity, HoldEntityID, Reason, True$, HoldType, OperatorID) Hold_Services("CreateComment", HoldEntity, HoldEntityID, Reason, True$, HoldType, OperatorID) end end else Error_Services('Add', 'Lot is already on hold.') end end End Service //---------------------------------------------------------------------------------------------------------------------- // OffHold // // WOMatKey - [Required] // HoldEntity - [Required] // HoldEntityID - [Required] // HoldType - [Required] // HoldData - [Optional] // OperatorID - [Optional] // // Removes a hold placed on a lot. //---------------------------------------------------------------------------------------------------------------------- Service OffHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorID, OriginFlag) IF WOMatKey = '' or HoldEntity = '' or HoldEntityID = '' or HoldType = '' THEN Error_Services('Add', 'Null parameter WOMatKey, HoldEntity, HoldEntityID, or HoldType passed to service.') end else If OperatorID EQ '' then OperatorID = @USER4 if MemberOf(OperatorID, 'ENG_TECH') OR MemberOf(OperatorID, 'LEAD') OR MemberOf(OperatorID, 'SUPERVISOR') then //Turn hold off If Hold_Services('CheckForHold', WOMatKey) EQ True$ then CustInfo = XLATE('WO_MAT',WOMatKey,'CUST_NAME','X') WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, '', '', '') If HoldData EQ '' then Begin Case Case OriginFlag EQ 'P' ;*Packaging form HoldData<1> = OperatorID HoldData<2> = 'Packaging scanned data mismatch.' HoldData<3> = False$ Case OriginFlag EQ 'PTO' ;*PTO/PSVER form HoldData<1> = OperatorID HoldData<2> = 'PTO/PSVER scanned data mismatch.' HoldData<3> = False$ Case OriginFlag EQ 'H' ;*Auto-hold service HoldData<1> = OperatorID HoldData<2> = 'Makeup box is older than three years.' HoldData<3> = False$ End Case end UserID = HoldData<1> Reason = HoldData<2> Extended = HoldData<3> CurrDate = OCONV(Date(),'D4/') CurrTime = OCONV(Time(),'MTS') CurrDTM = ICONV(CurrDate:' ':CurrTime,'DT') IF HoldType = 'HOLD' THEN WOMatRec = 0 WOMatRec = CurrDTM WOMatRec = UserID WOMatRec = Reason WOMatRec = 0 *********************************************************** LOCATE CurrDTM IN WOMatRec BY 'AR' USING @VM SETTING Pos ELSE IF Pos > 1 THEN CurrWH = WOMatRec ;* WH before hold CurrLoc = WOMatRec ;* LOC before hold CurrTool = WOMatRec ;* ToolID before hold WOMatRec = INSERT(WOMatRec,WO_MAT_INV_WH$,Pos,0,CurrWH) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_LOCATION$,Pos,0,CurrLoc) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_ACTION$,Pos,0,'HOLD_OFF') WOMatRec = INSERT(WOMatRec,WO_MAT_INV_DTM$,Pos,0,CurrDTM) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_USER$,Pos,0,UserID) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TAG$,Pos,0,'') WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TOOL_ID$,Pos,0,CurrTool) END ;* End of check for Pos > 1 Rcvd is always the first transaction END ;* End of DTM locate ************************************************************** END ELSE WOMatRec = 0 WOMatRec = CurrDTM WOMatRec = UserID WOMatRec = Reason WOMatRec = 0 END IF HoldEntity = 'WM_OUT' THEN WOMatRec = obj_WM_Out('CurrStatus',HoldEntityID:@RM:@RM:WOMatRec) END IF HoldEntity = 'WM_IN' THEN WOMatRec = obj_WM_In('CurrStatus',HoldEntityID:@RM:@RM:WOMatRec) END Database_Services("WriteDataRow", "WO_MAT", WOMatKey, WOMatRec, True$, False$, '') If Error_Services("NoError") then Hold_Services("HoldNotification", HoldEntity, HoldEntityID, Reason, False$, HoldType, OperatorID) Hold_Services("CreateComment", HoldEntity, HoldEntityID, Reason, False$, HoldType, OperatorID) end end else Error_Services('Add', 'Lot is not on hold.') end end else Error_Services("Add", "User does not have permission to remove lot holds.") end end End Service //---------------------------------------------------------------------------------------------------------------------- // CheckForHold // // WOMatKey - [Required] // CtrlEntID - [Optional] // // Returns whether or not a lot is on hold. //---------------------------------------------------------------------------------------------------------------------- Service CheckForHold(WOMatKey, CtrlEntID) IF WOMatKey = '' THEN Error_Services('Add', 'Null parameter WOMatKey passed to service.') end else WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, '', '', '') BEGIN CASE CASE Index(CtrlEntID,'SHIP_HOLD',1) ; HoldType = 'SHOLD' ; * Ship Hold CASE Otherwise$ ; HoldType = 'HOLD' ; * Production or Engineering Hold END CASE IF HoldType = 'SHOLD' THEN HoldCheck = WOMatRec END ELSE HoldCheck = WOMatRec END If HoldCheck EQ '' then HoldCheck = False$ Response = HoldCheck End End Service //---------------------------------------------------------------------------------------------------------------------- // HoldNotification // // HoldEntity - [Required] // HoldEntityID - [Required] // Reason - [Required] // Transition - [Required] // HoldType - [Required] // // Notifies specified users of changes in lot holds. //---------------------------------------------------------------------------------------------------------------------- Service HoldNotification(HoldEntity, HoldEntityID, Reason, Transition, HoldType, OperatorID) IF HoldEntity = '' or HoldEntityID = '' or Reason = '' or Transition = '' or HoldType = '' THEN Error_Services('Add', 'Null parameter WOMatKey, HoldEntity, HoldEntityID, HoldType, or HoldData passed to service.') end else BEGIN CASE CASE HoldEntity = 'RDS' IF Transition EQ True$ THEN Subject = 'Material Placed on Hold ':HoldEntityID Message = 'Material Placed on Hold' END ELSE Subject = 'Material Taken off Hold ':HoldEntityID Message = 'Material Taken off Hold' END AttachWindow = HoldEntity AttachKey = HoldEntityID CASE HoldEntity = 'WO_MAT' IF Transition EQ True$ THEN IF HoldType = 'HOLD' THEN Subject = 'Material Placed on Hold ':HoldEntityID Message = 'Material Placed on Hold' END ELSE Subject = 'Material Placed on Ship Hold ':HoldEntityID Message = 'Material Placed on Ship Hold' END END ELSE IF HoldType = 'HOLD' THEN Subject = 'Material Taken off Hold ':HoldEntityID Message = 'Material Taken off Hold' END ELSE Subject = 'Material Taken off Ship Hold ':HoldEntityID Message = 'Material Taken off Ship Hold' END END AttachWindow = HoldEntity AttachKey = HoldEntityID CASE HoldEntity = 'REACT_RUN' IF Transition EQ True$ THEN Subject = 'Material Placed on Hold ':HoldEntityID Message = 'Material Placed on Hold' END ELSE Subject = 'Material Taken off Hold ':HoldEntityID Message = 'Material Taken off Hold' END AttachWindow = 'REACT_RUN' AttachKey = HoldEntityID CASE HoldEntity = 'WM_IN' IF Transition EQ True$ THEN Subject = 'Material Placed on Hold ':HoldEntityID Message = 'Material Placed on Hold' END ELSE Subject = 'Material Taken off Hold ':HoldEntityID Message = 'Material Taken off Hold' END AttachWindow = HoldEntity AttachKey = HoldEntityID CASE HoldEntity = 'WM_OUT' IF Transition EQ True$ THEN IF HoldType = 'HOLD' THEN Subject = 'Material Placed on Hold ':HoldEntityID Message = 'Material Placed on Hold' END ELSE Subject = 'Material Placed on Ship Hold ':HoldEntityID Message = 'Material Placed on Ship Hold' END END ELSE IF HoldType = 'HOLD' THEN Subject = 'Material Taken off Hold ':HoldEntityID Message = 'Material Taken off Hold' END ELSE Subject = 'Material Taken off Ship Hold ':HoldEntityID Message = 'Material Taken off Ship Hold' END END AttachWindow = HoldEntity AttachKey = HoldEntityID END CASE Message := ' - ':Reason IF HoldType = 'SHOLD' THEN Recipients = XLATE('NOTIFICATION','SHIP_HOLD',NOTIFICATION_USER_ID$,'X') If OperatorID NE '' then SentFrom = OperatorID end else SentFrom = @USER4 end SendToGroup = '' Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup obj_Notes('Create',Parms) END Recipients = XLATE('NOTIFICATION','RDS_HOLD',NOTIFICATION_USER_ID$,'X') If OperatorID NE '' then SentFrom = OperatorID end else SentFrom = @USER4 end SendToGroup = '' Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup obj_Notes('Create',Parms) end end service //---------------------------------------------------------------------------------------------------------------------- // EditHoldReason // // WOMatKey - [Required] // ColName - [Required] // ColValNo - [Required] // UpdatedText - [Required] // // Edits the reason for a lot's hold status. //---------------------------------------------------------------------------------------------------------------------- Service EditHoldReason(WOMatKey, ColName, ColValNo, UpdatedText) IF WOMatKey = '' OR ColName = '' OR ColValNo = '' OR UpdatedText = '' THEN Error_Services('Add', 'Null parameter WOMatKey, ColName, ColValNo, or UpdatedText passed to service.') end else WOMatRec = Database_Services("ReadDataRow", "WO_MAT", WOMatKey, "", "", "") If Error_Services("NoError") then WOMatRec = Database_Services("ReadDataRow", "WO_MAT", WOMatKey, "", "", FALSE$) IF INDEX(ColName,'START',1) THEN HoldStartReason = WOMatRec WOMatRec = UpdatedText END ELSE IF INDEX(ColName,'STOP',1) THEN HoldStopReason = WOMatRec WOMatRec = UpdatedText END END Database_Services("WriteDataRow", "WO_MAT", WoMatKey, WOMatRec, "", "", "") end else Respose = Error_Services("GetMessage") end end End Service //---------------------------------------------------------------------------------------------------------------------- // CreateComment // // HoldEntity - [Required] // HoldEntityID - [Required] // Reason - [Required] // Transition - [Required] // HoldType - [Required] // // Creates a HoldEntity comment marking changes in lot holds. //---------------------------------------------------------------------------------------------------------------------- Service CreateComment(HoldEntity, HoldEntityID, Reason, Transition, HoldType, OperatorID) IF HoldEntity = '' or HoldEntityID = '' or Reason = '' or Transition = '' or HoldType = '' THEN Error_Services('Add', 'Null parameter WOMatKey, HoldEntity, HoldEntityID, HoldType, or HoldData passed to service.') end else BEGIN CASE CASE HoldEntity = 'WO_MAT' OR HoldEntity = 'RDS' If HoldEntity = 'WO_MAT' then RDSNo = Xlate('WO_MAT', HoldEntityID, 'RDS_NO', 'X', '') end else RDSNo = HoldEntityID end IF Transition EQ True$ THEN IF HoldType = 'HOLD' THEN Subject = 'Material Placed on Hold ':HoldEntityID : ' by user ': OperatorID END ELSE Subject = 'Material Placed on Ship Hold ':HoldEntityID : ' by user ': OperatorID END END ELSE IF HoldType = 'HOLD' THEN Subject = 'Material Taken off Hold ':HoldEntityID : ' by user ': OperatorID END ELSE Subject = 'Material Taken off Ship Hold ':HoldEntityID : ' by user ': OperatorID END END Subject := ' - ':Reason Rds_Services('AddComment', RDSNo, Subject, '') CASE HoldEntity = 'WM_IN' IF Transition EQ True$ THEN Subject = 'Material Placed on Hold ':HoldEntityID : ' by user ': OperatorID END ELSE Subject = 'Material Taken off Hold ':HoldEntityID : ' by user ': OperatorID END Subject := ' - ':Reason Wm_In_Services('AddComment', HoldEntityID, Subject) CASE HoldEntity = 'WM_OUT' IF Transition EQ True$ THEN IF HoldType = 'HOLD' THEN Subject = 'Material Placed on Hold ':HoldEntityID : ' by user ': OperatorID END ELSE Subject = 'Material Placed on Ship Hold ':HoldEntityID : ' by user ': OperatorID END END ELSE IF HoldType = 'HOLD' THEN Subject = 'Material Taken off Hold ':HoldEntityID : ' by user ': OperatorID END ELSE Subject = 'Material Taken off Ship Hold ':HoldEntityID : ' by user ': OperatorID END END Subject := ' - ':Reason Wm_Out_Services('AddComment', HoldEntityID, Subject) END CASE end end service