open-insight/LSL2/STPROC/HOLD_SERVICES.txt
Ouellette Jonathan (CSC FI SPS MESLEO) 4037b2fa45 Merged PR 15668: Refactored Lot Event
Refactored Lot Event methods.
1. Moved all lot event methods to a new LOT_EVENT_SERVICES service module.
2. Simplified CreateLotEvent routine
3. Updated all calling stored procedures.
2025-04-28 21:02:24 +02:00

819 lines
33 KiB
Plaintext

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, Lot_Event_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<I>, HoldEntity, HoldEntityIDs<I>, CtrlEntID, OriginFlag, HoldData)
If Error_Services("NoError") then
Hold_Services("HoldNotification", HoldEntity, HoldEntityIDs<I>, 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<MCAPTION$> = "Processing..."
Def<MTYPE$ > = "G"
Def<MEXTENT$> = HoldEntityCount
Def<MTEXTWIDTH$> = 400
Def<MCOL$> = -2 ;* message h-pos in pixels, or -2 (center screen, the default), -1 (center parent)
Def<MROW$> = -2 ;* message v-pos in pixels
MsgUp = Msg(@window, Def)
end
For I = 1 to WOMatCount
If Hold_Services('CheckForHold', WOMatKeys<I>) EQ False$ then
Hold_Services('OnHold', WOMatKeys<I>, HoldEntity, HoldEntityIDs<I>, HoldType, HoldData)
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<MCAPTION$> = "Processing..."
Def<MTYPE$ > = "G"
Def<MEXTENT$> = HoldEntityCount
Def<MTEXTWIDTH$> = 400
Def<MCOL$> = -2 ;* message h-pos in pixels, or -2 (center screen, the default), -1 (center parent)
Def<MROW$> = -2 ;* message v-pos in pixels
MsgUp = Msg(@window, Def)
end
For I = 1 to WOMatCount
If Hold_Services('CheckForHold', WOMatKeys<I>) EQ True$ then
Hold_Services('OffHold', WOMatKeys<I>, HoldEntity, HoldEntityIDs<I>, HoldType, HoldData)
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>
Stage = HoldData<4>
Interrupted = HoldData<5>
CurrDate = OCONV(Date(),'D4/')
CurrTime = OCONV(Time(),'MTS')
CurrDTM = ICONV(CurrDate:' ':CurrTime,'DT')
IF HoldType = 'HOLD' THEN
WOMatRec<WO_MAT_HOLD$> = 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)
WOMatRec<WO_MAT_HOLD_STAGE$> = Stage
WOMatRec<WO_MAT_HOLD_INTERRUPTED$> = Interrupted
***********************************************************
// - 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<WO_MAT_INV_WH$>, @VM)
NewEntryPos = NumTimestamps + 1
CurrWH = WOMatRec<WO_MAT_INV_WH$, NewEntryPos - 1> ;* WH before hold
CurrLoc = WOMatRec<WO_MAT_INV_LOCATION$, NewEntryPos - 1> ;* LOC before hold
CurrTool = WOMatRec<WO_MAT_INV_TOOL_ID$, NewEntryPos - 1> ;* 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<WO_MAT_SHIP_HOLD$> = 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,'')
WOMatRec<WO_MAT_HOLD_STAGE$> = Stage
WOMatRec<WO_MAT_HOLD_INTERRUPTED$> = Interrupted
END
IF HoldEntity = 'WM_OUT' THEN
WOMatRec<WO_MAT_WMO_CURR_STATUS$> = 'HOLD' ;* JCH 7/14/2009
END
IF HoldEntity = 'WM_IN' THEN
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = '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)
//Add in logging lot event
If UserId EQ '' then
UserId = OperatorId
end
Begin Case
Case HoldEntity EQ 'WM_IN'
WONo = Field(WOMatKey, '*', 1)
StepNo = 1
CassNo = Field(WOMatKey, '*', 2)
WMInKey = WONo : '*' : StepNo : '*' : CassNo
Lot_Event_Services('CreateLotEvent', WMInKey, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'WM_IN')
Case HoldEntity EQ 'WM_OUT'
WONo = Field(WOMatKey, '*', 1)
StepNo = 1
CassNo = Field(WOMatKey, '*', 2)
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
Lot_Event_Services('CreateLotEvent', WMOutKey, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'WM_OUT')
Case HoldEntity EQ 'RDS'
RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
Lot_Event_Services('CreateLotEvent', RDSNo, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'RDS')
Case HoldEntity EQ 'WO_MAT'
Lot_Event_Services('CreateLotEvent', WOMatKey, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'WO_MAT')
End Case
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<WO_MAT_HOLD$> = 0
WOMatRec<WO_MAT_HOLD_STOP_DTM$,1> = CurrDTM
WOMatRec<WO_MAT_HOLD_STOP_USER$,1> = UserID
WOMatRec<WO_MAT_HOLD_STOP_REASON$,1> = Reason
WOMatRec<WO_MAT_HOLD_EXTENDED$,1> = 0
WOMatRec<WO_MAT_HOLD_STAGE$> = ''
WOMatRec<WO_MAT_HOLD_INTERRUPTED$> = ''
***********************************************************
LOCATE CurrDTM IN WOMatRec<WO_MAT_INV_DTM$> BY 'AR' USING @VM SETTING Pos ELSE
IF Pos > 1 THEN
CurrWH = WOMatRec<WO_MAT_INV_WH$,Pos-1> ;* WH before hold
CurrLoc = WOMatRec<WO_MAT_INV_LOCATION$,Pos-1> ;* LOC before hold
CurrTool = WOMatRec<WO_MAT_INV_TOOL_ID$,Pos-1> ;* 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<WO_MAT_SHIP_HOLD$> = 0
WOMatRec<WO_MAT_SHIP_HOLD_STOP_DTM$,1> = CurrDTM
WOMatRec<WO_MAT_SHIP_HOLD_STOP_USER$,1> = UserID
WOMatRec<WO_MAT_SHIP_HOLD_STOP_REASON$,1> = Reason
WOMatRec<WO_MAT_SHIP_HOLD_EXTENDED$,1> = 0
WOMatRec<WO_MAT_HOLD_STAGE$> = ''
WOMatRec<WO_MAT_HOLD_INTERRUPTED$> = ''
END
IF HoldEntity = 'WM_OUT' THEN
WOMatRec<WO_MAT_WMO_CURR_STATUS$> = obj_WM_Out('CurrStatus',HoldEntityID:@RM:@RM:WOMatRec)
END
IF HoldEntity = 'WM_IN' THEN
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = 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)
//Add in logging lot event
if UserID EQ '' then
UserId = OperatorId
end
Begin Case
Case HoldEntity EQ 'WM_IN'
WONo = Field(WOMatKey, '*', 1)
StepNo = 1
CassNo = Field(WOMatKey, '*', 2)
WMInKey = WONo : '*' : StepNo : '*' : CassNo
Lot_Event_Services('CreateLotEvent', WMInKey, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'WM_IN')
Case HoldEntity EQ 'WM_OUT'
WONo = Field(WOMatKey, '*', 1)
StepNo = 1
CassNo = Field(WOMatKey, '*', 2)
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
Lot_Event_Services('CreateLotEvent', WMOutKey, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'WM_OUT')
Case HoldEntity EQ 'RDS'
RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
Lot_Event_Services('CreateLotEvent', RDSNo, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'RDS')
Case HoldEntity EQ 'WO_MAT'
Lot_Event_Services('CreateLotEvent', WOMatKey, CurrDTM, 'HOLD_OFF', 'Lot taken off hold.', '', UserId, True$, 'WO_MAT')
End Case
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<WO_MAT_SHIP_HOLD$>
END ELSE
HoldCheck = WOMatRec<WO_MAT_HOLD$>
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<WO_MAT_HOLD_START_REASON$,ColValNo>
WOMatRec<WO_MAT_HOLD_START_REASON$,ColValNo> = UpdatedText
END ELSE
IF INDEX(ColName,'STOP',1) THEN
HoldStopReason = WOMatRec<WO_MAT_HOLD_STOP_REASON$,ColValNo>
WOMatRec<WO_MAT_HOLD_STOP_REASON$,ColValNo> = 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