Compare commits
26 Commits
f4f63c28e3
...
722bc63bdb
Author | SHA1 | Date | |
---|---|---|---|
722bc63bdb | |||
1f2777cd18 | |||
10bf8bf878 | |||
1a572a31b2 | |||
098f740585 | |||
89bb3e479b | |||
60522d74c1 | |||
3561b41a7b | |||
a636198128 | |||
adc247fd4c | |||
a094971d7d | |||
47b54f6a16 | |||
804258a167 | |||
6d552ab824 | |||
2fbf41d528 | |||
ba2faa8c9f | |||
0a2d53d173 | |||
844de71599 | |||
494988d394 | |||
e1c7544fac | |||
6d5c9c0ab7 | |||
a8dff61cfa | |||
09d2d13e63 | |||
14331fcf49 | |||
667831a003 | |||
82b74f0b96 |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -9,7 +9,7 @@ COMPILE FUNCTION Comm_PRS_Stage(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5)
|
||||
DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Event, Security_Err_Msg
|
||||
DECLARE SUBROUTINE Send_Message, Btree.Extract, Comm_Prod_Spec, Forward_Event, Post_Event
|
||||
DECLARE FUNCTION Get_Property, Get_Status, Popup, Send_Message, Msg, Start_Window, MemberOf, Security_Check
|
||||
DECLARE FUNCTION Comm_Prod_Spec
|
||||
DECLARE FUNCTION Comm_Prod_Spec, obj_Popup
|
||||
|
||||
|
||||
$INSERT POPUP_EQUATES
|
||||
@ -143,7 +143,7 @@ obj_Appwindow('Create',@WINDOW)
|
||||
|
||||
**** Set Dropdown columns in .MET_TEST edit table ****
|
||||
|
||||
MetStyles = Send_Message(@WINDOW:'.MET_TEST','COLSTYLE',0,'')
|
||||
MetStyles = Send_Message(@WINDOW:'.MET_TEST','COLSTYLE',0,'')
|
||||
|
||||
MetStyles<COL$MET_TEST> = BitOr(MetStyles<COL$MET_TEST>,DROPDOWN_STYLE$)
|
||||
MetStyles<COL$MET_PROP> = BitOr(MetStyles<COL$MET_PROP>,DROPDOWN_STYLE$)
|
||||
@ -192,7 +192,6 @@ NEXT I
|
||||
|
||||
Send_Message(@WINDOW:'.MET_TEST','COLFORMAT',COL$MET_PROP,PropCodes)
|
||||
|
||||
|
||||
* Class Tools is set in the POSCHANGED event for the edit table.
|
||||
|
||||
/*
|
||||
@ -235,6 +234,23 @@ Read:
|
||||
|
||||
GOSUB Refresh
|
||||
|
||||
* Met Property Descriptions *
|
||||
|
||||
PSNo = Get_Property(@WINDOW : '.PS_NO', 'TEXT')
|
||||
Stage = Get_Property(@WINDOW:'.STAGE','DEFPROP')
|
||||
|
||||
Props = Xlate('PRS_STAGE', PSNo:'*':Stage, PRS_STAGE_MET_PROP$, 'X')
|
||||
|
||||
PropDescs = obj_Popup('CodeDesc','MET_PROPERTY':@RM:Props)
|
||||
|
||||
CtrlEntID = @WINDOW:'.MET_TEST'
|
||||
DescCount = DCount(PropDescs, @VM)
|
||||
FOR Row = 1 to DescCount
|
||||
PropDesc = PropDescs<1, Row>
|
||||
|
||||
Set_Property(CtrlEntId,"CELLPOS",PropDesc,COL$MET_PROP_DESC:@FM:Row)
|
||||
Next Row
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -722,8 +738,8 @@ CurrLine = Get_Property(CtrlEntID,'LIST')<CurrRow>
|
||||
|
||||
|
||||
DefProp = ''
|
||||
BEGIN CASE
|
||||
|
||||
BEGIN CASE
|
||||
|
||||
CASE CurrCol = COL$MET_TOOL_CLASS
|
||||
|
||||
PropCode = CurrLine<1,COL$MET_PROP>
|
||||
@ -764,6 +780,12 @@ BEGIN CASE
|
||||
|
||||
RETURN
|
||||
|
||||
CASE CurrCol = COL$MET_PROP_DESC
|
||||
|
||||
PropCode = CurrLine<1,COL$MET_PROP>
|
||||
|
||||
DefProp = obj_Popup('CodeDesc','MET_PROPERTY':@RM:PropCode)
|
||||
|
||||
|
||||
CASE CurrCol = COL$MET_MIN AND CurrLine<1,COL$MET_MIN> = ''
|
||||
MetTest = CurrLine<1,COL$MET_TEST>
|
||||
@ -1229,3 +1251,4 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -2015,7 +2015,7 @@ HoldClick:
|
||||
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType:@FM:Stage:@FM:Interrupted)
|
||||
|
||||
If HoldData NE 'Cancel' then
|
||||
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEnt, '', HoldData, '')
|
||||
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEnt, '', HoldData, @User4)
|
||||
IF Error_Services("HasError") THEN
|
||||
ErrCode = Error_Services("GetMessage")
|
||||
ErrMsg(errCode)
|
||||
|
@ -425,7 +425,7 @@ RejMat:
|
||||
Msg(@window, MsgUp) ;* take down the processing message
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
IneligibleSlots = ''
|
||||
AllSlotsPermitted = True$ ; // Assume that all slots are permitted to be NCR'd for now.
|
||||
For I = 1 TO SelCnt
|
||||
@ -434,7 +434,7 @@ RejMat:
|
||||
WfrID = SlotList<SelectedRows<I>, COL$WAFER_ID>
|
||||
PrevNCR = SlotList<SelectedRows<I>, COL$SLOT_NCR>
|
||||
MUWfrID = SlotList<SelectedRows<I>, COL$MU_WAFER_ID>
|
||||
If (WfrId EQ '') then
|
||||
If (WfrID EQ '') then
|
||||
AllSlotsPermitted = False$
|
||||
IneligibleSlots<0, -1> = SlotNo
|
||||
end
|
||||
@ -1233,3 +1233,7 @@ LogRecord:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -32,7 +32,8 @@ DataFields := "EVENT_BEGIN_WAFER_QTY" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_BEGIN
|
||||
DataFields := "EVENT_END_WAFER_QTY" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_END_WAFER_QTY$), "INT"):@FM
|
||||
DataFields := "EVENT_OPERATION_ID" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_OPERATION_ID$), "STR"):@FM
|
||||
DataFields := "EVENT_OPERATOR_ID" :@VM:SQL_Format(Rec(LOT_EVENT_EVENT_OPERATOR_ID$), "STR"):@FM
|
||||
DataFields := "SEQUENCE" :@VM:SQL_Format(Rec(LOT_EVENT_SEQUENCE$), "INT")
|
||||
DataFields := "SEQUENCE" :@VM:SQL_Format(Rec(LOT_EVENT_SEQUENCE$), "INT"):@FM
|
||||
DataFields := "CHRON_ID" :@VM:SQL_Format(Rec(LOT_EVENT_CHRON_ID$), "INT")
|
||||
|
||||
// Symbolics
|
||||
|
||||
@ -43,3 +44,4 @@ Ans = SQL_Write(Connection, "LOT_EVENT", Keys, DataFields);
|
||||
// Multi-valued Fields
|
||||
|
||||
Return Ans
|
||||
|
||||
|
@ -14,7 +14,7 @@ Declare function SQL_Write, SQL_Write_MV, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// Parse record into a dimensioned array for speed
|
||||
Dim Rec(24)
|
||||
Dim Rec(25)
|
||||
MatParse Record into Rec
|
||||
|
||||
// List of key names and their values
|
||||
@ -54,3 +54,4 @@ Ans = SQL_Write(Connection, "LOT_OPERATION", Keys, DataFields);
|
||||
// Multi-valued Fields
|
||||
|
||||
Return Ans
|
||||
|
||||
|
30
LSL2/STPROC/DELETE_LOT_EVENT_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_LOT_EVENT_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_LOT_EVENT_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given LOT_EVENT record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "LOT_EVENT_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// LOT_EVENT
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "LOT_EVENT", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
30
LSL2/STPROC/DELETE_LOT_EVENT_TYPE_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_LOT_EVENT_TYPE_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_LOT_EVENT_TYPE_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given LOT_EVENT_TYPE record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "LOT_EVENT_TYPE_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// LOT_EVENT_TYPE
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "LOT_EVENT_TYPE", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
30
LSL2/STPROC/DELETE_LOT_OPERATION_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_LOT_OPERATION_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_LOT_OPERATION_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given LOT_OPERATION record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "LOT_OPERATION_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// LOT_OPERATION
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "LOT_OPERATION", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
30
LSL2/STPROC/DELETE_LOT_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_LOT_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_LOT_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given LOT record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "LOT_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// LOT
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "LOT", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
30
LSL2/STPROC/DELETE_OPERATION_RECORD_FROM_SQL.txt
Normal file
30
LSL2/STPROC/DELETE_OPERATION_RECORD_FROM_SQL.txt
Normal file
@ -0,0 +1,30 @@
|
||||
Compile function Delete_OPERATION_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given OPERATION record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
08/15/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "OPERATION_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
!! Delete records from MV tables first !!
|
||||
|
||||
// Currently no multi-value (child) tables
|
||||
|
||||
// OPERATION
|
||||
If Ans EQ "" then
|
||||
Ans = SQL_Delete(Connection, "OPERATION", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
@ -84,7 +84,7 @@ Service IsProd()
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
IsProd = False$
|
||||
If Machine _NEC "messa012" and Machine _NEC "mestsa01ec" and Machine _NEC "mestsa09ec" and Machine _NEC "mestsa010ec" and Machine _NEC "mestsa011ec" and Machine _NEC "mestsa012ec" and Machine _NEC "MESTST1010" and Machine _NEC "MESTST1009" then
|
||||
If Machine _NEC "messa012" and Machine _NEC "mestsa01ec" and Machine _NEC "mestsa09ec" and Machine _NEC "mestsa010ec" and Machine _NEC "mestsa011ec" and Machine _NEC "mestsa012ec" and Machine _NEC "mestsa024ec" and Machine _NEC "MESTST1010" and Machine _NEC "MESTST1009" then
|
||||
IsProd = True$
|
||||
end
|
||||
Response = IsProd
|
||||
@ -122,7 +122,8 @@ Service GetApplicationRootIP()
|
||||
Case Machine EQ 'MESTSA09EC' ; ApplicationRootIP = '\\10.95.140.62'
|
||||
Case Machine EQ 'MESTSA010EC' ; ApplicationRootIP = '\\10.95.140.63'
|
||||
Case Machine EQ 'MESTSA011EC' ; ApplicationRootIP = '\\10.95.140.64'
|
||||
Case Machine EQ 'MESTSA012EC' ; ApplicationRootIP = '\\10.95.140.65'
|
||||
Case Machine EQ 'MESTSA012EC' ; ApplicationRootIP = '\\10.95.140.65'
|
||||
Case Machine EQ 'MESTSA024EC' ; ApplicationRootIP = '\\10.95.140.66'
|
||||
Case Machine EQ 'MESSA012' ; ApplicationRootIP = '\\10.95.176.50'
|
||||
Case Machine EQ 'MESST5201' ; ApplicationRootIP = '\\10.95.140.14'
|
||||
Case Machine EQ 'MESST5202' ; ApplicationRootIP = '\\10.95.140.14'
|
||||
@ -325,6 +326,7 @@ Service GetLocalRootPath()
|
||||
Case Machine EQ 'MESTSA010EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA011EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA012EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESTSA024EC' ; LocalRootPath = 'D:'
|
||||
Case Machine EQ 'MESST6501' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
Case Machine EQ 'MESST6502' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
Case Machine EQ 'MESTST1006' ; LocalRootPath = 'C:' ; // This is a map to the user's actual C drive.
|
||||
|
@ -46,19 +46,19 @@ Compile function Hold_Services(@Service, @Params)
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert SERVICE_SETUP
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert MSG_EQUATES
|
||||
$Insert DICT_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$INSERT NOTIFICATION_EQU
|
||||
|
||||
$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 function Environment_Services, Utility, Logging_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
|
||||
Declare subroutine Wm_Out_Services, Rds_Services, Lot_Event_Services, Logging_Services
|
||||
|
||||
GoToService else
|
||||
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.')
|
||||
@ -268,7 +268,7 @@ end service
|
||||
// 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
|
||||
@ -361,29 +361,42 @@ Service OnHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorI
|
||||
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
|
||||
LotKey = ''
|
||||
Begin Case
|
||||
Case HoldEntity EQ 'WM_IN'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
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')
|
||||
LotKey = 'I':WMInKey
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'WM_OUT'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
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')
|
||||
LotKey = 'O':WMOutKey
|
||||
Convert '*' to '.' in LotKey
|
||||
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')
|
||||
RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
|
||||
LotKey = 'R':RDSNo
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'WO_MAT'
|
||||
Lot_Event_Services('CreateLotEvent', WOMatKey, CurrDTM, 'HOLD_ON', 'Lot placed on hold.', '', UserId, True$, 'WO_MAT')
|
||||
LotKey = 'W':WOMatKey
|
||||
Convert '*' to '.' in LotKey
|
||||
End Case
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = LotKey:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'Lot ':LotKey:' of type ':HoldEntity:' placed on hold by user ':OperatorId
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Lot is already on hold.')
|
||||
@ -406,7 +419,7 @@ End Service
|
||||
// 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
|
||||
@ -497,29 +510,43 @@ Service OffHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, Operator
|
||||
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
|
||||
LotKey = ''
|
||||
Begin Case
|
||||
Case HoldEntity EQ 'WM_IN'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
WMInKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
LotKey = 'I':WMInKey
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'WM_OUT'
|
||||
WONo = Field(WOMatKey, '*', 1)
|
||||
StepNo = 1
|
||||
CassNo = Field(WOMatKey, '*', 2)
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
LotKey = 'O':WMOutKey
|
||||
Convert '*' to '.' in LotKey
|
||||
Case HoldEntity EQ 'RDS'
|
||||
RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
|
||||
LotKey = 'R':RDSNo
|
||||
Case HoldEntity EQ 'WO_MAT'
|
||||
LotKey = WOMatKey
|
||||
Convert '*' to '.' in LotKey
|
||||
End Case
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = LotKey:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'Lot ':LotKey:' of type ':HoldEntity:' taken off hold by user ':OperatorId
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Lot is not on hold.')
|
||||
|
@ -55,7 +55,7 @@ $Insert LOT_EQUATES
|
||||
$Insert LOT_OPERATION_EQUATES
|
||||
|
||||
Declare function Error_Services, Logging_Services, Environment_Services, Database_Services, RTI_CreateGUID
|
||||
Declare function Lot_Event_Services, Lot_Services
|
||||
Declare function Lot_Event_Services, Lot_Services, NextKey
|
||||
Declare subroutine Error_Services, Logging_Services, Database_Services, Lot_Services, Service_Services
|
||||
Declare subroutine Transaction_Services
|
||||
|
||||
@ -89,28 +89,36 @@ Service CreateLotEvent(LotId, EventDateTime, EventType=EVENT_TYPES, EventNote, E
|
||||
end
|
||||
end
|
||||
If RowExists('LOT', LotId) then
|
||||
CurrLotOperation = Lot_Services('GetLotCurrOperationId', LotId)
|
||||
NewEventId = RTI_CreateGUID()
|
||||
If NewEventId NE '' then
|
||||
NewEventSequence = Lot_Event_Services('GetLotEventNextSequence', LotId)
|
||||
If Error_Services('NoError') then
|
||||
NewEventRec = ''
|
||||
NewEventRec<LOT_EVENT_LOT_ID$> = LotId
|
||||
NewEventRec<LOT_EVENT_LOT_EVENT_TYPE$> = EventType
|
||||
NewEventRec<LOT_EVENT_EVENT_DATETIME$> = EventDatetime
|
||||
NewEventRec<LOT_EVENT_EVENT_NOTE$> = EventNote
|
||||
NewEventRec<LOT_EVENT_EQUIPMENT_ID$> = EventEquipmentId
|
||||
NewEventRec<LOT_EVENT_EVENT_OPERATOR_ID$> = OperatorId
|
||||
NewEventRec<LOT_EVENT_SEQUENCE$> = NewEventSequence
|
||||
Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec)
|
||||
If Error_Services('NoError') then
|
||||
Transaction_Services('PostWriteFieldTransaction', 'LOT', LotId, LOT_MOST_RECENT_LOT_EVENT_ID$, NewEventId)
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
end else
|
||||
ErrorMessage = 'Error creating new event : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
NextEventChronId = NextKey('LOT_EVENT')
|
||||
If NextEventChronId NE 0 then
|
||||
NewEventSequence = Lot_Event_Services('GetLotEventNextSequence', LotId)
|
||||
If Error_Services('NoError') then
|
||||
NewEventRec = ''
|
||||
NewEventRec<LOT_EVENT_LOT_ID$> = LotId
|
||||
NewEventRec<LOT_EVENT_LOT_EVENT_TYPE$> = EventType
|
||||
NewEventRec<LOT_EVENT_EVENT_DATETIME$> = EventDatetime
|
||||
NewEventRec<LOT_EVENT_EVENT_NOTE$> = EventNote
|
||||
NewEventRec<LOT_EVENT_EVENT_OPERATION_ID$> = CurrLotOperation
|
||||
NewEventRec<LOT_EVENT_EQUIPMENT_ID$> = EventEquipmentId
|
||||
NewEventRec<LOT_EVENT_EVENT_OPERATOR_ID$> = OperatorId
|
||||
NewEventRec<LOT_EVENT_SEQUENCE$> = NewEventSequence
|
||||
NewEventRec<LOT_EVENT_CHRON_ID$> = NextEventChronId
|
||||
Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec)
|
||||
If Error_Services('NoError') then
|
||||
Transaction_Services('PostWriteFieldTransaction', 'LOT', LotId, LOT_MOST_RECENT_LOT_EVENT_ID$, NewEventId)
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
end else
|
||||
ErrorMessage = 'Error creating new event : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error creating new event. Error calling NextKey("LOT_EVENT") to get LOT_EVENT_CHRON_ID.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error creating an event Id.'
|
||||
end
|
||||
@ -233,3 +241,5 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -53,7 +53,8 @@ Declare function PSN_Services, Return_To_Fab_Services
|
||||
Declare subroutine Database_Services, Btree.Extract, Lot_Services, Error_Services, Labeling_Services, SRP_Json, Logging_Services
|
||||
Declare subroutine SRP_Run_Command, Service_Services, obj_notes, Lot_Event_Services, Mona_Services
|
||||
|
||||
$insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert LOT_EQUATES
|
||||
$Insert TEST_WAFER_PROD_EQUATES
|
||||
$Insert Lot_Operation_Equates
|
||||
@ -65,6 +66,7 @@ $Insert RDS_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert PROD_VER_EQUATES
|
||||
$Insert OPERATION_EQUATES
|
||||
$Insert IFX_EQUATES
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -106,7 +108,9 @@ end else
|
||||
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_LOTSERVICES'
|
||||
end
|
||||
|
||||
GoToService
|
||||
GoToService else
|
||||
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||
end
|
||||
|
||||
Return Response or ""
|
||||
|
||||
@ -1226,7 +1230,7 @@ Service OpenLot(LotId)
|
||||
LotRec<LOT_OPEN$> = True$
|
||||
Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'OPEN', 'Lot status set to Open.', '', 'SYSTEM')
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'LOT_START', 'Lot created.', '', 'SYSTEM')
|
||||
end else
|
||||
ErrorMessage = 'Error setting lot ' : LotId : ' to open.' : Error_Services('GetMessage')
|
||||
end
|
||||
@ -1409,7 +1413,7 @@ Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId)
|
||||
// Write Lot Event
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'REDUCE_WAFER_QTY', 'Reduced wafer count by ' : ReductionQty, '', OperatorId, False$, '')
|
||||
if LotNewWfrQty EQ 0 AND LotType EQ 'TW' then
|
||||
ServiceParms = 'AutoCloseTestWaferLot' : @VM : LotId : @VM : 'SYSTEM'
|
||||
ServiceParms = 'AutoCloseTestWaferLot' : SD$ : LotId : SD$ : 'SYSTEM'
|
||||
Service_Services('PostProcedure', 'LOT_SERVICES', ServiceParms)
|
||||
If Error_Services('HasError') then
|
||||
Recipients = Xlate('NOTIFICATION', 'FI_SUPPORT', NOTIFICATION_USER_ID$, 'X')
|
||||
@ -1465,7 +1469,7 @@ Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId)
|
||||
Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
// Write Lot Event
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'INCREASE_WAFER_QTY', 'Increased wafer count by ' : IncreaseQty, '', OperatorId, False$, '')
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'BONUS_WAFER_QTY', 'Increased wafer count by ' : IncreaseQty, '', OperatorId, False$, '')
|
||||
end else
|
||||
ErrorMessage = 'Error in Increase Lot Wafer Count service, Error writing Lot Id ' : LotId : ' with new quantity.'
|
||||
end
|
||||
@ -1580,11 +1584,11 @@ Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
|
||||
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service CanUserModifyLot(UserId)
|
||||
|
||||
Begin Case
|
||||
@ -1614,4 +1618,3 @@ end service
|
||||
// Internal GoSubs
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
@ -254,19 +254,13 @@ Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
|
||||
If ErrorMsg EQ '' then Response = ScanSubLot
|
||||
|
||||
Case ScanType EQ 'CASSETTE1'
|
||||
debug
|
||||
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
|
||||
// non-existent carrier will the scan data be considered invalid.
|
||||
// Strip '1T', 'I', and 'O' prefixes.
|
||||
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
|
||||
DelimCount = DCount(ScanData, '|')
|
||||
Begin Case
|
||||
Case (ScanData[1, 1] EQ 'I')
|
||||
! Temporary exception while we exhaust current WMI inventory on KIT racks that
|
||||
! do not have a 2D barcode.
|
||||
CassetteID = ScanData
|
||||
SeqNo = 'SEQ1'
|
||||
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
|
||||
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') or (ScanData[1, 1] EQ 'I') )
|
||||
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
|
||||
Case (DelimCount NE 8)
|
||||
ErrorMsg = 'Invalid Lot Label Scan.'
|
||||
@ -315,12 +309,7 @@ Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
|
||||
|
||||
DelimCount = DCount(ScanData, '|')
|
||||
Begin Case
|
||||
Case (ScanData[1, 1] EQ 'I')
|
||||
! Temporary exception while we exhaust current WMI inventory on KIT racks that
|
||||
! do not have a 2D barcode.
|
||||
CassetteID = ScanData
|
||||
Seq2No = 'SEQ2'
|
||||
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
|
||||
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') or (ScanData[1, 1] EQ 'I') )
|
||||
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
|
||||
Case (DelimCount NE 8)
|
||||
ErrorMsg = 'Invalid Lot Label Scan.'
|
||||
|
@ -414,36 +414,27 @@ Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
|
||||
|
||||
Begin Case
|
||||
Case Machine _EQC 'Tencor'
|
||||
SearchPattern = '*.pdsf';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSFS6420\Source\MET08DDUPSFS6420\'
|
||||
Case Machine _EQC 'HgCV'
|
||||
SearchPattern = '*.pdsf';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESIHGCV\Source\MET08RESIHGCV\'
|
||||
Case Machine _EQC 'CDE'
|
||||
SearchPattern = '*.pdsf';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESIMAPCDE\Source\MET08RESIMAPCDE\'
|
||||
Case Machine _EQC 'Biorad'
|
||||
SearchPattern = '*.pdsf';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08THFTIRQS408M\Source\MET08THFTIRQS408M\'
|
||||
Case Machine _EQC 'Stratus'
|
||||
SearchPattern = '*.txt';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08THFTIRSTRATUS\Source\MET08THFTIRSTRATUS\'
|
||||
Case Machine _EQC 'SP1'
|
||||
SearchPattern = '*.pdsf';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08DDUPSP1TBI\Source\MET08DDUPSP1TBI\'
|
||||
Case Machine _EQC 'SPV'
|
||||
SearchPattern = '*.txt';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08RESISRP2100\Source\MET08RESISRP2100\'
|
||||
Case Machine _EQC 'SRP'
|
||||
SearchPattern = '*.txt';
|
||||
DataPath = Environment_Services('GetApplicationRootPath') : '\Metrology\MET08ANLYSDIFAAST230\Source\MET08ANLYSDIFAAST230\'
|
||||
Case Otherwise$
|
||||
SearchPattern = '*.txt';
|
||||
Error_Services('Add', 'Error in ':Service:' service. Unsupported Machine "':Machine:'" passed into service')
|
||||
End Case
|
||||
|
||||
If Error_Services('NoError') then
|
||||
|
||||
SearchPattern = '*.pdsf';
|
||||
InitDir DataPath:SearchPattern
|
||||
FileList = DirList()
|
||||
FileNames = ''
|
||||
@ -520,41 +511,15 @@ Service ImportMetrologyFiles(Machine=MACHINE_TYPES)
|
||||
RepoPath = Environment_Services('GetApplicationRootPath') : '\Metrology\Run Data Repository\MET08ANLYSDIFAAST230\Source\MET08ANLYSDIFAAST230\'
|
||||
End Case
|
||||
|
||||
IF SearchPattern = '*.pdsf' THEN
|
||||
OSREAD Text FROM DataPath:FileName THEN
|
||||
json = Metrology_Services('GetJsonFromProcessDataStandardFormat', Text);
|
||||
END ELSE
|
||||
json = '';
|
||||
END
|
||||
IF LEN(json) GT 0 THEN
|
||||
RunData = Metrology_Services('GetRunData', Machine, json);
|
||||
END ELSE
|
||||
Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to get PDSF json');
|
||||
END
|
||||
OSREAD Text FROM DataPath:FileName THEN
|
||||
json = Metrology_Services('GetJsonFromProcessDataStandardFormat', Text);
|
||||
END ELSE
|
||||
|
||||
OSREAD RunData FROM DataPath:FileName THEN
|
||||
Set_Status(0)
|
||||
OSWrite RunData to RepoPath:FileName
|
||||
status_code = ''
|
||||
If Get_Status(status_code) then
|
||||
ErrorMessage = 'Error writing run data file to repository: status_code = ' : status_code
|
||||
Metrology_Services('LogResults', '', Machine, 'UID001', Service : ' : ' : ErrorMessage)
|
||||
Set_Status(0)
|
||||
end
|
||||
|
||||
SWAP '|' WITH @VM IN RunData
|
||||
SWAP CRLF$ WITH @FM IN RunData
|
||||
|
||||
LOOP
|
||||
LastChar = RunData[-1,1]
|
||||
UNTIL LastChar NE @FM
|
||||
RunData[-1,1] = ''
|
||||
REPEAT
|
||||
Convert Tab$ to @FM in RunData
|
||||
END else
|
||||
Metrology_Services('LogResults', '', Machine, 'UID001', 'Read : ' : FileName : ', Size : ' : FileSize)
|
||||
end
|
||||
json = '';
|
||||
END
|
||||
IF LEN(json) GT 0 THEN
|
||||
RunData = Metrology_Services('GetRunData', Machine, json);
|
||||
END ELSE
|
||||
Metrology_Services('LogResults', PSN, Machine, 'UID002', Service : ' : ' : 'Failed to get PDSF json');
|
||||
END
|
||||
|
||||
*************************
|
||||
|
@ -508,23 +508,23 @@ GetRdsColumns:
|
||||
GoSub GetView
|
||||
|
||||
If CurrentViewSelection _EQC 'quick' then
|
||||
RDSColumns = ''
|
||||
RDSColumns<0, 1> = 'ABBREV_OR_CO_NAME'
|
||||
RDSColumns<0, 2> = 'WO'
|
||||
RDSColumns<0, 3> = 'WO_STEP'
|
||||
RDSColumns<0, 4> = 'SEQ'
|
||||
RDSColumns<0, 5> = 'REACTOR'
|
||||
RDSColumns<0, 6> = 'RUN_ORDER_NUM'
|
||||
RDSColumns<0, 7> = 'UNLOAD_THICK_TEST'
|
||||
RDSColumns<0, 8> = 'HGCV_TEST'
|
||||
RDSColumns<0, 9> = 'DATE_IN'
|
||||
RDSColumns<0, 10> = 'TIME_IN'
|
||||
RDSColumns<0, 11> = 'DATE_OUT'
|
||||
RDSColumns<0, 12> = 'TIME_OUT'
|
||||
RDSColumns<0, 13> = 'PART_NUM'
|
||||
RDSColumns<0, 14> = 'LOT_NUM'
|
||||
RDSColumns<0, 15> = 'SUPPL_INST'
|
||||
RDSColumns<0, 16> = 'HOLD_STATUS'
|
||||
RDSColumns = ''
|
||||
RDSColumns<0, 1> = 'ABBREV_OR_CO_NAME'
|
||||
RDSColumns<0, 2> = 'WO'
|
||||
RDSColumns<0, 3> = 'WO_STEP'
|
||||
RDSColumns<0, 4> = 'SEQ'
|
||||
RDSColumns<0, 5> = 'REACTOR'
|
||||
RDSColumns<0, 6> = 'RUN_ORDER_NUM'
|
||||
RDSColumns<0, 7> = 'UNLOAD_THICK_TEST'
|
||||
RDSColumns<0, 8> = 'HGCV_TEST'
|
||||
RDSColumns<0, 9> = 'DATE_IN'
|
||||
RDSColumns<0, 10> = 'TIME_IN'
|
||||
RDSColumns<0, 11> = 'DATE_OUT'
|
||||
RDSColumns<0, 12> = 'TIME_OUT'
|
||||
RDSColumns<0, 13> = 'PART_NUM'
|
||||
RDSColumns<0, 14> = 'LOT_NUM'
|
||||
RDSColumns<0, 15> = 'SUPPL_INST'
|
||||
RDSColumns<0, 16> = 'HOLD_STATUS'
|
||||
end else
|
||||
RDSColumns = ''
|
||||
RDSColumns<0, 1> = 'ABBREV_OR_CO_NAME'
|
||||
@ -609,7 +609,7 @@ return
|
||||
|
||||
|
||||
GetExistingSupps:
|
||||
|
||||
|
||||
Gosub GetView
|
||||
NumRDS = DCount(RDSList, @FM)
|
||||
SuppsWithLots = Supplement_Services('GetLotsWithSupplements', 'RDS')
|
||||
@ -677,6 +677,3 @@ CheckSelectedForHolds:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -30,7 +30,7 @@ Compile function NDW_WAFER_COUNTER_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window NDW_PACKAGING
|
||||
#window NDW_WAFER_COUNTER
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert EVENT_SETUP
|
||||
@ -44,7 +44,7 @@ Equ MSG_WIDTH$ to 650
|
||||
Equ Comma$ to ','
|
||||
|
||||
Declare function MemberOf, Form_Services, Wafer_Counter_Services, SRP_Json, WO_Mat_Services, Wm_Out_Services, Datetime
|
||||
Declare function Logging_Services, Environment_Services
|
||||
Declare function Logging_Services, Environment_Services, Wo_Mat_Qa_Services, Return_To_Fab_Services
|
||||
Declare subroutine SRP_Json, PlaceDialog, Wafer_Counter_Services, Logging_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WaferCounter'
|
||||
@ -97,13 +97,26 @@ Event WINDOW.CREATE(CreateParam)
|
||||
LogData<5> = ToolLoc
|
||||
LogData<6> = @Window:'.CREATE'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
QAMetComplete = ''
|
||||
|
||||
If CassID NE '' then
|
||||
If RowExists('WM_OUT', CassID) then
|
||||
WOMatKey = Xlate('WM_OUT', CassID, 'WO_MAT_KEY', 'X')
|
||||
end else
|
||||
WOMatKey = Xlate('RDS', CassID, 'WO_MAT_KEY', 'X')
|
||||
end
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
end
|
||||
|
||||
Convert '.' to '*' in CassID
|
||||
ExpectedQty = ''
|
||||
ExpectedWfrMap = ''
|
||||
If WfrCntAdj EQ '' then WfrCntAdj = 0
|
||||
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassID)
|
||||
|
||||
Begin Case
|
||||
Case (CassID NE '' AND QAMetComplete EQ False$)
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
Case ( (CassID EQ '') and (ToolLoc EQ '') )
|
||||
// Alternate workflow
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass ID')
|
||||
@ -319,36 +332,49 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
Set_Property(@Window:'.EDL_CASS_ID', 'TEXT', CassetteID)
|
||||
Begin Case
|
||||
Case RowExists('RDS', CassetteID)
|
||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
|
||||
|
||||
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||
end
|
||||
|
||||
Case RowExists('WM_OUT', CassetteID)
|
||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
|
||||
If QAMetComplete EQ True$ then
|
||||
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
|
||||
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
|
||||
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
|
||||
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
|
||||
|
||||
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
|
||||
If Error_Services('NoError') then
|
||||
ExpectedWfrMap = CurrWfrMap
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
end
|
||||
End Case
|
||||
|
||||
Convert @VM to '' in ExpectedWfrMap
|
||||
Set_Property(@Window, '@EXPECTED_WFR_MAP', ExpectedWfrMap)
|
||||
If ErrorMsg EQ '' then
|
||||
Convert @VM to '' in ExpectedWfrMap
|
||||
Set_Property(@Window, '@EXPECTED_WFR_MAP', ExpectedWfrMap)
|
||||
end
|
||||
end else
|
||||
If CassetteID NE VerifyCassID then
|
||||
ErrorMsg = 'Scanned cassette ID does not match cassette to verify!'
|
||||
@ -598,3 +624,9 @@ ClearForm:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1169,10 +1169,13 @@ MetPropFlag:
|
||||
IF RDSRec = '' THEN RETURN
|
||||
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
WOStepKey = RDSRec<RDS_WO_STEP_KEY$>
|
||||
ReactNo = RDSRec<RDS_REACTOR$>
|
||||
PSNo = RDSRec<RDS_PROD_SPEC_ID$>
|
||||
|
||||
ReactRDSNos = Rds_Services('GetRDSRunHistoryByReactorAndWO', ReactNo, WONo)
|
||||
WOStepNo = FIELD(WOStepKey,'*',2)
|
||||
|
||||
ReactRDSNos = XLATE('WO_REACT',WONo:'*':WOStepNo:'*':ReactNo,WO_REACT_RDS_NO$,'X')
|
||||
|
||||
LOCATE RDSNo IN ReactRDSNos USING @VM SETTING Pos THEN
|
||||
Result = obj_PRS_Prop('GetIntervalFlag',PSNo:@RM:PropCd:@RM:Pos)
|
||||
@ -1239,4 +1242,3 @@ CalcThickTarget:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -92,6 +92,7 @@ RETURN Result
|
||||
* * * * * * *
|
||||
Create:
|
||||
* * * * * * *
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'Create'
|
||||
|
||||
@ -165,93 +166,12 @@ Create:
|
||||
WOMatLogRec<WO_MAT_LOG_TOOL_ID$> = ToolID
|
||||
WOMatLogRec<WO_MAT_LOG_SCAN_ENTRY$> = ScanEntry
|
||||
|
||||
* OtParms = 'WO_MAT_LOG':@RM:WOMatLogKey:@RM:@RM:WOMatLogRec
|
||||
* obj_Tables('WriteRec',OtParms)
|
||||
*
|
||||
* errCode = ''
|
||||
* IF Get_Status(errCode) THEN
|
||||
* ErrorMsg = 'obj_WO_Mat_Log':TAB$:'Create: Write error':TAB$:LogFile:TAB$:WONos:TAB$:CassNos:TAB$:WhCd:'*':LocCd:TAB$:Action:TAB$:TransDTM:TAB$:UserID:TAB$:Tags:TAB$:ToolID:TAB$:errCode
|
||||
* END ElSE
|
||||
* ErrorMsg = ''
|
||||
* END
|
||||
|
||||
Database_Services('WriteDataRow', 'WO_MAT_LOG', WOMatLogKey, WOMatLogRec, True$, False$, True$)
|
||||
If Error_Services('NoError') then
|
||||
ReactType = XLATE('WO_LOG', WONos, WO_LOG_REACT_TYPE$, 'X')
|
||||
If ReactType NE 'EPP' then
|
||||
WONo = WoNos
|
||||
CassNo = CassNos
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
RDSKey = XLATE('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X')
|
||||
Lot_Event_Services('CreateLotEvent', RDSKey, Datetime(), Action, '', '', UserId, True$, 'RDS')
|
||||
end else
|
||||
Begin Case
|
||||
Case Action EQ 'RCVD'
|
||||
//WMI
|
||||
WONo = WoNos
|
||||
StepNo = 1
|
||||
CassNo = CassNos
|
||||
WMInKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMInKey, Datetime(), Action, '', '', UserId, True$, 'WM_IN')
|
||||
Case Action EQ 'REL'
|
||||
//WMI
|
||||
WONo = WoNos
|
||||
StepNo = 1
|
||||
CassNo = CassNos
|
||||
WMInKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMInKey, Datetime(), Action, '', '', UserId, True$, 'WM_IN')
|
||||
Case Action EQ '1VER'
|
||||
//RDS action, do nothing for now
|
||||
Case Action EQ '1LOAD'
|
||||
//RDS, do nothing for now
|
||||
Case Action EQ '1UNLOAD'
|
||||
//RDS, do nothing for now
|
||||
Case Action EQ '1MO_PSTI'
|
||||
WONo = WoNos
|
||||
StepNo = 1
|
||||
CassNo = CassNos
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMOutKey, Datetime(), Action, '', '', UserId, True$, 'WM_OUT')
|
||||
Case Action EQ '1MO_QA'
|
||||
WONo = WoNos
|
||||
StepNo = 1
|
||||
CassNo = CassNos
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMOutKey, Datetime(), Action, '', '', UserId, True$, 'WM_OUT')
|
||||
Case Action EQ 'PACK'
|
||||
WONo = WoNos
|
||||
StepNo = 1
|
||||
CassNo = CassNos
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMOutKey, Datetime(), Action, '', '', UserId, True$, 'WM_OUT')
|
||||
Case Action EQ 'PSVER'
|
||||
WONo = WoNos
|
||||
StepNo = 1
|
||||
CassNo = CassNos
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMOutKey, Datetime(), Action, '', '', UserId, True$, 'WM_OUT')
|
||||
Case Action EQ 'SHIP'
|
||||
WONo = WoNos
|
||||
StepNo = 1
|
||||
CassNo = CassNos
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMOutKey, Datetime(), Action, '', '', UserId, True$, 'WM_OUT')
|
||||
Case Action EQ 'LBLCHK'
|
||||
//WMO
|
||||
WONo = WoNos
|
||||
StepNo = 1
|
||||
CassNo = CassNos
|
||||
WMOutKey = WONo : '*' : StepNo : '*' : CassNo
|
||||
Lot_Event_Services('CreateLotEvent', WMOutKey, Datetime(), Action, '', '', UserId, True$, 'WM_OUT')
|
||||
End Case
|
||||
end
|
||||
ErrorMsg = ''
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -406,5 +326,3 @@ Post:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -712,7 +712,7 @@ Service CreatePackagingRecord(LotId, UserId, EqpId)
|
||||
NewPackagingRec<PACKAGING_COMPLETE_DTM$> = TransDtm
|
||||
Database_Services('WriteDataRow', 'PACKAGING', NewRecId, NewPackagingRec, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, TransDtm, 'PACKAGING', 'Lot Packaged.', EqpId, UserId)
|
||||
Lot_Event_Services('CreateLotEvent', LotId, TransDtm, 'COMMENT', 'Lot Packaged.', EqpId, UserId)
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
@ -765,5 +765,3 @@ Service AddPackToLotOperation(LotOperationId, PackagingId, UserId)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
@ -622,7 +622,7 @@ READONLY_RECORD:
|
||||
return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'WriteRecordPre'
|
||||
|
||||
@ -923,11 +923,23 @@ DELETE_RECORD_PRE:
|
||||
LogData<3> = Name
|
||||
LogData<4> = Notes
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
||||
return
|
||||
|
||||
|
||||
DELETE_RECORD:
|
||||
|
||||
Notes = RetStack()
|
||||
Swap @FM with ' | ' in Notes
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
LogData<3> = Name
|
||||
LogData<4> = Notes
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
||||
return
|
||||
|
||||
|
||||
@ -990,3 +1002,4 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -86,10 +86,10 @@ EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
|
||||
Declare subroutine Lot_Event_Services, Override_Log_Services
|
||||
Declare subroutine Lot_Event_Services, Override_Log_Services, Logging_Services
|
||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
|
||||
Declare function QA_Services, Database_Services, Rds_Services, Obj_Calendar, Override_Log_Services, Max, Supplement_Services
|
||||
Declare function Datetime, Test_Run_Services
|
||||
Declare function Datetime, Test_Run_Services, Environment_Services, Logging_Services
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
@ -100,11 +100,11 @@ If Event EQ 'OLE' then
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
* Transfer Param4 to Param3
|
||||
* Transfer Param5 to Param4
|
||||
* Transfer Param6 to Param5
|
||||
* Transfer Param7 to Param6
|
||||
* Transfer Param8 to Param7
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
@ -463,7 +463,19 @@ Event PUB_SIGN.CLICK()
|
||||
OverrideUser = Response<2>
|
||||
|
||||
If Valid then
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'UNSIGN_LOAD', 'Load stage unsigned', 'Reactor', @User4, True$, 'RDS')
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = 'R':RDSNo:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// 4. Remove WO_MAT Unload signature, date, and time
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
@ -728,4 +740,3 @@ OLE_LL_Status:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -59,7 +59,6 @@ $insert COMPANY_EQUATES
|
||||
$insert WO_MAT_QA_EQUATES
|
||||
$insert WAFER_COUNTER_EQUATES
|
||||
|
||||
|
||||
Equ COL$LOG_FILE to 1
|
||||
Equ COL$LOG_DTM to 2
|
||||
Equ COL$ACTION to 3
|
||||
@ -88,10 +87,12 @@ EQU APPGREEN$ TO 192 + (220*256) + (192*65536)
|
||||
EQU APPRED$ TO 255 + (128*256) + (128*65536)
|
||||
EQU APPORANGE$ TO 255 + (176*256) + (0*65536)
|
||||
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, RDS_Services, Signature_Services, obj_Notes
|
||||
Declare subroutine Comm_RDS, WO_Mat_QA_Services, Wafer_Counter_Services, Dialog_Box, Lot_Event_Services
|
||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, QA_Services, Signature_Services
|
||||
Declare function RDS_Services, Wafer_Counter_Services, Datetime, Supplement_Services
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, RDS_Services, Signature_Services, obj_Notes
|
||||
Declare subroutine Comm_RDS, WO_Mat_QA_Services, Wafer_Counter_Services, Dialog_Box, Lot_Event_Services
|
||||
Declare subroutine Logging_Services
|
||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, QA_Services, Signature_Services
|
||||
Declare function RDS_Services, Wafer_Counter_Services, Datetime, Supplement_Services, Environment_Services
|
||||
Declare function Logging_Services
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
@ -102,11 +103,11 @@ If Event EQ 'OLE' then
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
* Transfer Param4 to Param3
|
||||
* Transfer Param5 to Param4
|
||||
* Transfer Param6 to Param5
|
||||
* Transfer Param7 to Param6
|
||||
* Transfer Param8 to Param7
|
||||
Transfer Param4 to Param3
|
||||
Transfer Param5 to Param4
|
||||
Transfer Param6 to Param5
|
||||
Transfer Param7 to Param6
|
||||
Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
@ -603,8 +604,18 @@ Event SIGN_BUTTON.CLICK()
|
||||
Set_Property(@Window : '.POST_EPI_SUP_SIG_DATE', 'TEXT', SigDt)
|
||||
Set_Property(@Window : '.POST_EPI_SUP_SIG_TIME', 'TEXT', SigTmPlusOne)
|
||||
|
||||
** Create LOT_EVENT **
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'SIGN_FQA', '', '', @USER4, True$, 'RDS')
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = 'R':RDSNo:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'FQA stage signed for RDS ':RDSNo:' by user ':@User4
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
|
||||
/* Sync up the RDS record with WO_MAT */
|
||||
IOOptions = Get_Property(@Window, 'IOOPTIONS')
|
||||
|
@ -282,52 +282,57 @@ Event PUB_SIGN.CLICK()
|
||||
If ( (WONo NE '') and (CassNo NE '') ) then
|
||||
WoMatKey = WONo:'*':CassNo
|
||||
If RowExists('WO_MAT', WOMatKey) then
|
||||
IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
|
||||
If Error_Services('NoError') then
|
||||
If IsLastCassetteInWo then
|
||||
NextEventScheduled = False$
|
||||
NextEventHasSamePsn = True$
|
||||
NextEventIsBlock = False$
|
||||
NextScheduledEvent = Schedule_Services('GetNextEvent', Reactor)
|
||||
If Error_Services('NoError') then
|
||||
NextEventScheduled = True$
|
||||
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', Reactor)
|
||||
NextEventIsBlock = Schedule_Services('NextEventIsBlock', Reactor)
|
||||
end
|
||||
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
|
||||
WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
|
||||
If Error_Services('NoError') then
|
||||
If WOMatRecord NE '' then
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = True$
|
||||
TestWaferRanSinceLoad = WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$>
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
Message = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
Message = 'No material scheduled. Test wafer required.'
|
||||
end else if NextEventHasSamePsn EQ False$ then
|
||||
Message = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
end
|
||||
Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$)
|
||||
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : '' : @VM : 'REACTOR' : @VM : Reactor)
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
|
||||
If TWLogResult NE True$ then
|
||||
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'WO_MAT record for ':WOMatKey:' is null!'
|
||||
end
|
||||
end else
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
|
||||
end
|
||||
end
|
||||
WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
|
||||
If Error_Services('NoError') then
|
||||
IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
|
||||
If Error_Services('NoError') then
|
||||
If IsLastCassetteInWo then
|
||||
NextEventScheduled = False$
|
||||
NextEventHasSamePsn = True$
|
||||
NextEventIsBlock = False$
|
||||
NextScheduledEvent = Schedule_Services('GetNextEvent', Reactor)
|
||||
If Error_Services('NoError') then
|
||||
NextEventScheduled = True$
|
||||
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', Reactor)
|
||||
NextEventIsBlock = Schedule_Services('NextEventIsBlock', Reactor)
|
||||
end
|
||||
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
|
||||
If WOMatRecord NE '' then
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = True$
|
||||
TestWaferRanSinceLoad = WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$>
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
Message = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
Message = 'No material scheduled. Test wafer required.'
|
||||
end else if NextEventHasSamePsn EQ False$ then
|
||||
Message = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
end
|
||||
Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$)
|
||||
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : '' : @VM : 'REACTOR' : @VM : Reactor)
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
|
||||
If TWLogResult NE True$ then
|
||||
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
|
||||
end
|
||||
If ErrMsg NE '' then
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'WO_MAT record for ':WOMatKey:' is null!'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'WO_MAT ':WOMatKey:' does not exist!'
|
||||
end
|
||||
@ -468,3 +473,4 @@ Setup_OLE_Controls:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -3574,6 +3574,53 @@ Service GetReactorDownLL(ReactNo)
|
||||
|
||||
end service
|
||||
|
||||
Service GetReactorsWithDownLLByDtm(DtmToCheck, ReactType)
|
||||
|
||||
ErrMsg = ''
|
||||
SLLReactors = ''
|
||||
If DtmToCheck NE '' then
|
||||
AllReactors = Reactor_Services('GetReactorNumbers', ReactType)
|
||||
If AllReactors NE '' then
|
||||
for each ReactNo in AllReactors using @FM
|
||||
PickPlaceFlag = XLATE('REACTOR', ReactNo, REACTOR_PICK_PLACE$, 'X')
|
||||
If PickPlaceFlag then
|
||||
Open 'DICT.REACT_LL' to DictReactLL then
|
||||
SearchString = ''
|
||||
SearchString := 'REACT_NO':@VM:ReactNo:@FM
|
||||
ReactLLKeys = ''
|
||||
Btree.Extract(SearchString, 'REACT_LL', DictReactLL, ReactLLKeys)
|
||||
|
||||
For each ReactLLKey in ReactLLKeys using @VM
|
||||
ReactLLRec = Database_Services('ReadDataRow', 'REACT_LL', ReactLLKey, True$, 0, False$)
|
||||
ReactLLStartDTM = Field(ReactLLKey, '*', 2)
|
||||
ReactLLEndDTM = ReactLLRec<REACT_LL_STOP_DTM$>
|
||||
ReactLLApplicable = false$
|
||||
If ReactLLStartDTM LE DtmToCheck AND (ReactLLEndDTM EQ '' OR ReactLLEndDtm GT DtmToCheck) then
|
||||
Locate ReactNo in SLLReactors using @VM setting iPos else
|
||||
SLLReactors<1, -1> = ReactNo
|
||||
end
|
||||
end
|
||||
|
||||
Next ReactLLKey
|
||||
end else
|
||||
ErrMsg = 'Unable to open the REACT_LL dictionary.'
|
||||
end
|
||||
end
|
||||
Next ReactNo
|
||||
end else
|
||||
ErrMsg = 'No Reactor IDs found!'
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Datetime to check variable was null.'
|
||||
end
|
||||
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
|
||||
Response = SLLReactors
|
||||
|
||||
end service
|
||||
|
||||
Service GetReactorLoadCountLimit(ReactNo)
|
||||
|
||||
@ -4373,3 +4420,4 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -137,6 +137,16 @@ CreateHALItem:
|
||||
RepJSON = Report_Services('GetOpenTestWaferLotWIPReportJson')
|
||||
Case ReportID = 'OpenNCRReport'
|
||||
RepJson = Report_Services('GetOpenNCRReportJson')
|
||||
Case ReportID = 'SLLReport'
|
||||
//Single Load Lock Report from Metrology Services
|
||||
ReportStartDtm = Http_Services('GetQueryField', 'StartDate')
|
||||
ReportEndDtm = Http_Services('GetQueryField', 'EndDate')
|
||||
If ReportStartDtm NE '' AND ReportEndDtm NE '' then
|
||||
RepJson = Report_Services('GetSLLReportJson', ReportStartDtm, ReportEndDtm)
|
||||
end else
|
||||
Error_Services('Add', 'Missing parameters for report.')
|
||||
end
|
||||
|
||||
Case Otherwise$
|
||||
Error_Services('Add', 'Unsupported report')
|
||||
End Case
|
||||
@ -233,3 +243,4 @@ API reports.GET
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
@ -82,7 +82,7 @@ Declare function Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, ob
|
||||
Declare function Schedule_Services, Error_Services, Location_Services, SRP_Array, Signature_Services, obj_RDS_Test
|
||||
Declare function Epi_Part_Services, SRP_Math, Database_Services, SRP_JSON, Reactor_Services, SRP_Datetime
|
||||
Declare function SRP_Array, Environment_Services, Logging_Services, Datetime, Select_Into, Wafer_Counter_Services
|
||||
Declare function Lot_Services, Test_Run_Services, NCR_Services
|
||||
Declare function Lot_Services, Test_Run_Services, NCR_Services, Date_Services
|
||||
|
||||
Equ TAB TO \09\
|
||||
|
||||
@ -2367,6 +2367,53 @@ Service GetOpenNCRReportJson()
|
||||
Response = OpenNCRReportJson
|
||||
end service
|
||||
|
||||
|
||||
/* * * * * *
|
||||
Called from Reporting Services
|
||||
|
||||
* * * * * */
|
||||
Service GetSLLReportJson(FromDt, ToDt)
|
||||
|
||||
FromDt = IConv(FromDt, 'D')
|
||||
ToDt = IConv(ToDt, 'D')
|
||||
ErrorMessage = ''
|
||||
SLLReportJson = ''
|
||||
objSLLReportJson = ''
|
||||
If FromDt NE '' OR ToDt NE '' then
|
||||
If SRP_Json(objSLLReportJson, 'New', 'Array') then
|
||||
For StartDt = FromDt to ToDt
|
||||
ThisDate = Date_Services('ConvertDateTimeToISO8601', StartDt)
|
||||
ThisDtASMDownLL = Reactor_Services('GetReactorsWithDownLLByDtm', StartDt + 1, 'ASM')
|
||||
ThisDtASMPlusDownLL = Reactor_Services('GetReactorsWithDownLLByDtm', StartDt + 1, 'ASM+')
|
||||
ThisDtHTRDownLL = Reactor_Services('GetReactorsWithDownLLByDtm', StartDt + 1, 'HTR')
|
||||
ThisDtASMDownLLCount = DCount(ThisDtASMDownLL, @VM) + DCount(ThisDtASMPlusDownLL, @VM)
|
||||
ThisDtHTRDownLLCount = DCount(ThisDtHTRDownLL, @VM)
|
||||
objSLLDay = ''
|
||||
If SRP_Json(objSLLDay, 'New', 'Object') then
|
||||
SRP_Json(objSLLDay, 'SetValue', 'Date', ThisDate)
|
||||
SRP_Json(objSLLDay, 'SetValue', 'ASM', ThisDtASMDownLLCount)
|
||||
SRP_Json(objSLLDay, 'SetValue', 'HTR', ThisDtHTRDownLLCount)
|
||||
SRP_Json(objSLLReportJson, 'Add', objSLLDay)
|
||||
SRP_Json(objSLLDay, 'Release')
|
||||
end
|
||||
Next StartDt
|
||||
SLLReportJson = SRP_Json(objSLLReportJson, 'Stringify', 'Fast')
|
||||
SRP_Json(objSLLReportJson, 'Release')
|
||||
end else
|
||||
ErrorMessage = 'Error creating the root JSON for the report.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'From Date or To Date was null.'
|
||||
end
|
||||
|
||||
If ErrorMessage NE '' then
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
Response = SLLReportJson
|
||||
|
||||
end service
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -2388,3 +2435,4 @@ OipiPrintError:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -1141,6 +1141,38 @@ Service OpenOIWizardReturnToFabInBrowser(RTFId)
|
||||
|
||||
end service
|
||||
|
||||
Service GetReturnedToFab(CassID)
|
||||
If CassID NE '' then
|
||||
RTFRecords = ''
|
||||
ErrorMessage = ''
|
||||
If CassId NE '' then
|
||||
table = "RETURN_TO_FAB_LOTS"
|
||||
Open "DICT ":table To @DICT Else
|
||||
ErrorMessage = 'Error opening RETURN_TO_FAB_LOTS dictionary'
|
||||
End
|
||||
If ErrorMessage EQ '' then
|
||||
srch_strng = "CASS_ID":@VM:CassId:@FM
|
||||
option = ""
|
||||
flag = ""
|
||||
Btree.Extract(srch_strng, table, @DICT, RTFRecords, option, flag)
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error getting return to fab record by cass. ID. Cassette ID was null'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Missing CassID parameter.'
|
||||
end
|
||||
If ErrorMessage EQ '' then
|
||||
If RTFRecords = '' then
|
||||
Response = False$
|
||||
end else
|
||||
Response = True$
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
end service
|
||||
Service InitializeReturnToFabLotOperations(LotId)
|
||||
|
||||
ErrorMessage = ''
|
||||
|
@ -1142,50 +1142,60 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')
|
||||
WoMatKey = WO:'*':CassNo
|
||||
WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
|
||||
LastCassInWoTestWaferAckReq = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$>
|
||||
LastCassInWoTestWaferAcked = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$>
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If LastCassInWoTestWaferAcked EQ False$ or LastCassInWoTestWaferAcked EQ '' then
|
||||
LastCassInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
|
||||
|
||||
If LastCassInWo then
|
||||
NextEventScheduled = False$
|
||||
NextEventHasSamePsn = True$
|
||||
NextEventIsBlock = False$
|
||||
|
||||
NextScheduledEvent = Schedule_Services('GetNextEvent', ReactorNo)
|
||||
If Error_Services('NoError') then
|
||||
NextEventScheduled = True$
|
||||
if Error_Services('NoError') then
|
||||
If WoMatRec NE '' then
|
||||
LastCassInWoTestWaferAckReq = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$>
|
||||
LastCassInWoTestWaferAcked = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$>
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If LastCassInWoTestWaferAcked EQ False$ or LastCassInWoTestWaferAcked EQ '' then
|
||||
LastCassInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
|
||||
|
||||
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', ReactorNo)
|
||||
NextEventIsBlock = Schedule_Services('NextEventIsBlock', ReactorNo)
|
||||
end
|
||||
|
||||
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferAckReq = True$
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = LastCassInWoTestWaferAckReq
|
||||
TestWaferRanSinceLoad = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> or TestWaferLotIsValid EQ True$
|
||||
|
||||
If TestWaferLotIsValid NE True$ and TestWaferRanSinceLoad NE True$ then
|
||||
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
|
||||
If LastCassInWo then
|
||||
NextEventScheduled = False$
|
||||
NextEventHasSamePsn = True$
|
||||
NextEventIsBlock = False$
|
||||
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
|
||||
end else If NextEventHasSamePsn EQ False$ then
|
||||
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
NextScheduledEvent = Schedule_Services('GetNextEvent', ReactorNo)
|
||||
If Error_Services('NoError') then
|
||||
NextEventScheduled = True$
|
||||
|
||||
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', ReactorNo)
|
||||
NextEventIsBlock = Schedule_Services('NextEventIsBlock', ReactorNo)
|
||||
end
|
||||
|
||||
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferAckReq = True$
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = LastCassInWoTestWaferAckReq
|
||||
TestWaferRanSinceLoad = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> or TestWaferLotIsValid EQ True$
|
||||
|
||||
If TestWaferLotIsValid NE True$ and TestWaferRanSinceLoad NE True$ then
|
||||
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
|
||||
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
|
||||
end else If NextEventHasSamePsn EQ False$ then
|
||||
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
end
|
||||
|
||||
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
|
||||
end
|
||||
end
|
||||
|
||||
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$)
|
||||
end
|
||||
end
|
||||
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$)
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'WO_MAT record was null.'
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Failure to read cassette record. ' : Error_Services('GetMessage')
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1487,6 +1497,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
// Check if cassette field is populated. If so, then check the cassette's current status to
|
||||
// determine what the next action will be (i.e. Pre-Epi+Load, Unload, etc.)
|
||||
CassetteID = CassetteIDs<0, 1>
|
||||
*if CassetteId EQ 1005860 then debug
|
||||
TestWaferLots = ScansRow<SCANS.TW_LOT_ID$>
|
||||
Begin Case
|
||||
Case CassetteID NE ''
|
||||
@ -1534,6 +1545,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
Continue = False$
|
||||
end
|
||||
If Continue then
|
||||
*if RDSNo EQ 1006721 then debug
|
||||
PreStageSigned = QA_Services('SignPreEpiStage', RDSNo, Username, WaferQty, Reactor, 1)
|
||||
If PreStageSigned EQ True$ then
|
||||
LoadStageSigned = QA_Services('SignLoadStage', RDSNo, USername, WaferQty, LLSide, 1)
|
||||
@ -2402,3 +2414,4 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -61,12 +61,12 @@ Equ COL$USER_ID to 8
|
||||
Equ COL$TAGS to 9
|
||||
Equ COL$TOOL_ID to 10
|
||||
|
||||
Declare function obj_Prod_Spec, RDS_Services, Error_Services, Signature_Services, Memory_Services, obj_RDS_Test
|
||||
Declare function SRP_Array
|
||||
Declare function Database_Services, obj_WO_Mat, Dialog_Box, MemberOf, Msg, QA_Services, Datetime, Supplement_Services
|
||||
Declare function Environment_Services, GetTickCount
|
||||
Declare function obj_Prod_Spec, RDS_Services, Error_Services, Signature_Services, Memory_Services, obj_RDS_Test
|
||||
Declare function SRP_Array, Environment_Services, GetTickCount, QA_Services, Datetime, Supplement_Services
|
||||
Declare function Database_Services, obj_WO_Mat, Dialog_Box, MemberOf, Msg, Logging_Services
|
||||
Declare subroutine Error_Services, Popup, Memory_Services, SRP_Stopwatch, Set_Status, Database_Services, obj_WO_Mat
|
||||
Declare subroutine Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg, Obj_Rds, Lot_Event_Services, Mona_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
PSNKey = ServiceKeyID
|
||||
ReactorKey = ServiceKeyID
|
||||
@ -224,6 +224,8 @@ end service
|
||||
|
||||
|
||||
Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'CheckSigOrder'
|
||||
|
||||
@ -260,17 +262,15 @@ Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
|
||||
Begin Case
|
||||
Case ( Not(MemberOf(@User4, 'BYPASS') ) and ( (CurrStage EQ 'QA') or (CurrStage EQ 'MO_QA') ) and (PrevStageSig EQ @User4) )
|
||||
ErrorMsg = 'FQA stage signature cannot match previous step ':PrevStage:' signature. ':WOMatKey:' (':Service:')'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Case PrevStageComp EQ False$
|
||||
ErrorMsg = 'Previous step ':PrevStage:' is not signed. ':WOMatKey:' (':Service:')'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Case CurrStageComp EQ True$
|
||||
// Allow user to re-sign. This may be necessary in certain cases such as when multiple surfscans
|
||||
// have taken place and one still needs to be signed.
|
||||
Response = True$
|
||||
Case Error_Services('HasError') EQ True$
|
||||
// Error message already in stack.
|
||||
Null
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Case Otherwise$
|
||||
// Ok
|
||||
Response = True$
|
||||
@ -282,6 +282,11 @@ Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
@ -2844,6 +2849,14 @@ end service
|
||||
|
||||
Service UnsignFQAStage(RDSNo)
|
||||
|
||||
Machine = Environment_Services('GetServer')
|
||||
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
|
||||
ColumnWidths = 20 : @FM : 15 : @FM : 300
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
|
||||
makeDirSuccess = Utility("MAKEDIR", LogPath)
|
||||
LogFileName = 'R':RDSNo:'.csv'
|
||||
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||
|
||||
IsEPP = Rds_Services('IsEpiPro', RDSNo)
|
||||
If IsEpp EQ False$ then
|
||||
Database_Services('ActivateRecord', 'RDS', RDSNo)
|
||||
@ -2888,8 +2901,11 @@ Service UnsignFQAStage(RDSNo)
|
||||
{SUP_VER_SIG_DATE} = ''
|
||||
{SUP_VER_SIG_TIME} = ''
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, @Record, True$, False$, False$)
|
||||
** Create LOT_EVENT **
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'UNSIGN_FQA', '', '', @USER4, True$, 'RDS')
|
||||
LogData = ''
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'FQA stage unsigned for RDS ':RDSNo:' by user ':@User4
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
end else
|
||||
Error_Services('Add', 'Error accessing RDS.')
|
||||
end
|
||||
@ -2917,7 +2933,3 @@ GetMostRecentSig:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -128,6 +128,12 @@ Service CreateSupplement(LotType=LOTTYPES, LotID, Stage=STAGES, SupplText, Entry
|
||||
NewSupRec<SUPPLEMENTS_SUPPL_TEXT$> = SupplText
|
||||
NewSupRec<SUPPLEMENTS_ENTRY_USER$> = EntryUser
|
||||
NewSupRec<SUPPLEMENTS_ENTRY_DATETIME$> = Datetime()
|
||||
If Stages NE False$ then
|
||||
StageList = Stages<1>
|
||||
Locate Stage in StageList using @VM setting StageIndex then
|
||||
NewSupRec<SUPPLEMENTS_STAGE_INDEX$> = StageIndex
|
||||
end
|
||||
end
|
||||
Database_Services('WriteDataRow', 'SUPPLEMENTS', SupplID, NewSupRec, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Response = SupplID
|
||||
@ -305,49 +311,30 @@ Service GetSupplementsForLot(LotType=LOTTYPES, LotID, Stage=STAGES)
|
||||
|
||||
Response = False$
|
||||
If ( (LotType NE '') and (LotID NE '') ) then
|
||||
If (Stage EQ '') then
|
||||
KeyList = ''
|
||||
Query = ''
|
||||
Query<1> = 'LOT_TYPE' : @VM : LotType
|
||||
Query<2> = 'LOT_ID' : @VM : LotID : @FM
|
||||
Flag = ''
|
||||
Open 'DICT.SUPPLEMENTS' to hDict then
|
||||
Btree.Extract(Query, 'SUPPLEMENTS', hDict, KeyList, 'E', Flag)
|
||||
If (Flag EQ 0) then
|
||||
If (KeyList NE '') then
|
||||
SupplementList = ''
|
||||
Stages = Supplement_Services('GetStagesForLot', LotType, LotID)
|
||||
StageCount = Dcount(Stages<1>, @VM)
|
||||
For I = 1 to StageCount
|
||||
SupplementStage = Supplement_Services('GetSupplementsForLot', LotType, LotID, Stages<1,I>)
|
||||
If SupplementStage NE False$ then SupplementList<-1> = SupplementStage
|
||||
Next I
|
||||
If SupplementList NE '' then Response = SupplementList
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.')
|
||||
end
|
||||
end else
|
||||
StageSupplementList = ''
|
||||
Query = ''
|
||||
Query<1> = 'LOT_TYPE' : @VM : LotType
|
||||
Query<2> = 'LOT_ID' : @VM : LotID
|
||||
Query<3> = 'STAGE' : @VM : Stage : @FM
|
||||
Flag = ''
|
||||
Open 'DICT.SUPPLEMENTS' to hDict then
|
||||
Btree.Extract(Query, 'SUPPLEMENTS', hDict, StageSupplementList, 'E', Flag)
|
||||
If (Flag EQ 0) then
|
||||
If StageSupplementList NE '' then Response = StageSupplementList
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract')
|
||||
If Stage EQ '' then Stage = '#0'
|
||||
StageSupplementList = ''
|
||||
Query = ''
|
||||
Query<1> = 'LOT_TYPE' : @VM : LotType
|
||||
Query<2> = 'LOT_ID' : @VM : LotID
|
||||
Query<3> = 'STAGE' : @VM : Stage : @FM
|
||||
Flag = ''
|
||||
Open 'DICT.SUPPLEMENTS' to hDict then
|
||||
Btree.Extract(Query, 'SUPPLEMENTS', hDict, StageSupplementList, 'E', Flag)
|
||||
If (Flag EQ 0) then
|
||||
If StageSupplementList NE '' then
|
||||
StageIndexes = Xlate('SUPPLEMENTS', StageSupplementList, 'STAGE_INDEX', 'X')
|
||||
SortArray = StageIndexes:@FM:StageSupplementList
|
||||
SortArray = SRP_Array('SortRows', SortArray, 'AR1', 'ARRAY', @FM, @VM)
|
||||
SortedStageSupplementList = SortArray<2>
|
||||
Convert @VM to @FM in SortedStageSupplementList
|
||||
Response = SortedStageSupplementList
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'LotType or LotID was missing in the ' : Service : ' service.')
|
||||
end
|
||||
@ -683,6 +670,3 @@ Service SendNotifications(RDSList, EditEvent, Instructions, EntryUser)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -39,7 +39,7 @@ Function Wafercounter_API(@API)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function OI_Wizard_Services, Wafer_Counter_Services, Database_Services, Datetime, Wo_Mat_Services
|
||||
Declare function Logging_Services, Environment_Services
|
||||
Declare function Logging_Services, Environment_Services, Wo_Mat_Qa_Services, Return_To_Fab_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
|
||||
@ -127,7 +127,12 @@ API wafercounter.startnewwafercount.POST
|
||||
CassNo = Field(CassId, '*', 3)
|
||||
WoMatKey = WONo : '*' : CassNo
|
||||
End Case
|
||||
ReturnedToFab = Return_To_Fab_Services('GetReturnedToFab', CassID)
|
||||
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WoMatKey)
|
||||
ExpectedWfrMap = Wo_Mat_Services('GetWaferMap', WoMatKey)
|
||||
If (ReturnedToFab EQ False$) AND (QAMetComplete EQ False$) then
|
||||
Error_Services('Add', 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.')
|
||||
end
|
||||
ExpectedCassetteArray = ''
|
||||
for i = 25 to 1 step -1
|
||||
Slot = i
|
||||
@ -376,3 +381,5 @@ API wafercounter.ID.GET
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
|
||||
|
||||
end api
|
||||
|
||||
|
||||
|
@ -530,8 +530,8 @@ Service GetWaferCounterJSONTestData(WaferSize, ToolLocation, CassID)
|
||||
If SRP_JSON(objJson, 'New', 'Object') then
|
||||
SRP_JSON(objJson, 'SetValue', 'dateTimeFormatted', Datetime(), 'String')
|
||||
SRP_JSON(objJson, 'SetValue', 'equipmentId', 'WC8INCH1', 'String')
|
||||
SRP_JSON(objJson, 'SetValue', 'total', 25, 'Number')
|
||||
SRP_JSON(objJson, 'SetValue', 'slotMap', '1111111111111111111111111', 'String')
|
||||
SRP_JSON(objJson, 'SetValue', 'total', 24, 'Number')
|
||||
SRP_JSON(objJson, 'SetValue', 'slotMap', '1111111110111111111111111', 'String')
|
||||
Response = SRP_Json(objJson, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end
|
||||
@ -744,4 +744,3 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1456,15 +1456,7 @@ Service CreateVoidedLotRecord(LotId, LegacyLotId, LegacyLotType, WoMatKey, UserI
|
||||
if LegacyLotType NE '' then
|
||||
if LegacyLotType EQ 'RDS' OR LegacyLotType EQ 'WM_IN' OR LegacyLotType EQ 'WM_OUT' then
|
||||
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', LegacyLotId, LegacyLotType)
|
||||
If Error_Services('NoError') then
|
||||
If LotID EQ '' then
|
||||
//No Lot ID was found, lets create one.
|
||||
LotId = Lot_Services('CreateNewLot', 'RDS', '', '', '', '', '', UserId, '', LegacyLotId)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
@ -1475,23 +1467,19 @@ Service CreateVoidedLotRecord(LotId, LegacyLotId, LegacyLotType, WoMatKey, UserI
|
||||
end
|
||||
end
|
||||
|
||||
If ErrorMessage NE '' then
|
||||
If RowExists('LOT', LotId) then
|
||||
NewVoidedLotId = RTI_CreateGUID()
|
||||
NewVoidedLotRec = ''
|
||||
NewVoidedLotRec<VOIDED_LOT_WORK_ORDER_LOG_ID$> = Field(WoMatKey, '*', 1)
|
||||
NewVoidedLotRec<VOIDED_LOT_VOID_BY$> = UserId
|
||||
NewVoidedLotRec<VOIDED_LOT_VOID_DTM$> = Datetime()
|
||||
NewVoidedLotRec<VOIDED_LOT_ENTITY_TYPE$> = LegacyLotType
|
||||
NewVoidedLotRec<VOIDED_LOT_LOT_ID$> = LotId
|
||||
NewVoidedLotRec<VOIDED_LOT_LEGACY_LOT_ID$> = LegacyLotId
|
||||
NewVoidedLotRec<VOIDED_LOT_WO_MAT_KEY$> = WoMatKey
|
||||
Database_Services('WriteDataRow', 'VOIDED_LOT', NewVoidedLotId, NewVoidedLotRec)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Unable to find lot record.'
|
||||
If (ErrorMessage EQ '') then
|
||||
NewVoidedLotId = RTI_CreateGUID()
|
||||
NewVoidedLotRec = ''
|
||||
NewVoidedLotRec<VOIDED_LOT_WORK_ORDER_LOG_ID$> = Field(WoMatKey, '*', 1)
|
||||
NewVoidedLotRec<VOIDED_LOT_VOID_BY$> = UserId
|
||||
NewVoidedLotRec<VOIDED_LOT_VOID_DTM$> = Datetime()
|
||||
NewVoidedLotRec<VOIDED_LOT_ENTITY_TYPE$> = LegacyLotType
|
||||
NewVoidedLotRec<VOIDED_LOT_LOT_ID$> = LotId
|
||||
NewVoidedLotRec<VOIDED_LOT_LEGACY_LOT_ID$> = LegacyLotId
|
||||
NewVoidedLotRec<VOIDED_LOT_WO_MAT_KEY$> = WoMatKey
|
||||
Database_Services('WriteDataRow', 'VOIDED_LOT', NewVoidedLotId, NewVoidedLotRec)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
@ -1504,6 +1492,7 @@ Service CreateVoidedLotRecord(LotId, LegacyLotId, LegacyLotType, WoMatKey, UserI
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service IsLotVoided(LotId)
|
||||
|
||||
//Todo: Move to Lot_Services
|
||||
@ -1525,6 +1514,7 @@ Service IsLotVoided(LotId)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service SignVoidNonEpp(WOMatKeys, WONo, Username)
|
||||
|
||||
ErrorMessage = ''
|
||||
@ -1545,9 +1535,14 @@ Service SignVoidNonEpp(WOMatKeys, WONo, Username)
|
||||
if Error_Services('NoError') then
|
||||
RDS_Services('DetachRDSFromWO', RDSNo)
|
||||
If Error_Services('NoError') then
|
||||
//Create a voided LOT record then record an event.
|
||||
// Create a voided LOT record.
|
||||
Work_Order_Services('CreateVoidedLotRecord', '', RDSNo, 'RDS', WoMatKey, Username)
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'VOID', 'Lot voided by ' : Username, '', Username, True$, 'RDS')
|
||||
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', RDSNo, 'RDS')
|
||||
// Create a LOT_EVENT record if this lot is in the new LOT system.
|
||||
If LotId NE '' then
|
||||
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'COMMENT', 'Lot voided by ' : Username, '', Username, True$, 'RDS')
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
@ -1610,20 +1605,27 @@ Service SignVoidWMI(WMInKeys, WONo, Username)
|
||||
If Not(IsOnHold) then
|
||||
WM_In_Services('SetVoidFlag', WmInKey, Username)
|
||||
If Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', WmInKey, DateTime(), 'VOID', 'Lot voided by ' : Username, '', Username, True$, 'WM_IN')
|
||||
Work_Order_Services('CreateVoidedLotRecord', '', WmInKey, 'WM_IN', WoMatKey, Username)
|
||||
if Error_Services('NoError') then
|
||||
//Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
|
||||
WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey
|
||||
IsWMOVoided = Database_Services('ReadDataColumn', 'WM_OUT', WMOKey, WM_OUT_VOID$)
|
||||
If IsWMOVoided then
|
||||
Locate WoMatKey in WoLogRecord<WO_LOG_WO_MAT_KEY$> using @VM setting CassPos then
|
||||
WoLogRecord<WO_LOG_WO_MAT_KEY$> = Delete(WOLogRecord<WO_LOG_WO_MAT_KEY$>, 1, CassPos, 0)
|
||||
WO_Mat_Services('SetWoMatVoidFlag', WoMatKey, Username)
|
||||
end else
|
||||
ErrorMessage = 'Unable to locate WO_MAT key in WO_LOG record.'
|
||||
If Error_Services('NoError') then
|
||||
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', WmInKey, 'WM_IN')
|
||||
// Create a LOT_EVENT record if this lot is in the new LOT system.
|
||||
If LotId NE '' then
|
||||
Lot_Event_Services('CreateLotEvent', WmInKey, DateTime(), 'COMMENT', 'Lot voided by ' : Username, '', Username, True$, 'WM_IN')
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
If ErrorMessage EQ '' then
|
||||
//Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
|
||||
WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey
|
||||
IsWMOVoided = Database_Services('ReadDataColumn', 'WM_OUT', WMOKey, WM_OUT_VOID$)
|
||||
If IsWMOVoided then
|
||||
Locate WoMatKey in WoLogRecord<WO_LOG_WO_MAT_KEY$> using @VM setting CassPos then
|
||||
WoLogRecord<WO_LOG_WO_MAT_KEY$> = Delete(WOLogRecord<WO_LOG_WO_MAT_KEY$>, 1, CassPos, 0)
|
||||
WO_Mat_Services('SetWoMatVoidFlag', WoMatKey, Username)
|
||||
end else
|
||||
ErrorMessage = 'Unable to locate WO_MAT key in WO_LOG record.'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
@ -1683,7 +1685,7 @@ Service SignVoidWMO(WMOutKeys, WONo, Username)
|
||||
ErrorMessage = ''
|
||||
|
||||
WOLogRecord = Database_Services('ReadDataRow', 'WO_LOG', WONo, True$, 0, False$)
|
||||
if Error_Services('NoError') then
|
||||
If Error_Services('NoError') then
|
||||
for each WmOutKey in WMOutKeys using @VM
|
||||
if WmOutKey NE '' then
|
||||
WONo = Field(WmOutKey, '*', 1)
|
||||
@ -1698,34 +1700,31 @@ Service SignVoidWMO(WMOutKeys, WONo, Username)
|
||||
IsOnHold = Hold_Services('CheckForHold', WoMatKey)
|
||||
If Not(IsOnHold) then
|
||||
WM_Out_Services('SetVoidFlag', WmOutKey, Username)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Work_Order_Services('CreateVoidedLotRecord', '', WmOutKey, 'WM_OUT', WoMatKey, Username)
|
||||
If Error_Services('NoError') then
|
||||
If Error_Services('NoError') then
|
||||
Lot_Event_Services('CreateLotEvent', WmOutKey, DateTime(), 'VOID', 'Lot voided by ' : Username, '', Username, True$, 'WM_OUT')
|
||||
Work_Order_Services('CreateVoidedLotRecord', '', WmOutKey, 'WM_OUT', WoMatKey, Username)
|
||||
if Error_Services('NoError') then
|
||||
//Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
|
||||
WMIKey = WmOutKey; //the paired WMO key is the same as the WMIKey
|
||||
IsWMIVoided = Database_Services('ReadDataColumn', 'WM_IN', WMOKey, WM_IN_VOID$)
|
||||
If IsWMIVoided then
|
||||
Locate WoMatKey in WoLogRecord<WO_LOG_WO_MAT_KEY$> using @VM setting CassPos then
|
||||
WoLogRecord<WO_LOG_WO_MAT_KEY$> = Delete(WOLogRecord<WO_LOG_WO_MAT_KEY$>, 1, CassPos, 0)
|
||||
WO_Mat_Services('SetWoMatVoidFlag', WoMatKey, Username)
|
||||
end else
|
||||
ErrorMessage = 'Unable to locate WO_MAT key in WO_LOG record.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', WmOutKey, 'WM_OUT')
|
||||
// Create a LOT_EVENT record if this lot is in the new LOT system.
|
||||
If LotId NE '' then
|
||||
Lot_Event_Services('CreateLotEvent', WmOutKey, DateTime(), 'COMMENT', 'Lot voided by ' : Username, '', Username, True$, 'WM_OUT')
|
||||
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
If ErrorMessage EQ '' then
|
||||
//Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
|
||||
WMIKey = WmOutKey; //the paired WMO key is the same as the WMIKey
|
||||
IsWMIVoided = Database_Services('ReadDataColumn', 'WM_IN', WMOKey, WM_IN_VOID$)
|
||||
If IsWMIVoided then
|
||||
Locate WoMatKey in WoLogRecord<WO_LOG_WO_MAT_KEY$> using @VM setting CassPos then
|
||||
WoLogRecord<WO_LOG_WO_MAT_KEY$> = Delete(WOLogRecord<WO_LOG_WO_MAT_KEY$>, 1, CassPos, 0)
|
||||
WO_Mat_Services('SetWoMatVoidFlag', WoMatKey, Username)
|
||||
end else
|
||||
ErrorMessage = 'Unable to locate WO_MAT key in WO_LOG record.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
@ -2326,4 +2325,3 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -58,7 +58,7 @@ $Insert PRS_STAGE_EQUATES
|
||||
$Insert PROD_VER_EQUATES
|
||||
$Insert QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
|
||||
|
||||
Declare function Database_Services, SRP_JSON, Error_Services, obj_Prod_Spec
|
||||
Declare function Database_Services, SRP_JSON, Error_Services, obj_Prod_Spec, Wo_Mat_Qa_Services
|
||||
Declare subroutine Database_Services, SRP_JSON, Error_Services
|
||||
|
||||
GoToService
|
||||
@ -419,3 +419,80 @@ Service AllWafersWereTested(WoMatQAKey, StageToInspect)
|
||||
end service
|
||||
|
||||
|
||||
Service GetQAMetComplete(WOMatKey)
|
||||
|
||||
If WOMatKey NE '' then
|
||||
If Rowexists('WO_MAT_QA', WOMatKey) then
|
||||
Response = ''
|
||||
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
|
||||
Stages = QAMetRec<WO_MAT_QA_STAGE$>
|
||||
Results = QAMetRec<WO_MAT_QA_RESULT$>
|
||||
StageCount = Count(Stages, @VM)
|
||||
For I = 1 to StageCount
|
||||
If Results<1,I> EQ '' then
|
||||
Response = False$
|
||||
end
|
||||
Until Response EQ False$
|
||||
Next I
|
||||
If Response = '' then
|
||||
Response = Wo_Mat_Qa_Services('GetMUWaferQAComplete', WOMatKey)
|
||||
end
|
||||
end else
|
||||
Response = True$
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Missing WOMatKey parameter.')
|
||||
end
|
||||
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetMUWaferQAComplete(WOMatKey)
|
||||
|
||||
If WOMatKey NE '' then
|
||||
Response = True$
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
MUBoxes = ''
|
||||
MUBoxesResults = ''
|
||||
MUWafers = WOMatRec<WO_MAT_SLOT_MOVED_FROM$>
|
||||
Counter = 0
|
||||
|
||||
If Count(MUWafers, @VM) GT 0 then
|
||||
for each BoxNumber in MUWafers using @VM setting OrigIndex
|
||||
if BoxNumber NE '' then
|
||||
MUCassId = FIELD(BoxNumber,'.',1,2)
|
||||
Locate MUCassId in MUBoxesResults using @VM setting BoxIndex then
|
||||
MUThkResult = WOMatRec<WO_MAT_MU_WAFER_THK_RESULT$, OrigIndex>
|
||||
If MUThkResult NE '' then
|
||||
MUBoxesResults<BoxIndex, 2> = True$
|
||||
end
|
||||
end else
|
||||
Counter += 1
|
||||
MUBoxesResults<Counter> = MUCassID
|
||||
MUThkResult = WOMatRec<WO_MAT_MU_WAFER_THK_RESULT$, OrigIndex>
|
||||
If MUThkResult NE '' then
|
||||
MUBoxesResults<Counter, 2> = True$
|
||||
end
|
||||
end
|
||||
end
|
||||
Next BoxNumber
|
||||
|
||||
for each Box in MUBoxesResults using @FM
|
||||
if Box<1,2> EQ '' then
|
||||
Response = False$
|
||||
end
|
||||
Until Response = False$
|
||||
Next Box
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Failed to open WO_MAT record.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Missing WOMatKey parameter.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
@ -19,5 +19,7 @@ compile insert LOT_EVENT_EQUATES
|
||||
equ LOT_EVENT_EVENT_OPERATION_ID$ to 10
|
||||
equ LOT_EVENT_EVENT_OPERATOR_ID$ to 11
|
||||
equ LOT_EVENT_SEQUENCE$ to 12
|
||||
equ LOT_EVENT_CHRON_ID$ to 13
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,20 +1,20 @@
|
||||
compile insert SUPPLEMENTS_EQUATES
|
||||
/*----------------------------------------
|
||||
Author : Table Create Insert Routine
|
||||
Written : 20/03/2024
|
||||
Description : Insert for Table SUPPLEMENTS
|
||||
----------------------------------------*/
|
||||
|
||||
|
||||
Equ SUPPLEMENTS_SUPPL_ID$ To 0
|
||||
Equ SUPPLEMENTS_LOT_TYPE$ To 1
|
||||
Equ SUPPLEMENTS_LOT_ID$ To 2
|
||||
Equ SUPPLEMENTS_STAGE$ To 3
|
||||
Equ SUPPLEMENTS_SUPPL_TEXT$ To 4
|
||||
Equ SUPPLEMENTS_SUPPL_ACK$ To 5
|
||||
Equ SUPPLEMENTS_ACK_USER$ To 6
|
||||
Equ SUPPLEMENTS_ACK_DTM$ To 7
|
||||
Equ SUPPLEMENTS_ENTRY_USER$ To 8
|
||||
Equ SUPPLEMENTS_ENTRY_DATETIME$ To 9
|
||||
|
||||
|
||||
compile insert SUPPLEMENTS_EQUATES
|
||||
/*----------------------------------------
|
||||
Author : Table Create Insert Routine
|
||||
Written : 20/03/2024
|
||||
Description : Insert for Table SUPPLEMENTS
|
||||
----------------------------------------*/
|
||||
|
||||
|
||||
Equ SUPPLEMENTS_SUPPL_ID$ To 0
|
||||
Equ SUPPLEMENTS_LOT_TYPE$ To 1
|
||||
Equ SUPPLEMENTS_LOT_ID$ To 2
|
||||
Equ SUPPLEMENTS_STAGE$ To 3
|
||||
Equ SUPPLEMENTS_SUPPL_TEXT$ To 4
|
||||
Equ SUPPLEMENTS_SUPPL_ACK$ To 5
|
||||
Equ SUPPLEMENTS_ACK_USER$ To 6
|
||||
Equ SUPPLEMENTS_ACK_DTM$ To 7
|
||||
Equ SUPPLEMENTS_ENTRY_USER$ To 8
|
||||
Equ SUPPLEMENTS_ENTRY_DATETIME$ To 9
|
||||
Equ SUPPLEMENTS_STAGE_INDEX$ To 10
|
||||
|
||||
|
Reference in New Issue
Block a user