Compare commits
34 Commits
2ed3fe1feb
...
51da9ef7c2
Author | SHA1 | Date | |
---|---|---|---|
51da9ef7c2 | |||
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 | |||
f4f63c28e3 | |||
1f2b73797b | |||
54eaf15598 | |||
fffadaa1c3 | |||
a6da80dc3c | |||
3125225639 | |||
f54331eb0e |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
LSL2/STPROC/TEST_DANIEL*.txt
|
||||
LSL2/STPROC/TEST_DAKOTA.txt
|
||||
LSL2/STPROC/JONATHAN_SERVICES.txt
|
||||
LSL2/STPROC/CHASE_SERVICES.txt
|
16
.vscode/.http
vendored
Normal file
16
.vscode/.http
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
###
|
||||
|
||||
GET https://messa020ec.infineon.com/api/oiWizard/reactors
|
||||
Accept: application/json
|
||||
|
||||
###
|
||||
|
||||
GET https://messa020ec.infineon.com/api/oiWizard/materials/rds/1000416
|
||||
Accept: application/json
|
||||
|
||||
###
|
||||
|
||||
GET https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/1750770474/header
|
||||
Accept: application/json
|
||||
|
||||
###
|
29
.vscode/.hurl
vendored
Normal file
29
.vscode/.hurl
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
###
|
||||
|
||||
GET https://messa020ec.infineon.com/api/oiWizard/reactors
|
||||
Accept: application/json
|
||||
|
||||
HTTP 200
|
||||
[Asserts]
|
||||
header "Content-Type" == "application/hal+json"
|
||||
|
||||
###
|
||||
|
||||
GET https://messa020ec.infineon.com/api/oiWizard/materials/rds/1000416
|
||||
Accept: application/json
|
||||
|
||||
HTTP 200
|
||||
[Asserts]
|
||||
header "Content-Type" == "application/hal+json"
|
||||
|
||||
###
|
||||
|
||||
GET https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV3/1750770474/header
|
||||
Accept: application/json
|
||||
|
||||
HTTP 200
|
||||
[Asserts]
|
||||
header "Content-Type" == "application/json; charset=utf-8"
|
||||
jsonpath "$.TotalRows" == 1
|
||||
|
||||
###
|
234
.vscode/.txt
vendored
Normal file
234
.vscode/.txt
vendored
Normal file
@ -0,0 +1,234 @@
|
||||
|
||||
// T:\met08resisrp2100\06_SourceCode\met08resisrp2100\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.Date // 001
|
||||
// x.Employee // 002
|
||||
// x.Recipe // 003
|
||||
// x.Reactor // 004
|
||||
// x.RDS // 005
|
||||
// x.PSN // 006
|
||||
// x.Layer // 007
|
||||
// x.Zone // 008
|
||||
|
||||
// T:\met08anlysdifaast230\06_SourceCode\met08anlysdifaast230\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.PSN // 001
|
||||
// x.Reactor // 002
|
||||
// logistics.MesEntity // 003
|
||||
// x.RDS // 004
|
||||
// x.Recipe // 005
|
||||
// x.Employee // 006
|
||||
// x.SlotNumber // 007
|
||||
|
||||
// T:\met08thftirstratus\06_SourceCode\met08thftirstratus\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// "Stratus_" // 001
|
||||
// x.Date // 002
|
||||
// logistics.JobID // 003
|
||||
// "FQA Thickness" // 004
|
||||
// x.Employee // 005
|
||||
// x.Recipe // 006
|
||||
// x.Reactor // 007
|
||||
// x.RDS // 008
|
||||
// x.PSN // 009
|
||||
// x.Lot // 010
|
||||
// x.Cassette // 011
|
||||
// x.MeanThickness // 012
|
||||
// descriptions[i].Slot // 013
|
||||
// descriptions[i].Mean // 014
|
||||
|
||||
// T:\met08thftirqs408m\06_SourceCode\met08thftirqs408m\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// Bio-Rad UniqueId // 001
|
||||
// Date // 002
|
||||
// ThicknessFourteenCriticalPointsAverage // 003
|
||||
// Recipe // 004
|
||||
// Reactor // 005
|
||||
// RDS // 006
|
||||
// PSN // 007
|
||||
// Layer // 008
|
||||
// Zone // 009
|
||||
// Cassette // 010
|
||||
// Wafer // 011
|
||||
// RVThickness // 012
|
||||
// Position // 013
|
||||
// Thickness // 014
|
||||
|
||||
// T:\met08resimapcde\06_SourceCode\met08resimapcde\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.UniqueId // 001
|
||||
// x.Run // 002
|
||||
// x.Date // 003
|
||||
// x.Lot // 004
|
||||
// x.Recipe // 005
|
||||
// x.Reactor // 006
|
||||
// x.RDS // 007
|
||||
// x.PSN // 008
|
||||
// x.Layer // 009
|
||||
// x.Zone // 010
|
||||
// logistics.MesEntity // 011
|
||||
// x.Employee // 012
|
||||
// x.Engineer // 013
|
||||
// x.DLRatio // 014
|
||||
// x.Temp // 015
|
||||
// x.AutoOptimizeGain // 016
|
||||
// x.AutoProbeHeightSet // 017
|
||||
// x.DataReject // 018
|
||||
// x.FileName // 019
|
||||
// x.Avg // 020
|
||||
// x.StdDev // 021
|
||||
// x.SemiRadial // 022
|
||||
// description.Pt // 023
|
||||
// description.R // 024
|
||||
// description.T // 025
|
||||
// description.Rs // 026
|
||||
// description.Merit // 027
|
||||
|
||||
// T:\met08resihgcv\06_SourceCode\met08resihgcv\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.UniqueId // 001
|
||||
// logistics.MesEntity // 002
|
||||
// x.Reactor // 003
|
||||
// x.RDS // 004
|
||||
// x.PSN // 005
|
||||
// x.Layer // 006
|
||||
// x.Zone // 007
|
||||
// x.Wafer // 008
|
||||
// x.Lot // 009
|
||||
// x.Plan // 010
|
||||
// x.Date // 011
|
||||
// x.WaferSize // 012
|
||||
// x.Ccomp // 013
|
||||
// x.Area // 014
|
||||
// x.CondType // 015
|
||||
// x.Model // 016
|
||||
// x.StartVoltage // 017
|
||||
// x.StopVoltage // 018
|
||||
// x.RampRate // 019
|
||||
// x.GLimit // 020
|
||||
// x.SetupFile // 021
|
||||
// x.SetupFile // 022
|
||||
// x.Folder // 023
|
||||
// x.Pattern // 024
|
||||
// x.RhoMethod // 025
|
||||
// x.NAvgMean // 026
|
||||
// x.NAvgStdDev // 027
|
||||
// x.NAvgRadialGradient // 028
|
||||
// x.NslMean // 029
|
||||
// x.NslStdDev // 030
|
||||
// x.NslRadialGradient // 031
|
||||
// x.VdMean // 032
|
||||
// x.VdStdDev // 033
|
||||
// x.VdRadialGradient // 034
|
||||
// x.FlatZMean // 035
|
||||
// x.FlatZStdDev // 036
|
||||
// x.FlatZRadialGradient // 037
|
||||
// x.RhoAvgMean // 038
|
||||
// x.RhoAvgStdDev // 039
|
||||
// x.RhoAvgRadialGradient // 040
|
||||
// x.RhoslMean // 041
|
||||
// x.RhoslStdDev // 042
|
||||
// x.RhoslRadialGradient // 043
|
||||
// x.PhaseMean // 044
|
||||
// x.PhaseStdDev // 045
|
||||
// x.PhaseRadialGradient // 046
|
||||
// x.GradeMean // 047
|
||||
// x.GradeStdDev // 048
|
||||
// x.GradeRadialGradient // 049
|
||||
// x.RsMean // 050
|
||||
// x.RsStdDev // 051
|
||||
// x.RsRadialGradient // 052
|
||||
// description.Index // 053
|
||||
// description.NAvg // 054
|
||||
// description.Nsl // 055
|
||||
// description.Vd // 056
|
||||
// description.FlatZ // 057
|
||||
// description.RhoAvg // 058
|
||||
// description.Rhosl // 059
|
||||
// description.Phase // 060
|
||||
// description.Grade // 061
|
||||
|
||||
// T:\met08ddupsfs6420\06_SourceCode\met08ddupsfs6420\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.AreaCountAvg // 001 - AreaCountAvg
|
||||
// x.AreaCountMax // 002 - AreaCountMax
|
||||
// x.AreaCountMin // 003 - AreaCountMin
|
||||
// x.AreaCountStdDev // 004 - AreaCountStdDev
|
||||
// x.AreaTotalAvg // 005 - AreaTotalAvg
|
||||
// x.AreaTotalMax // 006 - AreaTotalMax
|
||||
// x.AreaTotalMin // 007 - AreaTotalMin
|
||||
// x.AreaTotalStdDev // 008 - AreaTotalStdDev
|
||||
// x.Date // 009 -
|
||||
// x.HazeAverageAvg // 010 - Haze Average
|
||||
// x.HazeAverageMax // 011 -
|
||||
// x.HazeAverageMin // 012 -
|
||||
// x.HazeAverageStdDev // 013 -
|
||||
// x.HazeRegionAvg // 014 -
|
||||
// x.HazeRegionMax // 015 -
|
||||
// x.HazeRegionMin // 016 -
|
||||
// x.HazeRegionStdDev // 017 -
|
||||
// x.Lot // 018 -
|
||||
// x.LPDCM2Avg // 019 -
|
||||
// x.LPDCM2Max // 020 -
|
||||
// x.LPDCM2Min // 021 -
|
||||
// x.LPDCM2StdDev // 022 -
|
||||
// x.LPDCountAvg // 023 -
|
||||
// x.LPDCountMax // 024 -
|
||||
// x.LPDCM2Min // 025 -
|
||||
// x.LPDCountStdDev // 026 -
|
||||
// x.Employee // 027 -
|
||||
// x.RDS // 028 - Lot
|
||||
// x.Reactor // 029 - Process
|
||||
// x.Recipe // 030 - Part
|
||||
// x.ScratchCountAvg // 031 - Scratch Count
|
||||
// x.ScratchCountMax // 032 -
|
||||
// x.ScratchCountMin // 033 -
|
||||
// x.ScratchTotalStdDev // 034 -
|
||||
// x.ScratchTotalAvg // 035 - Scratch Length
|
||||
// x.ScratchTotalMax // 036 -
|
||||
// x.ScratchTotalMin // 037 -
|
||||
// x.ScratchTotalStdDev // 038 -
|
||||
// x.SumOfDefectsAvg // 039 - Average Sum of Defects
|
||||
// x.SumOfDefectsMax // 040 - Max Sum of Defects
|
||||
// x.SumOfDefectsMin // 041 - Min Sum of Defects
|
||||
// x.SumOfDefectsStdDev // 042 - SumOfDefectsStdDev
|
||||
// logistics.MesEntity // 043 -
|
||||
|
||||
// T:\met08ddupsp1tbi\06_SourceCode\met08ddupsp1tbi\Adaptation\FileHandlers\OpenInsight\FileRead.cs
|
||||
// x.DcnLpdMin // 001 -
|
||||
// x.DcnLpdMax // 002 -
|
||||
// x.DcnLpdMean // 003 - DCN LPD
|
||||
// x.DcnAreaCountMin // 004 -
|
||||
// x.DcnAreaCountMax // 005 -
|
||||
// x.DcnAreaCountMean // 006 - DCN Area
|
||||
// x.DcnAreaMin // 007 -
|
||||
// x.DcnAreaMax // 008 -
|
||||
// x.Date // 009 -
|
||||
// x.DcnHazeAvgMean // 010 - Haze Average
|
||||
// string.Empty // 011 -
|
||||
// string.Empty // 012 -
|
||||
// string.Empty // 013 -
|
||||
// string.Empty // 014 -
|
||||
// string.Empty // 015 -
|
||||
// string.Empty // 016 -
|
||||
// string.Empty // 017 -
|
||||
// string.Empty // 018 -
|
||||
// string.Empty // 019 -
|
||||
// string.Empty // 020 -
|
||||
// string.Empty // 021 -
|
||||
// string.Empty // 022 -
|
||||
// string.Empty // 023 -
|
||||
// string.Empty // 024 -
|
||||
// string.Empty // 025 -
|
||||
// string.Empty // 026 -
|
||||
// string.Empty // 027 -
|
||||
// x.RDS // 028 - Lot
|
||||
// x.Reactor // 029 - Process
|
||||
// x.Recipe // 030 - Part
|
||||
// x.DcnScrMean // 031 - Scratch Count
|
||||
// string.Empty // 032 -
|
||||
// string.Empty // 033 -
|
||||
// string.Empty // 034 -
|
||||
// x.DcnMicroScrMean // 035 - Scratch Length
|
||||
// string.Empty // 036 -
|
||||
// string.Empty // 037 -
|
||||
// string.Empty // 038 -
|
||||
// x.DcnAllMean // 039 - Average Sum of Defects
|
||||
// x.DcnAllMax // 040 - Max Sum of defects
|
||||
// x.DcnAllMin // 041 - Min Sum of Defects
|
||||
// string.Empty // 042 -
|
||||
// logistics.MesEntity // 043 -
|
||||
// x.DcnAreaMean // 044 - DCN MM2
|
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"*.txt": "vb",
|
||||
},
|
||||
"cSpell.words": []
|
||||
}
|
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 = '*.txt';
|
||||
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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -425,7 +425,7 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
|
||||
SRP_JSON(objJson, 'SetValue', 'reactorNumber', ReactNo)
|
||||
NewChecklistInstIds = Xlate('NICA_CHECKLISTS', NewSortedChecklistIds, 'NICA_BASE_INSTRUCTION_ID', 'X')
|
||||
SRP_JSON(objJson, 'SetValueArray', 'baseInstructionIds', NewChecklistInstIds, @VM)
|
||||
Body = SRP_JSON(objJson, 'Stringify', 'Styled')
|
||||
Body = SRP_JSON(objJson, 'Stringify', 'Fast')
|
||||
Convert @FM to '' in Body
|
||||
SRP_JSON(objJson, 'Release')
|
||||
end else
|
||||
@ -443,11 +443,12 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
|
||||
IsSuccessful = False$
|
||||
If ErrorMsg EQ '' then
|
||||
|
||||
AttemptNo = 0
|
||||
Retries = 3
|
||||
BackoffSeconds = 1
|
||||
OrderId = ''
|
||||
|
||||
Loop
|
||||
Loop
|
||||
while (IsSuccessful EQ False$ and Retries GT 0)
|
||||
WaitSeconds = (3 - retries) * BackoffSeconds
|
||||
Delay(WaitSeconds)
|
||||
@ -458,7 +459,32 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
|
||||
end else
|
||||
Headers = 'Accept':@VM:'*/*'
|
||||
end
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
AttemptNo += 1
|
||||
LogData<3> = 'Attempt number ':AttemptNo:' to send HTTP POST request to ':NicaURL
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// Write directly to the log file to avoid mangling the JSON
|
||||
OSRead LogBytes from LogPath:'\':LogFileName then
|
||||
LogBytes := CRLF$:Body
|
||||
OSWrite LogBytes to LogPath:'\':LogFileName
|
||||
end
|
||||
|
||||
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'POST', NicaURL, Headers, Body, '', '', False$, False$, '', IgnoreCertErrors)
|
||||
|
||||
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
|
||||
LogData<2> = Machine
|
||||
LogData<3> = 'Attempt number ':AttemptNo:' HttpResponse from ':NicaURL:':'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// Write directly to the log file to avoid mangling the JSON
|
||||
OSRead LogBytes from LogPath:'\':LogFileName then
|
||||
LogBytes := CRLF$:HttpResponseJson
|
||||
OSWrite LogBytes to LogPath:'\':LogFileName
|
||||
end
|
||||
|
||||
If HttpResponseJson NE '' then
|
||||
ObjResponseJson = ''
|
||||
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -16,7 +16,7 @@ COMPILE FUNCTION obj_WO_React(Method,Parms)
|
||||
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
|
||||
Declare function Environment_Services
|
||||
Declare function Environment_Services, Database_Services
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services
|
||||
|
||||
$INSERT MSG_EQUATES
|
||||
@ -90,7 +90,6 @@ WOReactKey = WONo:'*':StepNo:'*':ReactNo
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
|
||||
WOReactRec = obj_Tables('ReadOnlyRec',otParms)
|
||||
|
||||
RDSNos = WOReactRec<WO_REACT_RDS_NO$>
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$>
|
||||
|
||||
@ -105,13 +104,11 @@ Start = QAMetData<COL$QA_MET_START>
|
||||
Interval = QAMetData<COL$QA_MET_INTERVAL>
|
||||
Stage = QAMetData<COL$QA_MET_STAGE>
|
||||
MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||
|
||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||
|
||||
|
||||
* * * Find where the the RDS being added will be in the list. * * *
|
||||
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> BY 'AR' USING @VM SETTING InsPos THEN
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING InsPos THEN
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
WOReactRec = obj_Tables('UnlockRec',otParms)
|
||||
@ -120,10 +117,9 @@ LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> BY 'AR' USING @VM SETTING InsPos TH
|
||||
|
||||
END ELSE
|
||||
|
||||
LOCATE InsPos IN AllTestPos BY 'AR' USING @VM SETTING TrimPos ELSE Null
|
||||
LOCATE InsPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||
|
||||
END
|
||||
@ -135,13 +131,12 @@ RDSNos = WOReactRec<WO_REACT_RDS_NO$> ;* List after insert
|
||||
CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after insert
|
||||
|
||||
* * * Now build list for cassette
|
||||
|
||||
GOSUB BuildAllTestPos
|
||||
|
||||
GOSUB BuildAllTestPos
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
|
||||
|
||||
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
||||
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
|
||||
|
||||
@ -194,19 +189,17 @@ MetPropCd = QAMetData<COL$QA_MET_PROP>
|
||||
|
||||
GOSUB BuildAllTestPos ;* Set RDSNos, Start and Interval -> returns AllTestPos
|
||||
|
||||
|
||||
IF AllTestPos NE '' THEN
|
||||
|
||||
* * * Find where the the RDS being removed is in the list. * * *
|
||||
|
||||
LOCATE RDSNo IN WOReactRec<WO_REACT_RDS_NO$> USING @VM SETTING RemPos THEN
|
||||
|
||||
LOCATE RemPos IN AllTestPos BY 'AR' USING @VM SETTING TrimPos ELSE Null
|
||||
LOCATE RemPos IN AllTestPos USING @VM SETTING TrimPos ELSE Null
|
||||
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
GOSUB RemSchedQA ;* Removes unsigned QAMet from cassettes scheduled past the box being removed
|
||||
|
||||
END ELSE
|
||||
|
||||
otParms = 'WO_REACT':@RM:WOReactKey
|
||||
@ -225,11 +218,9 @@ CassNos = WOReactRec<WO_REACT_CASS_NO$> ;* List after removal
|
||||
* * * Now build list for cassette
|
||||
|
||||
GOSUB BuildAllTestPos
|
||||
|
||||
ChangePosList = FIELD(AllTestPos,@VM,TrimPos,SeqCnt)
|
||||
|
||||
GOSUB AddSchedQA ;* Add QAMet spec data to cassettes now associated with the test positions after removing the RDS & Cassno from the lists
|
||||
|
||||
otParms = FIELDSTORE(otParms,@RM,4,0,WOReactRec)
|
||||
// 10/12/18 Changed to WriteOnlyRec as per Francois' instructions. - djs
|
||||
obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REACT record
|
||||
@ -346,3 +337,4 @@ FOR I = 1 TO chgCnt
|
||||
NEXT I
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -2063,7 +2063,12 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
|
||||
Begin Case
|
||||
Case ( AbortAlarmOrderActive and (SelE10State _EQC 'Productive') )
|
||||
ErrorMsg = "An ABORT/ALARM Checklist is active for this reactor and must be completed or overridden in order to change to a productive state."
|
||||
|
||||
|
||||
Case ( (Mode _EQC 'WAITING_FOR_MAINTENANCE_UNSCHEDULED') and IndexC(ModeSubCat, 'ABORT/ALARM', 1) )
|
||||
// Do not create an ABORT/ALARM NICA order yet as maintenance may determine the appropriate ABORT/ALARM sub mode to be different than
|
||||
// the operator. This avoids creating a NICA order for the wrong flow.
|
||||
CreateAbortAlarmOrder = False$
|
||||
|
||||
Case ( AbortAlarmFromIntrusiveMaintRequired and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') and (ChecklistIds NE '') )
|
||||
// INTRUSIVE_MAINT FIRST_PRODUCT_RUN_THICK or FIRST_PRODUCT_RUN_HGCV checklist started and
|
||||
// ABORT/ALARM mode entered, so create an ABORT/ALARM order to contain product in reactor.
|
||||
@ -2099,7 +2104,11 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
|
||||
|
||||
If CreateAbortAlarmOrder then
|
||||
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds, Intrusive)
|
||||
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end else
|
||||
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@ -2171,19 +2180,23 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
|
||||
EntryId = UserID
|
||||
|
||||
RLRec = ''
|
||||
RLRec<reactor_log_start_date$> = CurDate
|
||||
RLRec<reactor_log_start_time$> = CurTime
|
||||
RLRec<reactor_log_reactor$> = ReactNo
|
||||
if NewModeCategory EQ 'MAINTENANCE' then
|
||||
RLRec<reactor_log_category$> = 'M' ;* for maintenance
|
||||
RLRec<REACTOR_LOG_START_DATE$> = CurDate
|
||||
RLRec<REACTOR_LOG_START_TIME$> = CurTime
|
||||
RLRec<REACTOR_LOG_REACTOR$> = ReactNo
|
||||
If NewModeCategory EQ 'MAINTENANCE' then
|
||||
RLRec<REACTOR_LOG_CATEGORY$> = 'M' ;* for maintenance
|
||||
end
|
||||
RLRec<reactor_log_entry_id$> = UserID
|
||||
RLRec<reactor_log_entry_date$> = CurDate
|
||||
RLRec<reactor_log_react_util_id$> = NewRUKey
|
||||
RLRec<reactor_log_react_prob_cat_id$> = ModeSubCatID
|
||||
|
||||
CurrWoNo = Xlate('CONFIG', 'WO_DAILY_SCHED':ReactNo, 'F2', 'X')
|
||||
CurrWoNo = CurrWoNo[1, 'F ']
|
||||
RLRec<REACTOR_LOG_ENTRY_ID$> = UserID
|
||||
RLRec<REACTOR_LOG_ENTRY_DATE$> = CurDate
|
||||
RLRec<REACTOR_LOG_REACT_UTIL_ID$> = NewRUKey
|
||||
RLRec<REACTOR_LOG_REACT_PROB_CAT_ID$> = ModeSubCatID
|
||||
If (RLComment NE '') then
|
||||
RLRec<REACTOR_LOG_NOTES$> = RLComment
|
||||
RLRec<REACTOR_LOG_NOTES_DTMS$> = CurDate + (CurTime / SECONDS_IN_DAY$)
|
||||
RLRec<REACTOR_LOG_NOTES_USERS$> = UserID
|
||||
end
|
||||
CurrWoNo = Xlate('CONFIG', 'WO_DAILY_SCHED':ReactNo, 'F2', 'X')
|
||||
CurrWoNo = CurrWoNo[1, 'F ']
|
||||
If CurrWoNo NE '' then
|
||||
CurrPSNo = Xlate('WO_LOG', CurrWoNo, 'PS_NO', 'X')
|
||||
end else
|
||||
@ -2292,7 +2305,6 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
|
||||
// Reopen previous react mode
|
||||
Database_Services('WriteDataRow', 'REACT_MODE_NG', NGPrevModeKey, PrevModeRec)
|
||||
end else
|
||||
If RlComment NE '' then Reactor_Log_Services('AddComment', ReactNo, RlComment, UserID)
|
||||
If SelE10State _EQC 'Productive' then
|
||||
// Reset ABORT/ALARM flag
|
||||
Open 'REACTOR' to hReactor then
|
||||
@ -3562,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)
|
||||
|
||||
@ -4361,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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -50,7 +50,7 @@ $Insert VOIDED_LOT_EQUATES
|
||||
$Insert IFX_EQUATES
|
||||
$Insert CUST_EPI_PART_EQUATES
|
||||
|
||||
Equ MAX_NUM_CASS$ to 96
|
||||
Equ MAX_NUM_CASS$ to 150
|
||||
|
||||
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
|
||||
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
|
||||
@ -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
|
||||
|
@ -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