Compare commits
1 Commits
3e0991f681
...
extra-file
| Author | SHA1 | Date | |
|---|---|---|---|
| 51da9ef7c2 |
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": []
|
||||
}
|
||||
@ -5,7 +5,7 @@
|
||||
},
|
||||
"body": {
|
||||
"record1": {
|
||||
"<1>": "declare function prod_spec_comm\r\ndeclare subroutine forward_event\r\n\r\nforward_event(NewData)\r\nVoid = prod_spec_comm( \"LOAD_TOOL_RECIPE\" )\r\nVoid = prod_spec_comm( \"LOAD_TOOL_PATTERN\" )\r\nRETURN 0\r\n"
|
||||
"<1>": "declare function prod_spec_comm\r\ndeclare subroutine forward_event\r\n\r\nforward_event(NewData)\r\nVoid = prod_spec_comm( \"LOAD_TOOL_RECIPE\" )\r\nRETURN 0\r\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5,7 +5,7 @@
|
||||
},
|
||||
"body": {
|
||||
"record1": {
|
||||
"<1>": "$INSERT RECIPE_EQU\r\n$insert TOOL_CLASS_EQUATES\r\n\r\nDECLARE SUBROUTINE Set_List_Box_data, Set_Property\r\nDECLARE FUNCTION Center_Window, Prod_Spec_Comm\r\n\r\nEQU MI$TOOL\t\t\tTO 1\r\nEQU MI$TYPE\t\t\tTO 2\r\nEQU MI$RECIPE\t\tTO 3\r\nEQU MI$FREQ\t\t\tTO 4\r\nEQU MI$PROVE_TYPE\tTO 5\r\nEQU MI$FIRST_CHECK\tTO 6\r\nEQU MI$LAST_CHECK\tTO 7\r\nEQU MI$SPC\t\t\tTO 8\r\nEQU MI$OVERGROW\t\tTO 9\r\nEQU MI$EXP_TW_QTY\tTO 10\r\nEQU MI$PATTERN\t\tTO 11\r\n\r\nIF INDEX( CreateParam, 'CENTER', 1 ) THEN\r\n void = center_window( @window )\r\nEND ELSE\r\n Void = Set_Property( @window, 'VISIBLE', 1 )\r\nEND\r\n\r\nMeasureInfo\t= FIELD( CreateParam, CHAR(245), 1 )\t\t;* 1st passed parameter\r\n\r\nCtrls = @WINDOW:'.TOOL':@RM\t\t\t\t; Props = 'TEXT':@RM\t\t; Vals = FIELD(MeasureInfo,'~',MI$TOOL):@RM\r\nCtrls := @WINDOW:'.TYPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$TYPE):@RM\r\nCtrls := @WINDOW:'.RECIPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$RECIPE):@RM\r\nCtrls := @WINDOW:'.FREQ':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FREQ):@RM\r\nCtrls := @WINDOW:'.PROVE_TYPE':@RM\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$PROVE_TYPE):@RM\r\nCtrls := @WINDOW:'.FIRST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FIRST_CHECK):@RM\r\nCtrls := @WINDOW:'.LAST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$LAST_CHECK):@RM\r\nCtrls := @WINDOW:'.SPC':@RM\t\t\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$SPC):@RM\r\nCtrls := @WINDOW:'.OVERGROW':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$OVERGROW):@RM\r\nCtrls := @WINDOW:'.EXPECTED_TW_QTY':@RM\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$EXP_TW_QTY):@RM\r\nCtrls := @WINDOW:'.PATTERN'\t\t\t\t\t; Props := 'TEXT'\t\t\t; Vals := FIELD(MeasureInfo,'~',MI$PATTERN)\r\n\r\nSet_Property(Ctrls,Props,Vals)\r\nSet_Property(@WINDOW, '@Controls',Ctrls)\r\nSet_Property(@WINDOW, '@Props',Props)\r\n\r\nType = FIELD(CreateParam,CHAR(245),2)\t\t;* 2nd passed parameter\r\n\r\nIF Type = 'RES' THEN\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',1)\r\nEND ELSE\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',0)\r\nEND\r\n\r\nTypeOut = FIELD(CreateParam,CHAR(245),3)\t\t\t;* 3rd passed parameter\r\n\r\nTitle = Get_Property(@WINDOW,'TEXT')\r\nTitle := TypeOut:' ':Title\r\nSet_Property(@WINDOW,'TEXT',Title)\r\n\r\nToolList = XLATE('LISTBOX_CONFIG',Type:'MEASURETOOL','','X')\r\nCONVERT @VM TO @FM IN ToolList\r\nSet_Property(@WINDOW:'.TOOL','LIST',ToolList)\r\n\r\nTool = Get_Property(@WINDOW:'.TOOL', 'TEXT' )\r\nCONVERT @LOWER_CASE TO @UPPER_CASE IN Tool\r\n\r\nRecipeList = XLATE( 'TOOL_CLASS', Tool, TOOL_CLASS_RECIPES$, 'X' )\r\nCONVERT @VM To @FM IN RecipeList\r\n\r\nIF RecipeList NE '' THEN\r\n\tSet_Property(@WINDOW:'.RECIPE','LIST',RecipeList)\r\nEnd\r\n\r\nPatternList = Xlate('TOOL_CLASS', Tool, TOOL_CLASS_PATTERN$, 'X')\r\nCONVERT @VM To @FM IN PatternList\r\n\r\nIf PatternList Ne '' Then\r\n Set_Property(@Window:'.PATTERN', 'LIST', PatternList)\r\nEnd\r\n\r\nRETURN 1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
|
||||
"<1>": "$INSERT RECIPE_EQU\r\n\r\nDECLARE SUBROUTINE Set_List_Box_data, Set_Property\r\nDECLARE FUNCTION Center_Window, Prod_Spec_Comm\r\n\r\nEQU MI$TOOL\t\t\tTO 1\r\nEQU MI$TYPE\t\t\tTO 2\r\nEQU MI$RECIPE\t\tTO 3\r\nEQU MI$FREQ\t\t\tTO 4\r\nEQU MI$PROVE_TYPE\tTO 5\r\nEQU MI$FIRST_CHECK\tTO 6\r\nEQU MI$LAST_CHECK\tTO 7\r\nEQU MI$SPC\t\t\tTO 8\r\nEQU MI$OVERGROW\t\tTO 9\r\nEQU MI$EXP_TW_QTY\tTO 10\r\nEQU MI$PATTERN\t\tTO 11\r\n\r\nIF INDEX( CreateParam, 'CENTER', 1 ) THEN\r\n void = center_window( @window )\r\nEND ELSE\r\n Void = Set_Property( @window, 'VISIBLE', 1 )\r\nEND\r\n\r\nMeasureInfo\t= FIELD( CreateParam, CHAR(245), 1 )\t\t;* 1st passed parameter\r\n\r\nCtrls = @WINDOW:'.TOOL':@RM\t\t\t\t; Props = 'TEXT':@RM\t\t; Vals = FIELD(MeasureInfo,'~',MI$TOOL):@RM\r\nCtrls := @WINDOW:'.TYPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$TYPE):@RM\r\nCtrls := @WINDOW:'.RECIPE':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$RECIPE):@RM\r\nCtrls := @WINDOW:'.FREQ':@RM\t\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FREQ):@RM\r\nCtrls := @WINDOW:'.PROVE_TYPE':@RM\t\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$PROVE_TYPE):@RM\r\nCtrls := @WINDOW:'.FIRST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$FIRST_CHECK):@RM\r\nCtrls := @WINDOW:'.LAST_CHECK':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$LAST_CHECK):@RM\r\nCtrls := @WINDOW:'.SPC':@RM\t\t\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$SPC):@RM\r\nCtrls := @WINDOW:'.OVERGROW':@RM\t\t\t; Props := 'CHECK':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$OVERGROW):@RM\r\nCtrls := @WINDOW:'.EXPECTED_TW_QTY':@RM\t\t; Props := 'TEXT':@RM\t\t; Vals := FIELD(MeasureInfo,'~',MI$EXP_TW_QTY):@RM\r\nCtrls := @WINDOW:'.PATTERN'\t\t\t\t\t; Props := 'TEXT'\t\t\t; Vals := FIELD(MeasureInfo,'~',MI$PATTERN)\r\n\r\nSet_Property(Ctrls,Props,Vals)\r\nSet_Property(@WINDOW, '@Controls',Ctrls)\r\nSet_Property(@WINDOW, '@Props',Props)\r\n\r\nType = FIELD(CreateParam,CHAR(245),2)\t\t;* 2nd passed parameter\r\n\r\nIF Type = 'RES' THEN\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',1)\r\nEND ELSE\r\n\tvoid = Set_Property(@WINDOW:'.OVERGROW','VISIBLE',0)\r\nEND\r\n\r\nTypeOut = FIELD(CreateParam,CHAR(245),3)\t\t\t;* 3rd passed parameter\r\n\r\nTitle = Get_Property(@WINDOW,'TEXT')\r\nTitle := TypeOut:' ':Title\r\nSet_Property(@WINDOW,'TEXT',Title)\r\n\r\nSet_List_Box_Data(CtrlEntId)\r\n\r\n\r\nToolList = XLATE('LISTBOX_CONFIG',Type:'MEASURETOOL','','X')\r\nCONVERT @VM TO @FM IN ToolList\r\nSet_Property(@WINDOW:'.TOOL','LIST',ToolList)\r\n\r\nTool = Get_Property(@WINDOW:'.TOOL', 'TEXT' )\r\nCONVERT @LOWER_CASE TO @UPPER_CASE IN Tool\r\n\r\nRecipeList = XLATE( 'LISTBOX_CONFIG', Tool:'_RECIPES', '', 'X' )\r\nCONVERT @VM To @FM IN RecipeList\r\n\r\nIF RecipeList NE '' THEN\r\n\tSet_Property(@WINDOW:'.RECIPE','LIST',RecipeList)\r\nEND\r\n\r\nRETURN 1\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5,7 +5,7 @@
|
||||
},
|
||||
"body": {
|
||||
"record1": {
|
||||
"<1>": "\r\ndeclare function dialog_box, Get_Property\r\ndeclare subroutine Send_Event, Post_Event, Set_Property\r\n\r\nATRECORD = Get_Property(@Window, 'ATRECORD')\r\nRecCheck = @Record\r\n\r\nRDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')\r\n\r\nIf ATRECORD NE RecCheck then\r\n OrigIOOptions = Get_Property (@Window, \"IOOPTIONS\")\r\n TempIOOptions = OrigIOOptions\r\n TempIOOptions<6> = 1\r\n Set_Property(@Window, 'IOOPTIONS', TempIOOptions)\r\n Send_Event(@Window, 'WRITE')\r\n Set_Property(@Window, 'IOOPTIONS', OrigIOOptions)\r\nend\r\n\r\nReturnVal = dialog_box( 'NDW_LOAD_UNLOAD_EXTRA', @window, RDSNo)\r\nSet_Property(@window, 'SAVEWARN', 0)\r\nPost_Event(@Window, 'READ')\r\n/*\r\nVoid = set_property( @window, '@ExSigWrite', 0 )\r\nOrigExSigInfo = get_property( @window, '@ExSigInfo' )\r\nReturnVal = dialog_box( 'RDS_UNLOAD_LOAD_EX', @window, OrigExSigInfo )\r\nif ReturnVal <> 'CANCEL' and ( ReturnVal <> OrigExSigInfo ) then\r\n Void = set_property( @window, '@ExSigInfo', ReturnVal )\r\n Void = set_property( @window, '@ExSigWrite', 1 )\r\n @@window->savewarn = 1\r\nend\r\n*/\r\nRETURN 0\r\n"
|
||||
"<1>": "\r\ndeclare function dialog_box\r\n\r\nRDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')\r\nReturnVal = dialog_box( 'NDW_LOAD_UNLOAD_EXTRA', @window, RDSNo)\r\n/*\r\nVoid = set_property( @window, '@ExSigWrite', 0 )\r\nOrigExSigInfo = get_property( @window, '@ExSigInfo' )\r\nReturnVal = dialog_box( 'RDS_UNLOAD_LOAD_EX', @window, OrigExSigInfo )\r\nif ReturnVal <> 'CANCEL' and ( ReturnVal <> OrigExSigInfo ) then\r\n Void = set_property( @window, '@ExSigInfo', ReturnVal )\r\n Void = set_property( @window, '@ExSigWrite', 1 )\r\n @@window->savewarn = 1\r\nend\r\n*/\r\nRETURN 0\r\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -22604,10 +22604,10 @@
|
||||
"<2>": {
|
||||
"<2,1>": {
|
||||
"<2,1,1>": {
|
||||
"<2,1,1,1>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO",
|
||||
"<2,1,1,2>": "PRINT.FACTORY_LABELS",
|
||||
"<2,1,1,3>": "PRINT.CUSTOMER_RDS",
|
||||
"<2,1,1,4>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
|
||||
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT",
|
||||
"<2,1,1,2>": "PRINT.CUSTOMER_RDS",
|
||||
"<2,1,1,3>": "PRINT.FACTORY_LABELS",
|
||||
"<2,1,1,4>": "UNLOAD/LOAD_EXTRA.SIGNATURE_INFO"
|
||||
}
|
||||
},
|
||||
"<2,2>": {
|
||||
|
||||
@ -3591,7 +3591,7 @@
|
||||
"<22,2>": "",
|
||||
"<22,3>": "EDITFIELD",
|
||||
"<22,4>": "RDS_PRE_EPI",
|
||||
"<22,5>": "380",
|
||||
"<22,5>": "366",
|
||||
"<22,6>": "370",
|
||||
"<22,7>": "132",
|
||||
"<22,8>": "18",
|
||||
@ -3731,7 +3731,7 @@
|
||||
"<23,2>": "",
|
||||
"<23,3>": "EDITFIELD",
|
||||
"<23,4>": "RDS_PRE_EPI",
|
||||
"<23,5>": "521",
|
||||
"<23,5>": "505",
|
||||
"<23,6>": "370",
|
||||
"<23,7>": "84",
|
||||
"<23,8>": "18",
|
||||
@ -3871,7 +3871,7 @@
|
||||
"<24,2>": "",
|
||||
"<24,3>": "EDITFIELD",
|
||||
"<24,4>": "RDS_PRE_EPI",
|
||||
"<24,5>": "612",
|
||||
"<24,5>": "593",
|
||||
"<24,6>": "370",
|
||||
"<24,7>": "75",
|
||||
"<24,8>": "18",
|
||||
@ -9835,9 +9835,9 @@
|
||||
"<56,3>": "PUSHBUTTON",
|
||||
"<56,4>": "RDS_PRE_EPI",
|
||||
"<56,5>": "324",
|
||||
"<56,6>": "368",
|
||||
"<56,7>": "52",
|
||||
"<56,8>": "24",
|
||||
"<56,6>": "370",
|
||||
"<56,7>": "36",
|
||||
"<56,8>": "18",
|
||||
"<56,9>": "Sign",
|
||||
"<56,10>": {
|
||||
"<56,10,1>": "0x56000300",
|
||||
@ -17211,9 +17211,9 @@
|
||||
"<101,2>": "",
|
||||
"<101,3>": "GROUPBOX",
|
||||
"<101,4>": "RDS_PRE_EPI",
|
||||
"<101,5>": "12",
|
||||
"<101,5>": "10",
|
||||
"<101,6>": "268",
|
||||
"<101,7>": "690",
|
||||
"<101,7>": "672",
|
||||
"<101,8>": "129",
|
||||
"<101,9>": "Pre-Epi Verification",
|
||||
"<101,10>": {
|
||||
@ -17917,8 +17917,7 @@
|
||||
"<1,26,16>": "",
|
||||
"<1,26,17>": "",
|
||||
"<1,26,18>": "",
|
||||
"<1,26,19>": "",
|
||||
"<1,26,20>": ""
|
||||
"<1,26,19>": ""
|
||||
},
|
||||
"<1,27>": {
|
||||
"<1,27,1>": "ITEM",
|
||||
@ -17939,8 +17938,7 @@
|
||||
"<1,27,16>": "",
|
||||
"<1,27,17>": "",
|
||||
"<1,27,18>": "",
|
||||
"<1,27,19>": "",
|
||||
"<1,27,20>": ""
|
||||
"<1,27,19>": ""
|
||||
},
|
||||
"<1,28>": {
|
||||
"<1,28,1>": "POPUP",
|
||||
@ -18012,9 +18010,9 @@
|
||||
"<2>": {
|
||||
"<2,1>": {
|
||||
"<2,1,1>": {
|
||||
"<2,1,1,1>": "EDIT.THICKNESS_OVERGROWTH_AVG",
|
||||
"<2,1,1,1>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT",
|
||||
"<2,1,1,2>": "EDIT.SSI_STANDARDS",
|
||||
"<2,1,1,3>": "SEND_MESSAGE.MESSAGE_W/ATTACHMENT"
|
||||
"<2,1,1,3>": "EDIT.THICKNESS_OVERGROWTH_AVG"
|
||||
}
|
||||
},
|
||||
"<2,2>": {
|
||||
@ -18024,17 +18022,7 @@
|
||||
"<2,2,1,3>": "@WINDOW",
|
||||
"<2,2,1,4>": "",
|
||||
"<2,2,1,5>": "",
|
||||
"<2,2,1,6>": "",
|
||||
"<2,2,1,7>": "",
|
||||
"<2,2,1,8>": "",
|
||||
"<2,2,1,9>": "",
|
||||
"<2,2,1,10>": "",
|
||||
"<2,2,1,11>": "",
|
||||
"<2,2,1,12>": "",
|
||||
"<2,2,1,13>": "",
|
||||
"<2,2,1,14>": "",
|
||||
"<2,2,1,15>": "READROW",
|
||||
"<2,2,1,16>": "0"
|
||||
"<2,2,1,6>": ""
|
||||
},
|
||||
"<2,2,2>": {
|
||||
"<2,2,2,1>": "E",
|
||||
@ -18164,17 +18152,7 @@
|
||||
"<2,2,16,3>": "@WINDOW",
|
||||
"<2,2,16,4>": "",
|
||||
"<2,2,16,5>": "",
|
||||
"<2,2,16,6>": "",
|
||||
"<2,2,16,7>": "",
|
||||
"<2,2,16,8>": "",
|
||||
"<2,2,16,9>": "",
|
||||
"<2,2,16,10>": "",
|
||||
"<2,2,16,11>": "",
|
||||
"<2,2,16,12>": "",
|
||||
"<2,2,16,13>": "",
|
||||
"<2,2,16,14>": "",
|
||||
"<2,2,16,15>": "GEN",
|
||||
"<2,2,16,16>": "0"
|
||||
"<2,2,16,6>": ""
|
||||
}
|
||||
},
|
||||
"<2,3>": {
|
||||
|
||||
16713
LSL2/OIWIN/REACTOR.json
16713
LSL2/OIWIN/REACTOR.json
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,445 +0,0 @@
|
||||
{
|
||||
"header": {
|
||||
"version": 1,
|
||||
"type": "record"
|
||||
},
|
||||
"body": {
|
||||
"record1": {
|
||||
"<1>": "1010",
|
||||
"<2>": "1",
|
||||
"<3>": ""
|
||||
},
|
||||
"record2": {
|
||||
"<1>": {
|
||||
"<1,1>": "WEB_OI_WIZARD",
|
||||
"<1,2>": "",
|
||||
"<1,3>": "WINDOW",
|
||||
"<1,4>": "",
|
||||
"<1,5>": "0",
|
||||
"<1,6>": "0",
|
||||
"<1,7>": "-2083",
|
||||
"<1,8>": "-1097",
|
||||
"<1,9>": "OI Wizard",
|
||||
"<1,10>": {
|
||||
"<1,10,1>": "0x84CF0000",
|
||||
"<1,10,2>": "0x100"
|
||||
},
|
||||
"<1,11>": {
|
||||
"<1,11,1>": "0x8000",
|
||||
"<1,11,2>": "0x80000000"
|
||||
},
|
||||
"<1,12>": "",
|
||||
"<1,13>": {
|
||||
"<1,13,1>": "-2",
|
||||
"<1,13,2>": "-2",
|
||||
"<1,13,3>": ""
|
||||
},
|
||||
"<1,14>": "",
|
||||
"<1,15>": "",
|
||||
"<1,16>": "",
|
||||
"<1,17>": "",
|
||||
"<1,18>": {
|
||||
"<1,18,1>": {
|
||||
"<1,18,1,1>": "X",
|
||||
"<1,18,1,2>": "EXECUTE",
|
||||
"<1,18,1,3>": "@WINDOW_EVENTS",
|
||||
"<1,18,1,4>": {
|
||||
"<1,18,1,4,1>": "@SELF",
|
||||
"<1,18,1,4,2>": "@EVENT",
|
||||
"<1,18,1,4,3>": "@PARAM1",
|
||||
"<1,18,1,4,4>": "@PARAM2",
|
||||
"<1,18,1,4,5>": "@PARAM3",
|
||||
"<1,18,1,4,6>": "@PARAM4",
|
||||
"<1,18,1,4,7>": "@PARAM5",
|
||||
"<1,18,1,4,8>": "@PARAM6"
|
||||
},
|
||||
"<1,18,1,5>": "",
|
||||
"<1,18,1,6>": "",
|
||||
"<1,18,1,7>": "",
|
||||
"<1,18,1,8>": "",
|
||||
"<1,18,1,9>": "",
|
||||
"<1,18,1,10>": "",
|
||||
"<1,18,1,11>": "",
|
||||
"<1,18,1,12>": "",
|
||||
"<1,18,1,13>": "",
|
||||
"<1,18,1,14>": "",
|
||||
"<1,18,1,15>": "COMMEVT",
|
||||
"<1,18,1,16>": "0"
|
||||
},
|
||||
"<1,18,2>": {
|
||||
"<1,18,2,1>": "X",
|
||||
"<1,18,2,2>": "EXECUTE",
|
||||
"<1,18,2,3>": "@WINDOW_EVENTS",
|
||||
"<1,18,2,4>": {
|
||||
"<1,18,2,4,1>": "@SELF",
|
||||
"<1,18,2,4,2>": "@EVENT",
|
||||
"<1,18,2,4,3>": "@PARAM1",
|
||||
"<1,18,2,4,4>": "@PARAM2",
|
||||
"<1,18,2,4,5>": "@PARAM3",
|
||||
"<1,18,2,4,6>": "@PARAM4",
|
||||
"<1,18,2,4,7>": "@PARAM5",
|
||||
"<1,18,2,4,8>": "@PARAM6"
|
||||
},
|
||||
"<1,18,2,5>": "",
|
||||
"<1,18,2,6>": "",
|
||||
"<1,18,2,7>": "",
|
||||
"<1,18,2,8>": "",
|
||||
"<1,18,2,9>": "",
|
||||
"<1,18,2,10>": "",
|
||||
"<1,18,2,11>": "",
|
||||
"<1,18,2,12>": "",
|
||||
"<1,18,2,13>": "",
|
||||
"<1,18,2,14>": "",
|
||||
"<1,18,2,15>": "COMMEVT",
|
||||
"<1,18,2,16>": "0"
|
||||
}
|
||||
},
|
||||
"<1,19>": {
|
||||
"<1,19,1>": "CREATE",
|
||||
"<1,19,2>": "TIMER"
|
||||
},
|
||||
"<1,20>": "",
|
||||
"<1,21>": "",
|
||||
"<1,22>": "",
|
||||
"<1,23>": "",
|
||||
"<1,24>": {
|
||||
"<1,24,1>": "",
|
||||
"<1,24,2>": "0",
|
||||
"<1,24,3>": "0",
|
||||
"<1,24,4>": "0",
|
||||
"<1,24,5>": "",
|
||||
"<1,24,6>": "0",
|
||||
"<1,24,7>": "",
|
||||
"<1,24,8>": "",
|
||||
"<1,24,9>": "",
|
||||
"<1,24,10>": "0",
|
||||
"<1,24,11>": "0",
|
||||
"<1,24,12>": "0",
|
||||
"<1,24,13>": "0",
|
||||
"<1,24,14>": "0",
|
||||
"<1,24,15>": "0",
|
||||
"<1,24,16>": "0",
|
||||
"<1,24,17>": "0"
|
||||
},
|
||||
"<1,25>": "",
|
||||
"<1,26>": "",
|
||||
"<1,27>": "",
|
||||
"<1,28>": "",
|
||||
"<1,29>": "",
|
||||
"<1,30>": "",
|
||||
"<1,31>": "",
|
||||
"<1,32>": "",
|
||||
"<1,33>": "",
|
||||
"<1,34>": "LSL2*IMAGE*ICO*INFINEON",
|
||||
"<1,35>": "",
|
||||
"<1,36>": "",
|
||||
"<1,37>": {
|
||||
"<1,37,1>": "0X10001",
|
||||
"<1,37,2>": "0X10001"
|
||||
},
|
||||
"<1,38>": "",
|
||||
"<1,39>": "",
|
||||
"<1,40>": "",
|
||||
"<1,41>": "",
|
||||
"<1,42>": "",
|
||||
"<1,43>": "",
|
||||
"<1,44>": "",
|
||||
"<1,45>": "",
|
||||
"<1,46>": "",
|
||||
"<1,47>": "",
|
||||
"<1,48>": "",
|
||||
"<1,49>": "",
|
||||
"<1,50>": "",
|
||||
"<1,51>": "",
|
||||
"<1,52>": "",
|
||||
"<1,53>": "",
|
||||
"<1,54>": "",
|
||||
"<1,55>": "",
|
||||
"<1,56>": "",
|
||||
"<1,57>": "",
|
||||
"<1,58>": "",
|
||||
"<1,59>": "",
|
||||
"<1,60>": "",
|
||||
"<1,61>": "",
|
||||
"<1,62>": {
|
||||
"<1,62,1>": "0",
|
||||
"<1,62,2>": "",
|
||||
"<1,62,3>": "",
|
||||
"<1,62,4>": "0",
|
||||
"<1,62,5>": "0",
|
||||
"<1,62,6>": "0",
|
||||
"<1,62,7>": "",
|
||||
"<1,62,8>": "0.50",
|
||||
"<1,62,9>": "5.00",
|
||||
"<1,62,10>": "0.00"
|
||||
},
|
||||
"<1,63>": "",
|
||||
"<1,64>": "",
|
||||
"<1,65>": "",
|
||||
"<1,66>": "",
|
||||
"<1,67>": "",
|
||||
"<1,68>": "",
|
||||
"<1,69>": "",
|
||||
"<1,70>": "",
|
||||
"<1,71>": "",
|
||||
"<1,72>": "",
|
||||
"<1,73>": "",
|
||||
"<1,74>": "",
|
||||
"<1,75>": "",
|
||||
"<1,76>": "",
|
||||
"<1,77>": "",
|
||||
"<1,78>": "",
|
||||
"<1,79>": "",
|
||||
"<1,80>": "",
|
||||
"<1,81>": "",
|
||||
"<1,82>": "",
|
||||
"<1,83>": "",
|
||||
"<1,84>": "",
|
||||
"<1,85>": "",
|
||||
"<1,86>": "",
|
||||
"<1,87>": "",
|
||||
"<1,88>": "",
|
||||
"<1,89>": "",
|
||||
"<1,90>": "",
|
||||
"<1,91>": "",
|
||||
"<1,92>": "",
|
||||
"<1,93>": "",
|
||||
"<1,94>": "",
|
||||
"<1,95>": "",
|
||||
"<1,96>": "",
|
||||
"<1,97>": "",
|
||||
"<1,98>": "",
|
||||
"<1,99>": "",
|
||||
"<1,100>": "",
|
||||
"<1,101>": "",
|
||||
"<1,102>": "",
|
||||
"<1,103>": "",
|
||||
"<1,104>": "",
|
||||
"<1,105>": "",
|
||||
"<1,106>": "0",
|
||||
"<1,107>": "",
|
||||
"<1,108>": ""
|
||||
}
|
||||
},
|
||||
"record3": {
|
||||
"<1>": {
|
||||
"<1,1>": "WEBVIEW_MAIN",
|
||||
"<1,2>": "",
|
||||
"<1,3>": "WEBVIEW",
|
||||
"<1,4>": "WEB_OI_WIZARD",
|
||||
"<1,5>": "12",
|
||||
"<1,6>": "12",
|
||||
"<1,7>": "2060",
|
||||
"<1,8>": "1076",
|
||||
"<1,9>": "",
|
||||
"<1,10>": {
|
||||
"<1,10,1>": "0x56000000",
|
||||
"<1,10,2>": "0x0"
|
||||
},
|
||||
"<1,11>": {
|
||||
"<1,11,1>": "0x4",
|
||||
"<1,11,2>": "0x80000000"
|
||||
},
|
||||
"<1,12>": "1",
|
||||
"<1,13>": {
|
||||
"<1,13,1>": "-2",
|
||||
"<1,13,2>": "-2",
|
||||
"<1,13,3>": ""
|
||||
},
|
||||
"<1,14>": "",
|
||||
"<1,15>": "",
|
||||
"<1,16>": "",
|
||||
"<1,17>": "",
|
||||
"<1,18>": {
|
||||
"<1,18,1>": {
|
||||
"<1,18,1,1>": "X",
|
||||
"<1,18,1,2>": "EXECUTE",
|
||||
"<1,18,1,3>": "@WINDOW_EVENTS",
|
||||
"<1,18,1,4>": {
|
||||
"<1,18,1,4,1>": "@SELF",
|
||||
"<1,18,1,4,2>": "@EVENT",
|
||||
"<1,18,1,4,3>": "@PARAM1",
|
||||
"<1,18,1,4,4>": "@PARAM2",
|
||||
"<1,18,1,4,5>": "@PARAM3",
|
||||
"<1,18,1,4,6>": "@PARAM4",
|
||||
"<1,18,1,4,7>": "@PARAM5",
|
||||
"<1,18,1,4,8>": "@PARAM6"
|
||||
},
|
||||
"<1,18,1,5>": "",
|
||||
"<1,18,1,6>": "",
|
||||
"<1,18,1,7>": "",
|
||||
"<1,18,1,8>": "",
|
||||
"<1,18,1,9>": "",
|
||||
"<1,18,1,10>": "",
|
||||
"<1,18,1,11>": "",
|
||||
"<1,18,1,12>": "",
|
||||
"<1,18,1,13>": "",
|
||||
"<1,18,1,14>": "",
|
||||
"<1,18,1,15>": "COMMEVT",
|
||||
"<1,18,1,16>": "0"
|
||||
},
|
||||
"<1,18,2>": {
|
||||
"<1,18,2,1>": "X",
|
||||
"<1,18,2,2>": "EXECUTE",
|
||||
"<1,18,2,3>": "@WINDOW_EVENTS",
|
||||
"<1,18,2,4>": {
|
||||
"<1,18,2,4,1>": "@SELF",
|
||||
"<1,18,2,4,2>": "@EVENT",
|
||||
"<1,18,2,4,3>": "@PARAM1",
|
||||
"<1,18,2,4,4>": "@PARAM2",
|
||||
"<1,18,2,4,5>": "@PARAM3",
|
||||
"<1,18,2,4,6>": "@PARAM4",
|
||||
"<1,18,2,4,7>": "@PARAM5",
|
||||
"<1,18,2,4,8>": "@PARAM6"
|
||||
},
|
||||
"<1,18,2,5>": "",
|
||||
"<1,18,2,6>": "",
|
||||
"<1,18,2,7>": "",
|
||||
"<1,18,2,8>": "",
|
||||
"<1,18,2,9>": "",
|
||||
"<1,18,2,10>": "",
|
||||
"<1,18,2,11>": "",
|
||||
"<1,18,2,12>": "",
|
||||
"<1,18,2,13>": "",
|
||||
"<1,18,2,14>": "",
|
||||
"<1,18,2,15>": "COMMEVT",
|
||||
"<1,18,2,16>": "0"
|
||||
}
|
||||
},
|
||||
"<1,19>": {
|
||||
"<1,19,1>": "WEBVIEWCREATED",
|
||||
"<1,19,2>": "WEBNAVIGATED"
|
||||
},
|
||||
"<1,20>": "",
|
||||
"<1,21>": "",
|
||||
"<1,22>": "",
|
||||
"<1,23>": "",
|
||||
"<1,24>": "",
|
||||
"<1,25>": "",
|
||||
"<1,26>": "",
|
||||
"<1,27>": "",
|
||||
"<1,28>": "",
|
||||
"<1,29>": "",
|
||||
"<1,30>": "",
|
||||
"<1,31>": "",
|
||||
"<1,32>": "",
|
||||
"<1,33>": "",
|
||||
"<1,34>": "",
|
||||
"<1,35>": "",
|
||||
"<1,36>": "",
|
||||
"<1,37>": "",
|
||||
"<1,38>": "",
|
||||
"<1,39>": "",
|
||||
"<1,40>": "",
|
||||
"<1,41>": "",
|
||||
"<1,42>": "",
|
||||
"<1,43>": "",
|
||||
"<1,44>": "",
|
||||
"<1,45>": "",
|
||||
"<1,46>": "",
|
||||
"<1,47>": "",
|
||||
"<1,48>": "",
|
||||
"<1,49>": "",
|
||||
"<1,50>": "",
|
||||
"<1,51>": "",
|
||||
"<1,52>": "",
|
||||
"<1,53>": "",
|
||||
"<1,54>": "",
|
||||
"<1,55>": "",
|
||||
"<1,56>": "",
|
||||
"<1,57>": "",
|
||||
"<1,58>": {
|
||||
"<1,58,1>": "1",
|
||||
"<1,58,2>": "1",
|
||||
"<1,58,3>": "1",
|
||||
"<1,58,4>": "1",
|
||||
"<1,58,5>": "1",
|
||||
"<1,58,6>": "0",
|
||||
"<1,58,7>": "1",
|
||||
"<1,58,8>": "1",
|
||||
"<1,58,9>": "1",
|
||||
"<1,58,10>": "1",
|
||||
"<1,58,11>": "1",
|
||||
"<1,58,12>": "1",
|
||||
"<1,58,13>": "1"
|
||||
},
|
||||
"<1,59>": "",
|
||||
"<1,60>": "",
|
||||
"<1,61>": "",
|
||||
"<1,62>": "",
|
||||
"<1,63>": "",
|
||||
"<1,64>": "",
|
||||
"<1,65>": "",
|
||||
"<1,66>": "",
|
||||
"<1,67>": "",
|
||||
"<1,68>": "",
|
||||
"<1,69>": "",
|
||||
"<1,70>": "",
|
||||
"<1,71>": "",
|
||||
"<1,72>": "",
|
||||
"<1,73>": "",
|
||||
"<1,74>": "",
|
||||
"<1,75>": "",
|
||||
"<1,76>": "",
|
||||
"<1,77>": "",
|
||||
"<1,78>": "",
|
||||
"<1,79>": "",
|
||||
"<1,80>": "",
|
||||
"<1,81>": "",
|
||||
"<1,82>": "",
|
||||
"<1,83>": "",
|
||||
"<1,84>": "",
|
||||
"<1,85>": "",
|
||||
"<1,86>": "",
|
||||
"<1,87>": "",
|
||||
"<1,88>": "",
|
||||
"<1,89>": "",
|
||||
"<1,90>": "",
|
||||
"<1,91>": "",
|
||||
"<1,92>": "",
|
||||
"<1,93>": "",
|
||||
"<1,94>": {
|
||||
"<1,94,1>": "",
|
||||
"<1,94,2>": "",
|
||||
"<1,94,3>": "",
|
||||
"<1,94,4>": "0",
|
||||
"<1,94,5>": "",
|
||||
"<1,94,6>": "",
|
||||
"<1,94,7>": "0",
|
||||
"<1,94,8>": "",
|
||||
"<1,94,9>": "0",
|
||||
"<1,94,10>": "0"
|
||||
},
|
||||
"<1,95>": {
|
||||
"<1,95,1>": "0",
|
||||
"<1,95,2>": "0",
|
||||
"<1,95,3>": "0",
|
||||
"<1,95,4>": "0",
|
||||
"<1,95,5>": "0",
|
||||
"<1,95,6>": "0",
|
||||
"<1,95,7>": "0",
|
||||
"<1,95,8>": "0",
|
||||
"<1,95,9>": "0",
|
||||
"<1,95,10>": "0",
|
||||
"<1,95,11>": "0"
|
||||
},
|
||||
"<1,96>": "",
|
||||
"<1,97>": "",
|
||||
"<1,98>": "",
|
||||
"<1,99>": "",
|
||||
"<1,100>": "",
|
||||
"<1,101>": "",
|
||||
"<1,102>": "",
|
||||
"<1,103>": "",
|
||||
"<1,104>": "",
|
||||
"<1,105>": "",
|
||||
"<1,106>": "",
|
||||
"<1,107>": "",
|
||||
"<1,108>": ""
|
||||
}
|
||||
},
|
||||
"record4": {
|
||||
"<1>": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -122,12 +122,8 @@
|
||||
"<8,23,1>": "PSV",
|
||||
"<8,23,2>": "Pre Ship Verification"
|
||||
},
|
||||
"<8,24>": {
|
||||
"<8,24,1>": "RTF",
|
||||
"<8,24,2>": "Return To Fab Active"
|
||||
},
|
||||
"<8,25>": "",
|
||||
"<8,26>": ""
|
||||
"<8,24>": "",
|
||||
"<8,25>": ""
|
||||
},
|
||||
"<9>": {
|
||||
"<9,1>": {
|
||||
@ -145,6 +141,14 @@
|
||||
"<9,2,4>": "C",
|
||||
"<9,2,5>": "",
|
||||
"<9,2,6>": "Current Status Description"
|
||||
},
|
||||
"<9,3>": {
|
||||
"<9,3,1>": "",
|
||||
"<9,3,2>": "",
|
||||
"<9,3,3>": "",
|
||||
"<9,3,4>": "",
|
||||
"<9,3,5>": "",
|
||||
"<9,3,6>": ""
|
||||
}
|
||||
},
|
||||
"<10>": "L",
|
||||
@ -171,18 +175,8 @@
|
||||
"<31>": "0",
|
||||
"<32>": "0",
|
||||
"<33>": "0",
|
||||
"<34>": "-2",
|
||||
"<35>": "-2",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9,7 +9,7 @@
|
||||
"<2>": "-1",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "-2",
|
||||
"<5>": "16777215",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "Tahoma",
|
||||
@ -49,8 +49,20 @@
|
||||
"<8,4,2>": " EpiPro"
|
||||
},
|
||||
"<8,5>": {
|
||||
"<8,5,1>": "STD",
|
||||
"<8,5,2>": "Standard"
|
||||
"<8,5,1>": "GAN",
|
||||
"<8,5,2>": "GaN"
|
||||
},
|
||||
"<8,6>": {
|
||||
"<8,6,1>": "STD",
|
||||
"<8,6,2>": "Standard"
|
||||
},
|
||||
"<8,7>": {
|
||||
"<8,7,1>": "HD",
|
||||
"<8,7,2>": "Heavy Duty"
|
||||
},
|
||||
"<8,8>": {
|
||||
"<8,8,1>": "SCADA",
|
||||
"<8,8,2>": "Prototype"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -96,17 +108,7 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
"<35>": "16777215"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -130,11 +130,7 @@
|
||||
"<8,25,1>": "PSV",
|
||||
"<8,25,2>": "Pre Ship Verification"
|
||||
},
|
||||
"<8,26>": {
|
||||
"<8,26,1>": "RTF",
|
||||
"<8,26,2>": "Return To Fab Active"
|
||||
},
|
||||
"<8,27>": ""
|
||||
"<8,26>": ""
|
||||
},
|
||||
"<9>": {
|
||||
"<9,1>": {
|
||||
@ -178,18 +174,8 @@
|
||||
"<31>": "0",
|
||||
"<32>": "0",
|
||||
"<33>": "0",
|
||||
"<34>": "-2",
|
||||
"<35>": "-2",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9,7 +9,7 @@
|
||||
"<2>": "-1",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "-2",
|
||||
"<5>": "16777215",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "Tahoma",
|
||||
@ -43,19 +43,39 @@
|
||||
"<8,2,3>": "High Thruput"
|
||||
},
|
||||
"<8,3>": {
|
||||
"<8,3,1>": "5",
|
||||
"<8,3,1>": "4",
|
||||
"<8,3,2>": "HTR",
|
||||
"<8,3,3>": "High Thruput"
|
||||
},
|
||||
"<8,4>": {
|
||||
"<8,4,1>": "8",
|
||||
"<8,4,2>": "EPP",
|
||||
"<8,4,3>": "EpiPro"
|
||||
"<8,4,1>": "5",
|
||||
"<8,4,2>": "HTR",
|
||||
"<8,4,3>": "High Thruput"
|
||||
},
|
||||
"<8,5>": {
|
||||
"<8,5,1>": "18",
|
||||
"<8,5,1>": "8",
|
||||
"<8,5,2>": "EPP",
|
||||
"<8,5,3>": "EpiPro"
|
||||
},
|
||||
"<8,6>": {
|
||||
"<8,6,1>": "18",
|
||||
"<8,6,2>": "EPP",
|
||||
"<8,6,3>": "EpiPro"
|
||||
},
|
||||
"<8,7>": {
|
||||
"<8,7,1>": "24",
|
||||
"<8,7,2>": "EPP",
|
||||
"<8,7,3>": "EpiPro"
|
||||
},
|
||||
"<8,8>": {
|
||||
"<8,8,1>": "5",
|
||||
"<8,8,2>": "GAN",
|
||||
"<8,8,3>": "G5+"
|
||||
},
|
||||
"<8,9>": {
|
||||
"<8,9,1>": "8",
|
||||
"<8,9,2>": "GAN",
|
||||
"<8,9,3>": "G5"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -109,17 +129,7 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
"<35>": "16777215"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9,7 +9,7 @@
|
||||
"<2>": "-1",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "-2",
|
||||
"<5>": "16777215",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "Tahoma",
|
||||
@ -33,12 +33,32 @@
|
||||
"<7>": "",
|
||||
"<8>": {
|
||||
"<8,1>": {
|
||||
"<8,1,1>": "8",
|
||||
"<8,1,2>": "200mm 8 in"
|
||||
"<8,1,1>": "35",
|
||||
"<8,1,2>": "35 inch EpiPro"
|
||||
},
|
||||
"<8,2>": {
|
||||
"<8,2,1>": "6",
|
||||
"<8,2,2>": "150mm 6 in"
|
||||
"<8,2,1>": "18",
|
||||
"<8,2,2>": "18 inch HTR"
|
||||
},
|
||||
"<8,3>": {
|
||||
"<8,3,1>": "15",
|
||||
"<8,3,2>": "15 inch HTR"
|
||||
},
|
||||
"<8,4>": {
|
||||
"<8,4,1>": "8",
|
||||
"<8,4,2>": "8 inch 200mm"
|
||||
},
|
||||
"<8,5>": {
|
||||
"<8,5,1>": "6",
|
||||
"<8,5,2>": "6 inch 150mm"
|
||||
},
|
||||
"<8,6>": {
|
||||
"<8,6,1>": "5",
|
||||
"<8,6,2>": "5 inch 125mm"
|
||||
},
|
||||
"<8,7>": {
|
||||
"<8,7,1>": "4",
|
||||
"<8,7,2>": "4 inch 100mm"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -84,17 +104,7 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
"<35>": "16777215"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9,7 +9,7 @@
|
||||
"<2>": "-2",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "-2",
|
||||
"<5>": "16777215",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "MS Sans Serif",
|
||||
@ -105,10 +105,6 @@
|
||||
"<8,19>": {
|
||||
"<8,19,1>": "PACK",
|
||||
"<8,19,2>": "Loaded in PT Out"
|
||||
},
|
||||
"<8,20>": {
|
||||
"<8,20,1>": "RTF",
|
||||
"<8,20,2>": "Return To Fab Active"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -127,6 +123,14 @@
|
||||
"<9,2,4>": "C",
|
||||
"<9,2,5>": "",
|
||||
"<9,2,6>": "Current Status Description"
|
||||
},
|
||||
"<9,3>": {
|
||||
"<9,3,1>": "",
|
||||
"<9,3,2>": "",
|
||||
"<9,3,3>": "",
|
||||
"<9,3,4>": "",
|
||||
"<9,3,5>": "",
|
||||
"<9,3,6>": ""
|
||||
}
|
||||
},
|
||||
"<10>": "L",
|
||||
@ -154,17 +158,7 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
"<35>": "16777215"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9,7 +9,7 @@
|
||||
"<2>": "-2",
|
||||
"<3>": "-1",
|
||||
"<4>": "-1",
|
||||
"<5>": "-2",
|
||||
"<5>": "16777215",
|
||||
"<6>": {
|
||||
"<6,1>": {
|
||||
"<6,1,1>": "MS Sans Serif",
|
||||
@ -189,10 +189,6 @@
|
||||
"<8,40>": {
|
||||
"<8,40,1>": "PACK",
|
||||
"<8,40,2>": "Loaded in PT Out"
|
||||
},
|
||||
"<8,41>": {
|
||||
"<8,41,1>": "RTF",
|
||||
"<8,41,2>": "Return To Fab Active"
|
||||
}
|
||||
},
|
||||
"<9>": {
|
||||
@ -211,6 +207,14 @@
|
||||
"<9,2,4>": "C",
|
||||
"<9,2,5>": "",
|
||||
"<9,2,6>": "Current Status Description"
|
||||
},
|
||||
"<9,3>": {
|
||||
"<9,3,1>": "",
|
||||
"<9,3,2>": "",
|
||||
"<9,3,3>": "",
|
||||
"<9,3,4>": "",
|
||||
"<9,3,5>": "",
|
||||
"<9,3,6>": ""
|
||||
}
|
||||
},
|
||||
"<10>": "L",
|
||||
@ -238,17 +242,7 @@
|
||||
"<32>": "0",
|
||||
"<33>": "1",
|
||||
"<34>": "16777215",
|
||||
"<35>": "16777215",
|
||||
"<36>": "",
|
||||
"<37>": "",
|
||||
"<38>": "",
|
||||
"<39>": "",
|
||||
"<40>": "-2",
|
||||
"<41>": "1000",
|
||||
"<42>": "",
|
||||
"<43>": "",
|
||||
"<44>": "",
|
||||
"<45>": ""
|
||||
"<35>": "16777215"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -27,22 +27,17 @@ $Insert SERVICE_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert REVDOTNETEQUATES
|
||||
|
||||
Declare function Logging_Services, Environment_Services, Active_Directory_Services, Database_Services
|
||||
Declare function Error_Services, SRP_Array
|
||||
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services, Error_Services
|
||||
Declare function Logging_Services, Environment_Services, Active_Directory_Services
|
||||
Declare subroutine Set_Property.Net, Logging_Services, Set_Status, Database_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ActiveDirectory'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthenticationLog.csv'
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthLog.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
|
||||
objADAuthenticationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthorizationLog.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authorized'
|
||||
objADAuthorizationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
objADAuthLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryLog.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Operation' : @FM : 'Message'
|
||||
@ -88,43 +83,12 @@ Service AuthenticateUser(Username, Password, Domain)
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = Username
|
||||
LogData<3> = Authenticated
|
||||
Logging_Services('AppendLog', objADAuthenticationLog, LogData, @RM, @FM, False$)
|
||||
Logging_Services('AppendLog', objADAuthLog, LogData, @RM, @FM, False$)
|
||||
Response = Authenticated
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service AuthorizeUser(Username, Domain)
|
||||
|
||||
ErrorMsg = ''
|
||||
Authorized = False$
|
||||
If ( (Username NE '') and (Domain NE '') ) then
|
||||
AuthAdGroups = ''
|
||||
LoginConfig = Database_Services('ReadDataRow', 'SYSENV', 'CFG_LOGIN*LSL2')
|
||||
If Error_Services('NoError') then
|
||||
AuthAdGroups<-1> = LoginConfig<2>
|
||||
AuthAdGroups<-1> = LoginConfig<3>
|
||||
AuthAdGroups<-1> = LoginConfig<4>
|
||||
UserAdGroups = Active_Directory_Services('GetADGroups', Username, Domain)
|
||||
MemberOfAuthGroups = SRP_Array('Join', UserAdGroups, AuthAdGroups, 'AND', @FM)
|
||||
Authorized = (MemberOfAuthGroups NE '')
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error retrieving active directory authorization groups.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Username and domain required.'
|
||||
end
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = Username
|
||||
LogData<3> = Authorized
|
||||
Logging_Services('AppendLog', objADAuthorizationLog, LogData, @RM, @FM, False$)
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = Authorized
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetADGroups(Username, Domain)
|
||||
|
||||
ADGroups = ''
|
||||
@ -179,6 +143,7 @@ Service GetADGroups(Username, Domain)
|
||||
End Service
|
||||
|
||||
|
||||
|
||||
Service GetComputerDomain()
|
||||
|
||||
Domain = ''
|
||||
@ -201,7 +166,6 @@ Service GetComputerDomain()
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetADGroupsByString
|
||||
//
|
||||
@ -339,10 +303,8 @@ Service GetADGroupsByString(SearchString, Domain=DOMAIN, SearchByDescription=DES
|
||||
end
|
||||
|
||||
Response = ADGroups
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetADGroupMembersByGroupDescription
|
||||
//
|
||||
@ -357,7 +319,6 @@ end service
|
||||
// 9/26/2024 - [JRO] Initial Programmer.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
||||
|
||||
Set_Status(0)
|
||||
ErrMessage = ''
|
||||
GroupUsers = ''
|
||||
@ -436,10 +397,8 @@ Service GetADGroupMembersByGroupDescription(DescriptionName, Domain=DOMAIN)
|
||||
Error_Services('Add', ErrMessage)
|
||||
end
|
||||
Response = GroupUsers
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetADGroupMembersByGroupName
|
||||
//
|
||||
@ -454,7 +413,6 @@ end service
|
||||
// 9/26/2024 - [JRO] Initial Programmer.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
||||
|
||||
Set_Status(0)
|
||||
Users = ''
|
||||
ErrMessage = ''
|
||||
@ -543,10 +501,8 @@ Service GetADGroupMembersByGroupName(GroupName, Domain=DOMAIN)
|
||||
Error_Services('Add', ErrMessage)
|
||||
end
|
||||
Response = Users
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetADUserAttributes
|
||||
//
|
||||
@ -557,7 +513,6 @@ end service
|
||||
// First value is the AD User Name, Second value is the Display Name, and third value is the email.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetADUserAttributes(Username, Domain=DOMAIN)
|
||||
|
||||
Set_Status(0)
|
||||
ThisUser = ''
|
||||
ErrMessage = ''
|
||||
@ -638,6 +593,5 @@ Service GetADUserAttributes(Username, Domain=DOMAIN)
|
||||
Error_Services('Add', ErrMessage)
|
||||
end
|
||||
Response = ThisUser
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -2,19 +2,10 @@ Compile function Archive_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$insert APP_INSERTS
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert RDS_EQUATES
|
||||
$Insert REACT_RUN_EQUATES
|
||||
$Insert RDS_LAYER_EQUATES
|
||||
$Insert RDS_TEST_EQUATES
|
||||
$Insert ARCHIVE_EQUATES
|
||||
|
||||
EQU COMMA$ To ','
|
||||
|
||||
Declare subroutine Change_Log_Services, Logging_Services, Error_Services, Database_Services
|
||||
Declare subroutine Change_Log_Services, Logging_Services
|
||||
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
|
||||
Declare function Database_Services, Wo_Mat_Services, Error_Services, RDS_Services
|
||||
Declare function WM_In_Services, WM_Out_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -60,174 +51,7 @@ Service ArchiveRecords()
|
||||
|
||||
End Service
|
||||
|
||||
Service GetWORelatedRecord(WOLogId)
|
||||
|
||||
ErrorMsg = ''
|
||||
If WOLogId NE '' then
|
||||
If RowExists('WO_LOG', WOLogId) then
|
||||
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WOLogId, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
ArchiveRecordId = 'WO_LOG*' : WOLogId
|
||||
ArchiveRecord = ''
|
||||
WOMatKeys = Wo_Mat_Services('GetWOMatKeys', WOLogId)
|
||||
If Error_Services('NoError') then
|
||||
WOMatQAKeys = WOMatKeys
|
||||
WOStepKey = WOLogRec<WO_LOG_WO_STEP_KEY$>
|
||||
WMInKeys = Wm_In_Services('GetWMInKeys', WOLogId)
|
||||
if Error_Services('NoError') then
|
||||
WMOutKeys = Wm_Out_Services('GetWMOutKeys', WOLogId)
|
||||
if Error_Services('NoError') then
|
||||
RDSKeys = RDS_Services('GetRDSKeys', WOLogId)
|
||||
if Error_Services('NoError') then
|
||||
ReactRunKeys = RDSKeys
|
||||
RDSLayerKeys = ''
|
||||
CleanInspKeys = ''
|
||||
for each ReactRunKey in ReactRunKeys using @VM setting iPos
|
||||
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', ReactRunKey, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
CleanInspKeys<1, -1> = ReactRunRec<REACT_RUN_CI_NO$>
|
||||
RDSLayerKeys<1, -1> = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Next ReactRunKey
|
||||
RDSTestKeys = ''
|
||||
If ErrorMsg EQ '' then
|
||||
For each RDSLayerKey in RDSLayerKeys using @VM
|
||||
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
RDSTestKeys<1, -1> = RDSLayerRec<RDS_LAYER_RDS_TEST_KEYS$>
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Next RDSLayerKey
|
||||
TWUseKeys = ''
|
||||
end
|
||||
TWUseKeys = ''
|
||||
If ErrorMsg EQ '' then
|
||||
for each RDSTestKey in RDSTestKeys using @VM
|
||||
RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKey, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
TWUseKeys<1,-1> = RDSTestRec<RDS_TEST_TW_USE_ID$>
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Next RDSTestKey
|
||||
end
|
||||
If ErrorMsg EQ '' then
|
||||
//ArchiveRecord
|
||||
//WOLogId
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOLogId
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_LOG'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
//WOStepKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOStepKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_STEP'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
//WOMatKeys
|
||||
for each WOMatKey in WOMatKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next WOMatKey
|
||||
//WOMatQAKeys
|
||||
for each WOMatQAKey in WOMatQAKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WOMatQAKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WO_MAT_QA'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next WOMatQAKey
|
||||
//WMInKeys (EpiPro Specific)
|
||||
for each WMInKey in WMInKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMInKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_IN'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next WMInKey
|
||||
//WMOutKeys (EpiPro Specific)
|
||||
for each WMOutKey in WMOutKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = WMOutKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'WM_OUT'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next WMOutKey
|
||||
//RDSKeys
|
||||
for each RDSKey in RDSKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next RDSKey
|
||||
//ReactRunKeys
|
||||
for each ReactRunKey in ReactRunKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = ReactRunKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'REACT_RUN'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next ReactRunKey
|
||||
//RDSLayerKeys
|
||||
for each RDSLayerKey in RDSLayerKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSLayerKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_LAYER'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next RDSLayerKey
|
||||
//CleanInspKeys
|
||||
for each CleanInspKey in CleanInspKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = CleanInspKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'CLEAN_INSP'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next CleanInspKey
|
||||
//RDSTestKeys
|
||||
for each RDSTestKey in RDSTestKeys using @VM
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = RDSTestKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'RDS_TEST'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
Next RDSTestKey
|
||||
//TWUseKeys
|
||||
for each TWUseKey in TWUseKeys using @VM
|
||||
if TWUseKey NE '' then
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD$, -1> = TWUseKey
|
||||
ArchiveRecord<ARCHIVE_CHILD_TABLE$, -1> = 'TW_USE'
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_ARCHIVED$, -1> = False$
|
||||
ArchiveRecord<ARCHIVE_CHILD_RECORD_DELETED$, -1> = False$
|
||||
end
|
||||
Next TWUseKey
|
||||
Database_Services('WriteDataRow', 'ARCHIVE', ArchiveRecordId, ArchiveRecord)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'WO_LOG record not found in WO_LOG table.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'WO_LOG ID was null.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
Service DearchiveRecord(Table, ID)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -233,7 +233,13 @@ Read:
|
||||
* * * * * * *
|
||||
|
||||
WMOKey = Get_Property(@WINDOW,'ID')
|
||||
IF Not(RowExists('WM_OUT',WMOKey)) THEN
|
||||
IF RowExists('WM_OUT',WMOKey) THEN
|
||||
*IF NOT(Security_Check('Work Order',READ$)) THEN
|
||||
* Send_Event(@WINDOW,'CLEAR')
|
||||
* Security_Err_Msg('Work Order',READ$)
|
||||
* RETURN
|
||||
*END
|
||||
END ELSE
|
||||
ErrMsg('WM_OUT entries may only be created from the Work Order Release process.')
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
RETURN
|
||||
@ -378,9 +384,9 @@ WONoLF:
|
||||
* * * * * * *
|
||||
|
||||
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
|
||||
Convert @Lower_Case to @Upper_Case in WONo
|
||||
Convert 'O' to '' in WONo
|
||||
|
||||
IF INDEX(WONo,'.',1) > 0 THEN
|
||||
|
||||
CONVERT '.' TO '*' IN WONo
|
||||
Set_Property(@WINDOW:'.WO_NO','DEFPROP','')
|
||||
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WONo)
|
||||
@ -1763,6 +1769,20 @@ AddMakeup:
|
||||
AvailMU_WMOKeys = ''
|
||||
UserResp = Response
|
||||
MakeupBox = ''
|
||||
|
||||
// User requested to convert the current cassette into a makeup box.
|
||||
// Verify the quantity before proceeding.
|
||||
If WMOutKey NE '' then
|
||||
Parms = ''
|
||||
Parms<1> = WMOutKey ; // Cassette to verify wafer count of.
|
||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed NE True$ then Return
|
||||
end else
|
||||
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.')
|
||||
end
|
||||
|
||||
CheckValue = 1
|
||||
|
||||
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
|
||||
@ -1980,6 +2000,12 @@ MakeupClick:
|
||||
End Case
|
||||
|
||||
If Not(InvalidRequest) then
|
||||
Parms = ''
|
||||
Parms<1> = WMOKey ; // Cassette to verify wafer count of.
|
||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed EQ True$ then
|
||||
Send_Event(CtrlEnt,'GOTFOCUS')
|
||||
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
|
||||
// Log the makeup flag change
|
||||
@ -2016,6 +2042,9 @@ MakeupClick:
|
||||
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
|
||||
END
|
||||
* End of 10/11/2010 update
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
end
|
||||
end
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
|
||||
@ -646,7 +646,7 @@ MakeUpClick:
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
If (CheckValue EQ True$) then
|
||||
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
end
|
||||
end
|
||||
end else
|
||||
@ -815,4 +815,3 @@ BatchFixit:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
@ -811,6 +811,18 @@ AddMakeup:
|
||||
MakeupBox = ''
|
||||
|
||||
// User requested to convert the current cassette into a makeup box.
|
||||
// Verify the quantity before proceeding.
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
If RDSNo NE '' then
|
||||
Parms = ''
|
||||
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
|
||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed NE True$ then return
|
||||
end else
|
||||
ErrMsg('Error starting wafer counter check. RDS No is missing.')
|
||||
end
|
||||
|
||||
RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT') ; // Get the RDS No now before the WRITE in case it is needed to toggle the index.
|
||||
|
||||
@ -827,8 +839,7 @@ AddMakeup:
|
||||
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
||||
Return
|
||||
END else
|
||||
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
end
|
||||
end
|
||||
|
||||
@ -1055,7 +1066,15 @@ MakeUpLot:
|
||||
End Case
|
||||
|
||||
If Not(InvalidRequest) then
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
If RDSNo NE '' then
|
||||
Parms = ''
|
||||
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
|
||||
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed EQ True$ then
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
If EpiCheck EQ False$ then
|
||||
IF Get_Status(errCode) THEN
|
||||
@ -1065,14 +1084,20 @@ MakeUpLot:
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
If (CheckValue EQ True$) then
|
||||
Wo_Mat_Services('MakeupFlagOn', WOMatKey)
|
||||
If Error_Services('HasError') then ErrMsg(Error_Services('GetMessage'))
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
end
|
||||
end
|
||||
end else
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
end
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
end
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
ErrMsg('WARNING: Error starting wafer counter check. RDS No is missing.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
@ -1208,3 +1233,7 @@ LogRecord:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,37 +0,0 @@
|
||||
Compile function Copy_Test_Wafer_Prod_Record_To_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Copies the given TEST_WAFER_PROD (to be renamed) PRODUCT record to the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
09/10/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
$insert TEST_WAFER_PROD_EQUATES
|
||||
|
||||
Declare function SQL_Write, SQL_Write_MV, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// Parse record into a dimensioned array for speed
|
||||
Dim Rec(5)
|
||||
MatParse Record into Rec
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "PRODUCT_ID":@VM:SQL_Format(Key, "STR")
|
||||
|
||||
// List of data fields and their values
|
||||
DataFields = "PART_NAME" :@VM:SQL_Format(Rec(TEST_WAFER_PROD_PART_NAME$), "STR"):@FM
|
||||
DataFields := "USAGE" :@VM:SQL_Format(Rec(TEST_WAFER_PROD_USAGE$), "INT"):@FM
|
||||
DataFields := "SORT_ORDER" :@VM:SQL_Format(Rec(TEST_WAFER_PROD_SORT_ORDER$), "INT")
|
||||
|
||||
// Symbolics
|
||||
|
||||
// Write the data to the SQL database
|
||||
Ans = SQL_Write(Connection, "PRODUCT", Keys, DataFields);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// Multi-valued Fields
|
||||
|
||||
Return Ans
|
||||
|
||||
@ -910,7 +910,6 @@ end service
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks)
|
||||
|
||||
ErrorMsg = ''
|
||||
If TableName NE '' AND KeyID NE '' then
|
||||
If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$
|
||||
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
|
||||
@ -944,13 +943,7 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
|
||||
end
|
||||
end
|
||||
If IgnoreAllLocks EQ False$ then
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
|
||||
@ -1109,4 +1102,3 @@ end service
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
@ -220,17 +220,10 @@ Service GetWeekNum(InputDate)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ConvertDateTimeToISO8601(DatetimeToConv)
|
||||
|
||||
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ConvertISO8601ToDateTime(ISO8601Dtm)
|
||||
|
||||
Response = IConv(ISO8601Dtm, "[SRP_DATETIME,()YYYY-MM-DD'T'hh:mm:ss.000Z]")
|
||||
Response = OConv(DatetimeToConv, "[SRP_DATETIME,()YYYY-MM-DD hh:mm:ss.000Z]")
|
||||
swap ' ' with 'T' in Response
|
||||
|
||||
end service
|
||||
|
||||
@ -240,4 +233,3 @@ end service
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,30 +0,0 @@
|
||||
Compile function Delete_Test_Wafer_Prod_Record_From_SQL(Connection, Key, Record)
|
||||
|
||||
/*****************************************************************************\
|
||||
Deletes the given TEST_WAFER_PROD (to be renamed PRODUCT) record from the MSSQL database.
|
||||
|
||||
History
|
||||
-------
|
||||
09/10/2025 DJS Original Programmer
|
||||
\*****************************************************************************/
|
||||
|
||||
Declare function SQL_Delete, SQL_Format
|
||||
Ans = ""
|
||||
|
||||
// List of key names and their values
|
||||
Keys = "PRODUCT_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, "PRODUCT", Keys)
|
||||
end
|
||||
|
||||
Return Ans
|
||||
|
||||
@ -1,109 +0,0 @@
|
||||
Compile function Dialog_Response_Log_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert LOGICAL
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert DIALOG_RESPONSE_LOG_EQUATES
|
||||
|
||||
Declare function RTI_CreateGUID, Error_Services, Datetime, Environment_Services, Logging_Services
|
||||
|
||||
Declare subroutine Database_Services, Error_Services, Logging_Services
|
||||
|
||||
Options ENTITY_TYPES = 'RDS', 'REACTOR', 'WM_OUT', 'WM_IN'
|
||||
Options RESPONSE_TYPES = 'OVERRIDE', 'METROLOGY', 'TEST_WAFER', 'HTR_LAST_BOX_TW'
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service AddDialogResponseLog(EntityId, EntityType=ENTITY_TYPES, UserId, ResponseType=RESPONSE_TYPES, Data)
|
||||
|
||||
ErrorMsg = ''
|
||||
NewDialogResponseLogId = ''
|
||||
ResponseDtm = Datetime()
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\DialogResponseLog'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LoggingDTM = LogDate : ' ' : LogTime
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' DialogResponseLogCreation.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Key Id' : @FM : 'Response Dtm' : @FM : 'Entity Id' : @FM : 'Entity Type' : @FM : 'User Id' : @FM : 'Response Type' : @FM : 'Data' : @FM : 'Creation Message'
|
||||
objAddLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
|
||||
If EntityId NE '' then
|
||||
If EntityType NE '' then
|
||||
If RowExists(EntityType, EntityId) then
|
||||
If UserId NE '' then
|
||||
If RowExists('LSL_USERS', UserId) then
|
||||
If ResponseType NE '' then
|
||||
If Data NE '' then
|
||||
NewDialogResponseLogId = RTI_CreateGUID()
|
||||
If NewDialogResponseLogId NE '' then
|
||||
NewDialogResponseLogRec = ''
|
||||
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_RESPONSE_DTM$> = ResponseDtm
|
||||
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_ENTITY_ID$> = EntityId
|
||||
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_ENTITY_TYPE$> = EntityType
|
||||
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_USER_ID$> = UserId
|
||||
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_DIALOG_TYPE$> = ResponseType
|
||||
NewDialogResponseLogRec<DIALOG_RESPONSE_LOG_DATA$> = Data
|
||||
Database_Services('WriteDataRow', 'DIALOG_RESPONSE_LOG', NewDialogResponseLogId, NewDialogResponseLogRec)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error generating a new key ID.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Data was null.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Response Type was null.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Invalid user id.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'User Id was null.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Entity Id and Entity Type was not a valid data type.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Entity Type was null.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Entity Id was null.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = NewDialogResponseLogId
|
||||
LogData<3> = OConv(ResponseDtm, 'DT')
|
||||
LogData<4> = EntityId
|
||||
LogData<5> = EntityType
|
||||
LogData<6> = UserId
|
||||
LogData<7> = ResponseType
|
||||
LogData<8> = Data
|
||||
LogData<9> = 'Success'
|
||||
Logging_Services('AppendLog', objAddLog, LogData, @RM, @FM, False$)
|
||||
end else
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = NewDialogResponseLogId
|
||||
LogData<3> = OConv(ResponseDtm, 'DT')
|
||||
LogData<4> = EntityId
|
||||
LogData<5> = EntityType
|
||||
LogData<6> = UserId
|
||||
LogData<7> = ResponseType
|
||||
LogData<8> = Data
|
||||
LogData<9> = ErrorMsg
|
||||
Logging_Services('AppendLog', objAddLog, LogData, @RM, @FM, False$)
|
||||
Error_Services('Set', ErrorMsg)
|
||||
end
|
||||
|
||||
End Service
|
||||
@ -111,6 +111,7 @@ API Lock.HEAD
|
||||
|
||||
|
||||
API Lock.POST
|
||||
|
||||
OIWizardID = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
|
||||
@ -1618,4 +1618,3 @@ end service
|
||||
// Internal GoSubs
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
@ -219,28 +219,6 @@ Service GetOnShiftUsers()
|
||||
|
||||
end service
|
||||
|
||||
Service GetCurrentShiftStartDtm()
|
||||
|
||||
CurrDate = SRP_Datetime('Date', Datetime())
|
||||
ShiftTime = SRP_DateTime('Time', CurrDtm)
|
||||
ShiftStartDtm = ''
|
||||
|
||||
Begin Case
|
||||
Case ShiftTime GE 21600 AND ShiftTime LT 64800
|
||||
//Day Shift - Same day @ 6AM
|
||||
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate, 6)
|
||||
Case ShiftTime LT 21600
|
||||
//Morning part of night shift - Prior day at 6PM
|
||||
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate - 1, 18)
|
||||
Case ShiftTime GT 64800
|
||||
//Evening Part of Night shift - Same day at 6PM
|
||||
ShiftStartDtm = SRP_Datetime('AddHours', CurrDate, 18)
|
||||
End Case
|
||||
|
||||
Response = ShiftStartDtm
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetShiftByDate(Date, GenerateFlag)
|
||||
OnShift = ''; *Return Value
|
||||
@ -571,4 +549,3 @@ Service UpdateSecurityGroups()
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
||||
@ -3,15 +3,13 @@ Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#window NDW_LOAD_UNLOAD_EXTRA
|
||||
|
||||
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
|
||||
Declare subroutine Set_Property, Rds_Services, Set_Status, Rlist, Obj_Post_Log
|
||||
Declare function Database_Services, Error_Services, Qa_Services, Reactor_Services
|
||||
Declare function Get_Property, Dialog_Box
|
||||
Declare subroutine Set_Property, Rds_Services
|
||||
Declare function Database_Services, Error_Services
|
||||
Declare function Get_Property
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
$Insert RDS_EQUATES
|
||||
$Insert REACT_LL_EQUATES
|
||||
$Insert REACTOR_EQUATES
|
||||
$Insert MSG_EQUATES
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
@ -44,102 +42,47 @@ end event
|
||||
//Signature buttons
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_1.CLICK()
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Unload Extra 1'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
|
||||
If Valid then
|
||||
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_1.CLICK()
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
OldReactorNo = RDSRec<RDS_REACTOR$>
|
||||
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Load Extra 1'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
|
||||
If Valid then
|
||||
If Qa_Services('LoadExtra1stReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
|
||||
Gosub ReactorChange
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 1 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
End else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
GoSub Refresh
|
||||
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Unload Extra 2'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
|
||||
If Valid then
|
||||
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Unload Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
GoSub Refresh
|
||||
end event
|
||||
|
||||
Event PUB_SIGN_LOAD_EX_2.CLICK()
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
OldReactorNo = RDSRec<RDS_REACTOR$>
|
||||
NewReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
|
||||
initParams = ''
|
||||
initParams<4> = 'Sign Load Extra 2'
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
|
||||
Valid = Response<1>
|
||||
|
||||
If Valid then
|
||||
If Qa_Services('LoadExtra2ndReady', RDSNo) AND (OldReactorNo NE NewReactorNo) then
|
||||
Gosub ReactorChange
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Load Extra 2 Signed!')
|
||||
end else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
End else
|
||||
Msg(@Window, Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
|
||||
GoSub Refresh
|
||||
|
||||
end event
|
||||
|
||||
//Clear Signature Buttons
|
||||
@ -200,9 +143,6 @@ Refresh:
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
If RowExists('RDS', RDSNo) then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
if Error_Services('NoError') then
|
||||
UnloadSigned = RDSRec<RDS_OPERATOR_OUT$>
|
||||
ReactorNo = RDSRec<RDS_REACTOR$>
|
||||
//Unload Extra 1
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
@ -213,7 +153,6 @@ Refresh:
|
||||
LoadExtra1UserFirstLast = xlate( 'LSL_USERS', LoadExtra1Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra1Date = Oconv(RDSRec<RDS_OP_IN_EX2_DATE$>, 'D')
|
||||
LoadExtra1Time = Oconv(RDSRec<RDS_OP_IN_EX2_TIME$>, 'MT')
|
||||
LoadExtra1Reactor = RDSRec<RDS_LOAD_EXTRA_1_REACTOR$>
|
||||
//Unload Extra 2
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
@ -224,7 +163,6 @@ Refresh:
|
||||
LoadExtra2UserFirstLast = xlate( 'LSL_USERS', LoadExtra2Signature, 'FIRST_LAST', 'X' )
|
||||
LoadExtra2Date = Oconv(RDSRec<RDS_OP_IN_EX3_DATE$>, 'D')
|
||||
LoadExtra2Time = Oconv(RDSRec<RDS_OP_IN_EX3_TIME$>, 'MT')
|
||||
LoadExtra2Reactor = RDSRec<RDS_LOAD_EXTRA_2_REACTOR$>
|
||||
|
||||
//Populate text fields
|
||||
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
|
||||
@ -239,55 +177,6 @@ Refresh:
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_USER', 'TEXT', LoadExtra2UserFirstLast)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_DATE', 'TEXT', LoadExtra2Date)
|
||||
Set_Property(@Window : '.EDL_LOAD_EX_2_TIME', 'TEXT', LoadExtra2Time)
|
||||
If LoadExtra1Reactor NE '' then
|
||||
Set_Property(@Window : '.EDL_REACTOR1', 'TEXT', LoadExtra1Reactor)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_REACTOR1', 'TEXT', ReactorNo)
|
||||
end
|
||||
If LoadExtra2Reactor NE '' then
|
||||
Set_Property(@Window : '.EDL_REACTOR2', 'TEXT', LoadExtra2Reactor)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_REACTOR2', 'TEXT', ReactorNo)
|
||||
end
|
||||
If UnloadSigned EQ '' then
|
||||
Set_Property(@Window : '.EDL_REACTOR1', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.EDL_REACTOR2', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.EDL_REACTOR1', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.EDL_REACTOR2', 'ENABLED', False$)
|
||||
end
|
||||
If UnloadExtra1Signature NE '' then
|
||||
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_1', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_1', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_1', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_1', 'ENABLED', False$)
|
||||
end
|
||||
If UnloadExtra2Signature NE '' then
|
||||
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_2', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_2', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.PUB_SIGN_UNLOAD_EX_2', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_UNLOAD_EX_2', 'ENABLED', False$)
|
||||
end
|
||||
If LoadExtra1Signature NE '' then
|
||||
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_1', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_1', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_1', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_1', 'ENABLED', False$)
|
||||
end
|
||||
If LoadExtra2Signature NE '' then
|
||||
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_2', 'ENABLED', False$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_2', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window : '.PUB_SIGN_LOAD_EX_2', 'ENABLED', True$)
|
||||
Set_Property(@Window : '.PUB_CLEAR_LOAD_EX_2', 'ENABLED', False$)
|
||||
end
|
||||
end else
|
||||
Msg(@Window, 'Error reading RDS record from database.')
|
||||
end
|
||||
|
||||
end else
|
||||
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
|
||||
Post_Event(@Window, 'CLOSE')
|
||||
@ -295,116 +184,4 @@ Refresh:
|
||||
|
||||
return
|
||||
|
||||
ReactorChange:
|
||||
|
||||
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
if Error_Services('NoError') then
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
ReactorNo = ''
|
||||
LLChosen = ''
|
||||
ChangePermitted = False$
|
||||
Begin Case
|
||||
|
||||
Case Control EQ 'PUB_SIGN_LOAD_EX_1'
|
||||
ReactorNo = Get_Property(@Window : '.EDL_REACTOR1', 'TEXT')
|
||||
ReactorField = RDS_LOAD_EXTRA_1_REACTOR$
|
||||
Case Control EQ 'PUB_SIGN_LOAD_EX_2'
|
||||
ReactorNo = Get_Property(@Window : '.EDL_REACTOR2', 'TEXT')
|
||||
ReactorField = RDS_LOAD_EXTRA_2_REACTOR$
|
||||
Case Otherwise$
|
||||
|
||||
End Case
|
||||
|
||||
If ReactorNo NE '' then
|
||||
PickPlace = Xlate('REACTOR', ReactorNo, 'PICK_PLACE', 'X')
|
||||
If (Reactor_Services('GetReactorAvailChamberCount', ReactorNo) NE 0) OR (PickPlace EQ False$) then
|
||||
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||
GoSub ClearCursors
|
||||
Set_Status(0)
|
||||
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||
SchedReactors = ''
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext SchedReactor else EOF = True$
|
||||
Until EOF
|
||||
SchedReactors<0, -1> = SchedReactor
|
||||
Repeat
|
||||
|
||||
Locate ReactorNo in SchedReactors using @VM setting vPos then
|
||||
If PickPlace EQ True$ then
|
||||
LLDisabled = XLATE('REACTOR', ReactorNo, 'ACTIVE_LL_DISABLED', 'X')
|
||||
IF LLDisabled NE '' then
|
||||
ReactLLRec = Database_Services('ReadDataRow', 'REACT_LL', LLDisabled)
|
||||
SideDisabled = ReactLLRec<REACT_LL_DISABLED$>
|
||||
QualMode = ReactLLRec<REACT_LL_QUAL_MODE$>
|
||||
Begin Case
|
||||
Case SideDisabled EQ 'L'
|
||||
LLChosen = 'R'
|
||||
Case SideDisabled EQ 'R'
|
||||
LLChosen = 'L'
|
||||
End Case
|
||||
end else
|
||||
Def = ''
|
||||
Def<MCAPTION$> = 'Select Load Lock'
|
||||
Def<MTYPE$> = 'BLeft,Right'
|
||||
Def<MTEXT$> = 'Please select a load lock.'
|
||||
Def<MMODAL$> = 'A'
|
||||
LLResponse = Msg(@Window, Def)
|
||||
Begin Case
|
||||
Case LLResponse EQ 1
|
||||
LLChosen = 'L'
|
||||
Case LLResponse EQ 2
|
||||
LLChosen = 'R'
|
||||
End Case
|
||||
end
|
||||
If LLChosen NE '' then
|
||||
ChangePermitted = True$
|
||||
end else
|
||||
Error_Services('Add', 'You must select a load lock for this lot.')
|
||||
end
|
||||
end else
|
||||
ChangePermitted = True$
|
||||
end
|
||||
end else
|
||||
Swap @VM with ',' in SchedReactors
|
||||
Error_Services('Add', 'Assigned reactor, ':ReactorNo:', does not equal any scheduled reactor(s), ':SchedReactors:'.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', ReactorNo: 'does not have the capacity necessary for this lot.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Invalid Reactor number.')
|
||||
end
|
||||
If ChangePermitted then
|
||||
RDSRec<RDS_REACTOR$> = ReactorNo
|
||||
RDSRec<ReactorField> = ReactorNo
|
||||
RDSRec<RDS_LOAD_LOCK_SIDE$> = LLChosen
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Msg(@Window, 'Reactor successfully changed!')
|
||||
end else
|
||||
Msg(@Window, 'Error changing reactor!')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Msg(@Window, 'Error reading RDS from database!')
|
||||
end
|
||||
|
||||
|
||||
return
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClearCursors:
|
||||
For counter = 0 to 8
|
||||
ClearSelect counter
|
||||
Next counter
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -50,7 +50,7 @@ Equ HEIGHT$ to 4
|
||||
|
||||
Declare function GetCommandLine, MemberOf, obj_Install, obj_Notes_Sent, FindWindow, ShowWindow, Next_Key
|
||||
Declare function Environment_Services, Reactor_Services, Database_Services, obj_Tool, Messaging_Services, SRP_JSON
|
||||
Declare function Notes_Services, RTI_Xlate_Controller, Test_Run_Services, LSL_Users_Services, Datetime
|
||||
Declare function Notes_Services, RTI_Xlate_Controller
|
||||
Declare subroutine Set_Env, obj_Appwindow, Get_BMP_Info, obj_Login, obj_Calib_List, End_Window, Start_Window, Next_Key
|
||||
Declare subroutine Database_Services, obj_React_Status, Obj_React_Mode, obj_Tool_Log, RList, Messaging_Services, RTP27
|
||||
Declare subroutine Notes_Services, Obj_Note_Ptrs, Comm_Note_Ptrs, SRP_Run_Command, PlaceDialog, GetEngineVersion
|
||||
@ -404,16 +404,6 @@ Event WINDOW.TIMER()
|
||||
|
||||
Gosub SetSnoozeButtonState
|
||||
|
||||
CurrDtm = Datetime()
|
||||
CurrShiftStartDtm = LSL_USERS_SERVICES('GetCurrentShiftStartDtm', CurrDtm)
|
||||
|
||||
TWStats = Test_Run_Services('GetTestWaferUsageStats', @USER4, CurrShiftStartDtm, Datetime())
|
||||
LastUsed = TWStats<1>
|
||||
LastUsed = Oconv(LastUsed, 'DT2/^H')
|
||||
QtyUsed = TWStats<2>
|
||||
Set_Property(@Window: '.LBL_LAST_TW_USED', 'TEXT', 'TW Last Used by User: ' :LastUsed)
|
||||
Set_Property(@Window: '.LBL_TW_USED', 'TEXT', 'TW Used by User: ' :QtyUsed)
|
||||
|
||||
Set_Property(@WINDOW:'.CURRENT_TIME','TEXT','Current Time: ':OCONV( TIME(), 'MTHS' ))
|
||||
Set_Property(@WINDOW:'.CURRENT_DATE','TEXT','Date: ':OCONV( DATE(), 'D2/' ))
|
||||
If Get_Property(@Window, '@CLOSE') then
|
||||
@ -863,5 +853,3 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -50,7 +50,6 @@ Compile function NDW_MATERIAL_TRACK_PRO_REPORT_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
|
||||
Declare function Form_Services, Database_Services, RTI_Task_Submit, RTI_Task_Status, MemberOf
|
||||
Declare subroutine SRP_Show_Window, Send_Message, Set_Property, Database_Services, Material_Track, Report_Services
|
||||
Declare subroutine PlaceDialog
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert LOGICAL
|
||||
@ -98,7 +97,8 @@ Event WINDOW.CREATE(CreateParam)
|
||||
GoSub Setup_OLE_Controls
|
||||
GoSub EnableGenerateReportButton
|
||||
|
||||
PlaceDialog(-2, -2)
|
||||
FormSize = ''
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
|
||||
|
||||
End Event
|
||||
|
||||
|
||||
@ -39,6 +39,8 @@ $Insert POPUP_EQUATES
|
||||
$Insert NOTIFICATION_EQUATES
|
||||
$Insert LSL_USERS_EQUATES
|
||||
|
||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
|
||||
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
|
||||
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
|
||||
|
||||
@ -641,4 +643,3 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -45,7 +45,8 @@ EQU COL$PMID to 1
|
||||
EQU COL$DESC to 2
|
||||
EQU COL$DATECOMP to 3
|
||||
EQU COL$DATEDUE to 4
|
||||
EQU COL$USER to 5
|
||||
EQU COL$LATE to 5
|
||||
EQU COL$USER to 6
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
@ -101,7 +102,7 @@ Event PUB_EXPORT_TO_EXCEL.CLICK()
|
||||
|
||||
if FilePath NE '' then
|
||||
PmHistoryOutput = ''
|
||||
PmHistoryOutput<1> = 'PM ID' : @VM : 'Description' : @VM : 'Complete Date' : @VM : 'Due Date' : @VM : 'User'
|
||||
PmHistoryOutput<1> = 'PM ID' : @VM : 'Description' : @VM : 'Complete Date' : @VM : 'Due Date' : @VM : 'Late' : @VM : 'User'
|
||||
PMHistoryArray = Get_Property(@Window : '.OLE_HIST_TABLE', "OLE.ARRAY")
|
||||
PMHistoryArray = SRP_Array('Rotate',PMHistoryArray)
|
||||
for each DataRow in PmHistoryArray using @FM setting dPos
|
||||
@ -151,10 +152,13 @@ RunReport:
|
||||
PMRec = Database_Services('ReadDataRow', 'PM', PMId)
|
||||
SchedDtm = SRP_Datetime('Combine', PMRec<PM_SCHED_DT$>, PMRec<PM_SCHED_TM$>)
|
||||
DueByDTM = obj_PM_Spec('LateStart',PMId:@RM:PMSpecRecord)
|
||||
Late = Xlate('PM', PMId, 'LATE', 'X')
|
||||
If Late then Late = 'Yes' else Late = 'No'
|
||||
PMHistoryArray<pPos, COL$PMID> = PMId
|
||||
PMHistoryArray<pPos, COL$DESC> = PMDescription
|
||||
PMHistoryArray<pPos, COL$DATECOMP> = OCONV(PMRec<PM_COMP_DTM$>, 'DT')
|
||||
PMHistoryArray<pPos, COL$DATEDUE> = OCONV(SchedDtm, 'DT')
|
||||
PMHistoryArray<pPos, COL$LATE> = Late
|
||||
PMHistoryArray<pPos, COL$USER> = OConv(PMRec<PM_COMP_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]')
|
||||
While Msg(@window, MsgUp, pPos, MSGINSTUPDATE$) ; * update the gauge and check if cancel was pressed
|
||||
Next PMId
|
||||
@ -187,9 +191,9 @@ Setup_OLE_Controls:
|
||||
EdtTableCtrl = @Window : '.OLE_HIST_TABLE'
|
||||
Set_Property(EdtTableCtrl, 'OLE.Redraw', False$)
|
||||
//Set up columns
|
||||
Set_Property(EdtTableCtrl, "OLE.Dimension", 5);*Define number of columns
|
||||
Set_Property(EdtTableCtrl, "OLE.Dimension", 6);*Define number of columns
|
||||
|
||||
HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Date Completed':@VM:'Sched Due':@VM:'User Completed'; *Define the column header titles
|
||||
HeaderTitles = 'PM ID':@VM:'Desc':@VM:'Date Completed':@VM:'Sched Due':@VM:'Late':@VM:'User Completed'; *Define the column header titles
|
||||
Set_Property(EdtTableCtrl, "OLE.TitleList", HeaderTitles); *Set the column titles
|
||||
|
||||
//Set the column Sizes
|
||||
@ -199,7 +203,7 @@ Setup_OLE_Controls:
|
||||
ColSize<1> = 45
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$PMID:"]", ColSize)
|
||||
//Column 2
|
||||
ColSize<1> = 250
|
||||
ColSize<1> = 200
|
||||
ColSize<4> = True$
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DESC:"]", ColSize)
|
||||
ColSize<4> = False$
|
||||
@ -207,10 +211,13 @@ Setup_OLE_Controls:
|
||||
ColSize<1> = 120
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATECOMP:"]", ColSize)
|
||||
//Column 4
|
||||
ColSize<1> = 135
|
||||
ColSize<1> = 110
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$DATEDUE:"]", ColSize)
|
||||
//Column 5
|
||||
ColSize<1> = 185
|
||||
ColSize<1> = 50
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$LATE:"]", ColSize)
|
||||
//Column 6
|
||||
ColSize<1> = 160
|
||||
Set_Property(EdtTableCtrl, "OLE.DataColumn[":COL$USER:"]", ColSize)
|
||||
|
||||
Set_Property(EdtTableCtrl, 'OLE.Border', 'XP Flat')
|
||||
@ -227,4 +234,3 @@ Setup_OLE_Controls:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
@ -39,6 +39,8 @@ $Insert POPUP_EQUATES
|
||||
$Insert SEC_GROUPS_EQUATES
|
||||
$Insert LSL_USERS_EQUATES
|
||||
|
||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
|
||||
Declare function Admin_User, Database_Services, Error_Services, Active_Directory_Services, SRP_Array
|
||||
Declare subroutine PlaceDialog, Error_Services, Database_Services, Btree.Extract, ErrMsg
|
||||
|
||||
@ -724,4 +726,3 @@ UnlockRec:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
@ -97,6 +97,16 @@ 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 = ''
|
||||
@ -105,6 +115,8 @@ Event WINDOW.CREATE(CreateParam)
|
||||
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')
|
||||
@ -321,6 +333,8 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
Begin Case
|
||||
Case RowExists('RDS', CassetteID)
|
||||
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')
|
||||
@ -333,9 +347,14 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||
end
|
||||
|
||||
Case RowExists('WM_OUT', CassetteID)
|
||||
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')
|
||||
@ -347,6 +366,9 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
end
|
||||
End Case
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
@ -416,53 +438,7 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
Cnt = DCount(ScanData, '|')
|
||||
If Cnt EQ 2 then
|
||||
WaferSize = Field(ScanData, '|', 1)
|
||||
Area = Field(ScanData, '|', 2) ; // This is a proxy for the operation being performed
|
||||
|
||||
If Area EQ 'FQA' then
|
||||
CassetteID = Get_Property(@Window:'.EDL_CASS_ID', 'TEXT')
|
||||
Begin Case
|
||||
Case RowExists('RDS', CassetteID)
|
||||
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 = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
|
||||
end
|
||||
Case RowExists('WM_OUT', CassetteID)
|
||||
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 = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
|
||||
end
|
||||
End Case
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
|
||||
Area = Field(ScanData, '|', 2)
|
||||
Def = ""
|
||||
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
|
||||
Def<MTYPE$> = "U"
|
||||
@ -555,16 +531,17 @@ Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Invalid Tool Barcode Scan.'
|
||||
end
|
||||
end else
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = OConv(Datetime(), 'DT2/^H')
|
||||
LogData<2> = @User4
|
||||
LogData<3> = 'Verification process canceled'
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
End_Dialog(@Window, False$)
|
||||
end
|
||||
If ErrorMsg NE '' then
|
||||
@ -647,3 +624,9 @@ ClearForm:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -20,9 +20,9 @@ COMPILE FUNCTION obj_Post_Log(Method,Parms)
|
||||
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services
|
||||
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount, SRP_Datetime
|
||||
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
|
||||
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services, Database_Services
|
||||
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services
|
||||
|
||||
|
||||
$INSERT POST_LOG_EQUATES
|
||||
@ -222,44 +222,12 @@ Post:
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
Set_Status(0)
|
||||
|
||||
Tablename = Field(UFParms, @RM, 1, 1)
|
||||
Key = Field(UFParms, @RM, 2, 1)
|
||||
Database_Services('ReleaseKeyIDLock', Tablename, Key)
|
||||
|
||||
CurrDtm = Datetime()
|
||||
FailureNotificationSent = PostLogRec<POST_LOG_FAILURE_NOTIFICATION_SENT$>
|
||||
FailureNotificationDtm = PostLogRec<POST_LOG_FAILURE_NOTIFICATION_DTM$>
|
||||
If FailureNotificationDtm NE '' then
|
||||
SendReminder = ( SRP_Datetime('HourSpan', FailureNotificationDtm, CurrDtm) GE 1 )
|
||||
end else
|
||||
SendReminder = False$
|
||||
end
|
||||
If ( (FailureNotificationSent NE True$) or (SendReminder EQ True$) ) then
|
||||
PostLogRec<POST_LOG_FAILED$> = True$
|
||||
PostLogRec<POST_LOG_FAILURE_REASON$> = errCode
|
||||
PostLogRec<POST_LOG_FAILURE_NOTIFICATION_SENT$> = True$
|
||||
PostLogRec<POST_LOG_FAILURE_NOTIFICATION_DTM$> = CurrDtm
|
||||
Database_Services('WriteDataRow', 'POST_LOG', PostLogKey, PostLogRec, True$, False$, False$)
|
||||
|
||||
// Notify OI_SYSADMIN group
|
||||
Server = Environment_Services('GetServer')
|
||||
Recipients = ''
|
||||
SentFrom = 'SYSTEM'
|
||||
Subject = 'Obj_Post_Log("Post") Error'
|
||||
Message = OConv(CurrDtm, 'DT2/^H')
|
||||
Message<2> = 'Error on server ':Server
|
||||
Message<3> = 'Failed to write record ':Tablename:' ':Key:' . Error_Services error message: ':errCode
|
||||
Swap @FM with \0D0A\ in Message
|
||||
AttachWindow = ''
|
||||
AttachKey = ''
|
||||
SendToGroup = 'OI_SYSADMIN'
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
end else
|
||||
Database_Services('ReleaseKeyIDLock', 'POST_LOG', PostLogKey)
|
||||
end
|
||||
|
||||
obj_Tables('UnlockRec',PlParms)
|
||||
obj_Tables('UnlockRec',UFParms)
|
||||
ClearSelect CursorVar
|
||||
// 4/22/19 Added unlock statement to prevent POST_LOG service from locking up
|
||||
Unlock hSysLists, ServiceKeyID else Null
|
||||
RETURN
|
||||
END ELSE
|
||||
obj_Tables('DeleteRec',PlParms)
|
||||
END
|
||||
|
||||
@ -18,7 +18,6 @@ COMPILE FUNCTION obj_RDS(Method,Parms)
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
|
||||
DECLARE FUNCTION obj_RDS2, obj_RDS_Test, obj_WO_Mat, obj_Clean_Insp, obj_PRS_Prop, Database_Services, RDS_Services
|
||||
DECLARE FUNCTION Return_To_Fab_Services
|
||||
DECLARE FUNCTION Logging_Services, Environment_Services, Error_Services, Signature_Services, Lot_Services, Supplement_Services
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In
|
||||
DECLARE SUBROUTINE Btree.Extract, RDS_React_Run, Environment_Services, Logging_Services, Error_Services, Send_Info
|
||||
@ -136,13 +135,6 @@ CurrStatus:
|
||||
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
||||
FOR R = 1 TO RDSCnt
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNos<R>)
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
ReturnVals<1,R> = 'RTF' ;* Open RTF on RDS *
|
||||
GOTO StatusHere
|
||||
END
|
||||
|
||||
NCRStatuses = XLATE('NCR',RDSRec<RDS_NCR_KEYS$>,7,'X')
|
||||
|
||||
IF INDEX(NCRStatuses,'O',1) THEN
|
||||
@ -1250,4 +1242,3 @@ CalcThickTarget:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ COMPILE FUNCTION obj_Reactor_Log(Method,Parms)
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, obj_React_Item_Hist, Update_Index, obj_Post_Log
|
||||
Declare subroutine Error_Services, Database_Services, React_Item_Services, Reactor_Services
|
||||
Declare subroutine Error_Services, Database_Services, React_Item_Services
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, obj_React_Item, obj_Calendar, Database_Services
|
||||
|
||||
|
||||
@ -117,7 +117,7 @@ PostReactItems:
|
||||
InstRINos = ReactorLogRec<REACTOR_LOG_INST_RI_NO$>
|
||||
|
||||
CurrRINos = XLATE('REACTOR_LOG', RLNo, 'CURR_RI_NO', 'X')
|
||||
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
|
||||
|
||||
//Check to make sure that everything is valid before adding or removing anything
|
||||
ValidationFailureReason = ''
|
||||
for each InstRINo in InstRINos using @VM
|
||||
@ -125,23 +125,6 @@ PostReactItems:
|
||||
If InstRIRec<REACT_ITEM_RETIRE_DT$> NE '' then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : ' because its status is retired!'
|
||||
end
|
||||
If InstRIRec<REACT_ITEM_RI_TYPE$> EQ 'S' then
|
||||
If InstRIRec<REACT_ITEM_PKT_SIZE$> EQ '' then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Pocket/Ring Size cannot be empty for Susceptor Reactor Items.'
|
||||
end
|
||||
If InstRIRec<REACT_ITEM_PKT_QTY$> EQ '' then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Pocket Qty cannot be empty for Susceptor Reactor Items.'
|
||||
end
|
||||
end
|
||||
If (InstRIRec<REACT_ITEM_RI_TYPE$> NE 'RE') AND (InstRIRec<REACT_ITEM_RI_TYPE$> NE 'LE') then
|
||||
If InstRIRec<REACT_ITEM_SERIAL_NO$> EQ '' then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Serial Number cannot be blank to non-elevator Reactor Items.'
|
||||
end
|
||||
end
|
||||
// Only check first three characters so that ASM parts can be installed in an ASM+ reactor
|
||||
If (InstRIRec<REACT_ITEM_PART_TYPE$>[1, 3] NE ReactorType[1, 3]) then
|
||||
ValidationFailureReason = 'Unable to install Reactor Item No. ' : InstRINo : '. Reactor Type must match Reactor Item Part Type.'
|
||||
end
|
||||
Until ValidationFailureReason NE ''
|
||||
Next InstRINo
|
||||
|
||||
@ -164,16 +147,8 @@ PostReactItems:
|
||||
|
||||
obj_React_Item_Hist('Install',oriParms)
|
||||
|
||||
IF Not(Get_Status(errCode)) THEN
|
||||
RIKey = InstRINos<1,I>
|
||||
RIRec = Xlate('REACT_ITEM', RIKey, '', 'X')
|
||||
RIType = RIRec<REACT_ITEM_RI_TYPE$>
|
||||
If RIType EQ 'S' then
|
||||
PktSize = Xlate('REACT_ITEM', RIKey, 'PKT_SIZE_DESC', 'X')
|
||||
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
|
||||
Reactor_Services('SetWaferSize', ReactNo, PktSize)
|
||||
Reactor_Services('SetPocketQty', ReactNo, PktQty)
|
||||
end
|
||||
IF Get_Status(errCode) THEN
|
||||
|
||||
END
|
||||
END ;* End of LOCATE check for Install RI number already in the reactor
|
||||
|
||||
|
||||
@ -20,13 +20,13 @@ DECLARE FUNCTION Printer_Select, Set_Printer, obj_Install, Direct_Print, Environ
|
||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Direct_Print
|
||||
DECLARE SUBROUTINE ErrMsg, Btree.Extract
|
||||
|
||||
$INSERT LOGICAL
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT REACT_ITEM_EQUATES
|
||||
$INSERT REACT_ITEM_HIST_EQUATES
|
||||
$INSERT REACTOR_EQUATES
|
||||
$INSERT REACT_READS_EQUATES
|
||||
|
||||
|
||||
EQU PI$LEFT TO 1
|
||||
EQU PI$TOP TO 2
|
||||
EQU PI$RIGHT TO 3
|
||||
@ -35,9 +35,12 @@ EQU PI$WIDTH TO 5
|
||||
EQU PI$HEIGHT TO 6
|
||||
EQU PI$SIZE TO 7
|
||||
|
||||
|
||||
|
||||
EQU CRLF$ TO \0D0A\
|
||||
EQU TAB$ TO CHAR(9)
|
||||
|
||||
|
||||
ErrTitle = 'Error in Stored Procedure "obj_ReactItem"'
|
||||
ErrorMsg = ''
|
||||
|
||||
@ -78,35 +81,35 @@ RETURN Result
|
||||
CurrStatus:
|
||||
* * * * * * *
|
||||
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
|
||||
Parms = '':@RM:RINo:@RM:''
|
||||
HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one
|
||||
HistKey = HistKeys<1,1> ;* This is the most recent
|
||||
Parms = '':@RM:RINo:@RM:''
|
||||
HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one
|
||||
HistKey = HistKeys<1,1> ;* This is the most recent
|
||||
|
||||
LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X')
|
||||
LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X')
|
||||
|
||||
InstDTM = FIELD(HistKey,'*',3)
|
||||
RemDTM = LastInstallRec<REACT_ITEM_HIST_REM_DTM$>
|
||||
InstDTM = FIELD(HistKey,'*',3)
|
||||
RemDTM = LastInstallRec<REACT_ITEM_HIST_REM_DTM$>
|
||||
|
||||
RetireDt = ReactItemRec<REACT_ITEM_RETIRE_DT$>
|
||||
Notes = ReactItemRec<REACT_ITEM_NOTES$>
|
||||
RetireDt = ReactItemRec<REACT_ITEM_RETIRE_DT$>
|
||||
Notes = ReactItemRec<REACT_ITEM_NOTES$>
|
||||
|
||||
CONVERT @LOWER_CASE TO @UPPER_CASE IN NOtes
|
||||
CONVERT @LOWER_CASE TO @UPPER_CASE IN NOtes
|
||||
|
||||
|
||||
BEGIN CASE
|
||||
BEGIN CASE
|
||||
CASE RetireDt NE '' ; Result = 'R'
|
||||
CASE InstDTM NE '' AND RemDTM = '' ; Result = 'I'
|
||||
CASE InstDTM NE '' AND RemDTM NE '' OR INDEX(Notes,'USED',1) ; Result = 'U'
|
||||
CASE InstDTM = '' AND RemDTM = '' ; Result = 'N'
|
||||
CASE Otherwise$ ; Result = '?'
|
||||
END CASE
|
||||
CASE 1 ; Result = '?'
|
||||
END CASE
|
||||
|
||||
RETURN
|
||||
|
||||
@ -115,28 +118,28 @@ RETURN
|
||||
ServiceHrs:
|
||||
* * * * * * *
|
||||
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
|
||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||
|
||||
IF LastRemDTM = '' THEN
|
||||
IF LastRemDTM = '' THEN
|
||||
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
||||
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_HRS_DTM$,'X')
|
||||
LastReadHrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_HOURS$,'X')
|
||||
END ELSE
|
||||
END ELSE
|
||||
LastReadHrs = ''
|
||||
END
|
||||
END
|
||||
|
||||
Ans = ''
|
||||
Ans = ''
|
||||
|
||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_HRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_HRS$> NE '')
|
||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_HRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_HRS$> NE '')
|
||||
|
||||
FOR I = 1 TO IRCnt
|
||||
FOR I = 1 TO IRCnt
|
||||
|
||||
RemReactHrs = ReactItemRec<REACT_ITEM_REM_REACT_HRS$,I>
|
||||
InstReactHrs = ReactItemRec<REACT_ITEM_INST_REACT_HRS$,I>
|
||||
@ -155,9 +158,9 @@ ServiceHrs:
|
||||
END ELSE
|
||||
Ans<1,I> = ''
|
||||
END
|
||||
NEXT I
|
||||
NEXT I
|
||||
|
||||
Result = Ans
|
||||
Result = Ans
|
||||
|
||||
RETURN
|
||||
|
||||
@ -166,31 +169,31 @@ RETURN
|
||||
ServiceWfrs:
|
||||
* * * * * * *
|
||||
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
|
||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||
|
||||
IF LastRemDTM = '' THEN
|
||||
IF LastRemDTM = '' THEN
|
||||
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
||||
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_WFRS_DTM$,'X')
|
||||
LastReadWfrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_WAFER_CNT$,'X')
|
||||
END ELSE
|
||||
END ELSE
|
||||
LastReadWfrs = ''
|
||||
END
|
||||
END
|
||||
|
||||
Ans = ''
|
||||
Ans = ''
|
||||
|
||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_WFRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_WFRS$> NE '')
|
||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_WFRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_WFRS$> NE '')
|
||||
|
||||
|
||||
IF IRCnt = 0 THEN
|
||||
IF IRCnt = 0 THEN
|
||||
Ans = LastReadWfrs
|
||||
END ELSE
|
||||
END ELSE
|
||||
|
||||
FOR I = 1 TO IRCnt
|
||||
|
||||
@ -208,9 +211,9 @@ ServiceWfrs:
|
||||
END
|
||||
|
||||
NEXT I
|
||||
END
|
||||
END
|
||||
|
||||
Result = Ans
|
||||
Result = Ans
|
||||
|
||||
RETURN Result
|
||||
|
||||
@ -219,20 +222,20 @@ RETURN Result
|
||||
Serial_RINo:
|
||||
* * * * * * *
|
||||
|
||||
* Temporary for conversion
|
||||
* Temporary for conversion
|
||||
|
||||
SerialNos = Parms[1,@RM]
|
||||
SerialNos = Parms[1,@RM]
|
||||
|
||||
IF SerialNos = '' THEN RETURN
|
||||
IF SerialNos = '' THEN RETURN
|
||||
|
||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '')
|
||||
snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '')
|
||||
|
||||
FOR I = 1 TO snCnt
|
||||
FOR I = 1 TO snCnt
|
||||
SerialNo = SerialNos<1,I>
|
||||
IF SerialNo NE '' THEN
|
||||
|
||||
@ -251,7 +254,7 @@ Serial_RINo:
|
||||
|
||||
Result<1,I> = RINo
|
||||
END ;* End of check for null SerialNo
|
||||
NEXT I
|
||||
NEXT I
|
||||
|
||||
RETURN
|
||||
|
||||
@ -260,30 +263,30 @@ RETURN
|
||||
ServicePCRC:
|
||||
* * * * * * *
|
||||
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
|
||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||
LastRemDtm = ReactItemRec<REACT_ITEM_REM_DTM$,1>
|
||||
|
||||
IF LastRemDTM = '' THEN
|
||||
IF LastRemDTM = '' THEN
|
||||
ReactNo = ReactItemRec<REACT_ITEM_REACT_NO$,1>
|
||||
LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_WFRS_DTM$,'X')
|
||||
LastReadWfrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_WAFER_CNT$,'X')
|
||||
END ELSE
|
||||
END ELSE
|
||||
LastReadWfrs = ''
|
||||
END
|
||||
END
|
||||
|
||||
Ans = ''
|
||||
Ans = ''
|
||||
|
||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_WFRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_WFRS$> NE '')
|
||||
IRCnt = COUNT(ReactItemRec<REACT_ITEM_INST_REACT_WFRS$>,@VM) + (ReactItemRec<REACT_ITEM_INST_REACT_WFRS$> NE '')
|
||||
|
||||
IF IRCnt = 0 THEN
|
||||
IF IRCnt = 0 THEN
|
||||
Ans = LastReadWfrs
|
||||
END ELSE
|
||||
END ELSE
|
||||
FOR I = 1 TO IRCnt
|
||||
|
||||
RemReactWfrs = ReactItemRec<REACT_ITEM_REM_REACT_WFRS$,I>
|
||||
@ -300,9 +303,9 @@ ServicePCRC:
|
||||
END
|
||||
|
||||
NEXT I
|
||||
END
|
||||
END
|
||||
|
||||
Result = Ans
|
||||
Result = Ans
|
||||
|
||||
RETURN
|
||||
|
||||
@ -311,21 +314,21 @@ RETURN
|
||||
ReactWfrCnt:
|
||||
* * * * * * *
|
||||
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
|
||||
|
||||
ReactNos = ReactItemRec<REACT_ITEM_REACT_NO$>
|
||||
ReactNos = ReactItemRec<REACT_ITEM_REACT_NO$>
|
||||
|
||||
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
|
||||
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
|
||||
|
||||
Ans = ''
|
||||
Ans = ''
|
||||
|
||||
FOR I = 1 TO ReactCnt
|
||||
FOR I = 1 TO ReactCnt
|
||||
ReactNo = ReactNos<1,I>
|
||||
InstWfrCnt = ReactItemRec<REACT_ITEM_INST_REACT_WFRS$,I>
|
||||
RemWfrCnt = ReactItemRec<REACT_ITEM_REM_REACT_WFRS$,I>
|
||||
@ -347,9 +350,9 @@ ReactWfrCnt:
|
||||
|
||||
Ans<1,I> = Delta
|
||||
|
||||
NEXT I
|
||||
NEXT I
|
||||
|
||||
Result = Ans
|
||||
Result = Ans
|
||||
|
||||
RETURN
|
||||
|
||||
@ -358,20 +361,20 @@ RETURN
|
||||
ReactHrs:
|
||||
* * * * * * *
|
||||
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
|
||||
ReactNos = ReactItemRec<REACT_ITEM_REACT_NO$>
|
||||
ReactNos = ReactItemRec<REACT_ITEM_REACT_NO$>
|
||||
|
||||
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
|
||||
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
|
||||
|
||||
Ans = ''
|
||||
Ans = ''
|
||||
|
||||
FOR I = 1 TO ReactCnt
|
||||
FOR I = 1 TO ReactCnt
|
||||
ReactNo = ReactNos<1,I>
|
||||
InstHrs = ReactItemRec<REACT_ITEM_INST_REACT_HRS$,I>
|
||||
RemHrs = ReactItemRec<REACT_ITEM_REM_REACT_HRS$,I>
|
||||
@ -392,31 +395,32 @@ ReactHrs:
|
||||
|
||||
Ans<1,I> = Delta
|
||||
|
||||
NEXT I
|
||||
NEXT I
|
||||
|
||||
Result = Ans
|
||||
Result = Ans
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Serial_GRNo:
|
||||
* * * * * * *
|
||||
|
||||
* Temporary for conversion
|
||||
* Temporary for conversion
|
||||
|
||||
SerialNos = Parms[1,@RM]
|
||||
SerialNos = Parms[1,@RM]
|
||||
|
||||
IF SerialNos = '' THEN RETURN
|
||||
IF SerialNos = '' THEN RETURN
|
||||
|
||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '')
|
||||
snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '')
|
||||
|
||||
FOR I = 1 TO snCnt
|
||||
FOR I = 1 TO snCnt
|
||||
SerialNo = SerialNos<1,I>
|
||||
IF SerialNo NE '' THEN
|
||||
SearchString = 'SERIAL':@VM:SerialNo:@FM
|
||||
@ -430,7 +434,9 @@ Serial_GRNo:
|
||||
|
||||
Result<1,I> = RINo
|
||||
END ;* End of check for null SerialNo
|
||||
NEXT I
|
||||
NEXT I
|
||||
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
@ -439,32 +445,32 @@ RETURN
|
||||
SplitSerial:
|
||||
* * * * * * *
|
||||
|
||||
PartNo = Parms[1,@RM]
|
||||
PartNo = Parms[1,@RM]
|
||||
|
||||
|
||||
IF PartNo = '' THEN ErrorMsg = 'Null Parameter "PartNo" passed to routine. (':Method:')'
|
||||
IF PartNo = '' THEN ErrorMsg = 'Null Parameter "PartNo" passed to routine. (':Method:')'
|
||||
|
||||
IF ErrorMsg NE '' THEN RETURN
|
||||
IF ErrorMsg NE '' THEN RETURN
|
||||
|
||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||
OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE
|
||||
DEBUG
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
SelectSent = 'SERIAL':@VM:'[':PartNo:']':@FM
|
||||
Option = ''
|
||||
Flag = ''
|
||||
SelectSent = 'SERIAL':@VM:'[':PartNo:']':@FM
|
||||
Option = ''
|
||||
Flag = ''
|
||||
|
||||
Btree.Extract(SelectSent,'REACT_ITEM',DictReactItem,RINos,Option,Flag)
|
||||
Btree.Extract(SelectSent,'REACT_ITEM',DictReactItem,RINos,Option,Flag)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
grCnt = COUNT(RINos,@VM) + (RINos NE '')
|
||||
grCnt = COUNT(RINos,@VM) + (RINos NE '')
|
||||
|
||||
FOR I = 1 TO grCnt
|
||||
FOR I = 1 TO grCnt
|
||||
RINo = RINos<1,I>
|
||||
|
||||
otParms = 'REACT_ITEM':@RM:RINo
|
||||
@ -486,9 +492,9 @@ SplitSerial:
|
||||
|
||||
obj_Tables('WriteRec',otParms)
|
||||
|
||||
NEXT I
|
||||
NEXT I
|
||||
|
||||
Result = RINos
|
||||
Result = RINos
|
||||
|
||||
RETURN
|
||||
|
||||
@ -497,16 +503,16 @@ RETURN
|
||||
CalcDesc:
|
||||
* * * * * * *
|
||||
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM]
|
||||
IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM]
|
||||
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
|
||||
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
|
||||
RIType = ReactItemRec<REACT_ITEM_RI_TYPE$>
|
||||
RIType = ReactItemRec<REACT_ITEM_RI_TYPE$>
|
||||
|
||||
BEGIN CASE
|
||||
BEGIN CASE
|
||||
CASE RITYpe = 'W'
|
||||
CalcDesc = ReactItemRec<REACT_ITEM_DESC$>
|
||||
|
||||
@ -536,7 +542,8 @@ CalcDesc:
|
||||
END
|
||||
|
||||
|
||||
CASE Otherwise$
|
||||
CASE 1
|
||||
|
||||
|
||||
* Graphite types
|
||||
|
||||
@ -570,191 +577,212 @@ CalcDesc:
|
||||
BEGIN CASE
|
||||
CASE RingDesc NE '' AND SuscSize EQ '' AND PktSize NE '' ; CalcDesc := RingDesc
|
||||
CASE RingDesc NE '' AND SuscSize NE '' ; CalcDesc := RingDesc:' for ':SuscSize:'in Susceptor with ':PktQty:' ':PktLabel
|
||||
*CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:', ':SuscSize:'in with ':PktSize:'in':PktQty:' ':PktLabel ;* Replaced PktQty with PktSize -dkk 9/11/14
|
||||
CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:' ':SuscSize:'in, with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in' ;* Replaced PktQty with PktSize -dkk 9/11/14
|
||||
CASE RITypeDesc NE '' AND PktQty NE '' AND PktSize NE '' ; CalcDesc := RITypeDesc:' with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in'
|
||||
CASE Otherwise$
|
||||
CASE 1
|
||||
|
||||
END CASE
|
||||
|
||||
END CASE
|
||||
|
||||
Result = CalcDesc
|
||||
|
||||
|
||||
END CASE
|
||||
|
||||
Result = CalcDesc
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
PrintLabel:
|
||||
* * * * * * *
|
||||
|
||||
RINo = Parms[1,@RM]
|
||||
RIRec = Parms[COL2()+1,@RM]
|
||||
RINo = Parms[1,@RM]
|
||||
RIRec = Parms[COL2()+1,@RM]
|
||||
|
||||
IF RINo = '' THEN
|
||||
IF RINo = '' THEN
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
IF RIRec = '' THEN
|
||||
IF RIRec = '' THEN
|
||||
RIRec = XLATE('REACT_ITEM',RINo,'','X')
|
||||
IF RIRec = '' THEN
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
EnterDTM = OCONV(RIRec<REACT_ITEM_ENTER_DTM$>,'DT4/^HS')
|
||||
Desc = RIRec<REACT_ITEM_DESC$>
|
||||
MfrCd = RIRec<REACT_ITEM_MFR_CD$>
|
||||
MfrName = XLATE('REACT_ITEM',RINo,'MFR_NAME','X')
|
||||
MfrPartNo = RIRec<REACT_ITEM_MFR_PART_NO$>
|
||||
MfrPartNoRev = RIRec<REACT_ITEM_MFR_PART_NO_REV$>
|
||||
SerialNo = RIRec<REACT_ITEM_SERIAL_NO$>
|
||||
CurrStatus = OCONV(XLATE('REACT_ITEM',RINo,'CURR_STATUS','X'),'[CONV_ITEM_CURR_STATUS]')
|
||||
RITypeDesc = XLATE('REACT_ITEM',RINo,'RI_TYPE_DESC','X')
|
||||
SuscSize = RIRec<REACT_ITEM_SUSC_SIZE$>
|
||||
SuscSizeDesc = XLATE('REACT_ITEM',RINo,'SUSC_SIZE_DESC','X')
|
||||
PktSize = RIRec<REACT_ITEM_PKT_SIZE$>
|
||||
PktSizeDesc = XLATE('REACT_ITEM',RINo,'PKT_SIZE_DESC','X')
|
||||
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
|
||||
PPlusRDSNo = RIRec<REACT_ITEM_PPLUS_RDS_NO$>
|
||||
EnterDTM = OCONV(RIRec<REACT_ITEM_ENTER_DTM$>,'DT4/^HS')
|
||||
Desc = RIRec<REACT_ITEM_DESC$>
|
||||
MfrCd = RIRec<REACT_ITEM_MFR_CD$>
|
||||
MfrName = XLATE('REACT_ITEM',RINo,'MFR_NAME','X')
|
||||
MfrPartNo = RIRec<REACT_ITEM_MFR_PART_NO$>
|
||||
MfrPartNoRev = RIRec<REACT_ITEM_MFR_PART_NO_REV$>
|
||||
SerialNo = RIRec<REACT_ITEM_SERIAL_NO$>
|
||||
CurrStatus = OCONV(XLATE('REACT_ITEM',RINo,'CURR_STATUS','X'),'[CONV_ITEM_CURR_STATUS]')
|
||||
RITypeDesc = XLATE('REACT_ITEM',RINo,'RI_TYPE_DESC','X')
|
||||
SuscSize = RIRec<REACT_ITEM_SUSC_SIZE$>
|
||||
SuscSizeDesc = XLATE('REACT_ITEM',RINo,'SUSC_SIZE_DESC','X')
|
||||
PktSize = RIRec<REACT_ITEM_PKT_SIZE$>
|
||||
PktSizeDesc = XLATE('REACT_ITEM',RINo,'PKT_SIZE_DESC','X')
|
||||
PktQty = RIRec<REACT_ITEM_PKT_QTY$>
|
||||
PPlusRDSNo = RIRec<REACT_ITEM_PPLUS_RDS_NO$>
|
||||
|
||||
* Build calculated description from field data
|
||||
* Build calculated description from field data
|
||||
|
||||
CalcDesc = obj_React_Item('CalcDesc',RINo:@RM:'')
|
||||
CalcDesc = obj_React_Item('CalcDesc',RINo:@RM:'')
|
||||
|
||||
IF PPLusRDSNo NE '' THEN
|
||||
IF PPLusRDSNo NE '' THEN
|
||||
CalcDesc := ' ( P++ )'
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
Parms = '':@RM:RINo:@RM:''
|
||||
HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one
|
||||
HistKey = HistKeys<1,1> ;* This is the most recent
|
||||
Parms = '':@RM:RINo:@RM:''
|
||||
HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one
|
||||
HistKey = HistKeys<1,1> ;* This is the most recent
|
||||
|
||||
LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X')
|
||||
LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X')
|
||||
|
||||
ReactNo = HistKey[1,'*']
|
||||
InstallDTM = OCONV(FIELD(HistKey,'*',3),'DT4/^S')
|
||||
RemoveDTM = OCONV(LastInstallRec<REACT_ITEM_HIST_REM_DTM$>,'DT4/^S')
|
||||
ReactNo = HistKey[1,'*']
|
||||
InstallDTM = OCONV(FIELD(HistKey,'*',3),'DT4/^S')
|
||||
RemoveDTM = OCONV(LastInstallRec<REACT_ITEM_HIST_REM_DTM$>,'DT4/^S')
|
||||
|
||||
FileName = "Printing Label"
|
||||
Title = "Printing Label"
|
||||
FileName = "Printing Label"
|
||||
Title = "Printing Label"
|
||||
|
||||
PageInfo = ''
|
||||
PageInfo<PI$LEFT> = 0.1
|
||||
PageInfo<PI$TOP> = 0.1
|
||||
PageInfo<PI$RIGHT> = 0.1
|
||||
PageInfo<PI$BOTTOM> = 0.1
|
||||
PageInfo = ''
|
||||
PageInfo<PI$LEFT> = 0.1
|
||||
PageInfo<PI$TOP> = 0.1
|
||||
PageInfo<PI$RIGHT> = 0.1
|
||||
PageInfo<PI$BOTTOM> = 0.1
|
||||
|
||||
|
||||
PageSetup = '1' ;* Landscape
|
||||
PrintSetup = '' ;* Preview
|
||||
PageSetup = '1' ;* Landscape
|
||||
PrintSetup = '' ;* Preview
|
||||
|
||||
PrinterID = '\\mesirwfp001\MESZBRPRT002' ;* This is the Zebra 105se
|
||||
PrinterID = '\\mesirwfp001\MESZBRPRT002' ;* This is the Zebra 105se
|
||||
|
||||
PrintPath = Printer_Select(PrinterID) ;* Popup is skipped IF Printer ID is passed
|
||||
PrintPath = Printer_Select(PrinterID) ;* Popup is skipped IF Printer ID is passed
|
||||
|
||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||
stat = Set_Printer("INIT",FileName,Title,PageInfo,PageSetup,PrintSetup,PrintPath)
|
||||
end else
|
||||
end else
|
||||
stat = Direct_Print('START', PrintPath<1>, '', '')
|
||||
end
|
||||
end
|
||||
|
||||
IF stat < 0 THEN GOTO OIPrint_Error
|
||||
IF stat < 0 THEN GOTO OIPrint_Error
|
||||
|
||||
EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch
|
||||
|
||||
Str = '^XA'
|
||||
Str := '^LH0,0'
|
||||
Str := '^PR2' ;* Print speed 2 inches per second
|
||||
Str := '^LL406' ;* Label length = 203.2dpi x 2in
|
||||
Str := '^PW812' ;* Print width = 203.2dpi x 4in ;* This was 900 jch 12/30/2013
|
||||
Str := '^MD15' ;* Media darkness
|
||||
Str := '^MMT' ;* Media mode t=tear off mode
|
||||
Str := '^FS' ;* end command
|
||||
|
||||
****** First Line
|
||||
|
||||
Str := '^FO30,25^A0,,36^FD':obj_Install('Get_Prop','Company'):'^FS'
|
||||
|
||||
Str := '^FO310,25^AC,18^FDRI No:^FS':CRLF$ ;* Label
|
||||
Str := '^FO390,25^A045,36^FD':RINo:'^FS':CRLF$ ;* Data
|
||||
|
||||
Str := '^FO560,25^AC,18^FDStatus:^FS':CRLF$ ;* Label
|
||||
Str := '^FO650,25^A045,36^FD':CurrStatus:'^FS':CRLF$ ;* Data
|
||||
EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch
|
||||
|
||||
|
||||
****** Second Line
|
||||
|
||||
Str:= '^FO30,70^AC,18^FDDesc:^FS':CRLF$
|
||||
Str:= '^FO95,70^A050,30^FD':CalcDesc:'^FS':CRLF$
|
||||
Str = '^XA'
|
||||
Str := '^LH0,0'
|
||||
Str := '^PR2' ;* Print speed 2 inches per second
|
||||
Str := '^LL406' ;* Label length = 203.2dpi x 2in
|
||||
Str := '^PW812' ;* Print width = 203.2dpi x 4in ;* This was 900 jch 12/30/2013
|
||||
Str := '^MD15' ;* Media darkness
|
||||
Str := '^MMT' ;* Media mode t=tear off mode
|
||||
*Str := '^PQ2' ;* Print 2 labels for each pass through here
|
||||
|
||||
Str := '^BY2,2.0':CRLF$
|
||||
Str := '^FO600,70^B3,,23,N^FD':RINo:'^FS':CRLF$
|
||||
Str := '^BY2,3.0':CRLF$
|
||||
Str := '^FS' ;* end command
|
||||
|
||||
****** First Line
|
||||
|
||||
Str := '^FO30,25^A0,,36^FD':obj_Install('Get_Prop','Company'):'^FS'
|
||||
|
||||
Str := '^FO310,25^AC,18^FDRI No:^FS':CRLF$ ;* Label
|
||||
Str := '^FO390,25^A045,36^FD':RINo:'^FS':CRLF$ ;* Data
|
||||
|
||||
Str := '^FO560,25^AC,18^FDStatus:^FS':CRLF$ ;* Label
|
||||
Str := '^FO650,25^A045,36^FD':CurrStatus:'^FS':CRLF$ ;* Data
|
||||
|
||||
|
||||
****** Third Line
|
||||
****** Second Line
|
||||
|
||||
Str:= '^FO30,115^AC,18^FDMfr:^FS' ;* Label
|
||||
MfrData = MfrCd:' - ':MfrName
|
||||
Str:= '^FO90,115^A0,,25^FD':MfrData:'^FS':CRLF$ ;* Data
|
||||
Str:= '^FO30,70^AC,18^FDDesc:^FS':CRLF$
|
||||
Str:= '^FO95,70^A050,30^FD':CalcDesc:'^FS':CRLF$
|
||||
|
||||
Str := '^BY2,2.0':CRLF$
|
||||
Str := '^FO600,70^B3,,23,N^FD':RINo:'^FS':CRLF$
|
||||
Str := '^BY2,3.0':CRLF$
|
||||
|
||||
|
||||
****** Fourth Line
|
||||
****** Third Line
|
||||
|
||||
Str:= '^FO30,160^AC,18^FDPN:^FS':CRLF$ ;* Label
|
||||
Str:= '^FO70,160^A045,25^FD':MfrPartNo:'^FS':CRLF$ ;* Data
|
||||
|
||||
Str:= '^FO300,160^AC,18^FDRev:^FS':CRLF$ ;* Label
|
||||
Str:= '^FO350,160^A045,25^FD':MfrPartNoRev:'^FS':CRLF$ ;* Data
|
||||
|
||||
Str:= '^FO500,160^AC,18^FDSN:^FS':CRLF$ ;* Label
|
||||
Str:= '^FO540,160^A045,25^FD':SerialNo:'^FS':CRLF$ ;* Data
|
||||
Str:= '^FO30,115^AC,18^FDMfr:^FS' ;* Label
|
||||
MfrData = MfrCd:' - ':MfrName
|
||||
Str:= '^FO90,115^A0,,25^FD':MfrData:'^FS':CRLF$ ;* Data
|
||||
|
||||
|
||||
****** Fifth Line
|
||||
****** Fourth Line
|
||||
|
||||
Str := '^FO30,205^AC,18^FDEntered:^FS':CRLF$
|
||||
Str := '^FO150,205^A0,20^FD':EnterDTM:'^FS':CRLF$
|
||||
Str:= '^FO30,160^AC,18^FDPN:^FS':CRLF$ ;* Label
|
||||
Str:= '^FO70,160^A045,25^FD':MfrPartNo:'^FS':CRLF$ ;* Data
|
||||
|
||||
Str:= '^FO300,160^AC,18^FDRev:^FS':CRLF$ ;* Label
|
||||
Str:= '^FO350,160^A045,25^FD':MfrPartNoRev:'^FS':CRLF$ ;* Data
|
||||
|
||||
Str:= '^FO500,160^AC,18^FDSN:^FS':CRLF$ ;* Label
|
||||
Str:= '^FO540,160^A045,25^FD':SerialNo:'^FS':CRLF$ ;* Data
|
||||
|
||||
|
||||
****** Sixth Line
|
||||
|
||||
Str := '^FO30,250^AC,18^FDInstalled:^FS':CRLF$
|
||||
Str := '^FO150,250^A0,20^FD':InstallDTM:'^FS':CRLF$
|
||||
****** Separator bar
|
||||
|
||||
*Str:= '^FO15,128^GB795,1^FS'
|
||||
|
||||
|
||||
Str := '^FO500,250^AC,18^FDReact No:^FS':CRLF$
|
||||
Str := '^FO610,250^A0,20^FD':ReactNo:'^FS':CRLF$
|
||||
****** Fifth Line
|
||||
|
||||
****** Seventh Line
|
||||
Str := '^FO30,205^AC,18^FDEntered:^FS':CRLF$
|
||||
Str := '^FO150,205^A0,20^FD':EnterDTM:'^FS':CRLF$
|
||||
|
||||
|
||||
****** Sixth Line
|
||||
|
||||
Str := '^FO30,250^AC,18^FDInstalled:^FS':CRLF$
|
||||
Str := '^FO150,250^A0,20^FD':InstallDTM:'^FS':CRLF$
|
||||
|
||||
|
||||
Str := '^FO500,250^AC,18^FDReact No:^FS':CRLF$
|
||||
Str := '^FO610,250^A0,20^FD':ReactNo:'^FS':CRLF$
|
||||
|
||||
****** Seventh Line
|
||||
|
||||
Str := '^FO30,295^AC,18^FDRemoved:^FS':CRLF$
|
||||
Str := '^FO150,295^A0,20^FD':RemoveDTM:'^FS':CRLF$
|
||||
|
||||
*Str := '^FO410,295^AC,18^FDReact Type:^FS':CRLF$
|
||||
*Str := '^FO560,295^A0,20^FD':PrintReactType:'^FS':CRLF$
|
||||
|
||||
Str := '^FO30,295^AC,18^FDRemoved:^FS':CRLF$
|
||||
Str := '^FO150,295^A0,20^FD':RemoveDTM:'^FS':CRLF$
|
||||
|
||||
|
||||
* * * * * *
|
||||
Jump:
|
||||
* * * * * *
|
||||
|
||||
Str := '^XZ'
|
||||
Str:= '^XZ'
|
||||
|
||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||
stat = Set_Printer('TEXT',Str)
|
||||
end else
|
||||
end else
|
||||
stat = Direct_Print('PRINT', Str)
|
||||
end
|
||||
end
|
||||
|
||||
* * * * * *
|
||||
OIPrint_Error:
|
||||
* * * * * *
|
||||
|
||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
|
||||
stat = Set_Printer("TERM")
|
||||
end else
|
||||
end else
|
||||
stat = Direct_Print('STOP')
|
||||
end
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -20,7 +20,6 @@ DECLARE SUBROUTINE obj_Clean_Insp, Btree.Extract, Send_Info, obj_WO_Wfr, ErrMsg,
|
||||
|
||||
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Send_Dyn, obj_Clean_Insp
|
||||
DECLARE FUNCTION obj_RDS_Test, obj_Test_Point_Map, obj_Popup, obj_WO_Wfr, Logging_Services, Environment_Services
|
||||
Declare function Return_To_Fab_Services
|
||||
|
||||
$INSERT APP_INSERTS
|
||||
$INSERT REACT_RUN_EQUATES
|
||||
@ -263,13 +262,6 @@ END
|
||||
|
||||
LSKeys = ReactRunRec<REACT_RUN_RDS_LAYER_KEYS$>
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNo)
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||
RETURN
|
||||
END
|
||||
|
||||
MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) ;* Updated for Metrology update 4/16/2006 JCH
|
||||
|
||||
IF MetOutOfSpec > 0 THEN
|
||||
@ -2286,4 +2278,3 @@ END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
@ -205,6 +205,8 @@ WriteRec:
|
||||
|
||||
IF TestRec = '' THEN
|
||||
DELETE TableVar,TableKey ELSE Null
|
||||
* ErrorMsg = 'Blank table rec with ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'; *added 4/9/21 for debugging
|
||||
* Set_FSError()
|
||||
END ELSE
|
||||
Set_Status(0)
|
||||
rv = Get_Status(errCode)
|
||||
@ -213,6 +215,7 @@ WriteRec:
|
||||
END ELSE
|
||||
ErrorMsg = 'Unable to write ':QUOTE(TableKey):' on ':QUOTE(TableName):' table.'
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
If ( (TableName NE '') and (TableKey NE '') ) then
|
||||
@ -232,9 +235,20 @@ WriteRec:
|
||||
LogData<7> = 'Record self locked: ':Database_Services('IsKeyIDSelfLocked', TableName, TableKey)
|
||||
LogData<9> = 'Call stack: ':RetStack()
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
Recipients = ''
|
||||
SendFrom = 'System'
|
||||
Subject = 'obj_Tables("WriteRec") failed to release lock'
|
||||
AttachWindow = TableName
|
||||
AttachKey = TableKey
|
||||
SendToGroup = 'FI_SUPPORT'
|
||||
MessageParms = Recipients:@RM:SendFrom:@RM:Subject:@RM:UnlockError:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',MessageParms)
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
@ -19,7 +19,7 @@ Compile Function obj_WM_Out(Method,Parms)
|
||||
|
||||
Declare Function Get_Status, Msg, Utility, obj_Tables, NextKey, obj_WO_Verify, obj_Prod_Spec, Send_Dyn, obj_RDS_Makeup
|
||||
Declare Function obj_RDS2, obj_WM_Out, Delete, Signature_Services, Environment_Services, Logging_Services
|
||||
Declare Function Database_Services, SRP_Array, Return_To_Fab_Services
|
||||
Declare Function Database_Services, SRP_Array
|
||||
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, Btree.Extract
|
||||
Declare Subroutine Extract_SI_Keys, obj_WM_Out, obj_WO_Mat, obj_Post_Log, obj_WO_Mat_Log, ErrMsg, obj_WO_Wfr
|
||||
Declare Subroutine Logging_Services, Material_Services, Database_Services, Update_Index, Work_Order_Services
|
||||
@ -382,18 +382,12 @@ CurrStatus:
|
||||
CurrLocation = XLATE('WO_MAT',WOMatKey,'CURR_LOCATION','X')
|
||||
END
|
||||
|
||||
|
||||
IF WOMatRec<WO_MAT_HOLD$> = 1 AND WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
|
||||
Result = 'HOLD' ;* Box is on Hold
|
||||
RETURN
|
||||
END
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOutKey)
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
Result = 'RTF' ;* Open RTF on WM_OUT *
|
||||
RETURN
|
||||
END
|
||||
|
||||
|
||||
IF WMOutRec<WM_OUT_SHIP_NO$> NE '' THEN
|
||||
Result = 'SHIP'
|
||||
@ -652,12 +646,7 @@ NextOpenSlots:
|
||||
IsMULot = WMOutRec EQ True$
|
||||
IsFQASigned = WMOutRec<WM_OUT_SUP_VER_SIG$> NE ''
|
||||
IsVoided = WMOutRec<WM_OUT_VOID$>
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, True$, 0, False$)
|
||||
WOMatHold = WOMatRec<WO_MAT_HOLD$>
|
||||
WOMatHoldEntity = WOMatRec<WO_MAT_HOLD_ENTITY$>
|
||||
IsOnHold = WOMatHold EQ True$ and WOMatHoldEntity EQ 'WM_OUT'
|
||||
If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) AND Not(IsOnHold) then
|
||||
If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) then
|
||||
FOR N = SlotCnt TO 1 STEP -1
|
||||
IF WMOutRec<WM_OUT_SLOT_NO$,N> NE '' AND WMOutRec<WM_OUT_RDS$,N> = '' AND WMOutRec<WM_OUT_SLOT_NCR$,N> = '' AND WMOutRec<WM_OUT_UMW_CASS_ID$,N> = '' THEN
|
||||
|
||||
@ -1999,6 +1988,3 @@ ConvertCleanInsp:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -28,7 +28,7 @@ Compile Function obj_WO_Mat(Method,Parms)
|
||||
Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack
|
||||
Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services
|
||||
Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup
|
||||
Declare Function Error_Services, Memberof, Datetime, GetTickCount, Return_To_Fab_Services
|
||||
Declare Function Error_Services, Memberof, Datetime, GetTickCount
|
||||
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event
|
||||
Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services
|
||||
Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr
|
||||
@ -664,22 +664,13 @@ CurrStatus:
|
||||
RETURN
|
||||
END
|
||||
|
||||
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
|
||||
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOKey)
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||
Result = Oconv(Result, '[WO_MAT_CURR_STATUS_CONV]')
|
||||
RETURN
|
||||
END
|
||||
|
||||
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
|
||||
Result = 'SHIP'
|
||||
RETURN
|
||||
END
|
||||
|
||||
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
|
||||
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
|
||||
|
||||
LocCnt = COUNT(WOMatRec<WO_MAT_INV_LOCATION$>,@VM) + (WOMatRec<WO_MAT_INV_LOCATION$> NE '')
|
||||
|
||||
@ -3293,19 +3284,6 @@ ReportStatus:
|
||||
WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
|
||||
WMOStatus = WOMatRec<WO_MAT_WMO_CURR_STATUS$>
|
||||
|
||||
|
||||
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', RDSNo)
|
||||
If OpenRTF EQ '' then
|
||||
OpenRTF = Return_To_Fab_Services('GetOpenReturnToFabRecordIdByCassId', WMOKey)
|
||||
end
|
||||
|
||||
IF OpenRTF NE '' THEN
|
||||
Result = 'RTF' ;* Open RTF on WO_MAT *
|
||||
Result = Oconv(Result, '[WO_MAT_CURR_STATUS_CONV]')
|
||||
RETURN
|
||||
END
|
||||
|
||||
IF WMOStatus = 'COMP' THEN
|
||||
WMOStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
|
||||
END
|
||||
@ -5736,5 +5714,3 @@ ExpCOA:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -119,22 +119,9 @@ API oiwizard.POST
|
||||
// Validate credentials and create a new session
|
||||
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
|
||||
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
|
||||
ADUsername = SRP_JSON(hWizardJSON, 'GetValue', 'adUsername')
|
||||
SRP_JSON(hWizardJSON, 'Release')
|
||||
Domain = 'Infineon'
|
||||
Begin Case
|
||||
Case ( (UserID NE '') and (Password NE '') )
|
||||
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, Domain)
|
||||
Authorized = Active_Directory_Services('AuthorizeUser', UserID, Domain)
|
||||
Case (ADUsername NE '')
|
||||
Authenticated = True$
|
||||
Authorized = Active_Directory_Services('AuthorizeUser', ADUsername, Domain)
|
||||
If Authorized then UserId = ADUsername
|
||||
Case Otherwise$
|
||||
Authenticated = False$
|
||||
Authorized = False$
|
||||
End Case
|
||||
If Authenticated and Authorized then
|
||||
Authenticated = Active_Directory_Services('AuthenticateUser', UserID, Password, 'Infineon')
|
||||
If Authenticated then
|
||||
LSLUserID = Security_Services('GetLSLUser', UserID)
|
||||
If LSLUserID NE '' then
|
||||
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
||||
@ -248,4 +235,3 @@ API oiwizard.checkidleoisessionvalid.GET
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
@ -450,7 +450,11 @@ Main:
|
||||
lsData<I,7> = PropRec<PRS_PROP_TOOL$>
|
||||
lsData<I,8> = PropRec<PRS_PROP_MET_WFR_TYPE$>
|
||||
lsData<I,9> = PropRec<PRS_PROP_MET_RECIPE$>
|
||||
If (PropRec<PRS_PROP_TOOL$> _NEC 'HgCV') then
|
||||
lsData<I,10> = PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
||||
end else
|
||||
lsData<I,10> = ''
|
||||
end
|
||||
lsData<I,11> = PropRec<PRS_PROP_MET_INTERVAL$>
|
||||
lsData<I,12> = PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
||||
|
||||
@ -464,7 +468,11 @@ Main:
|
||||
lsData<I,7> = lsData<I,7>:CRLF$:PropRec<PRS_PROP_TOOL$>
|
||||
lsData<I,8> = lsData<I,8>:CRLF$:PropRec<PRS_PROP_MET_WFR_TYPE$>
|
||||
lsData<I,9> = lsData<I,9>:CRLF$:PropRec<PRS_PROP_MET_RECIPE$>
|
||||
If (PropRec<PRS_PROP_TOOL$> _NEC 'HgCV') then
|
||||
lsData<I,10> = lsData<I,10>:CRLF$:PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
|
||||
end else
|
||||
lsData<I,10> = lsData<I,10>:CRLF$
|
||||
end
|
||||
lsData<I,11> = lsData<I,11>:CRLF$:PropRec<PRS_PROP_MET_INTERVAL$>
|
||||
lsData<I,12> = lsData<I,12>:CRLF$:PropRec<PRS_PROP_PROVEIN_WFR_TYPE$>
|
||||
|
||||
@ -832,7 +840,11 @@ Main:
|
||||
end else
|
||||
colData<StepNo,STEP_PRODUCT$> = CHAR(185):obj_Met_Prop('GetPropDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
||||
end
|
||||
If (StageRec<PRS_STAGE_MET_TOOL_CLASS$,M> _NEC 'HgCV') then
|
||||
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>:CRLF$:StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,M>
|
||||
end else
|
||||
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>
|
||||
end
|
||||
colData<StepNo,STEP_SPEC_TOL$> = StageRec<PRS_STAGE_MET_MIN$,M>:' - ':StageRec<PRS_STAGE_MET_MAX$,M>:' ':obj_Met_Prop('GetUnitsDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
|
||||
colData<StepNo,STEP_SIZE$> = StageRec<PRS_STAGE_MET_WFR_QTY$,M>
|
||||
colData<StepNo,STEP_FREQ$> = StageRec<PRS_STAGE_MET_INTERVAL$,M>
|
||||
|
||||
@ -28,7 +28,7 @@ OPEN 'REACTOR_LOG' TO ReactLogTable ELSE
|
||||
RETURN
|
||||
END
|
||||
|
||||
OPEN 'DICT.REACTOR_LOG' TO hReactLogDict ELSE
|
||||
OPEN 'DICT.REACTOR_LOG' TO @DICT ELSE
|
||||
ErrorMsg = 'Unable to open "DICT.Reactor_LOG" table.'
|
||||
ErrMsg(ErrorTitle:@SVM:ErrorMsg)
|
||||
RETURN
|
||||
@ -430,4 +430,3 @@ END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
@ -11,7 +11,6 @@ $insert recipe_layer_info_equ
|
||||
$insert msg_equates
|
||||
$insert logical
|
||||
$insert shipping_info_equ
|
||||
$insert TOOL_CLASS_EQUATES
|
||||
|
||||
equ CrLf$ to char(13):char(10)
|
||||
|
||||
@ -20,10 +19,10 @@ declare function memberof, scroll_enable
|
||||
ReturnVar = 0
|
||||
declare function set_property, fieldcount, get_property, msg, editcell, send_event, dialog_box
|
||||
declare subroutine create_note
|
||||
Branches = 'LOAD_SURFACE_DEF,SET_MEASURE,LOAD_TOOL_RECIPE,LOAD_TOOL_PATTERN,SURFSCAN_CLICK,VALIDATE_DOPANT,VALIDATE_MINMAX,SET_SCANNED_IMAGE,VALIDATE_RECIPE,AKRION_RECIPE_CHECK,TW_TYPE_CHECK'
|
||||
Branches = 'LOAD_SURFACE_DEF,SET_MEASURE,LOAD_TOOL_RECIPE,SURFSCAN_CLICK,VALIDATE_DOPANT,VALIDATE_MINMAX,SET_SCANNED_IMAGE,VALIDATE_RECIPE,AKRION_RECIPE_CHECK,TW_TYPE_CHECK'
|
||||
convert ',' to @fm in Branches
|
||||
locate Branch in Branches using @fm setting Bpos then
|
||||
on Bpos gosub load_surface_def, set_measure, load_tool_recipe, load_tool_pattern, surfscan_click, validate_dopant, validate_minmax, set_scanned_image, validate_recipe, akrion_recipe_check, tw_type_check
|
||||
on Bpos gosub load_surface_def, set_measure, load_tool_recipe, surfscan_click, validate_dopant, validate_minmax, set_scanned_image, validate_recipe, akrion_recipe_check, tw_type_check
|
||||
end else
|
||||
Void = msg( '', 'Invalid Branch ':Bpos:' passed to prod_spec_comm' )
|
||||
end
|
||||
@ -112,24 +111,13 @@ return
|
||||
LOAD_TOOL_RECIPE:
|
||||
Tool = get_property( @window:'.TOOL', 'TEXT' )
|
||||
convert @lower_case to @upper_case in Tool
|
||||
RecipeList = xlate( 'TOOL_CLASS', Tool, TOOL_CLASS_RECIPES$, 'X' )
|
||||
RecipeList = xlate( 'LISTBOX_CONFIG', Tool:'_RECIPES', '', 'X' )
|
||||
convert @vm to @fm in RecipeList
|
||||
if RecipeList <> '' then
|
||||
Void = set_property( @window:'.RECIPE', 'LIST', RecipeList )
|
||||
end
|
||||
return
|
||||
*============================================================================*
|
||||
*============================================================================*
|
||||
LOAD_TOOL_PATTERN:
|
||||
Tool = get_property( @window:'.TOOL', 'TEXT' )
|
||||
convert @lower_case to @upper_case in Tool
|
||||
PatternList = Xlate('TOOL_CLASS', Tool, TOOL_CLASS_PATTERN$, 'X')
|
||||
CONVERT @VM To @FM IN PatternList
|
||||
If PatternList Ne '' Then
|
||||
Void = Set_Property(@Window:'.PATTERN', 'LIST', PatternList)
|
||||
End
|
||||
return
|
||||
*============================================================================*
|
||||
SURFSCAN_CLICK:
|
||||
CtrlToUse = get_property( @window, '@SurfScanCtl' )
|
||||
if get_property( @window:'.':CtrlToUse, 'CHECK' ) then
|
||||
|
||||
@ -34,12 +34,11 @@ $Insert QA_MET_EQUATES
|
||||
$Insert RDS_TEST_EQUATES
|
||||
$Insert RDS_TEST_PROP_EQUATES
|
||||
$Insert PRS_LAYER_EQU
|
||||
$Insert PRS_PROP_EQUATES
|
||||
|
||||
Options SpecTypes = 'CLEAN', 'SURFSCAN', 'THICK', 'THICKA', 'RES', 'SRES', 'CRES', 'CONC'
|
||||
|
||||
Declare function Database_Services, Psn_Services, obj_Prod_Spec, Error_Services, SRP_JSON, Cust_Epi_Part_Services
|
||||
Declare function Prod_Ver_Services, PRS_Stage_Services, SRP_Array, Tool_Class_Services
|
||||
Declare function Prod_Ver_Services, PRS_Stage_Services, SRP_Array
|
||||
Declare subroutine Database_Services, Psn_Services, Error_Services, SRP_JSON, Extract_Si_Keys
|
||||
|
||||
GoToService else
|
||||
@ -105,77 +104,6 @@ Service GetRecipes(PSNo)
|
||||
|
||||
end service
|
||||
|
||||
Service GetMetrologyRecipesAndPatterns(PSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
RecipesAndPatterns = ''
|
||||
CurrIdx = 1
|
||||
If PSNo NE '' then
|
||||
If RowExists('PROD_SPEC', PSNo) then
|
||||
PropKeys = ''
|
||||
Extract_Si_Keys('PRS_PROP', 'PS_NO', PSNo, PropKeys)
|
||||
for each PropKey in PropKeys using @VM setting pPos
|
||||
Recipe = Xlate('PRS_PROP', PropKey, PRS_PROP_RECIPE$, 'X')
|
||||
Pattern = Xlate('PRS_PROP', PropKey, PRS_PROP_PATTERN$, 'X')
|
||||
Tool = Xlate('PRS_PROP', PropKey, PRS_PROP_TOOL$, 'X')
|
||||
Convert @LOWER_CASE to @UPPER_CASE in Tool
|
||||
|
||||
If Recipe NE '' and Pattern NE '' and Tool NE '' then
|
||||
PatternSize = Tool_Class_Services('GetNumberOfPointsForPattern', Tool, Pattern)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Entry = Recipe:@VM:Pattern:@VM:PatternSize:@VM:Tool
|
||||
RecipesAndPatterns<CurrIdx> = Entry
|
||||
CurrIdx = CurrIdx + 1
|
||||
end
|
||||
end
|
||||
Next PropKey
|
||||
|
||||
PRSStageKeys = ''
|
||||
Extract_Si_Keys('PRS_STAGE', 'PS_NO', PSNo, PRSStageKeys)
|
||||
for each PRSStageKey in PRSStageKeys using @VM setting sPos
|
||||
Recipes = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE$, 'X')
|
||||
for each Recipe in Recipes using @VM setting rPos
|
||||
Pattern = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_RECIPE_PATTERN$, 'X')<1, rPos>
|
||||
Tool = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_MET_TOOL_CLASS$, 'X')<1, rPos>
|
||||
Convert @LOWER_CASE to @UPPER_CASE in Tool
|
||||
|
||||
If Recipe NE '' and Tool NE '' and Pattern NE '' then
|
||||
PatternSize = Tool_Class_Services('GetNumberOfPointsForPattern', Tool, Pattern)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
Entry = Recipe:@VM:Pattern:@VM:PatternSize:@VM:Tool
|
||||
RecipesAndPatterns<CurrIdx> = Entry
|
||||
CurrIdx = CurrIdx + 1
|
||||
end
|
||||
end
|
||||
Next Recipe
|
||||
SurfScanRecipes = Xlate('PRS_STAGE', PRSStageKey, PRS_STAGE_SURFSCAN_RECIPE$, 'X')
|
||||
If SurfScanRecipes NE '' then
|
||||
for each SurfScanRecipe in SurfScanRecipes using @VM setting ssPos
|
||||
Entry = SurfScanRecipe:@VM:'':@VM:'':@VM:'TENCOR'
|
||||
RecipesAndPatterns<CurrIdx> = Entry
|
||||
CurrIdx = CurrIdx + 1
|
||||
Next SurfScanRecipe
|
||||
end
|
||||
Next PRSStageKey
|
||||
|
||||
RecipesAndPatterns = SRP_Array('Clean', RecipesAndPatterns, 'TrimAndMakeUnique')
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. PROD_SPEC record "':PSNo:'" does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null PSNo passed into service.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = RecipesAndPatterns
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service GetAllMetrologyRecipes(PSNo, GetSurfscan, GetClean, GetRes, GetThick)
|
||||
|
||||
Recipes = ''
|
||||
@ -1157,22 +1085,6 @@ Service ConvertRecordToJSON(KeyID, Record, ItemURL)
|
||||
SRP_JSON(objStageArray, 'Release')
|
||||
end
|
||||
|
||||
RecipesAndPatterns = PSN_Services('GetMetrologyRecipesAndPatterns', KeyID)
|
||||
If SRP_JSON(objRecipesAndPatternsArray, 'New', 'Array') then
|
||||
for each RecipeAndPattern in RecipesAndPatterns using @FM setting rpPos
|
||||
If SRP_JSON(objRecipeAndPattern, 'New', 'Object') then
|
||||
SRP_JSON(objRecipeAndPattern, 'SetValue', 'recipe', RecipeAndPattern<1, 1>, 'String')
|
||||
SRP_JSON(objRecipeAndPattern, 'SetValue', 'pattern', RecipeAndPattern<1, 2>, 'String')
|
||||
SRP_JSON(objRecipeAndPattern, 'SetValue', 'patternSize', RecipeAndPattern<1, 3>, 'Number')
|
||||
SRP_JSON(objRecipeAndPattern, 'SetValue', 'tool', RecipeAndPattern<1, 4>, 'String')
|
||||
SRP_JSON(objRecipesAndPatternsArray, 'Add', objRecipeAndPattern)
|
||||
SRP_JSON(objRecipeAndPattern, 'Release')
|
||||
end
|
||||
Next RecipeAndPattern
|
||||
SRP_JSON(objProdSpec, 'Set', 'recipesAndPatterns', objRecipesAndPatternsArray)
|
||||
SRP_JSON(objRecipesAndPatternsArray, 'Release')
|
||||
end
|
||||
|
||||
SRP_JSON(objJSON, 'Set', 'prodSpec', objProdSpec)
|
||||
SRP_JSON(objProdSpec, 'Release')
|
||||
end
|
||||
@ -1255,4 +1167,3 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -145,7 +145,7 @@ Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_
|
||||
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
|
||||
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
|
||||
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
|
||||
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Mona_Services, Service_Services, Obj_Notes
|
||||
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Obj_Notes, Mona_Services, Service_Services
|
||||
Declare subroutine Transaction_Services
|
||||
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
||||
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
||||
@ -1828,6 +1828,22 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
|
||||
PSNo = RDSRec<RDS_PROD_SPEC_ID$>
|
||||
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
|
||||
|
||||
BEGIN CASE
|
||||
CASE OrgReactNo = '' AND Reactor NE ''
|
||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE OrgReactNo NE '' AND Reactor = ''
|
||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE OrgReactNo NE Reactor
|
||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE Otherwise$
|
||||
NULL
|
||||
|
||||
END CASE
|
||||
|
||||
// Need to update/save RDS record before calling RDS_React_Run
|
||||
RDSRec<RDS_REACTOR$> = Reactor
|
||||
RDSRec<RDS_VERIFY_QTY$> = WaferQty
|
||||
@ -1997,11 +2013,11 @@ end service
|
||||
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'LoadSignatureReady'
|
||||
ErrorMsg = ''
|
||||
|
||||
Error_Services('Clear')
|
||||
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
|
||||
ErrorMsg = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
ErrorMessage = 'Process Error: RDSNo, Username, or WaferQty not supplied in the ':Service:' service.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
@ -2039,15 +2055,15 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
ReactorCapacity = Reactor_Services('GetReactorAvailChamberCount', Reactor)
|
||||
If ReactorCapacity LE 0 then
|
||||
|
||||
ErrorMsg = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
ErrorMessage = 'Process Error: Reactor ' : Reactor : ' does not have the capacity for this lot.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
|
||||
If WaferQty NE SchedQty then
|
||||
ErrorMsg = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
ErrorMessage = 'Process Error: Verified wafer quantity does not match the scheduled quantity.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
@ -2067,8 +2083,8 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
// the parameters. If they do not confirm them, then we need to stop the load signature.
|
||||
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
|
||||
If RDSLayerAckReq EQ True$ then
|
||||
ErrorMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
@ -2151,9 +2167,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
|
||||
|
||||
If ROTRStatus EQ 'F' then
|
||||
ErrorMsg = 'Process Error: Unable to load reactor due to ROTR load block. ' |
|
||||
ErrorMessage = 'Process Error: Unable to load reactor due to ROTR load block. ' |
|
||||
: 'A lead or supervisor must clear the ROTR load block.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
@ -2236,149 +2252,35 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
// Add check for supplement signatures
|
||||
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
|
||||
If UnacknowledgedSupp NE FALSE$ then
|
||||
ErrorMsg = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
ErrorMessage = 'The LOAD stage supplements must be acknowledged before the load operation can be signed.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
If Error_Services('NoError') then
|
||||
Response = True$
|
||||
end else
|
||||
Response = False$
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service UnsignLoadSignatureReady(RDSNo)
|
||||
|
||||
ErrorMessage = ''
|
||||
UnsignEligible = True$
|
||||
|
||||
If RowExists('RDS', RDSNo) then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
CassNo = RDSRec<RDS_CASS_NO$>
|
||||
WoMatKey = WONo : '*' : CassNo
|
||||
If RowExists('WO_MAT', WoMatKey) then
|
||||
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
|
||||
|
||||
//Cases to check for various statuses that should block unsigning the unload.
|
||||
Begin Case
|
||||
Case WOMatCurrStatus EQ 'HOLD'
|
||||
ErrorMessage = 'Cassette is on HOLD and may not have the signature removed.'
|
||||
Case Otherwise$
|
||||
|
||||
End Case
|
||||
|
||||
If ErrorMessage EQ '' then
|
||||
//Check if any subsequent signature are set. If so RDS is not eligible.
|
||||
UnloadExtra1Sig = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Sig = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Sig = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Sig = RDSRec<RDS_OP_IN_EX3$>
|
||||
UnloadSig = RDSRec<RDS_OPERATOR_OUT$>Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
|
||||
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
|
||||
swap @VM with '' in CISigs
|
||||
ReactorType = XLATE('RDS', RDSNo, 'REACTOR_TYPE', 'X')
|
||||
If ReactorType NE 'EPP' Then
|
||||
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
|
||||
end else
|
||||
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
|
||||
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
|
||||
end
|
||||
|
||||
Begin Case
|
||||
Case FQASig NE ''
|
||||
ErrorMessage = 'FQA Signature is set.'
|
||||
Case CISigs NE ''
|
||||
ErrorMessage = 'Clean and Inspect Signatures are set.'
|
||||
Case UnloadSig NE ''
|
||||
ErrorMessage = 'Unload signature is set.'
|
||||
Case LoadExtra2Sig NE ''
|
||||
ErrorMessage = 'Load extra 2 signature is set.'
|
||||
Case UnloadExtra2Sig NE ''
|
||||
ErrorMessage = 'Unload extra 2 signature is set.'
|
||||
Case LoadExtra1Sig NE ''
|
||||
ErrorMessage = 'Load extra 1 signature is set.'
|
||||
Case UnloadExtra1Sig NE ''
|
||||
ErrorMessage = 'Unload extra 1 signature is set.'
|
||||
End Case
|
||||
|
||||
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Unable to locate the WO_MAT record for this RDS in the WO_MAT table.'
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Error reading RDS Record. ' : Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
end else
|
||||
ErrorMessage = 'Unable to locate RDS in the RDS Table.'
|
||||
end
|
||||
|
||||
If ErrorMessage NE '' then
|
||||
UnsignEligible = False$
|
||||
ErrorMessage = 'Process Error: Unable to verify the load signature is Eligible to be unsigned: ' : ErrorMessage
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
|
||||
Response = UnsignEligible
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
end service
|
||||
|
||||
|
||||
Service LoadExtra1stReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
if Error_Services('NoError') then
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
Reactor = RDSRec<RDS_REACTOR$>
|
||||
|
||||
If Reactor NE '' then
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||
GoSub ClearCursors
|
||||
Set_Status(0)
|
||||
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||
SchedReactors = ''
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext SchedReactor else EOF = True$
|
||||
Until EOF
|
||||
SchedReactors<0, -1> = SchedReactor
|
||||
Repeat
|
||||
|
||||
Locate Reactor in SchedReactors using @VM setting vPos then
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
ErrorMsg = 'RDS is not eligible to have Load Extra 1 signed.'
|
||||
end
|
||||
end else
|
||||
Swap @VM with ',' in SchedReactors
|
||||
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
@ -2386,10 +2288,8 @@ end service
|
||||
|
||||
Service UnsignLoadExtra1stReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
if Error_Services('NoError') then
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
@ -2401,63 +2301,22 @@ Service UnsignLoadExtra1stReady(RDSNo)
|
||||
Response = True$
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service LoadExtra2ndReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
If Error_Services('NoError') then
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
|
||||
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
|
||||
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
|
||||
Reactor = RDSRec<RDS_REACTOR$>
|
||||
|
||||
If Reactor NE '' then
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
Query = 'SELECT REACT_STATE WITH SCHED_WO CONTAINING ':WONo
|
||||
ClearSelect
|
||||
Set_Status(0)
|
||||
RList(Query, TARGET_ACTIVELIST$, '', '' '')
|
||||
SchedReactors = ''
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext SchedReactor else EOF = True$
|
||||
Until EOF
|
||||
SchedReactors<0, -1> = SchedReactor
|
||||
Repeat
|
||||
|
||||
Locate Reactor in SchedReactors using @VM setting vPos then
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
ErrorMsg = 'RDS is not eligible to have the Load Extra 2 set.'
|
||||
end
|
||||
end else
|
||||
Swap @VM with ',' in SchedReactors
|
||||
ErrorMsg = 'Assigned reactor, ':Reactor:', does not equal any scheduled reactor(s), ':SchedReactors:'.'
|
||||
Response = False$
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
@ -2465,10 +2324,8 @@ end service
|
||||
|
||||
Service UnsignLoadExtra2ndReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
If Error_Services('NoError') then
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
|
||||
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
|
||||
@ -2480,13 +2337,6 @@ Service UnsignLoadExtra2ndReady(RDSNo)
|
||||
Response = True$
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
@ -2551,6 +2401,62 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
|
||||
return
|
||||
end
|
||||
|
||||
IF ReactorType NE 'EPP' THEN
|
||||
|
||||
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
|
||||
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
|
||||
SigAction = WOStep:'LOAD'
|
||||
|
||||
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
|
||||
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
|
||||
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
|
||||
END ELSE
|
||||
WOMatSig = ''
|
||||
END
|
||||
RDSSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
|
||||
|
||||
BEGIN CASE
|
||||
CASE WOMatSig = '' AND RDSSig NE ''
|
||||
|
||||
* Signature missing on WO_MAT
|
||||
SigDate = RDSRec<RDS_DATE_IN$>
|
||||
SigTime = RDSRec<RDS_TIME_IN$>
|
||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'LOAD':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
||||
* Sets LOAD signature
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMsg = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
END else
|
||||
Response = True$
|
||||
end
|
||||
return
|
||||
|
||||
CASE RDSSig = '' AND WOMatSig NE ''
|
||||
|
||||
* Signature missing on RDS
|
||||
CurrDate = CurrDTM[1,' ']
|
||||
CurrTime = CurrDTM[COL2()+1,' ']
|
||||
RDSRec<RDS_OPERATOR_IN$> = WOMatSig
|
||||
RDSRec<RDS_DATE_IN$> = IConv(CurrDate, 'D')
|
||||
RDSRec<RDS_TIME_IN$> = IConv(CurrTime, 'MT')
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
||||
Response = True$
|
||||
return
|
||||
|
||||
CASE RDSSig NE '' AND WOMatSig NE ''
|
||||
ErrorMsg = 'Process Error: Load stage has already been signed.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
RETURN
|
||||
|
||||
CASE Otherwise$
|
||||
Null
|
||||
// Continue
|
||||
END CASE
|
||||
|
||||
END
|
||||
|
||||
SigDt = OCONV( Date(), 'D2/' )
|
||||
SigTm = OCONV( Time(), 'MTS' )
|
||||
LoadDTM = SigDt:' ':SigTm
|
||||
@ -3776,52 +3682,6 @@ Service SignFQAStage(RDSNo, Username)
|
||||
|
||||
end service
|
||||
|
||||
Service UnsignPreEpiReady(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
UnsignPreEpiReady = False$
|
||||
|
||||
If RDSNo NE '' then
|
||||
If RowExists('RDS', RDSNo) then
|
||||
If Error_Services('NoError') then
|
||||
//Call on the same logic to determine if the unsign LOAD signature is ready
|
||||
UnsignLoadReady = QA_Services('UnsignLoadSignatureReady', RDSNo)
|
||||
if Error_Services('NoError') then
|
||||
If UnsignLoadReady then
|
||||
//Check if LOAD signature is present
|
||||
LoadSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_OPERATOR_IN$, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
If LoadSig EQ '' then
|
||||
UnsignPreEpiReady = True$
|
||||
end else
|
||||
ErrorMsg = 'Load signature is set.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'A signature beyond pre-epi exists. Please check later stages of this RDS.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'RDS ' : RDSNo : ' was not found in database.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'RDS No was null'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
Response = UnsignPreEpiReady
|
||||
|
||||
end service
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
@ -3835,12 +3695,3 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -67,8 +67,7 @@ Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Ser
|
||||
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services
|
||||
Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
|
||||
Declare function Lot_Event_Services, GetTickCount, Work_Order_Services
|
||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, obj_WO_React
|
||||
Declare Subroutine Mona_Services
|
||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, Mona_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -624,7 +623,6 @@ return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
ErrorMsg = ''
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'WriteRecordPre'
|
||||
|
||||
@ -771,7 +769,7 @@ WRITE_RECORD_PRE:
|
||||
|
||||
Begin Case
|
||||
|
||||
Case ( (OrigTimeOutSig NE '') and (OrigReactor NE NewReactor) )
|
||||
Case ( (OrigLoadSig NE '') and (OrigReactor NE NewReactor) )
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @USER4
|
||||
@ -780,8 +778,25 @@ WRITE_RECORD_PRE:
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
|
||||
ErrorMsg = 'Reactor number cannot be changed or removed once the unload signature is set!'
|
||||
OrigFileError = 104:': Reactor number cannot be changed or removed once the unload signature is set!'
|
||||
Error_Services('Add', 'Reactor number cannot be changed or removed once the load signature is set!')
|
||||
OrigFileError = 104:': Reactor number cannot be changed or removed once the load signature is set!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
||||
Case ( (OrigVerSig NE '') and (NewVerSig EQ '') ) or ( (OrigVerDate NE '') and (NewVerDate EQ '') ) |
|
||||
or ( (OrigVerTime NE '') and (NewVerTime EQ '') ) or ( (NewVerDate EQ '') and (NewVerTime NE '') ) |
|
||||
or ( (NewVerDate NE '') and (NewVerTime EQ '') )
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @USER4
|
||||
LogData<3> = RDSKeyID
|
||||
LogData<4> = 'Signature data cannot be removed!'
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
|
||||
Error_Services('Add', 'Signature data cannot be removed!')
|
||||
OrigFileError = 104:': Signature data cannot be removed!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
@ -797,7 +812,7 @@ WRITE_RECORD_PRE:
|
||||
LogData<4> = 'Signature datetime is greater than current datetime!'
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
ErrorMsg = 'Signature datetime is greater than current datetime!'
|
||||
Error_Services('Add', 'Signature datetime is greater than current datetime!')
|
||||
OrigFileError = 104:': Signature datetime is greater than current datetime!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
@ -818,7 +833,7 @@ WRITE_RECORD_PRE:
|
||||
LogData<4> = 'Signature datetime is less than a previous signature datetime!'
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
ErrorMsg = 'Signature datetime is less than a previous signature datetime!'
|
||||
Error_Services('Add', 'Signature datetime is less than a previous signature datetime!')
|
||||
OrigFileError = 104:': Signature datetime is less than a previous signature datetime!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
@ -833,7 +848,7 @@ WRITE_RECORD_PRE:
|
||||
LogData<4> = 'Cassette runtime exceeds three days!'
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
|
||||
|
||||
ErrorMsg = 'Cassette runtime exceeds three days!'
|
||||
Error_Services('Add', 'Cassette runtime exceeds three days!')
|
||||
OrigFileError = 104:': Cassette runtime exceeds three days!'
|
||||
Status = 0
|
||||
Record = ''
|
||||
@ -846,11 +861,6 @@ WRITE_RECORD_PRE:
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
@ -870,32 +880,6 @@ WRITE_RECORD:
|
||||
OrigDateOut = OrigRecord<RDS_DATE_OUT$>
|
||||
NewDateOut = Record<RDS_DATE_OUT$>
|
||||
|
||||
RDSNo = {SEQ}
|
||||
Reactor = Record<RDS_REACTOR$>
|
||||
OrgReactNo = OrigRecord<RDS_REACTOR$>
|
||||
CassNo = Record<RDS_CASS_NO$>
|
||||
PSNo = Record<RDS_PROD_SPEC_ID$>
|
||||
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
|
||||
|
||||
BEGIN CASE
|
||||
CASE OrgReactNo = '' AND Reactor NE ''
|
||||
//Assignment to a reactor where there was no prior assigned reactor
|
||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE OrgReactNo NE '' AND Reactor = ''
|
||||
//Reactor Assignment is being cleared.
|
||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE OrgReactNo NE Reactor
|
||||
//Reactor Assignment is changing
|
||||
obj_WO_React('RemRdsNo',WONo:@RM:WOStep:@RM:OrgReactNo:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
obj_WO_React('AddRdsNo',WONo:@RM:WOStep:@RM:Reactor:@RM:RDSNo:@RM:CassNo:@RM:PSNo)
|
||||
|
||||
CASE Otherwise$
|
||||
NULL
|
||||
|
||||
END CASE
|
||||
|
||||
If ( ( (OrigDateOut EQ '') and (NewDateOut NE '') ) ) then
|
||||
// Mark this cassette as processed in the schedule event record
|
||||
DatetimeOut = {DATETIME_OUT}
|
||||
@ -1018,3 +1002,4 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
@ -99,13 +99,6 @@ API rds.ID.PUT
|
||||
end api
|
||||
|
||||
|
||||
API rds.ID.zpl.HEAD
|
||||
API rds.ID.zpl.GET
|
||||
|
||||
GoSub CreateZPLItem
|
||||
|
||||
end api
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -135,29 +128,3 @@ CreateHALItem:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateZPLItem
|
||||
//
|
||||
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateZPLItem:
|
||||
|
||||
RdsKey = ParentSegment
|
||||
ZPL = Rds_Services('GetRdsZpl', RdsKey)
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
@ -82,6 +82,8 @@ Equ COL$MET_SIG_DTM to 12
|
||||
|
||||
Equ MSG_WIDTH$ to 600
|
||||
|
||||
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, Logging_Services
|
||||
@ -181,20 +183,17 @@ Event PUB_SIGN.CLICK()
|
||||
LSIDArray = Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')
|
||||
Preauthenticated = FALSE$
|
||||
SignEventType = Get_Property(CtrlEntID, 'TEXT')
|
||||
WoMatKey = WONo : '*' : CassNo
|
||||
|
||||
Begin Case
|
||||
|
||||
Case SignEventType EQ 'Sign'
|
||||
|
||||
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
|
||||
WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT')
|
||||
LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP')
|
||||
|
||||
Reactor = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
If Reactor NE '' then
|
||||
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||
if Error_Services('NoError') then
|
||||
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
|
||||
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
|
||||
|
||||
@ -419,29 +418,45 @@ Event PUB_SIGN.CLICK()
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Msg(@Window, ErrorMsg)
|
||||
end
|
||||
end else
|
||||
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
|
||||
end
|
||||
end else
|
||||
Msg(@Window, "RDS is not assigned to a reactor.")
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Msg(@Window, ErrorMsg)
|
||||
end
|
||||
|
||||
GoSub OLE_LL_Status
|
||||
Set_Property(@Window, 'SAVEWARN', False$)
|
||||
Send_Event(@Window, 'READ')
|
||||
|
||||
Case SignEventType EQ 'Unsign'
|
||||
// 1. Check if RDS Load signature is eligible to be set.
|
||||
IsEligible = QA_Services('UnsignLoadSignatureReady', RDSNo)
|
||||
// 1. Check if on hold. If so, then block event and inform user
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
|
||||
IF WOMatCurrStatus = 'HOLD' THEN
|
||||
ErrorMessage = 'Process Error':@SVM:'Cassette is on Hold and may not have the signature removed.':CRLF$:CRLF$
|
||||
ErrMsg(ErrorMessage)
|
||||
RETURN 0
|
||||
END
|
||||
// 2.
|
||||
// a. For Non-EPP - Check if LWII, LWIS, or FQA has been signed. If so, then block event and inform user
|
||||
// b. For EPP - Check Clean_Insp actions to see if an inspection or surfscan has been completed
|
||||
// Also check the FQA signature (MO_QA)
|
||||
UnloadSig = Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
|
||||
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE','X')
|
||||
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
|
||||
Convert @VM to '' in CISigs
|
||||
IF ReactorType NE 'EPP' THEN
|
||||
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
|
||||
END ELSE
|
||||
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
|
||||
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
|
||||
END
|
||||
If ( (UnloadSig NE '') or (CISigs NE '') or (FQASig NE '') ) then
|
||||
// UNLOAD, LWII, LWIS, or FQA already signed. Block unload unsign event.
|
||||
ErrorMessage = 'Process Error':@SVM:'UNLOAD, LWII, LWIS, or FQA already signed. Cannot unsign unload event.' |
|
||||
: CRLF$ : CRLF$
|
||||
ErrMsg(ErrorMessage)
|
||||
Return 0
|
||||
end
|
||||
|
||||
If IsEligible then
|
||||
// 3. Lead/Supervisor/Engineer/EngTech override
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
|
||||
Valid = Response<1>
|
||||
@ -504,6 +519,7 @@ Event PUB_SIGN.CLICK()
|
||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||
|
||||
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
||||
Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
|
||||
|
||||
@ -525,10 +541,7 @@ Event PUB_SIGN.CLICK()
|
||||
end else
|
||||
Return 0
|
||||
end
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Msg(@Window, ErrorMessage)
|
||||
end
|
||||
|
||||
End Case
|
||||
Post_Event(@Window, 'READ')
|
||||
|
||||
@ -569,6 +582,7 @@ Event LL_R_STATUS.OnClick()
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -726,6 +740,3 @@ OLE_LL_Status:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -51,6 +51,8 @@ $insert REACT_STATUS_EQUATES
|
||||
$insert SUPPL_INFO_ARRAY_EQU
|
||||
$insert CLEAN_INSP_EQUATES
|
||||
|
||||
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
|
||||
Equ COL$LOG_FILE to 1
|
||||
Equ COL$LOG_DTM to 2
|
||||
Equ COL$ACTION to 3
|
||||
@ -65,7 +67,7 @@ Equ COL$TOOL_ID to 10
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||
Declare subroutine Qa_Services, RDS_Services, Dialog_Box
|
||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
|
||||
Declare function QA_Services, Database_Services, Supplement_Services, RDS_Services
|
||||
Declare function QA_Services, Database_Services, Supplement_Services
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
@ -94,15 +96,19 @@ Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
GoSub SetupControls
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.READ()
|
||||
|
||||
GoSub SetupControls
|
||||
|
||||
// Disable reactor edit line control if the RDS has been loaded.
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
If RDSNo NE '' then
|
||||
LoadSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
|
||||
If LoadSig NE '' then
|
||||
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
||||
end
|
||||
end
|
||||
end event
|
||||
|
||||
|
||||
@ -126,76 +132,6 @@ end event
|
||||
|
||||
Event PUB_SIGN.CLICK()
|
||||
|
||||
ButtonText = Get_Property(@Window:'.PUB_SIGN', 'TEXT')
|
||||
|
||||
Begin Case
|
||||
Case ButtonText EQ 'Sign'
|
||||
GoSub SignPreEpi
|
||||
Case ButtonText EQ 'Unsign'
|
||||
GoSub UnsignPreEpi
|
||||
End Case
|
||||
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end
|
||||
Set_Property(@Window, 'SAVEWARN', False$)
|
||||
Set_Status(0)
|
||||
Send_Event(@Window, 'READ')
|
||||
|
||||
end event
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SetupControls:
|
||||
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
|
||||
GoSub ReactorEdlCtrlSetup
|
||||
GoSub PubSignCtrlSetup
|
||||
|
||||
return
|
||||
|
||||
ReactorEdlCtrlSetup:
|
||||
|
||||
// Disable reactor edit line control if the RDS has been assigned.
|
||||
If RDSNo NE '' then
|
||||
PreEpiSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_PRE_EPI_SIG$, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
If PreEpiSig NE '' then
|
||||
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
||||
end else
|
||||
Set_Property(@Window:'.REACTOR', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', EDIT_ACTIVE_WHITE$)
|
||||
end
|
||||
end else
|
||||
Set_Property(@Window:'.REACTOR', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.REACTOR', 'BACKCOLOR', READONLY_GREEN$)
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
PubSignCtrlSetup:
|
||||
|
||||
If RDSNo NE '' then
|
||||
PreEpiSig = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_PRE_EPI_SIG$, True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
If PreEpiSig NE '' then
|
||||
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Unsign')
|
||||
end else
|
||||
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
SignPreEpi:
|
||||
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO' ,'DEFPROP')
|
||||
WfrQty = Get_Property(@Window:'.VERIFY_QTY','TEXT')
|
||||
Reactor = Get_Property(@Window:'.REACTOR' ,'TEXT')
|
||||
@ -225,24 +161,18 @@ SignPreEpi:
|
||||
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
UnsignPreEpi:
|
||||
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO','DEFPROP')
|
||||
VerCheckParams = ''
|
||||
VerCheckParams<4> = 'Permission needed for Pre-Epi Unsign on RDS# ' : RDSNo
|
||||
UserVerCheck = Dialog_Box('NDW_VERIFY_USER', @Window, '':@FM:'':@FM:'':@FM:VerCheckParams)
|
||||
ValidUserCheck = UserVerCheck<1>
|
||||
If ValidUserCheck then
|
||||
ValidUserId = UserVerCheck<2>
|
||||
If ValidUserId NE '' then
|
||||
RDS_Services('UnsignPreEpiSignature', RDSNo, ValidUserId)
|
||||
end
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end
|
||||
Set_Property(@Window, 'SAVEWARN', False$)
|
||||
Set_Status(0)
|
||||
Send_Event(@Window, 'READ')
|
||||
|
||||
return
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -93,7 +93,7 @@ Equ ACTION$SPEC_SURFSCAN_RECIPE TO 8
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||
Declare subroutine Dialog_Box, Msg, MemberOf, obj_WO_Mat, Get_Property, obj_React_Status, Get_Status, Override_Services
|
||||
Declare subroutine record_lock, obj_React_Status, Post_Event, obj_React_State, obj_Post_Log, Qa_Services, Reactor_Services
|
||||
Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services, Dialog_Response_Log_Services
|
||||
Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services
|
||||
|
||||
Declare function dialog_box, msg, Get_Status, obj_WO_Mat, Get_Status, obj_Clean_Insp, obj_Reactor, Get_Property
|
||||
Declare function QA_Services, Database_Services, Set_Property, Rds_Services, Qa_Services, Memberof, Reactor_Services
|
||||
@ -315,9 +315,6 @@ Event PUB_SIGN.CLICK()
|
||||
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'
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer not logged when one was required. Unload signature was blocked. User was prompted.')
|
||||
end else
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was logged when one was required. Unload signature was allowed. User was prompted.')
|
||||
end
|
||||
If ErrMsg NE '' then
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
|
||||
@ -325,8 +322,6 @@ Event PUB_SIGN.CLICK()
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was logged prior when one was required. Unload signature was allowed. User was not prompted.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
@ -479,4 +474,3 @@ Setup_OLE_Controls:
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
@ -41,9 +41,8 @@ Function Reactitems_API(@API)
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$Insert REACT_ITEM_EQUATES
|
||||
|
||||
Declare subroutine OI_Wizard_Services, SRP_JSON, Database_Services, React_Item_Services
|
||||
Declare subroutine OI_Wizard_Services, SRP_JSON, Database_Services
|
||||
Declare function React_Item_Services, SRP_JSON, OI_Wizard_Services
|
||||
|
||||
GoToAPI else
|
||||
@ -221,9 +220,8 @@ API ReactItems.ID.PUT
|
||||
SRP_JSON(hJSON, 'Release')
|
||||
KeyID = EndpointSegment
|
||||
Record = React_Item_Services('ConvertJSONToRecord', JSON)
|
||||
If Error_Services('NoError') then
|
||||
If KeyID NE '' and Record NE '' then
|
||||
React_Item_Services('UpdateReactItem', KeyID, Record)
|
||||
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
|
||||
end
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
@ -232,9 +230,6 @@ API ReactItems.ID.PUT
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
// Error parsing JSON
|
||||
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
|
||||
@ -361,3 +356,4 @@ CreateHALCollection:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
@ -149,7 +149,8 @@ WRITE_RECORD:
|
||||
ModeUser = @User4
|
||||
end
|
||||
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
||||
OrderTypeAlreadyActive = (CurrActiveHgCVOrders NE '')
|
||||
CurrActiveProveInOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'CHANGEOVER')
|
||||
OrderTypeAlreadyActive = ( (CurrActiveHgCVOrders NE '') or (CurrActiveProveInOrders NE '') )
|
||||
If Not(OrderTypeAlreadyActive) then
|
||||
// Only create an order and change the mode if there is not already an active IQS_HGCV_ALARM order
|
||||
OrderResponse = Nica_Orders_Services('CreateNewOrder', 'REACTOR', Name, 'IQS_HGCV_ALARM')
|
||||
@ -227,3 +228,5 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
@ -165,15 +165,11 @@ Service SignReactorLog(ReactorLogID, UserID)
|
||||
RIPostBy = ReactorLogRec<REACTOR_LOG_RI_POST_BY$>
|
||||
If RIPostBy EQ '' then
|
||||
obj_Reactor_Log('PostReactItems',ReactorLogID:@RM:UserID)
|
||||
If Error_Services('NoError') then
|
||||
// Pull in a fresh copy of the record with the POST_BY signature set
|
||||
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
|
||||
If Get_Status(ErrCode) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end
|
||||
If ErrorMsg EQ '' then
|
||||
@ -965,4 +961,3 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
@ -677,93 +677,12 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
|
||||
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// SetWaferSize
|
||||
//
|
||||
// Sets the Reactor's Wafer Size.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service SetWaferSize(ReactNo, WaferSize)
|
||||
|
||||
ErrMsg = ''
|
||||
If ReactNo EQ '' then
|
||||
ErrMsg := 'ReactNo value is missing.'
|
||||
end
|
||||
If WaferSize EQ '' then
|
||||
ErrMsg := 'WaferSize value is missing.'
|
||||
end
|
||||
If ErrMsg EQ '' then
|
||||
If RowExists('REACTOR', ReactNo) then
|
||||
WaferSizeOptions = Xlate('SYSREPOSPOPUPS', 'LSL2**WAFER_SIZES', 8, 'X')
|
||||
Swap @VM with @FM in WaferSizeOptions
|
||||
Swap @SVM with @VM in WaferSizeOptions
|
||||
WaferSizeOptions = SRP_Array('Rotate', WaferSizeOptions)
|
||||
WaferSizeOptions = WaferSizeOptions<2>
|
||||
If Count(WaferSizeOptions, WaferSize) NE 0 then
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
|
||||
ReactorRec<REACTOR_SUSC_POCKET_SIZE$> = WaferSize
|
||||
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'Invalid Wafer Size.'
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'The chosen Reactor No. ': ReactNo: ' does not exist.'
|
||||
end
|
||||
end
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// SetPocketQty
|
||||
//
|
||||
// Sets the Reactor's Wafer Size.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service SetPocketQty(ReactNo, PocketQty)
|
||||
|
||||
ErrMsg = ''
|
||||
If ReactNo EQ '' then
|
||||
ErrMsg := 'ReactNo value is missing.'
|
||||
end
|
||||
If PocketQty EQ '' then
|
||||
ErrMsg := 'PocketQty value is missing.'
|
||||
end
|
||||
If ErrMsg EQ '' then
|
||||
If RowExists('REACTOR', ReactNo) then
|
||||
PocketQtyOptions = Xlate('SYSREPOSPOPUPS', 'LSL2**SUSCEPTOR_POCKETS', 8, 'X')
|
||||
Swap @VM with @FM in PocketQtyOptions
|
||||
Swap @SVM with @VM in PocketQtyOptions
|
||||
PocketQtyOptions = SRP_Array('Rotate', PocketQtyOptions)
|
||||
PocketQtyOptions = PocketQtyOptions<1>
|
||||
If Count(PocketQtyOptions, PocketQty) NE 0 then
|
||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
|
||||
ReactorRec<REACTOR_SUSC_POCKET_QTY$> = PocketQty
|
||||
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'Invalid Pocket Qty..'
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'The chosen Reactor No. ': ReactNo: ' does not exist.'
|
||||
end
|
||||
end
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetReactors
|
||||
//
|
||||
// Returns a JSON formatted array of reactor objects. Reactor number 0 will be ommitted. If the MatchType or MatchSize
|
||||
// arguments are populated, the array will be filtered accordingly.
|
||||
// arguments are populated, the array will be filterd accordingly.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetReactors(MatchType, MatchSize)
|
||||
|
||||
@ -2856,21 +2775,12 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
|
||||
SRP_JSON(objReactor, 'SetValue', 'ArmsCnt', Xlate('REACTOR', ReactorNo, REACTOR_ARMS_WFR_CNT$, 'X'))
|
||||
|
||||
// Add Current Run Status (Current Loaded Cassettes)
|
||||
LoadLockLeftRDS = ''
|
||||
LoadLockRightRDS = ''
|
||||
LoadedRDS = Xlate('REACT_STATUS', ReactorNo, 'LOAD_RDS', 'X')
|
||||
If LoadedRDS NE '' then
|
||||
objLoadedRDS = ''
|
||||
If SRP_JSON(objLoadedRDS, 'New', 'Array') then
|
||||
For each RDS in LoadedRDS using @VM setting vPos
|
||||
SRP_JSON(objLoadedRDS, 'AddValue', RDS)
|
||||
LoadLockSide = Xlate('RDS', RDS, 'LOAD_LOCK_SIDE', 'X')
|
||||
Begin Case
|
||||
Case LoadLockSide EQ 'L'
|
||||
LoadLockLeftRDS = RDS
|
||||
Case LoadLockSide EQ 'R'
|
||||
LoadLockRightRDS = RDS
|
||||
End Case
|
||||
Next RDS
|
||||
SRP_JSON(objReactor, 'Set', 'loadedRDS', objLoadedRDS)
|
||||
SRP_JSON(objLoadedRDS, 'Release')
|
||||
@ -2878,8 +2788,6 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
|
||||
end else
|
||||
SRP_JSON(objReactor, 'SetValue', 'loadedRDS', '')
|
||||
end
|
||||
SRP_JSON(objReactor, 'SetValue', 'loadLockLeftRDS', LoadLockLeftRDS)
|
||||
SRP_JSON(objReactor, 'SetValue', 'loadLockRightRDS', LoadLockRightRDS)
|
||||
|
||||
// Add new reactor items here
|
||||
InstItems = Xlate('REACTOR', ReactorNo, REACTOR_CURR_INST_ITEMS$, 'X')
|
||||
@ -3768,7 +3676,7 @@ Service GetReactorAvailChamberCount(ReactNo)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'GetReactorAvailChamberCount'
|
||||
|
||||
ErrMsg = ''
|
||||
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: '
|
||||
AvailableChamberCount = 0
|
||||
If ReactNo NE '' then
|
||||
If RowExists('REACTOR', ReactNo) then
|
||||
@ -3778,19 +3686,16 @@ Service GetReactorAvailChamberCount(ReactNo)
|
||||
AvailableChamberCount = ReactorCurrCapacity - ReactorCurrLoadCnt
|
||||
end else
|
||||
ErrMsg := 'Reactor ' : ReactNo : ' does not exist.'
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
end else
|
||||
ErrMsg := 'Reactor Number was null.'
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
Response = AvailableChamberCount
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then
|
||||
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: ':ErrMsg
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
end service
|
||||
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@ COMPILE FUNCTION React_Item(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5)
|
||||
01/13/2014 - John C. Henry, J.C. Henry & Co., Inc. cloned from Graphite
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Set_Property, ErrMsg, obj_Appwindow, Btree.Extract, Send_Event, Post_Event, obj_React_Item, Forward_Event
|
||||
DECLARE SUBROUTINE Set_Property, ErrMsg, obj_Appwindow, Btree.Extract, Send_Event, Post_Event, obj_React_Item
|
||||
DECLARE FUNCTION Get_Property, Send_Message, NextKey, Popup, obj_Calendar, Printer_Select
|
||||
DECLARE FUNCTION Set_Printer, obj_Install, Start_Window, obj_React_Item_Hist, obj_React_Item, Dialog_Box
|
||||
|
||||
@ -15,7 +15,6 @@ $INSERT REACT_ITEM_EQUATES
|
||||
$INSERT REACT_ITEM_HIST_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT POPUP_EQUATES
|
||||
$INSERT LOGICAL
|
||||
|
||||
EQU COL$REACT_NO TO 1
|
||||
EQU COL$SVC_HRS TO 2
|
||||
@ -78,9 +77,6 @@ BEGIN CASE
|
||||
CASE EntID = @WINDOW:'.LU_PKT_QTY' AND Event = 'CLICK' ; GOSUB LUPktQty
|
||||
CASE EntID = @WINDOW:'.RETIRE_BUTTON' AND Event = 'CLICK' ; GOSUB RetireItem
|
||||
CASE EntID = @WINDOW:'.PRINT_LABEL' AND Event = 'CLICK' ; GOSUB PrintLabel
|
||||
CASE EntID = @WINDOW:'.RI_TYPE' AND Event = 'CHANGED' ; GOSUB RITypeChange
|
||||
CASE EntID = @WINDOW:'.PKT_SIZE' AND Event = 'CHANGED' ; GOSUB PktSizeChange
|
||||
CASE EntID = @WINDOW:'.PART_TYPE' AND Event = 'LOSTFOCUS' ; GOSUB PktSizeChange
|
||||
|
||||
CASE 1
|
||||
|
||||
@ -146,11 +142,14 @@ RETURN
|
||||
Read:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
GOSUB Refresh
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Write:
|
||||
* * * * * * *
|
||||
@ -262,68 +261,9 @@ FOR Line = 1 TO ListCnt
|
||||
NEXT N
|
||||
END
|
||||
NEXT Line
|
||||
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||
If RIType EQ 'S' then
|
||||
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_QTY_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'TEXT', '')
|
||||
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'TEXT', '')
|
||||
Set_Property(@Window:'PKT_QTY_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'TEXT', '')
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
* * * * * * *
|
||||
RITypeChange:
|
||||
* * * * * * *
|
||||
|
||||
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||
If RIType EQ 'S' then
|
||||
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PKT_QTY_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', True$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', True$)
|
||||
end else
|
||||
Set_Property(@Window:'.SUSC_GROUP', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE', 'TEXT', '')
|
||||
Set_Property(@Window:'.LU_PKT_SIZE', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_SIZE_DESC', 'TEXT', '')
|
||||
Set_Property(@Window:'PKT_QTY_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||
Set_Property(@Window:'.LU_PKT_QTY', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO_LABEL', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'ENABLED', False$)
|
||||
Set_Property(@Window:'.PPLUS_RDS_NO', 'TEXT', '')
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
* * * * * * *
|
||||
RetireItem:
|
||||
@ -503,47 +443,19 @@ RETURN
|
||||
LUPktSize:
|
||||
* * * * * * *
|
||||
|
||||
Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
|
||||
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||
If RIType EQ 'S' then
|
||||
PocketQty = ''
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||
PartType = Get_Property(@Window: '.PART_TYPE', 'TEXT')
|
||||
If (PartType EQ 'HTR') OR (PartType EQ 'EPP') OR (PartType EQ 'ASM') then
|
||||
RetVal = Popup(@WINDOW,TypeOver,'WAFER_SIZES')
|
||||
IF RetVal NE '' THEN
|
||||
RetVal = Popup(@WINDOW,'','WAFER_SIZES')
|
||||
|
||||
IF RetVal NE '' THEN
|
||||
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
|
||||
obj_Appwindow('LUValReturn',oaParms)
|
||||
Begin Case
|
||||
Case PartType EQ 'HTR'
|
||||
If RetVal EQ 8 then
|
||||
PocketQty = 3
|
||||
end else
|
||||
If RetVal EQ 6 then PocketQty = 5
|
||||
end
|
||||
Case PartType EQ 'EPP'
|
||||
If RetVal EQ 8 then
|
||||
PocketQty = 8
|
||||
end else
|
||||
If RetVal EQ 6 then PocketQty = 18
|
||||
end
|
||||
Case PartType EQ 'ASM'
|
||||
If RetVal EQ 8 OR RetVal EQ 6 then PocketQty = 1
|
||||
|
||||
End Case
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', PocketQty)
|
||||
END
|
||||
end else
|
||||
If Retired EQ '' then ErrMsg('A valid Part Type (EPP, ASM, HTR) must be selected before selecting Pocket Size.')
|
||||
end
|
||||
end
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * *
|
||||
* * * * * * *
|
||||
LUPktQty:
|
||||
* * * * * *
|
||||
* * * * * * *
|
||||
|
||||
ReactType = Get_Property(@WINDOW:'.REACT_TYPE','INVALUE')
|
||||
|
||||
@ -596,43 +508,3 @@ obj_React_Item('PrintLabel',RINo:@RM:CurrRec)
|
||||
RETURN
|
||||
|
||||
|
||||
PktSizeChange:
|
||||
|
||||
Retired = Get_Property(@Window: '.RETIRE_DT', 'TEXT')
|
||||
RIType = Get_Property(@Window:'.RI_TYPE', 'TEXT')
|
||||
If RIType EQ 'S' then
|
||||
PocketQty = ''
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', '')
|
||||
PktSize = Get_Property(@Window: '.PKT_SIZE', 'TEXT')
|
||||
PartType = Get_Property(@Window: '.PART_TYPE', 'TEXT')
|
||||
If (PartType EQ 'HTR') OR (PartType EQ 'EPP') OR (PartType EQ 'ASM') then
|
||||
If PktSize EQ 6 OR PktSize EQ 8 then
|
||||
Begin Case
|
||||
Case PartType EQ 'HTR'
|
||||
If PktSize EQ 8 then
|
||||
PocketQty = 3
|
||||
end else
|
||||
If PktSize EQ 6 then PocketQty = 5
|
||||
end
|
||||
Case PartType EQ 'EPP'
|
||||
If PktSize EQ 8 then
|
||||
PocketQty = 8
|
||||
end else
|
||||
If PktSize EQ 6 then PocketQty = 18
|
||||
end
|
||||
Case PartType EQ 'ASM'
|
||||
If PktSize EQ 8 OR PktSize EQ 6 then PocketQty = 1
|
||||
|
||||
End Case
|
||||
Set_Property(@Window:'.PKT_QTY', 'TEXT', PocketQty)
|
||||
end else
|
||||
If Retired EQ '' then ErrMsg('A valid Pocket Size (6 or 8 in.) is required.')
|
||||
end
|
||||
end else
|
||||
If Retired EQ '' then ErrMsg('A valid Part Type (EPP, ASM, HTR) must be selected before selecting Pocket Size.')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
@ -136,70 +136,12 @@ return
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
ErrMsg = ''
|
||||
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
|
||||
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
|
||||
|
||||
If OrigRetireDt EQ '' AND NewRetireDt NE '' then
|
||||
RetireBypass = True$
|
||||
end else
|
||||
RetireBypass = False$
|
||||
end
|
||||
|
||||
If RetireBypass EQ False$ then
|
||||
// Req'd parameter checks
|
||||
ItemType = {RI_TYPE}
|
||||
|
||||
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
|
||||
|
||||
If (ItemType NE 'LE') AND (ItemType NE 'RE') then
|
||||
SerialNo = Record<REACT_ITEM_SERIAL_NO$>
|
||||
If SerialNo EQ '' then
|
||||
ErrMsg := 'Serial No. is required for this Reactor Item type. '
|
||||
end
|
||||
end
|
||||
|
||||
If ItemType EQ 'S' then
|
||||
PocketQty = Record<REACT_ITEM_PKT_QTY$>
|
||||
PocketSize = Record<REACT_ITEM_PKT_SIZE$>
|
||||
If PocketSize EQ '' then
|
||||
ErrMsg := 'Pocket size is required for Susceptor Item Type. '
|
||||
end
|
||||
If PocketQty EQ '' then
|
||||
ErrMsg := 'Pocket quantity is required for Susceptor Item Type. '
|
||||
end
|
||||
If ErrMsg = '' then
|
||||
ExpectedQty = ''
|
||||
Begin Case
|
||||
Case Record<REACT_ITEM_PART_TYPE$> EQ 'ASM'
|
||||
If PocketSize EQ 6 OR PocketSize EQ 8 then
|
||||
ExpectedQty = 1
|
||||
end
|
||||
Case Record<REACT_ITEM_PART_TYPE$> EQ 'HTR'
|
||||
If PocketSize EQ 8 then
|
||||
ExpectedQty = 3
|
||||
end else
|
||||
If PocketSize EQ 6 then ExpectedQty = 5
|
||||
end
|
||||
Case Record<REACT_ITEM_PART_TYPE$> EQ 'EPP'
|
||||
If PocketSize EQ 8 then
|
||||
ExpectedQty = 8
|
||||
end else
|
||||
If PocketSize EQ 6 then ExpectedQty = 18
|
||||
end
|
||||
Case Record<REACT_ITEM_PART_TYPE$> EQ ''
|
||||
ErrMsg := 'Part Type. is required for Susceptor Reactor Item type. '
|
||||
Case Otherwise$
|
||||
ErrMsg := 'Invalid Part Type for Susceptor Reactor Item Type. '
|
||||
End Case
|
||||
If ExpectedQty NE '' then
|
||||
If PocketQty NE ExpectedQty then
|
||||
ErrMsg := 'Invalid Pocket Quantity for Part Type/Pocket Size combination. '
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
|
||||
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
|
||||
@ -207,6 +149,8 @@ WRITE_RECORD_PRE:
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
end else
|
||||
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
|
||||
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
|
||||
OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
|
||||
NewNotes = Record<REACT_ITEM_NOTES$>
|
||||
If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
|
||||
@ -289,6 +233,3 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -46,7 +46,7 @@ Options BOOLEAN = True$, False$
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN, PartType)
|
||||
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN)
|
||||
|
||||
ErrorMsg = ''
|
||||
Response = ''
|
||||
@ -99,9 +99,6 @@ Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStar
|
||||
Swap ',' with @VM in CurrStatus
|
||||
SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM
|
||||
end
|
||||
If PartType NE '' then
|
||||
SearchString := 'PART_TYPE':@VM:PartType:@FM
|
||||
end
|
||||
Flag = ''
|
||||
RIKeys = ''
|
||||
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag)
|
||||
@ -384,15 +381,17 @@ Service CreateReactItem(Record)
|
||||
ErrMsg = ''
|
||||
KeyID = ''
|
||||
If Record NE '' then
|
||||
//Need to do some parameter checks here
|
||||
ReactItemType = Record<REACT_ITEM_RI_TYPE$>
|
||||
If ReactItemType EQ '' then
|
||||
ErrMsg := 'React Item Type was blank!' : CRLF$
|
||||
end
|
||||
If ErrMsg EQ '' then
|
||||
KeyID = NextKey('REACT_ITEM')
|
||||
If Error_Services('NoError') and KeyID NE '' then
|
||||
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg := Error_Services('GetMessage')
|
||||
end
|
||||
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
|
||||
end else
|
||||
ErrMsg := 'Failed to generate a key for a new react item. '
|
||||
ErrMsg := 'Failed to generate a key for a new react item. ' : CRLF$
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -458,31 +457,6 @@ Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
|
||||
end service
|
||||
|
||||
|
||||
Service UpdateReactItem(RINo, Record)
|
||||
|
||||
ErrorMsg = ''
|
||||
If RINo EQ '' then
|
||||
ErrorMsg := 'React Item ID argument was missing in the ' : Service : ' service. '
|
||||
end
|
||||
If Record EQ '' then
|
||||
ErrorMsg := 'React Item Record argument was missing in the ' : Service : ' service. '
|
||||
end
|
||||
If ErrorMsg EQ '' then
|
||||
If RowExists('REACT_ITEM', RINo) then
|
||||
Database_Services('WriteDataRow', 'REACT_ITEM', RINo, Record, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg := 'React Item not found. '
|
||||
end
|
||||
end
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service UpdateReactItemStatus(RINo)
|
||||
|
||||
If RINo NE '' then
|
||||
@ -519,7 +493,3 @@ ClearCursors:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,174 +0,0 @@
|
||||
Function Receivecassette_API(@API)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from SRP Computer Solutions, Inc.
|
||||
|
||||
Name : Receivecassette_API
|
||||
|
||||
Description : API logic for the Receivecassette resource.
|
||||
|
||||
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||
|
||||
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||
FullEndpointURL - The URL submitted by the client, including query params.
|
||||
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||
EndpointSegment - The URL endpoint segment.
|
||||
ParentURL - The URL path preceeding the current endpoint.
|
||||
CurrentAPI - The name of this stored procedure.
|
||||
|
||||
Parameters :
|
||||
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||
- APIPattern must follow this structure Receivecassette[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Receivecassette.POST
|
||||
- Receivecassette.ID.PUT
|
||||
- Receivecassette.ID.firstName.GET
|
||||
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||
services do not rely upon anything being returned in the response. This is what the
|
||||
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||
value is only helpful if the developers want to use it for debug purposes.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
08/28/25 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function Work_Order_Services, Wo_Mat_Services, OI_Wizard_Services, Date_Services
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API receivecassette.POST
|
||||
|
||||
OIWizardID = ''
|
||||
Cookies = HTTP_Services('GetHTTPCookie')
|
||||
For each Cookie in Cookies using ';'
|
||||
Key = Field(Cookie, '=', 1)
|
||||
If Key EQ 'sessionID' then
|
||||
OIWizardID = Field(Cookie, '=', 2)
|
||||
end
|
||||
Next Cookie
|
||||
|
||||
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
|
||||
|
||||
If ValidSession then
|
||||
ErrorMsg = ''
|
||||
// Check if payload has the required information to create a react mode change record
|
||||
Body = HTTP_Services('GetHTTPPostString')
|
||||
If Body NE '' then
|
||||
// The POST string will have been encoded so use percent (URL) decoding.
|
||||
SubstrateScanJSON = HTTP_Services('DecodePercentString', Body)
|
||||
ParseResponse = SRP_JSON(hJSON, 'PARSE', SubstrateScanJSON)
|
||||
If (ParseResponse EQ '') then
|
||||
WONo = SRP_JSON(hJSON, 'GetValue', 'WoNo', '')
|
||||
LotNo = SRP_JSON(hJSON, 'GetValue', 'LotNo', '')
|
||||
Qty = SRP_JSON(hJSON, 'GetValue', 'Qty', 0)
|
||||
SubPartNo = SRP_JSON(hJSON, 'GetValue', 'SubPartNo', '')
|
||||
SubVendCd = SRP_JSON(hJSON, 'GetValue', 'VendorCd', '')
|
||||
ReceiveDtm = SRP_JSON(hJSON, 'GetValue', 'ReceiveDtm', '01/01/0001 00:00:00')
|
||||
ReceiveUser = SRP_JSON(hJSON, 'GetValue', 'ReceiveUser', '')
|
||||
Begin Case
|
||||
Case (WONo EQ '')
|
||||
ErrorMsg = 'WoNo cannot be null'
|
||||
Case (ReceiveUser EQ '')
|
||||
ErrorMsg = 'ReceiveUser cannot be null'
|
||||
Case (LotNo EQ '')
|
||||
ErrorMsg = 'Scanned LotNo cannot be null'
|
||||
Case (Qty EQ 0)
|
||||
ErrorMsg = 'Scanned Qty cannot be 0'
|
||||
Case (SubPartNo EQ '')
|
||||
ErrorMsg = 'Scanned SubPartNo cannot be null'
|
||||
Case (SubVendCd EQ '')
|
||||
ErrorMsg = 'Scanned VendorCd cannot be null'
|
||||
Case (ReceiveDtm EQ '01/01/0001 00:00:00')
|
||||
ErrorMsg = 'Invalid ReceiveDtm'
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
If (ErrorMsg EQ '') then
|
||||
ReceiveDtm = Date_Services('ConvertISO8601ToDateTime', ReceiveDtm)
|
||||
WOMatKey = Work_Order_Services('ReceiveReleaseCassette', WONo, ReceiveUser, LotNo, Qty, SubPartNo, SubVendCd, IConv(ReceiveDtm, 'DT'))
|
||||
If Error_Services('NoError') then
|
||||
ResponseCode = 201
|
||||
Message = 'Cassette ':WOMatKey:' received'
|
||||
GoSub CreateHalItem
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Error receiving cassette. ':ErrorMsg)
|
||||
end
|
||||
SRP_JSON(hJSON, 'Release')
|
||||
end else
|
||||
// Error parsing JSON
|
||||
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the JSON data from the request.')
|
||||
end
|
||||
end else
|
||||
// No JSON payload sent with request
|
||||
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing in the body of the request.')
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 401, 'Invalid session. Reauthentication required.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CreateHalItem:
|
||||
|
||||
JSON = ''
|
||||
|
||||
IF RowExists('WO_MAT', WOMatKey) then
|
||||
// Update Scan object in root JSON object to contain the returned WO_MAT object
|
||||
WOMatJson = Wo_Mat_Services('ConvertRecordToJsonOIWizard', WOMatKey)
|
||||
If (SRP_JSON(objWOMat, 'Parse', WOMatJson) EQ '') then
|
||||
objTemp = SRP_JSON(objWOMat, 'Get', 'WO_Mat')
|
||||
SRP_JSON(hJSON, 'Remove', 'ReceivedCass')
|
||||
SRP_JSON(hJSON, 'Set', 'ReceivedCass', objTemp)
|
||||
SRP_JSON(objTemp, 'Release')
|
||||
SRP_JSON(objWOMat, 'Release')
|
||||
JSON = SRP_JSON(hJSON, 'Stringify', 'Fast')
|
||||
end
|
||||
end else
|
||||
ResponseCode = 406
|
||||
ResponseMessage = 'Error receiving and releasing cassette. WO_MAT record ':WOMatKey:' does not exist after calling ReceiveReleaseCassette.'
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, ResponseMessage)
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', JSON, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
@ -243,3 +243,4 @@ API reports.GET
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
@ -150,7 +150,7 @@ Service GetMakeupInventoryReportJSON()
|
||||
end else
|
||||
LotID = Row<0, 2>:'*1*':Row<0, 3>
|
||||
end
|
||||
WcRec = Wafer_Counter_Services('GetLastScan', LotID)
|
||||
WcRec = Wafer_Counter_Services('GetLastScan', LotID, 'MU')
|
||||
WcQty = WcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||
WcDtm = WcRec<WAFER_COUNTER.SCAN_DTM$>
|
||||
|
||||
@ -1446,11 +1446,8 @@ Service GenerateMaterialTrackRows()
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
|
||||
SchedDetTable = ''
|
||||
SchedDetDict = ''
|
||||
|
||||
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO @DICT then
|
||||
Today = Datetime()
|
||||
|
||||
ReactList = ''
|
||||
@ -1469,12 +1466,12 @@ Service GenerateMaterialTrackRows()
|
||||
END
|
||||
|
||||
Done = 0
|
||||
CurrSchedDetKey = ''
|
||||
@ID = ''
|
||||
LOOP
|
||||
PrevSchedDetKey = CurrSchedDetKey
|
||||
READNEXT CurrSchedDetKey ELSE Done = 1
|
||||
PrevSchedDetKey = @ID
|
||||
READNEXT @ID ELSE Done = 1
|
||||
UNTIL Done
|
||||
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
If ReactNo NE '' then
|
||||
@ -1485,20 +1482,20 @@ Service GenerateMaterialTrackRows()
|
||||
If WONo NE '' then
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0, SchedDetKeys, SchedDetTable, SchedDetDict)
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
|
||||
DateRange = 'Effective ':OCONV(Date(),'D4')
|
||||
|
||||
RowIndex = 0
|
||||
AllReportData = ''
|
||||
RecCount = 0
|
||||
@RECCOUNT = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
@ -1509,50 +1506,48 @@ Service GenerateMaterialTrackRows()
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
CurrSchedDetRec = ''
|
||||
|
||||
Loop
|
||||
|
||||
ReactNo.Break = 0
|
||||
|
||||
READNEXT CurrSchedDetKey, Which.Value ELSE
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = CurrSchedDetKey
|
||||
S.ATID = @ID
|
||||
Abort = (FirstPass and LastRecord)
|
||||
If Not(Abort) then
|
||||
|
||||
If Not(LastRecord) then
|
||||
|
||||
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
|
||||
READO @RECORD FROM SchedDetTable,@ID then
|
||||
|
||||
// GOTO ReadRecord
|
||||
RecCount += 1
|
||||
@RECCOUNT += 1
|
||||
|
||||
* Calculate Value(s) For Column(s)
|
||||
|
||||
S.StartDtm = CurrSchedDetRec<SCHED_DET_NG.START_DTM$>
|
||||
S.ATID = CurrSchedDetKey
|
||||
S.StartDtm = {START_DTM}
|
||||
S.ATID = {@ID}
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
S.ReactNo = {REACT_NO}
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
S.WoNo = {WO_NO}
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
|
||||
S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X')
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X')
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X')
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
|
||||
S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X')
|
||||
|
||||
Locate 'SR*KTR]' in LocationFilter using @VM setting vPos then
|
||||
KitData = Location_Services('GetLocationCassInfo', S.WONo, 'SR*KTR]')
|
||||
@ -1904,11 +1899,8 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
ErrCode = ''
|
||||
ErrorMsg = ''
|
||||
|
||||
SchedDetTable = ''
|
||||
SchedDetDict = ''
|
||||
|
||||
OPEN 'SCHED_DET_NG' TO SchedDetTable then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO SchedDetDict then
|
||||
OPEN 'DICT.SCHED_DET_NG' TO @DICT then
|
||||
Today = Datetime()
|
||||
|
||||
ReactList = ''
|
||||
@ -1930,12 +1922,12 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
END
|
||||
|
||||
Done = 0
|
||||
CurrSchedDetKey = ''
|
||||
@ID = ''
|
||||
LOOP
|
||||
PrevSchedDetKey = CurrSchedDetKey
|
||||
READNEXT CurrSchedDetKey ELSE Done = 1
|
||||
PrevSchedDetKey = @ID
|
||||
READNEXT @ID ELSE Done = 1
|
||||
UNTIL Done
|
||||
READ SchedDetRec FROM SchedDetTable,CurrSchedDetKey THEN
|
||||
READ SchedDetRec FROM SchedDetTable,@ID THEN
|
||||
ReactNo = SchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
WONo = SchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
If ReactNo NE '' then
|
||||
@ -1946,14 +1938,14 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
If WONo NE '' then
|
||||
LOCATE WONo IN WOList<Pos> USING @VM SETTING WPos ELSE
|
||||
WOList = INSERT(WOList,Pos,-1,0,WONo)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,CurrSchedDetKey)
|
||||
SchedDetKeys = INSERT(SchedDetKeys,-1,0,0,@ID)
|
||||
END
|
||||
END
|
||||
END
|
||||
|
||||
REPEAT
|
||||
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,SchedDetDict)
|
||||
CALL Make.List(0,SchedDetKeys,SchedDetTable,@DICT)
|
||||
|
||||
Header = "'D'":@VM:obj_Install('Get_Prop','CompTitle'):' Material Tracking by Reactor':@VM:"Page 'P'"
|
||||
MinDemand = 0
|
||||
@ -1996,7 +1988,7 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
Footer = " 'D' 'T'":@VM:@VM:"Page: 'P'"
|
||||
stat = Set_Printer('FOOTER',Footer)
|
||||
If Stat GE 0 then
|
||||
RecCount = 0
|
||||
@RECCOUNT = 0
|
||||
FirstPass = 1
|
||||
LastRecord = 0
|
||||
FirstLine = 1
|
||||
@ -2018,48 +2010,48 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
Prev.ReactNo = ''
|
||||
Last.ReactNo.Break = 1
|
||||
|
||||
CurrSchedDetRec = ''
|
||||
|
||||
Loop
|
||||
|
||||
* Zero Break Flags To False
|
||||
|
||||
ReactNo.Break = 0
|
||||
|
||||
READNEXT CurrSchedDetKey, Which.Value ELSE
|
||||
READNEXT @ID, Which.Value ELSE
|
||||
LastRecord = 1
|
||||
ReactNo.Break = 1
|
||||
ReactNo = Prev.ReactNo
|
||||
END
|
||||
|
||||
S.ATID = CurrSchedDetKey
|
||||
S.ATID = @ID
|
||||
Abort = (FirstPass AND LastRecord)
|
||||
IF Not(Abort) THEN
|
||||
|
||||
IF Not(LastRecord) then
|
||||
READO CurrSchedDetRec FROM SchedDetTable,CurrSchedDetKey then
|
||||
READO @RECORD FROM SchedDetTable,@ID then
|
||||
|
||||
RecCount += 1
|
||||
@RECCOUNT += 1
|
||||
|
||||
* Calculate Value(s) For Column(s)
|
||||
S.ATID = CurrSchedDetKey
|
||||
|
||||
S.ATID = {@ID}
|
||||
I.ATID = S.ATID
|
||||
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
|
||||
S.ReactNo = {REACT_NO}
|
||||
I.ReactNo = S.ReactNo
|
||||
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.WO_NO$>
|
||||
S.WoNo = {WO_NO}
|
||||
I.WoNo = S.WoNo
|
||||
S.SubPartNo = XLATE('WO_LOG', S.WoNo, 'ORD_SUB_PART_NO', 'X')
|
||||
I.SubPartNo = S.SubPartNo
|
||||
S.EpiPartNo = XLATE('WO_LOG', S.WoNo, WO_LOG_EPI_PART_NO$, 'X')
|
||||
I.EpiPartNo = S.EpiPartNo
|
||||
S.WO_Qty = Xlate('WO_LOG', S.WoNo, WO_LOG_WO_QTY$, 'X')
|
||||
S.WO_Qty = Xlate('WO_LOG', {WO_NO}, WO_LOG_WO_QTY$, 'X')
|
||||
I.WO_Qty = S.WO_Qty
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
|
||||
S.WO_RX_Qty = Xlate('WO_LOG', {WO_NO}, 'RX_QTY', 'X')
|
||||
I.WO_RX_Qty = S.WO_RX_Qty
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, 'UNREL_QTY', 'X')
|
||||
S.WO_UnRel_QTY = Xlate('WO_LOG', {WO_NO}, 'UNREL_QTY', 'X')
|
||||
I.WO_UnRel_QTY = S.WO_UnRel_QTY
|
||||
S.REACT_TYPE = Xlate('WO_LOG', S.WoNo, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', S.WoNo, 'PROD_ORD_NO', 'X')
|
||||
S.REACT_TYPE = Xlate('WO_LOG', {WO_NO}, 'REACT_TYPE', 'X')
|
||||
S.ProdOrdNo = Xlate('WO_LOG', {WO_NO}, 'PROD_ORD_NO', 'X')
|
||||
|
||||
|
||||
If OldReport then
|
||||
|
||||
@ -2340,9 +2332,7 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetOpenNCRReportJson()
|
||||
|
||||
ErrorMessage = ''
|
||||
OpenNCRReportJson = ''
|
||||
OpenNCRKeyList = NCR_Services('GetOpenNCRKeys')
|
||||
@ -2445,3 +2435,4 @@ OipiPrintError:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
@ -1320,4 +1320,3 @@ Service MigrateLegacyRTFRecord(RTFRecordId)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -263,7 +263,6 @@ API scan.ID.PATCH
|
||||
SRP_Stopwatch('Start', 'IDPatchResponseTime')
|
||||
// First confirm that this is a valid Scan ID.
|
||||
jsonScan = Scan_Services('GetScansRow', ScanID, True$)
|
||||
ErrMsg = ''
|
||||
If Error_Services('NoError') then
|
||||
// Confirm that all required data has been scanned before allowing the "accept" field to be updated.
|
||||
ParseResponse = SRP_JSON(objResource, 'Parse', jsonScan)
|
||||
@ -294,7 +293,7 @@ API scan.ID.PATCH
|
||||
end
|
||||
end else
|
||||
ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason')
|
||||
ErrMsg = ScanNotAcceptableReason
|
||||
Error_Services('Add', ScanNotAcceptableReason)
|
||||
end
|
||||
SRP_JSON(objResource, 'Release')
|
||||
end else
|
||||
@ -325,8 +324,6 @@ API scan.ID.PATCH
|
||||
end
|
||||
LogData<6> = ResponseStatusCode
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end api
|
||||
|
||||
|
||||
@ -438,3 +435,6 @@ CreateHALItem:
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
@ -51,7 +51,6 @@ Declare function GetTickCount
|
||||
Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services
|
||||
Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services
|
||||
Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services, Mona_Services
|
||||
Declare Subroutine Dialog_Response_Log_Services
|
||||
|
||||
Equ CRLF$ to \0D0A\
|
||||
|
||||
@ -214,22 +213,19 @@ Service GetScansRow(ScanID, ReturnJSON)
|
||||
|
||||
ScansRow = ''
|
||||
|
||||
ErrMsg = ''
|
||||
If ScanID NE '' then
|
||||
ScansRow = Database_Services('ReadDataRow', 'SCANS', ScanID)
|
||||
If ReturnJSON EQ True$ then
|
||||
ScansRow = Scan_Services('ConvertMVScanToJSON', ScanID, ScansRow)
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'ScanID argument was missing in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'ScanID argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
Response = ScansRow
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -242,17 +238,14 @@ Service SetScansRow(ScanID, ScansRow)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'SetScansRow'
|
||||
|
||||
ErrMsg = ''
|
||||
If (ScanID NE '') AND (ScansRow NE '') then
|
||||
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow)
|
||||
end else
|
||||
ErrMsg = 'ScanID or ScansRow argument was missing in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'ScanID or ScansRow argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -268,7 +261,6 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'ProcessScanData'
|
||||
|
||||
ErrMsg = ''
|
||||
If ( (ScanID NE '') AND (ScanJSON NE '') ) then
|
||||
hScanJSON = ''
|
||||
ParseResponse = SRP_JSON(hScanJSON, 'PARSE', ScanJSON)
|
||||
@ -307,7 +299,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
If RowExists('LOT', LotId) then
|
||||
TWLots = ScansRow<SCANS.TW_LOT_ID$>
|
||||
Locate LotId in TWLots using @VM setting twPos then
|
||||
ErrMsg = LotID : ' has already been added as a test wafer lot being used.'
|
||||
Error_Services('Add', LotID : ' has already been added as a test wafer lot being used.')
|
||||
end else
|
||||
ScansRow<SCANS.TW_LOT_CHANGED$> = True$
|
||||
LotCurrentOperation = Lot_Services('GetLotCurrOperationName', LotId)
|
||||
@ -323,14 +315,14 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.TW_LOT_QTY$, twPos> = 1
|
||||
end
|
||||
end else
|
||||
ErrMsg = LotID : ' does not have enough wafers to be used.'
|
||||
Error_Services('Add', LotID : ' does not have enough wafers to be used.')
|
||||
end
|
||||
end else
|
||||
ErrMsg = LotID : ' is not at a valid operation for use.'
|
||||
Error_Services('Add', LotID : ' is not at a valid operation for use.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg = LotID : ' is not a valid test wafer lot ID.'
|
||||
Error_Services('Add', LotID : ' is not a valid test wafer lot ID.')
|
||||
end
|
||||
|
||||
Case Otherwise$
|
||||
@ -357,9 +349,9 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
Case EmployeeAuthorized NE True$
|
||||
// Regardless of the not authorized reason, the scan data will be considered invalid.
|
||||
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
|
||||
ErrMsg = EmployeeNotAuthorizedReason
|
||||
Error_Services('Add', EmployeeNotAuthorizedReason)
|
||||
Case EmployeeActive NE True$
|
||||
ErrMsg = 'Inactive employee.'
|
||||
Error_Services('Add', 'Inactive employee.')
|
||||
Case Otherwise$
|
||||
ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID}
|
||||
|
||||
@ -402,7 +394,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
If (EmployeeAuthorized NE True$) AND ({EMPLOYEE_ID} NE '') then
|
||||
// Regardless of the not authorized reason, the scan data will be considered invalid.
|
||||
EmployeeNotAuthorizedReason = {EMPLOYEE_NOT_AUTHORIZED_REASON}
|
||||
ErrMsg = EmployeeNotAuthorizedReason
|
||||
Error_Services('Add', EmployeeNotAuthorizedReason)
|
||||
end else
|
||||
* If LoadLock EQ '' then LoadLock = 'NA' ; // NA means Not Applicable.
|
||||
ReactorID = ToolID[2, 999]
|
||||
@ -422,10 +414,10 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.TOOL_ID$> = ToolID
|
||||
ScansRow<SCANS.LOAD_LOCK$> = LoadLock
|
||||
end else
|
||||
ErrMsg = 'Invalid load lock value "':LoadLock:'".'
|
||||
Error_Services('Add', 'Invalid load lock value "':LoadLock:'".')
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'A load lock side "L" or "R" is required for reactor ':ReactorID:'.'
|
||||
Error_Services('Add', 'A load lock side "L" or "R" is required for reactor ':ReactorID:'.')
|
||||
end
|
||||
Case (LoadLockReq EQ False$)
|
||||
If ScansRow<SCANS.LOCATION_ID$> NE '' then
|
||||
@ -440,17 +432,17 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
|
||||
end
|
||||
Case ToolType _EQC 'Transfer'
|
||||
ErrMsg = 'Tool type ':ToolType:' is not currently supported by the barcode application.'
|
||||
Error_Services('Add', 'Tool type ':ToolType:' is not currently supported by the barcode application.')
|
||||
// Code below may be implemented down the road.
|
||||
// This is a transfer tool. Just update the scan resource.
|
||||
* ScansRow<SCANS.LOCATION_ID$> = '' ; // Make sure the Location ID is cleared.
|
||||
* ScansRow<SCANS.CASSETTE_IDS$> = ScansRow<SCANS.CASSETTE_IDS$, 1> ; // Make sure only the first Cassette ID is tracked.
|
||||
* ScansRow<SCANS.TRANSFER_TOOL_ID$> = ToolID
|
||||
Case Otherwise$
|
||||
ErrMsg = 'Tool type ':ToolType:' is not currently supported by the barcode application.'
|
||||
Error_Services('Add', 'Tool type ':ToolType:' is not currently supported by the barcode application.')
|
||||
End Case
|
||||
end else
|
||||
ErrMsg = ToolID : ' is not a valid tool ID.'
|
||||
Error_Services('Add', ToolID : ' is not a valid tool ID.')
|
||||
end
|
||||
|
||||
Case ScanData[1, 2] EQ '1L'
|
||||
@ -468,7 +460,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.TRANSFER_TOOL_ID$> = '' ; // Make sure the Transfer Tool ID is cleared.
|
||||
ScansRow<SCANS.LOCATION_ID$> = LocationID
|
||||
end else
|
||||
ErrMsg = LocationID : ' is not a valid location ID.'
|
||||
Error_Services('Add', LocationID : ' is not a valid location ID.')
|
||||
end
|
||||
|
||||
Case ScanData[1, 2] EQ '1B'
|
||||
@ -483,7 +475,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.BOAT_ID$> = BoatID
|
||||
ScansRow<SCANS.PL_NUMBER$> = PLNo
|
||||
end else
|
||||
ErrMsg = ScanData : ' is not a valid boat ID.'
|
||||
Error_Services('Add', ScanData : ' is not a valid boat ID.')
|
||||
end
|
||||
Case ScanData[1, 3] EQ 'PWD'
|
||||
// Password/Signature scan. If the scan is not ready to be accepted or the password does
|
||||
@ -498,14 +490,14 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.AUTHENTICATED$> = 1
|
||||
end else
|
||||
ScansRow<SCANS.AUTHENTICATED$> = 0
|
||||
ErrMsg = 'Invalid password for user ':EmployeeID:'.'
|
||||
Error_Services('Add', 'Invalid password for user ':EmployeeID:'.')
|
||||
end
|
||||
ScansRow<SCANS.EMPLOYEE_CHANGED$> = True$
|
||||
end else
|
||||
ErrMsg = 'An employee ID must be scanned before scanning a password.'
|
||||
Error_Services('Add', 'An employee ID must be scanned before scanning a password.')
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Invalid password scanned.'
|
||||
Error_Services('Add', 'Invalid password scanned.')
|
||||
end
|
||||
Case ScanData[1, 8] EQ 'OVERRIDE'
|
||||
|
||||
@ -572,7 +564,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
|
||||
end else
|
||||
ErrMsg = 'Selected Employee is not authorized to perform an override'
|
||||
Error_Services('Add', 'Selected Employee is not authorized to perform an override')
|
||||
end
|
||||
end
|
||||
Case ScanData[1, 2] EQ '5T'
|
||||
@ -658,11 +650,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.CASSETTE_IDS$> = CassetteID
|
||||
end
|
||||
end else
|
||||
ErrMsg = CassetteID : ' is not a valid Cassette ID.'
|
||||
Error_Services('Add', CassetteID : ' is not a valid Cassette ID.')
|
||||
end
|
||||
End Case
|
||||
|
||||
If ErrMsg EQ '' then
|
||||
If Error_Services('NoError') then
|
||||
// Process Scan row data here to determine the type of scan (i.e. Location, Pre-Epi + Load, or Unload).
|
||||
ScanType = ScansRow<SCANS.SCAN_TYPE$>
|
||||
CassetteIDs = ScansRow<SCANS.CASSETTE_IDS$>
|
||||
@ -689,7 +681,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
LastCassScanned = CassetteIDs<0, NumCass>
|
||||
CurrStage = Xlate('RDS', LastCassScanned, 'CURR_STAGE', 'X')
|
||||
If CurrStage EQ 'UNLOAD' then
|
||||
ErrMsg = '(':LastCassScanned:') Cassette is currently loaded on a tool and is ineligble for a location scan.'
|
||||
Error_Services('Add', '(':LastCassScanned:') Cassette is currently loaded on a tool and is ineligble for a location scan.')
|
||||
end
|
||||
|
||||
Case ScanType EQ 'TOOL'
|
||||
@ -763,9 +755,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
CassNo = Xlate('RDS', CassetteID, 'CASS_NO', 'X')
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
|
||||
If Index(WOMatLocs,'PTI',1) else
|
||||
ErrMsg = 'Cassette ':CassetteID:' failed due to missing PTI.'
|
||||
end
|
||||
If Index(WOMatLocs,'PTI',1) else Error_Services('Add', 'Cassette ':CassetteID:' failed due to missing PTI.')
|
||||
end else
|
||||
// EpiPro RDS
|
||||
OutCassNos = Xlate('RDS', CassetteID, 'OUT_CASS_NO', 'X')
|
||||
@ -775,13 +765,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
CassNo = OutCassNo
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatLocs = Xlate('WO_MAT', WOMatKey, WO_MAT_INV_LOCATION$, 'X')
|
||||
If Index(WOMatLocs,'PTI',1) else
|
||||
ErrMsg = 'Cassette ':CassetteID:' failed due to missing PTI.'
|
||||
end
|
||||
If Index(WOMatLocs,'PTI',1) else Error_Services('Add', 'Cassette ':CassetteID:' failed due to missing PTI.')
|
||||
Next OutCassNo
|
||||
end
|
||||
|
||||
If ErrMsg EQ '' then
|
||||
If Error_Services('NoError') then
|
||||
If CurrStatus NE 'HOLD' then
|
||||
If (EmployeeID NE '') then
|
||||
* SupplInstAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ' , 'X')
|
||||
@ -985,7 +973,8 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
FirstParmsComp = LSParmsComp<1,1>
|
||||
If (FirstParmsComp EQ False$) then RDS_Services('CopyRDSLayerParameters', RDSNo)
|
||||
//Test Wafer logging verification
|
||||
If Error_Services('NoError') then
|
||||
|
||||
|
||||
// Supplier lot verification
|
||||
ScannedSuppLot = ScansRow<SCANS.SUPPLIER_LOT$>
|
||||
RDSSuppLot = RDSRec<RDS_LOT_NUM$>
|
||||
@ -1002,13 +991,13 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide, True$, Reactor)
|
||||
If (LoadStageReady NE True$) then
|
||||
// Why is it not ready?
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrMsg, 'supplement', 1)
|
||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
||||
// Clear the error to return a JSON payload and handle the acknowledgements.
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
Case IndexC(ErrMsg, 'ROTR', 1)
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
||||
Case IndexC(ErrorMsg, 'ROTR', 1)
|
||||
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
||||
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
||||
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
||||
@ -1028,11 +1017,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
end else
|
||||
// Why is it not ready?
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrMsg, 'supplement', 1)
|
||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
||||
End Case
|
||||
end
|
||||
end else
|
||||
@ -1043,19 +1032,17 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
end else
|
||||
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
||||
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
|
||||
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
|
||||
end
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
||||
end
|
||||
|
||||
end else
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Error_Services('Add', '(':CassetteID:') The first run must be completed using the OpenInsight user interface.')
|
||||
end
|
||||
end else
|
||||
ErrMsg = '(':CassetteID:') The first run must be completed using the OpenInsight user interface.'
|
||||
end
|
||||
end else
|
||||
ErrMsg = '(':CassetteID:') A pre-clean is required for this RDS. The OpenInsight user interface must be used to proceed.'
|
||||
Error_Services('Add', '(':CassetteID:') A pre-clean is required for this RDS. The OpenInsight user interface must be used to proceed.')
|
||||
end
|
||||
Case CurrStage _EQC 'LOAD'
|
||||
Action = 'LOAD'
|
||||
@ -1080,13 +1067,13 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide)
|
||||
If (LoadStageReady NE True$) then
|
||||
// Why is it not ready?
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrMsg, 'supplement', 1)
|
||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
||||
// Clear the error to return a JSON payload and handle the acknowledgements.
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
Case IndexC(ErrMsg, 'ROTR', 1)
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
||||
Case IndexC(ErrorMsg, 'ROTR', 1)
|
||||
ROTRBlock = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS$, True$, 0, False$)
|
||||
ROTRBlockReason = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ROTR_STATUS_REASON$, True$, 0, False$)
|
||||
ROTREnabled = Database_Services('ReadDataColumn', 'REACTOR', Reactor, REACTOR_ENABLE_ROTR$, True$, 0, False$)
|
||||
@ -1111,11 +1098,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
Scan_Services('AddNotAcceptableReason', 'The LWI stage engineering instructions must be acknowledged before the load operation can be signed.')
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMessage)
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Scanned tool ':ScanTool:' does not match the scheduled tool ':SchedTool:'. (':RDSNo:')'
|
||||
Error_Services('Add', 'Scanned tool ':ScanTool:' does not match the scheduled tool ':SchedTool:'. (':RDSNo:')')
|
||||
end
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
|
||||
@ -1123,7 +1110,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end else
|
||||
|
||||
ScansRow<SCANS.SUPPLIER_LOT$> = ''
|
||||
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
|
||||
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
|
||||
end
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
|
||||
@ -1139,11 +1126,11 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
UnloadStageReady = QA_Services('UnloadSignatureReady', RDSNo, Username, Reactor)
|
||||
If Not(UnloadStageReady) then
|
||||
// Why is it not ready?
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case IndexC(ErrMsg, 'supplement', 1)
|
||||
Case IndexC(ErrorMsg, 'supplement', 1)
|
||||
Error_Services('Clear')
|
||||
Scan_Services('AddNotAcceptableReason', ErrMsg)
|
||||
Scan_Services('AddNotAcceptableReason', ErrorMsg)
|
||||
Case Otherwise$
|
||||
// Keep error on Error_Services stack and return 400 level error.
|
||||
End Case
|
||||
@ -1188,16 +1175,12 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'No test wafer ran with box when one was required. Unload signature was blocked. User was notified.')
|
||||
end else If NextEventHasSamePsn EQ False$ then
|
||||
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'No test wafer ran with box when one was required. Unload signature was blocked. User was notified.')
|
||||
end
|
||||
|
||||
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
|
||||
end
|
||||
end else
|
||||
Dialog_Response_Log_Services('AddDialogResponseLog', RDSNo, 'RDS', @User4, 'HTR_LAST_BOX_TW', 'Test wafer was already logged with box. Unload signature was allowed. User was not prompted.')
|
||||
end
|
||||
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||
@ -1207,10 +1190,12 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'WO_MAT record was null.'
|
||||
ErrorMessage = 'WO_MAT record was null.'
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Failure to read cassette record. ' : Error_Services('GetMessage')
|
||||
ErrorMessage = 'Failure to read cassette record. ' : Error_Services('GetMessage')
|
||||
Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1228,23 +1213,24 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
Case CurrStage _EQC 'COMP'
|
||||
Action = 'COMP'
|
||||
ErrMsg = '(':CassetteID:") Cassette has already been FQA'd."
|
||||
Error_Services('Add', '(':CassetteID:") Cassette has already been FQA'd.")
|
||||
Case Otherwise$
|
||||
Action = CurrStage
|
||||
ErrMsg = '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.'
|
||||
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
|
||||
End Case
|
||||
end else
|
||||
Scan_Services('AddNotAcceptableReason', 'EmployeeID required to complete a tool scan.')
|
||||
end
|
||||
end else
|
||||
ErrMsg = '(':CassetteID:') Process Error: cassette is on Hold and may not be signed off.'
|
||||
Error_Services('Add', '(':CassetteID:') Process Error: cassette is on Hold and may not be signed off.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg = '(':CassetteID:') WMI/WMO cassette are not currently supported for tool scans. The OpenInsight user interface must be used in order to proceed.'
|
||||
Error_Services('Add', '(':CassetteID:') WMI/WMO cassette are not currently supported for tool scans. The OpenInsight user interface must be used in order to proceed.')
|
||||
end
|
||||
end else
|
||||
ErrMsg = '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.'
|
||||
// Currently we are only supporting loading one cassette onto a tool at a time.
|
||||
Error_Services('Add', '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.')
|
||||
end
|
||||
end
|
||||
|
||||
@ -1305,7 +1291,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
End Case
|
||||
end
|
||||
// If the the scan data is valid, update the scan log before returning to the calling process.
|
||||
If ErrMsg EQ '' then
|
||||
If Error_Services('NoError') then
|
||||
If Scan_Services('NoNotAcceptableReason') then
|
||||
ScansRow<SCANS.ACCEPTABLE$> = True$
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ''
|
||||
@ -1315,7 +1301,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
end
|
||||
end else
|
||||
ScansRow<SCANS.ACCEPTABLE$> = False$
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ErrMsg
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = Error_Services('GetMessage')
|
||||
end
|
||||
If ScanData NE '' then
|
||||
ScansRow<SCANS.SCANNED_DATES$, -1> = Date()
|
||||
@ -1323,21 +1309,25 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
ScansRow<SCANS.SCANNED_DATA$, -1> = ScanData
|
||||
end
|
||||
ScansRow<SCANS.ACTION$> = Action
|
||||
|
||||
// Save error message if present as Database_Services will clear any errors.
|
||||
ErrorMessage = ''
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$)
|
||||
// Restore pre-existing error message if present.
|
||||
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Unable to parse the JSON scan data in the ':Service:' service.'
|
||||
Error_Services('Add', 'Unable to parse the JSON scan data in the ':Service:' service.')
|
||||
end
|
||||
SRP_JSON(hScanJSON, 'Release')
|
||||
end else
|
||||
ErrMsg = 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -1349,7 +1339,6 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'AcceptScan'
|
||||
|
||||
ErrMsg = ''
|
||||
If ( (ScanID NE '') and (ScanJSON NE '') ) then
|
||||
hBody = ''
|
||||
ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON)
|
||||
@ -1382,7 +1371,7 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
If Error_Services('NoError') AND SendStatus EQ 'Success' then
|
||||
Result = 'Tencor Data Sent Successfully'
|
||||
end else
|
||||
ErrMsg = SendStatus
|
||||
Error_Services('Add', SendStatus)
|
||||
end
|
||||
|
||||
Case ScanType _EQC 'LOCATION'
|
||||
@ -1487,7 +1476,8 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
end
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
|
||||
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
|
||||
Error_Services('Add', ErrorMsg)
|
||||
END else
|
||||
NumCass = DCount(CassetteIDs, @VM)
|
||||
If NumCass EQ 1 then
|
||||
@ -1550,7 +1540,8 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
If Error_Services('NoError') then
|
||||
Continue = True$
|
||||
end else
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Continue = False$
|
||||
end
|
||||
If Continue then
|
||||
@ -1594,7 +1585,8 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
If Error_Services('NoError') then
|
||||
Continue = True$
|
||||
end else
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Continue = False$
|
||||
end
|
||||
If Continue then
|
||||
@ -1630,7 +1622,8 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X')
|
||||
NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Continue = False$
|
||||
end
|
||||
end
|
||||
@ -1647,10 +1640,10 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
end
|
||||
Case CurrStage _EQC 'COMP'
|
||||
Action = 'COMP'
|
||||
ErrMsg = '(':CassetteID:") Cassette has already been FQA'd."
|
||||
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
|
||||
Case Otherwise$
|
||||
Action = CurrStage
|
||||
ErrMsg = '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.'
|
||||
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
|
||||
End Case
|
||||
Case CassetteID EQ '' AND TestWaferLots NE ''
|
||||
//Tool scan with ONLY test wafers being logged.
|
||||
@ -1663,10 +1656,12 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
If NewTestRunId NE '' then
|
||||
Result = 'Test run logged successfully'
|
||||
end else
|
||||
ErrMsg = 'Error while logging creating test run.'
|
||||
ErrorMessage = 'Error while logging creating test run.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
end
|
||||
end else
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
end
|
||||
Case Otherwise$
|
||||
//null
|
||||
@ -1674,30 +1669,34 @@ Service AcceptScan(ScanID, ScanJSON)
|
||||
End Case
|
||||
end
|
||||
|
||||
If ErrMsg EQ '' then
|
||||
If Error_Services('NoError') then
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = 'This scan has already been accepted.'
|
||||
end else
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = ErrMsg
|
||||
ScansRow<SCANS.NOT_ACCEPTABLE_REASON$> = Error_Services('GetMessage')
|
||||
end
|
||||
ScansRow<SCANS.ACCEPTABLE$> = False$
|
||||
If Assigned(Result) then ScansRow<SCANS.RESULT$> = Result
|
||||
|
||||
// Save error message if present as Database_Services will clear any errors.
|
||||
ErrorMessage = ''
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
Scan_Services('SetScansRow', ScanID, ScansRow)
|
||||
// Restore pre-existing error message if present.
|
||||
If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
|
||||
end else
|
||||
ErrMsg = 'The accepted.status field is missing from the JSON object in the ':Service:' service.'
|
||||
Error_Services('Add', 'The accepted.status field is missing from the JSON object in the ':Service:' service.')
|
||||
end
|
||||
SRP_JSON(hBody, 'Release')
|
||||
end else
|
||||
ErrMsg = 'Unable to parse the JSON scan resource in the ':Service:' service.'
|
||||
Error_Services('Add', 'Unable to parse the JSON scan resource in the ':Service:' service.')
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -1715,7 +1714,6 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
|
||||
|
||||
mvScanChanged = False$
|
||||
|
||||
ErrMsg = ''
|
||||
If ScanID NE '' then
|
||||
|
||||
If mvScan EQ '' then mvScan = Database_Services('ReadDataRow', 'SCANS', ScanID)
|
||||
@ -2169,19 +2167,17 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
|
||||
Database_Services('WriteDataRow', 'SCANS', {SCAN_ID}, mvScan, True$, False$, False$)
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Unable to create JSON representation in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'ScanID argument was missing in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'ScanID argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
Response = jsonScan
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -2419,7 +2415,3 @@ ClearCursors:
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -385,6 +385,7 @@ end service
|
||||
Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
|
||||
|
||||
If IncludeWaferDetails NE True$ then IncludeWaferDetails = False$
|
||||
|
||||
ScheduleEventSummary = ''
|
||||
If SchedDetKeyID NE '' then
|
||||
SchedDetRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetKeyID)
|
||||
@ -441,10 +442,10 @@ Service GetScheduleEventSummary(SchedDetKeyID, IncludeWaferDetails)
|
||||
Begin Case
|
||||
Case BackColor NE ''
|
||||
// Set in the schedule detail record. Use current color.
|
||||
Case WOClosedFlag
|
||||
BackColor = 'LightGray'
|
||||
Case HotLotFlag
|
||||
BackColor = 'LightCoral'
|
||||
Case WOClosedFlag
|
||||
BackColor = 'LightGray'
|
||||
Case HardBlock
|
||||
BackColor = 'LightGoldenRodYellow'
|
||||
Case BlockOut
|
||||
@ -806,7 +807,6 @@ Service GetCurrentEvent(ReactNo)
|
||||
MetricName = 'GetCurrentEvent'
|
||||
|
||||
SchedDetKey = ''
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
CurrDTM = Datetime()
|
||||
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
|
||||
@ -819,21 +819,19 @@ Service GetCurrentEvent(ReactNo)
|
||||
Response = SchedDetKey
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
GoSub ClearCursors
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
Service CurrentEventIsBlock(ReactNo)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'CurrentEventIsBlock'
|
||||
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
|
||||
|
||||
@ -849,15 +847,15 @@ Service CurrentEventIsBlock(ReactNo)
|
||||
end else
|
||||
Error = Error_Services('GetMessage')
|
||||
ErrorMsg = 'Error in service ':Service:' module. ':Error
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
Service GetNextEvent(ReactNo)
|
||||
@ -865,7 +863,6 @@ Service GetNextEvent(ReactNo)
|
||||
MetricName = 'GetNextEvent'
|
||||
|
||||
SchedDetKey = ''
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
CurrDTM = Datetime()
|
||||
Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM'
|
||||
@ -878,24 +875,25 @@ Service GetNextEvent(ReactNo)
|
||||
ReadNext SchedDetKey else EOF = True$
|
||||
If EOF EQ True$ then
|
||||
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end else
|
||||
ReadNext SchedDetKey else EOF = True$
|
||||
If EOF EQ True$ then
|
||||
ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule after current event'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end else
|
||||
Response = SchedDetKey
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
GoSub ClearCursors
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
Service GetEngagedEvent(ReactNo)
|
||||
@ -949,7 +947,6 @@ Service NextEventIsSamePsn(ReactNo)
|
||||
MetricName = 'NextEventIsSamePsn'
|
||||
|
||||
Response = False$
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
|
||||
|
||||
@ -990,19 +987,17 @@ Service NextEventIsSamePsn(ReactNo)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
Service NextEventIsBlock(ReactNo)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'NextEventIsBlock'
|
||||
|
||||
ErrorMsg = ''
|
||||
If ReactNo NE '' then
|
||||
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
|
||||
|
||||
@ -1018,15 +1013,15 @@ Service NextEventIsBlock(ReactNo)
|
||||
end else
|
||||
Error = Error_Services('GetMessage')
|
||||
ErrorMsg = 'Error in service ':Service:' module. ':Error
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
end service
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -3601,3 +3596,5 @@ CreateScheduleChangeNotification:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,159 +0,0 @@
|
||||
Function Semi_vend_code_API(@API)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from SRP Computer Solutions, Inc.
|
||||
|
||||
Name : Semi_vend_code_API
|
||||
|
||||
Description : API logic for the Semi_vend_code resource.
|
||||
|
||||
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||
|
||||
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||
FullEndpointURL - The URL submitted by the client, including query params.
|
||||
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||
EndpointSegment - The URL endpoint segment.
|
||||
ParentURL - The URL path preceeding the current endpoint.
|
||||
CurrentAPI - The name of this stored procedure.
|
||||
|
||||
Parameters :
|
||||
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||
- APIPattern must follow this structure Semi_vend_code[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Semi_vend_code.POST
|
||||
- Semi_vend_code.ID.PUT
|
||||
- Semi_vend_code.ID.firstName.GET
|
||||
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||
services do not rely upon anything being returned in the response. This is what the
|
||||
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||
value is only helpful if the developers want to use it for debug purposes.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
09/12/25 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert API_SETUP
|
||||
$Insert HTTP_INSERTS
|
||||
$Insert SEMI_VEND_CODE_EQUATES
|
||||
|
||||
Declare function Semi_Vend_Code_Services
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API semi_vend_code.HEAD
|
||||
API semi_vend_code.GET
|
||||
|
||||
GoSub CreateHALCollection
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API semi_vend_code.ID.HEAD
|
||||
API semi_vend_code.ID.GET
|
||||
|
||||
GoSub CreateHALItem
|
||||
|
||||
end api
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CreateHALItem:
|
||||
|
||||
ResponseCode = 200
|
||||
SemiVendCd = EndpointSegment
|
||||
IF RowExists('SEMI_VEND_CODE', SemiVendCd) then
|
||||
JSON = Semi_Vend_Code_Services('ConvertRecordToJSON', SemiVendCd)
|
||||
If Error_Services('NoError') then
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', JSON, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', ResponseCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
end else
|
||||
ResponseCode = 406
|
||||
ResponseMessage = 'No WO found based on the search criteria provided.'
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, ResponseMessage)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateHALCollection
|
||||
//
|
||||
// Creates a HAL+JSON collection based on OpenInsight data row representations.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateHALCollection:
|
||||
|
||||
StatusCode = 200
|
||||
JSONCollection = ''
|
||||
Abort = False$
|
||||
SemiVendCodes = Semi_Vend_Code_Services('GetSemiVendCodes')
|
||||
If Error_Services('NoError') then
|
||||
If SemiVendCodes NE '' then
|
||||
If SRP_JSON(hJSONCollection, 'New', 'Object') then
|
||||
If SRP_Json(hSemiArray, 'New', 'Array') then
|
||||
For each SemiVendCode in SemiVendCodes using @FM
|
||||
SemiJson = Semi_Vend_Code_Services('ConvertRecordToJSON', SemiVendCode)
|
||||
If (SRP_Json(hSemi, 'Parse', SemiJson) EQ '') then
|
||||
hTemp = SRP_Json(hSemi, 'Get', 'SemiVendCode')
|
||||
SRP_Json(hSemiArray, 'Add', hTemp)
|
||||
SRP_Json(hTemp, 'Release')
|
||||
SRP_Json(hSemi, 'Release')
|
||||
end
|
||||
Next SemiVendCode
|
||||
end
|
||||
SRP_Json(hJSONCollection, 'Set', 'SemiVendCodes', hSemiArray)
|
||||
SRP_Json(hSemiArray, 'Release')
|
||||
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Fast')
|
||||
SRP_JSON(hJSONCollection, 'Release')
|
||||
end
|
||||
end else
|
||||
Message = 'No Semi Vend Codes found!'
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
StatusCode = 500
|
||||
end
|
||||
If Error_Services('NoError') then
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', JSONCollection, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
@ -1,124 +0,0 @@
|
||||
Function Semi_Vend_Code_Services(@Service, @Params)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from Infineon Technologies.
|
||||
|
||||
Name : Semi_Vend_Code_Services
|
||||
|
||||
Description : Handler program for all module related services.
|
||||
|
||||
Notes : The generic parameters should contain all the necessary information to process the services. Often
|
||||
this will be information like the data Record and Key ID.
|
||||
|
||||
Parameters :
|
||||
Service [in] -- Name of the service being requested
|
||||
Param1-10 [in/out] -- Additional request parameter holders
|
||||
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
|
||||
|
||||
Metadata :
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
09/12/2025 djs Created service module for OI Wizard Receive and Release operations.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert SEMI_VEND_CODE_EQUATES
|
||||
|
||||
Declare function Database_Services, SRP_Json
|
||||
Declare subroutine Error_Services, SRP_Json
|
||||
|
||||
GoToService else
|
||||
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||
end
|
||||
|
||||
Return Response else ''
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Service Parameter Options
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
Options BOOLEAN = True$, False$
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Services
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetSemiVendCodes
|
||||
//
|
||||
// Returns an @FM delimited array of all SEMI_VEND_CD keys in the table.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetSemiVendCodes()
|
||||
|
||||
ErrorMsg = ''
|
||||
SemiVendCodes = ''
|
||||
Open 'SEMI_VEND_CODE' to hTable then
|
||||
Select hTable
|
||||
EOF = False$
|
||||
SemiVendCodes = ''
|
||||
Loop
|
||||
Readnext KeyId else EOF = True$
|
||||
Until EOF
|
||||
SemiVendCodes<-1> = KeyId
|
||||
Repeat
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error opening SEMI_VEND_CODE table.'
|
||||
end
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = SemiVendCodes
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ConvertRecordToJSON(KeyId, Record)
|
||||
|
||||
ErrorMsg = ''
|
||||
JsonRecord = ''
|
||||
If KeyId NE '' then
|
||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'SEMI_VEND_CODE', KeyId)
|
||||
If Error_Services('NoError') then
|
||||
// Create the JSON response object
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objSemiVendCode = ''
|
||||
If SRP_JSON(objSemiVendCode, 'New', 'Object') then
|
||||
SRP_JSON(objSemiVendCode, 'SetValue', 'VendCd', KeyId)
|
||||
SRP_JSON(objSemiVendCode, 'SetValue', 'VendorName', Record<SEMI_VEND_CODE_VENDOR_NAME$>)
|
||||
SRP_JSON(objSemiVendCode, 'SetValue', 'Location', Record<SEMI_VEND_CODE_LOCATION$>)
|
||||
SRP_JSON(objSemiVendCode, 'SetValue', 'EpiVendCd', Record<SEMI_VEND_CODE_EPI_VEND_CD$>)
|
||||
SRP_JSON(objJSON, 'Set', 'SemiVendCode', objSemiVendCode)
|
||||
SRP_JSON(objSemiVendCode, 'Release')
|
||||
end
|
||||
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null KeyId passed into service.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = JsonRecord
|
||||
|
||||
end service
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
ClearCursors:
|
||||
|
||||
For counter = 0 to 8
|
||||
ClearSelect counter
|
||||
Next counter
|
||||
|
||||
return
|
||||
|
||||
@ -456,7 +456,6 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'AcknowledgeSupplement'
|
||||
|
||||
ErrMsg = ''
|
||||
If ( (SupplID NE '') and (EntryUser NE '') ) then
|
||||
OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '')
|
||||
If OldRec NE '' then
|
||||
@ -470,21 +469,19 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
|
||||
Supplement_Services('LogSupplementChange', NewRec, 'Acknowledged', EntryUser)
|
||||
end else
|
||||
Response = FALSE$
|
||||
ErrMsg = 'Error editing Supplement record.'
|
||||
Error_Services('Add', 'Error editing Supplement record.')
|
||||
end
|
||||
end else
|
||||
Response = FALSE$
|
||||
ErrMsg = 'Record does not exist.'
|
||||
Error_Services('Add', 'Record does not exist.')
|
||||
end
|
||||
end else
|
||||
Response = FALSE$
|
||||
ErrMsg = 'SupplID or EntryUser was missing in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'SupplID or EntryUser was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -504,7 +501,6 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
|
||||
|
||||
UnackList = ''
|
||||
Response = False$
|
||||
ErrMsg = ''
|
||||
If ( (LotType NE '') and (LotID NE '') and (Stage NE '') ) then
|
||||
KeyList = ''
|
||||
Query = ''
|
||||
@ -522,25 +518,23 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
|
||||
If AckField NE True$ then UnackList<-1> = Key
|
||||
Next Key
|
||||
end else
|
||||
ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS table.'
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS table.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Error in ':Service:' service. Error calling Btree.Extract'
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract')
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.'
|
||||
Error_Services('Add', 'Error in ':Service:' service. Error opening SUPPLEMENTS dictionary.')
|
||||
end
|
||||
end else
|
||||
ErrMsg = 'LotType, LotID, or Stage was missing in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
If UnackList NE '' then Response = UnackList
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -558,7 +552,6 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
|
||||
StartTick = GetTickCount()
|
||||
MetricName = 'LogSupplementChange'
|
||||
|
||||
ErrMsg = ''
|
||||
If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then
|
||||
SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$>
|
||||
LotType = SupplementRec<SUPPLEMENTS_LOT_TYPE$>
|
||||
@ -572,13 +565,11 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
|
||||
End Case
|
||||
|
||||
end else
|
||||
ErrMsg = 'LotType, LotID, or Stage was missing in the ' : Service : ' service.'
|
||||
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then Error_Services('Add', ErrMsg)
|
||||
end service
|
||||
|
||||
|
||||
@ -679,4 +670,3 @@ Service SendNotifications(RDSList, EditEvent, Instructions, EntryUser)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
@ -1,40 +0,0 @@
|
||||
Compile function Test_PSN_Services(@Test)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert LOGICAL
|
||||
|
||||
Declare function PSN_Services, Error_Services
|
||||
Declare subroutine PSN_Services, Error_Services
|
||||
|
||||
Error_Services('Clear')
|
||||
|
||||
GotoTest
|
||||
|
||||
// TODO: Code to run after each test goes here
|
||||
|
||||
Return TestResult or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// TESTS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Test GetMetrologyRecipesAndPatternsWithNullPsnNoShouldThrowError
|
||||
PSN_Services('GetMetrologyRecipesAndPatterns', '')
|
||||
Assert Error_Services('HasError') equals True$
|
||||
end test
|
||||
|
||||
Test GetMetrologyRecipesAndPatternsWithInvalidPsnNoShouldThrowError
|
||||
PSN_Services('GetMetrologyRecipesAndPatterns', 'potato')
|
||||
Assert Error_Services('HasError') equals True$
|
||||
end test
|
||||
|
||||
Test GetMetrologyRecipesAndPatternsWithValidPsnNoShouldReturnPrescribedValues
|
||||
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 4609)
|
||||
Assert DCount(Values, @FM) equals 9
|
||||
|
||||
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 5159)
|
||||
Assert DCount(Values, @FM) equals 7
|
||||
|
||||
Values = PSN_Services('GetMetrologyRecipesAndPatterns', 4830)
|
||||
Assert DCount(Values, @FM) equals 9
|
||||
end test
|
||||
@ -2,7 +2,6 @@ Compile function TEST_RUN_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert TEST_WAFER_PROD_EQUATES
|
||||
$Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES
|
||||
$Insert TEST_RUN_EQUATES
|
||||
@ -11,7 +10,7 @@ $Insert TEST_RUN_OBJ_EQUATES
|
||||
$Insert LOT_EQUATES
|
||||
$Insert LOT_OPERATION_EQUATES
|
||||
|
||||
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount, Xlate
|
||||
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount
|
||||
Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json, MemberOf
|
||||
Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json
|
||||
Declare subroutine Mona_Services
|
||||
@ -332,71 +331,6 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
|
||||
Response = TestWaferLotKeys
|
||||
end service
|
||||
|
||||
Service GetTestRunsByUsername(Username, StartDTM, StopDTM)
|
||||
|
||||
If Username NE '' then
|
||||
Begin Case
|
||||
Case StartDTM EQ '' AND StopDTM EQ ''
|
||||
//Set search date for last 12 hour period
|
||||
StopDTM = SRP_Datetime('Now')
|
||||
StartDTM = SRP_Datetime('AddHours', StopDTM, -12)
|
||||
Case StartDTM EQ '' AND StopDTM NE ''
|
||||
//Set search start date 12 hours prior to stopDTM
|
||||
StartDTM = SRP_Datetime('AddHours', StopDTM, -12)
|
||||
Case StartDTM NE '' AND StopDTM EQ ''
|
||||
//Set search start date to current dtm
|
||||
StopDTM = SRP_Datetime('Now')
|
||||
End Case
|
||||
|
||||
table = "TEST_RUN"
|
||||
Open "DICT ":table To hTestRunDict Else
|
||||
Error_Services('Add', 'Error opening TEST_RUN dictionary')
|
||||
End
|
||||
If Error_Services('NoError') then
|
||||
srch_strng = "RUN_DTM":@VM:StartDTM:'~':StopDTM:@FM: "LSL_USER_ID":@VM:UserName:@FM
|
||||
keylist = ""
|
||||
option = ""
|
||||
flag = ""
|
||||
Btree.Extract(srch_strng, table, hTestRunDict, keylist, option, flag)
|
||||
Swap @VM with @FM in keylist
|
||||
Response = keylist
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Username missing.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service GetTestWaferUsageStats(Username, StartDTM, StopDTM)
|
||||
|
||||
MostRecentDTM = ''
|
||||
WafersUsed = 0
|
||||
If Username NE '' then
|
||||
KeyList = Test_Run_Services('GetTestRunsByUsername', Username, StartDTM, StopDTM)
|
||||
If KeyList NE '' then
|
||||
For Each Key in KeyList
|
||||
TestRunRec = Xlate('TEST_RUN', Key, '', 'X')
|
||||
If MostRecentDTM EQ '' then
|
||||
MostRecentDTM = TestRunRec<TEST_RUN_RUN_DTM$>
|
||||
end else
|
||||
If MostRecentDTM LT TestRunRec<TEST_RUN_RUN_DTM$> then
|
||||
MostRecentDTM = TestRunRec<TEST_RUN_RUN_DTM$>
|
||||
end
|
||||
end
|
||||
WaferQty = Dcount(TestRunRec<TEST_RUN_TEST_RUN_WAFER_IDS$>, @VM)
|
||||
WafersUsed += WaferQty
|
||||
Next Key
|
||||
end
|
||||
Response = ''
|
||||
Response<1> = MostRecentDTM
|
||||
Response<2> = WafersUsed
|
||||
end else
|
||||
Error_Services('Add', 'Username missing.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys, ManualQtyAdjust)
|
||||
|
||||
StartTick = GetTickCount()
|
||||
@ -754,7 +688,6 @@ Service GetTestWaferUsageByDateSpan(StartDtm, StopDtm)
|
||||
end service
|
||||
|
||||
Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
|
||||
|
||||
Begin Case
|
||||
Case StartDTM EQ '' AND StopDTM EQ ''
|
||||
//Set search date for last 24 hour period
|
||||
@ -781,6 +714,8 @@ Service GetTestRunKeysByDateSpan(StartDtm, StopDtm)
|
||||
Response = keylist
|
||||
end
|
||||
|
||||
|
||||
|
||||
end service
|
||||
|
||||
Service GetTestRunKeysByEqp(EquipType, EquipID)
|
||||
@ -885,3 +820,13 @@ Service IsNewTWSystemActive(UserId)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -27,8 +27,6 @@ Service GetNumberOfPointsForPattern(ToolClass, PatternName)
|
||||
end
|
||||
end
|
||||
|
||||
Convert @LOWER_CASE to @UPPER_CASE in ToolClass
|
||||
|
||||
If Error_Services('NoError') then
|
||||
ToolClassRecord = Database_Services('ReadDataRow', 'TOOL_CLASS', ToolClass)
|
||||
If Error_Services('HasError') then
|
||||
@ -50,4 +48,3 @@ Service GetNumberOfPointsForPattern(ToolClass, PatternName)
|
||||
end
|
||||
end
|
||||
End Service
|
||||
|
||||
|
||||
@ -381,3 +381,5 @@ API wafercounter.ID.GET
|
||||
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
|
||||
|
||||
end api
|
||||
|
||||
|
||||
|
||||
@ -1,106 +0,0 @@
|
||||
Compile function WEB_OI_WIZARD_EVENTS(CtrlEntId, Event, @PARAMS)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#window WEB_OI_WIZARD
|
||||
|
||||
$Insert EVENT_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert PS_WebView_Equates
|
||||
|
||||
EQU ONE_DAY_SECS$ to 84600
|
||||
|
||||
Declare function OI_Wizard_Services, Exec_Method, Environment_Services
|
||||
Declare subroutine PlaceDialog
|
||||
|
||||
GoToEvent Event for CtrlEntId else
|
||||
// Event not implemented
|
||||
end
|
||||
|
||||
Return EventFlow or 1
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// EVENT HANDLERS
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
OIWizardBaseUrl = Environment_Services('GetOIWizardBaseUrl')
|
||||
Set_Property(@Window, '@BASE_URL', OIWizardBaseUrl)
|
||||
InitNavPage = CreateParam
|
||||
Set_Property(@Window, '@INIT_NAV_PAGE', InitNavPage)
|
||||
Set_Property(@Window, '@FIRST_RENDER', True$)
|
||||
Set_Property(@Window:'.WEBVIEW_MAIN', 'AUTOSIZEHEIGHT', True$)
|
||||
Set_Property(@Window:'.WEBVIEW_MAIN', 'AUTOSIZEWIDTH', True$)
|
||||
PlaceDialog(-2, -2)
|
||||
|
||||
End Event
|
||||
|
||||
|
||||
Event WEBVIEW_MAIN.WEBVIEWCREATED()
|
||||
|
||||
OIWizardURL = Get_Property(@Window, '@BASE_URL')
|
||||
NavPage = Get_Property(@Window, '@INIT_NAV_PAGE')
|
||||
NavTo = OIWizardURL:NavPage
|
||||
SuccessFlag = Exec_Method( CtrlEntID, "NAVIGATE", NavTo)
|
||||
If Not(SuccessFlag) then
|
||||
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error navigating to ':NavTo)
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WEBVIEW_MAIN.WEBNAVIGATED(NavID, URI, Redirected, UserInitiated, StatusInfo, FrameID)
|
||||
|
||||
FirstRender = Get_Property(@Window, '@FIRST_RENDER')
|
||||
If FirstRender then
|
||||
SuccessFlag = Exec_Method(CtrlEntID, "DELETECOOKIES", '*')
|
||||
If SuccessFlag then
|
||||
LSLUserId = @User4
|
||||
OIWizardID = OI_Wizard_Services('CreateWizardID', LSLUserID)
|
||||
If Error_Services('NoError') then
|
||||
Expiry = Xlate('OI_WIZARD', OIWizardID, 'EXPIRY', 'X')
|
||||
Domain = Get_Property(@Window, '@BASE_URL')
|
||||
Swap 'http://' with '' in Domain
|
||||
Swap 'https://' with '' in Domain
|
||||
PortIndex = Index(Domain, ':', 1)
|
||||
If PortIndex then Domain = Domain[1, PortIndex - 1]
|
||||
Cookie = ""
|
||||
Cookie<0, WBV_COOKIE_POS_NAME$> = "sessionID"
|
||||
Cookie<0, WBV_COOKIE_POS_VALUE$> = OIWizardID
|
||||
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
|
||||
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
|
||||
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
|
||||
If SuccessFlag then
|
||||
Cookies = Exec_Method( CtrlEntID, "GETCOOKIES")
|
||||
Cookie<0, WBV_COOKIE_POS_NAME$> = "userID"
|
||||
Cookie<0, WBV_COOKIE_POS_VALUE$> = LSLUserID
|
||||
Cookie<0, WBV_COOKIE_POS_DOMAIN$> = Domain
|
||||
Cookie<0, WBV_COOKIE_POS_EXPIRES$> = Expiry
|
||||
SuccessFlag = Exec_Method( CtrlEntID, "SETCOOKIE", Cookie )
|
||||
If SuccessFlag then
|
||||
// Set a timer to execute our session service javascript hook once the page is ready
|
||||
Set_Property(@Window, "TIMER", 0:@FM:1000)
|
||||
Set_Property(@Window, '@FIRST_RENDER', False$)
|
||||
end else
|
||||
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting userID cookie')
|
||||
end
|
||||
end else
|
||||
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error setting sessionID cookie')
|
||||
end
|
||||
end else
|
||||
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error creating OI Wizard session')
|
||||
end
|
||||
end else
|
||||
Msg(@Window, '', 'OK', '', 'Application Error':@FM:'Error deleting cookies')
|
||||
end
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.TIMER()
|
||||
|
||||
Response = Exec_Method(@Window:'.WEBVIEW_MAIN', 'EXECUTESCRIPT', 'SessionServiceHelper.SetSessionFromCookies()')
|
||||
|
||||
end event
|
||||
|
||||
|
||||
@ -1,132 +0,0 @@
|
||||
Function WM_IN_API(@API)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from SRP Computer Solutions, Inc.
|
||||
|
||||
Name : WM_IN_Api
|
||||
|
||||
Description : API logic for the WM_IN resource.
|
||||
|
||||
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||
|
||||
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||
FullEndpointURL - The URL submitted by the client, including query params.
|
||||
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||
EndpointSegment - The URL endpoint segment.
|
||||
ParentURL - The URL path preceeding the current endpoint.
|
||||
CurrentAPI - The name of this stored procedure.
|
||||
|
||||
Parameters :
|
||||
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||
- APIPattern must follow this structure Rds[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Rds.POST
|
||||
- Rds.ID.PUT
|
||||
- Rds.ID.firstName.GET
|
||||
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||
services do not rely upon anything being returned in the response. This is what the
|
||||
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||
value is only helpful if the developers want to use it for debug purposes.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
09/27/22 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function WM_In_Services
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API wm_in.ID.HEAD
|
||||
API wm_in.ID.GET
|
||||
|
||||
GoSub CreateHALItem
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API wm_in.ID.zpl.HEAD
|
||||
API wm_in.ID.zpl.GET
|
||||
|
||||
GoSub CreateZPLItem
|
||||
|
||||
end api
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateHALItem
|
||||
//
|
||||
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateHALItem:
|
||||
|
||||
WMInKey = EndpointSegment
|
||||
Convert '-' to '*' in WMInKey
|
||||
WmInJson = WM_In_Services('ConvertRecordToJSON', WMInKey, '', FullEndpointURL)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', WmInJson, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateZPLItem
|
||||
//
|
||||
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateZPLItem:
|
||||
|
||||
WmInKey = ParentSegment
|
||||
ZplJson = ''
|
||||
ZPL = Wm_In_Services('GetWmInZpl', WmInKey)
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
@ -46,48 +46,23 @@ Compile function WM_IN_Services(@Service, @Params)
|
||||
|
||||
***********************************************************************************************************************/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert LOGICAL
|
||||
$Insert SERVICE_SETUP
|
||||
$insert APP_INSERTS
|
||||
$Insert UNIT_EQUATES
|
||||
|
||||
$Insert MSG_EQUATES
|
||||
$Insert DICT_EQUATES
|
||||
$Insert WM_IN_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert PROD_SPEC_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$Insert CUST_EPI_PART_EQUATES
|
||||
$Insert QUOTE_SPEC_EQU
|
||||
$Insert WO_STEP_EQUATES
|
||||
|
||||
EQU PI$LEFT TO 1
|
||||
EQU PI$TOP TO 2
|
||||
EQU PI$RIGHT TO 3
|
||||
EQU PI$BOTTOM TO 4
|
||||
EQU PI$WIDTH TO 5
|
||||
EQU PI$HEIGHT TO 6
|
||||
EQU PI$SIZE TO 7
|
||||
|
||||
EQU PS$TOOL TO 1
|
||||
EQU PS$TYPE TO 2
|
||||
EQU PS$RECIPE TO 3
|
||||
EQU PS$FREQ TO 4
|
||||
EQU PS$PATTERN TO 11
|
||||
|
||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Database_Services, Environment_Services, Logging_Services
|
||||
Declare function obj_Install, SRP_Json
|
||||
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys, Btree.Extract
|
||||
Declare subroutine SRP_Json
|
||||
Declare subroutine Database_Services, Set_Status, obj_Wo_Mat_Log, Logging_Services, Extract_Si_Keys
|
||||
|
||||
GoToService else
|
||||
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||
end
|
||||
GoToService
|
||||
|
||||
Return Response else ''
|
||||
Return Response or ""
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Services
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -102,9 +77,11 @@ Service GetComments(WMINNo)
|
||||
|
||||
CommentArray = ''
|
||||
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
|
||||
|
||||
CommentDates = Oconv(WMInRow<WM_IN_EPP_COMMENT_DATE$>, 'DT')
|
||||
CommentUsers = WMInRow<WM_IN_EPP_COMMENT_USER$>
|
||||
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
|
||||
|
||||
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
|
||||
CommentArray = SRP_Rotate_Array(CommentList)
|
||||
Response = CommentArray
|
||||
@ -391,557 +368,3 @@ Service VerifyWOMatWMIKeyIndex(WMIKey)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetWMInKeys(WOLogId)
|
||||
|
||||
ErrorMsg = ''
|
||||
WMInKeys = ''
|
||||
|
||||
If WOLogId NE '' then
|
||||
Open 'DICT.WM_IN' to hWmInDict then
|
||||
SearchString = ''
|
||||
SearchString := 'WO_NO':@VM:WOLogId:@FM
|
||||
Btree.Extract(SearchString, 'WM_IN', hWmInDict, WMInKeys, 0, 0)
|
||||
end else
|
||||
ErrorMsg = 'Error opening WM_IN dictionary.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'WOLogId was null'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
Response = WMInKeys
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetWmInZpl(WmInKey)
|
||||
|
||||
ZPL = ''
|
||||
ErrorMsg = ''
|
||||
If WmInKey NE '' then
|
||||
Swap '-' with '*' in WmInKey
|
||||
Swap '.' with '*' in WmInKey
|
||||
If RowExists('WM_IN', WmInKey) then
|
||||
WONo = Field(WmInKey, '*', 1, 1)
|
||||
WOStep = Field(WmInKey, '*', 2, 1)
|
||||
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
|
||||
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||
PrintWONo = WONo:'.':WOStep
|
||||
END ELSE
|
||||
PrintWONo = WONo
|
||||
END
|
||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
|
||||
PONo = WORec<WO_LOG_CUST_PO_NO$>
|
||||
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
|
||||
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
||||
CustSpecNo = ''
|
||||
IF Captive THEN
|
||||
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
|
||||
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
|
||||
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
|
||||
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
|
||||
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
|
||||
FOR I = 1 TO SpecCnt
|
||||
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
|
||||
CustSpecNo = CustSpecNos<1,I>
|
||||
CustSpecDesc = CustSpecDescS<1,I>
|
||||
CustSpecRevNo = CustSpecRevNos<1,I>
|
||||
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
|
||||
END
|
||||
UNTIL CustSpecNo NE ''
|
||||
NEXT I
|
||||
END
|
||||
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||
PreSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
|
||||
FirstSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
|
||||
PostCleanSurfScan = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
|
||||
SubPreClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_PRE_CLEAN', 'X' )
|
||||
SubPostClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_POST_CLEAN', 'X' )
|
||||
PreCleanTool = SubPreClean ;* Temporary for 2x4 -> 4x4 conversion
|
||||
PostCleanTool = SubPostClean
|
||||
PreAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'PRE_AKRION_RECIPE', 'X' )
|
||||
PostAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'POST_AKRION_RECIPE', 'X' )
|
||||
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
|
||||
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
|
||||
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
|
||||
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
|
||||
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
|
||||
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
|
||||
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
|
||||
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
|
||||
CleaningReqs = ''
|
||||
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
|
||||
PrintThickTargets = ''
|
||||
FOR J = 1 TO ThickCnt
|
||||
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
|
||||
NEXT J
|
||||
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
|
||||
PrintResTargets = ''
|
||||
FOR J = 1 TO ResCnt
|
||||
IF ResTarget<1,J>[1,1] = '.' THEN
|
||||
TargetVal = '0':ResTarget<1,J>
|
||||
END ELSE
|
||||
TargetVal = ResTarget<1,J>
|
||||
END
|
||||
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
|
||||
NEXT J
|
||||
APreRec = ''
|
||||
APostRec = ''
|
||||
IF ( PreAkrionRecipe<1> <> '' ) THEN
|
||||
APreRec = ' ':PreAkrionRecipe:' '
|
||||
SubOxide = 'No' ;* If Akrion then no oxide strip
|
||||
END
|
||||
IF ( PostAkrionRecipe<1> <> '' ) THEN
|
||||
APostRec = ' ':PostAkrionRecipe
|
||||
END
|
||||
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
|
||||
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||
swap UNIT_A$ with 'A' in PrintResTargets
|
||||
|
||||
PrintWMInKey = WMInKey
|
||||
CONVERT '*' TO '.' IN PrintWMInKey
|
||||
CassNo = FIELD(WMInKey,'*',3)
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
|
||||
LotNo = WOMatRec<WO_MAT_LOT_NO$>
|
||||
WfrQty = WOMatRec<WO_MAT_WAFER_QTY$>
|
||||
CustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
|
||||
SubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
||||
OrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
||||
Vendor = WOMatRec<WO_MAT_SUB_VEND_CD$>
|
||||
OrderDetKey = WORec<WO_LOG_ORDER_NO$>:'*':OrderItem
|
||||
LOCATE CustPartNo IN CustEpiPartRec<CUST_EPI_PART_CUST_PART_NO$> USING @VM SETTING Pos THEN
|
||||
CustPartDesc = CustEpiPartRec<CUST_EPI_PART_CUST_PART_DESC$,Pos>
|
||||
END ELSE
|
||||
CustPartDesc = ''
|
||||
END
|
||||
PartNo = CustPartNo
|
||||
PartDesc = CustPartDesc
|
||||
SuppCd = TRIM(SubPartNo[-1,'B-'])
|
||||
IF LEN(SuppCd) NE '2' THEN SuppCd =''
|
||||
If CassNo EQ 1 then
|
||||
SpecEpi = PSRec<prod_spec_spec_epi$>
|
||||
SpecSub = PSRec<PROD_SPEC_SPEC_SUBSTRATE$>
|
||||
ThkSmile = PSRec<PROD_SPEC_THICK_SMILE_REQ$>
|
||||
ThkShift = Field(PSRec, @FM, PROD_SPEC_THICK_LIMIT_SHIFT$)
|
||||
ResShift = Field(PSRec, @FM, PROD_SPEC_RES_LIMIT_SHIFT$)
|
||||
SSRecipe = XLATE('PRS_STAGE', PSNo:'*LWI', 5, 'X')
|
||||
PCRecipe = XLATE('PRS_STAGE', PSNo, 'POST_CLEAN_SURFSCAN_RECIPE', 'X')
|
||||
WaferSize = Field(SpecSub, @VM, QSSubWafersize$)
|
||||
convert char(248) to @fm in SpecEpi ;* char(248) is used to separate layers
|
||||
layerCount = fieldcount( SpecEpi, @fm )
|
||||
layerInfo = SpecEpi<layerCount>
|
||||
// If this is just 1 layer, we're returning that info, if 3 layers, we're returning layer 3 (combo)
|
||||
ThkData = Field(layerInfo, @VM, QSEpiThickMeasure$)
|
||||
ResData = Field(layerInfo, @VM, QSEpiResMeasure$)
|
||||
ConData = Field(layerInfo, @VM, QSEpiConcMeasure$)
|
||||
CResData = Field(layerInfo, @VM, QSEpiCresMeasure$)
|
||||
ThkMin = OCONV(Field(layerInfo, @VM, QSEpiMinThick$), 'MD3')
|
||||
ThkMax = OCONV(Field(layerInfo, @VM, QSEpiMaxThick$), 'MD3')
|
||||
ThkTarg = ''
|
||||
If ThkMin NE '' Then ThkTarg = oConv(iconv((ThkMin+ThkMax)/2, 'MD3'), 'MD3')
|
||||
ResMin = OCONV(Field(layerInfo, @VM, QSEpiResMinThick$), 'MD3')
|
||||
ResMax = OCONV(Field(layerInfo, @VM, QSEpiResMaxThick$), 'MD3')
|
||||
ResTarg = ''
|
||||
If ResMin NE '' Then ResTarg = oConv(iconv((ResMin+ResMax)/2, 'MD3'), 'MD3')
|
||||
ConMin = OCONV(Field(layerInfo, @VM, QSEpiConcMinThick$), 'MD3')
|
||||
ConMax = OCONV(Field(layerInfo, @VM, QSEpiConcMaxThick$), 'MD3')
|
||||
ConTarg = ''
|
||||
If ConMin NE '' Then ConTarg = oConv(iconv((ConMin+ConMax)/2, 'MD3'), 'MD3')
|
||||
CResMin = OCONV(Field(layerInfo, @VM, QSEpiCresMin$), 'MD3')
|
||||
CResMax = OCONV(Field(layerInfo, @VM, QSEpiCresMax$), 'MD3')
|
||||
CResTarg = ''
|
||||
If CResMin NE '' Then CResTarg = oConv(iconv((CResMin+CResMax)/2, 'MD3'), 'MD3')
|
||||
ThkTool = Field(ThkData, '~', PS$TOOL)
|
||||
ThkType = Field(ThkData, '~', PS$TYPE)
|
||||
ThkRecipe = Field(ThkData, '~', PS$RECIPE)
|
||||
ThkFreq = Field(ThkData, '~', PS$FREQ)
|
||||
ThkPattern = Field(ThkData, '~', PS$PATTERN)
|
||||
ResTool = Field(ResData, '~', PS$TOOL)
|
||||
ResType = Field(ResData, '~', PS$TYPE)
|
||||
ResRecipe = Field(ResData, '~', PS$RECIPE)
|
||||
ResFreq = Field(ResData, '~', PS$FREQ)
|
||||
ResPattern = Field(ResData, '~', PS$PATTERN)
|
||||
ConTool = Field(ConData, '~', PS$TOOL)
|
||||
ConType = Field(ConData, '~', PS$TYPE)
|
||||
ConRecipe = Field(ConData, '~', PS$RECIPE)
|
||||
ConFreq = Field(ConData, '~', PS$FREQ)
|
||||
ConPattern = Field(ConData, '~', PS$PATTERN)
|
||||
CResTool = Field(CResData, '~', PS$TOOL)
|
||||
CResType = Field(CResData, '~', PS$TYPE)
|
||||
CResRecipe = Field(CResData, '~', PS$RECIPE)
|
||||
CResFreq = Field(CResData, '~', PS$FREQ)
|
||||
CResPattern = Field(CResData, '~', PS$PATTERN)
|
||||
IF ThkMin EQ '' THEN ThkMin = '--'
|
||||
IF ThkMax EQ '' THEN ThkMax = '--'
|
||||
IF ThkTarg EQ '' THEN ThkTarg = '--'
|
||||
IF ThkTool EQ '' THEN ThkTool = '--'
|
||||
IF ThkType EQ '' THEN ThkType = '--'
|
||||
IF ThkRecipe EQ '' THEN ThkRecipe = '--'
|
||||
IF ThkPattern EQ '' THEN ThkPattern = '--'
|
||||
IF ThkFreq EQ '' THEN ThkFreq = '--'
|
||||
IF ResMin EQ '' THEN ResMin = '--'
|
||||
IF ResMax EQ '' THEN ResMax = '--'
|
||||
IF ResTarg EQ '' THEN ResTarg = '--'
|
||||
IF ResTool EQ '' THEN ResTool = '--'
|
||||
IF ResType EQ '' THEN ResType = '--'
|
||||
IF ResRecipe EQ '' THEN ResRecipe = '--'
|
||||
IF ResPattern EQ '' THEN ResPattern = '--'
|
||||
IF ResFreq EQ '' THEN ResFreq = '--'
|
||||
IF ConMin EQ '' THEN ConMin = '--'
|
||||
IF ConMax EQ '' THEN ConMax = '--'
|
||||
IF ConTarg EQ '' THEN ConTarg = '--'
|
||||
IF ConTool EQ '' THEN ConTool = '--'
|
||||
IF ConType EQ '' THEN ConType = '--'
|
||||
IF ConRecipe EQ '' THEN ConRecipe = '--'
|
||||
IF ConPattern EQ '' THEN ConPattern = '--'
|
||||
IF ConFreq EQ '' THEN ConFreq = '--'
|
||||
IF CResMin EQ '' THEN CResMin = '--'
|
||||
IF CResMax EQ '' THEN CResMax = '--'
|
||||
IF CResTarg EQ '' THEN CResTarg = '--'
|
||||
IF CResTool EQ '' THEN CResTool = '--'
|
||||
IF CResType EQ '' THEN CResType = '--'
|
||||
IF CResRecipe EQ '' THEN CResRecipe = '--'
|
||||
IF CResPattern EQ '' THEN CResPattern = '--'
|
||||
IF CResFreq EQ '' THEN CResFreq = '--'
|
||||
Swap @VM with ' / ' in SSRecipe
|
||||
IF PCRecipe EQ '' Then PCRecipe = '--'
|
||||
If ThkSmile EQ '' OR ThkSmile EQ '0' then
|
||||
ThkSmile = 'N'
|
||||
end else
|
||||
ThkSmile = 'Y'
|
||||
end
|
||||
If ThkShift EQ '' OR ThkShift EQ '0' then
|
||||
ThkShift = 'N'
|
||||
end else
|
||||
ThkShift = 'Y'
|
||||
end
|
||||
If ResShift EQ '' OR ResShift EQ '0' then
|
||||
ResShift = 'N'
|
||||
end else
|
||||
ResShift = 'Y'
|
||||
end
|
||||
if Len(ThkMin) > 6 then
|
||||
ThkMin = ThkMin[1,6]
|
||||
end
|
||||
if Len(ThkMax) > 6 then
|
||||
ThkMax = ThkMax[1,6]
|
||||
end
|
||||
if Len(ThkTarg) > 6 then
|
||||
ThkTarg = ThkTarg[1,6]
|
||||
end
|
||||
if Len(ResMin) > 6 then
|
||||
ResMin = ResMin[1,6]
|
||||
end
|
||||
if Len(ResMax) > 6 then
|
||||
ResMax = ResMax[1,6]
|
||||
end
|
||||
if Len(ResTarg) > 6 then
|
||||
ResTarg = ResTarg[1,6]
|
||||
end
|
||||
if Len(ConMin) > 6 then
|
||||
ConMin = ConMin[1,6]
|
||||
end
|
||||
if Len(ConMax) > 6 then
|
||||
ConMax = ConMax[1,6]
|
||||
end
|
||||
if Len(ConTarg) > 6 then
|
||||
ConTarg = ConTarg[1,6]
|
||||
end
|
||||
if Len(CResMin) > 6 then
|
||||
CResMin = CResMin[1,6]
|
||||
end
|
||||
if Len(CResMax) > 6 then
|
||||
CResMax = CResMax[1,6]
|
||||
end
|
||||
if Len(CResTarg) > 6 then
|
||||
CResTarg = CResTarg[1,6]
|
||||
end
|
||||
****** Begin ZPL
|
||||
ZPL := '^XA'
|
||||
ZPL := '^LH10,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL406' ;* Label length @203 dpi
|
||||
ZPL := '^PW900'
|
||||
ZPL := '^MD0' ;* Media darkness
|
||||
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||
****** 1st/2nd Line
|
||||
ZPL := '^FO30,20^A0,,40^FDWO ':WONo:'^FS'
|
||||
ZPL := '^FO590,10^A050,30^FDPSN ':PSNo:'^FS'
|
||||
ZPL := '^FO555,40^A050,30^FDDopant ':Dopant:'^FS'
|
||||
****** 3rd Line - headers
|
||||
ZPL := '^FO85,100^A050,23^FDMin^FS'
|
||||
ZPL := '^FO145,100^A050,23^FDTarg^FS'
|
||||
ZPL := '^FO210,100^A050,23^FDMax^FS'
|
||||
ZPL := '^FO280,100^A050,23^FDTool^FS'
|
||||
ZPL := '^FO330,100^A050,23^FDType^FS'
|
||||
ZPL := '^FO470,100^A050,23^FDRecipe^FS'
|
||||
ZPL := '^FO600,100^A050,23^FDPattern^FS'
|
||||
ZPL := '^FO740,100^A050,23^FDFreq^FS'
|
||||
****** 4th Line - Thickness (Thk)
|
||||
ZPL := '^FO70,130^GB720,0,3^FS'
|
||||
ZPL := '^FO70,130^GB0,160,3^FS'
|
||||
ZPL := '^FO10,140^A050,23^FDThk:^FS'
|
||||
ZPL := '^FO80,140^A050,23^FD':ThkMin:'^FS'
|
||||
ZPL := '^FO145,140^A050,23^FD':ThkTarg:'^FS'
|
||||
ZPL := '^FO210,140^A050,23^FD':ThkMax:'^FS'
|
||||
ZPL := '^FO280,140^A050,23^FD':ThkTool[1,5]:'^FS'
|
||||
ZPL := '^FO330,140^A050,23^FD':ThkType[1,11]:'^FS'
|
||||
ZPL := '^FO470,140^A050,23^FD':ThkRecipe[1,11]:'^FS'
|
||||
ZPL := '^FO600,140^A050,23^FD':ThkPattern[1,11]:'^FS'
|
||||
ZPL := '^FO750,140^A050,23^FD':ThkFreq:'^FS'
|
||||
****** 5th Line - Resistivity (Res)
|
||||
ZPL := '^FO10,170^GB780,0,3^FS'
|
||||
ZPL := '^FO10,180^A050,23^FDRes:^FS'
|
||||
ZPL := '^FO80,180^A050,23^FD':ResMin:'^FS'
|
||||
ZPL := '^FO145,180^A050,23^FD':ResTarg:'^FS'
|
||||
ZPL := '^FO210,180^A050,23^FD':ResMax:'^FS'
|
||||
ZPL := '^FO280,180^A050,23^FD':ResTool[1,5]:'^FS'
|
||||
ZPL := '^FO330,180^A050,23^FD':ResType[1,11]:'^FS'
|
||||
ZPL := '^FO470,180^A050,23^FD':ResRecipe[1,11]:'^FS'
|
||||
ZPL := '^FO600,180^A050,23^FD':ResPattern[1,11]:'^FS'
|
||||
ZPL := '^FO750,180^A050,23^FD':ResFreq:'^FS'
|
||||
****** 6th Line - Contact (Con)
|
||||
ZPL := '^FX***LINE 4'
|
||||
ZPL := '^FO10,210^GB780,0,3^FS'
|
||||
ZPL := '^FO10,220^A050,23^FDCon:^FS'
|
||||
ZPL := '^FO80,220^A050,23^FD':ConMin:'^FS'
|
||||
ZPL := '^FO145,220^A050,23^FD':ConTarg:'^FS'
|
||||
ZPL := '^FO210,220^A050,23^FD':ConMax:'^FS'
|
||||
ZPL := '^FO280,220^A050,23^FD':ConTool[1,5]:'^FS'
|
||||
ZPL := '^FO330,220^A050,23^FD':ConType[1,11]:'^FS'
|
||||
ZPL := '^FO470,220^A050,23^FD':ConRecipe[1,11]:'^FS'
|
||||
ZPL := '^FO600,220^A050,23^FD':ConPattern[1,11]:'^FS'
|
||||
ZPL := '^FO750,220^A050,23^FD':ConFreq:'^FS'
|
||||
****** 7th Line - Contact Resistance (CRes)
|
||||
ZPL := '^FO10,250^GB780,0,3^FS'
|
||||
ZPL := '^FO10,260^A050,23^FDCRes:^FS'
|
||||
ZPL := '^FO80,260^A050,23^FD':CResMin:'^FS'
|
||||
ZPL := '^FO145,260^A050,23^FD':CResTarg:'^FS'
|
||||
ZPL := '^FO210,260^A050,23^FD':CResMax:'^FS'
|
||||
ZPL := '^FO280,260^A050,23^FD':CResTool[1,5]:'^FS'
|
||||
ZPL := '^FO330,260^A050,23^FD':CResType[1,11]:'^FS'
|
||||
ZPL := '^FO470,260^A050,23^FD':CResRecipe[1,11]:'^FS'
|
||||
ZPL := '^FO600,260^A050,23^FD':CResPattern[1,11]:'^FS'
|
||||
ZPL := '^FO750,260^A050,23^FD':CResFreq:'^FS'
|
||||
ZPL := '^FO10,290^GB780,0,3^FS'
|
||||
****** 8th Line - Special Instructions
|
||||
ZPL := '^FO10,310^A050,23^FDSurfScan: ':SSRecipe:'^FS'
|
||||
ZPL := '^FO10,340^A050,23^FDPostClean: ':PCRecipe:'^FS'
|
||||
ZPL := '^FO10,370^A050,23^FDWafer Size: ':WaferSize:'^FS'
|
||||
ZPL := '^FO500,310^A050,23^FDSmile Required: ':ThkSmile:'^FS'
|
||||
ZPL := '^FO500,340^A050,23^FDSPC Thk Shift: ':ThkShift:'^FS'
|
||||
ZPL := '^FO500,370^A050,23^FDSPC Res Shift: ':ResShift:'^FS'
|
||||
ZPL := '^XZ':CRLF$
|
||||
****** End Cheet Sheet ZPL
|
||||
end
|
||||
For cnt = 1 to 2
|
||||
ZPL := '^XA'
|
||||
ZPL := '^LH0,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL406' ;* Label length @203 dpi
|
||||
ZPL := '^PW900'
|
||||
ZPL := '^MD8' ;* Media darkness
|
||||
ZPL := '^MMT' ;* Media mode t=tear off mode
|
||||
ZPL := '^FO15,15^GB795,398,3,B^FS' ;* Border
|
||||
ZPL:= '^FO680,25^A0,36^FDWM In^FS'
|
||||
****** First Line
|
||||
Company = 'IFX Epi Services'
|
||||
ZPL := '^FO30,25^A0,,36^FD':Company:'^FS'
|
||||
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
|
||||
ZPL := '^FO370,25^A045,36^FD':PrintWONo:'^FS':CRLF$
|
||||
IF CassNo = 1 THEN
|
||||
ZPL := '^FO535,20^GB120,40,40,,3^FS':CRLF$
|
||||
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
|
||||
ZPL := '^FO600,25^A045,36^FR^FD':CassNo:'^FS':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
|
||||
ZPL := '^FO600,25^A045,36^FD':CassNo:'^FS':CRLF$
|
||||
END
|
||||
****** Second Line
|
||||
ZPL := '^FO30,70^AC,18^FDWM In:^FS':CRLF$
|
||||
ZPL := '^FO120,70^A050,30^FD':PrintWMInKey:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO300,60^B3,,37,N^FD':'I':PrintWMInKey:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
ZPL := '^FO700,70^AC,18^FDQty:^FS':CRLF$
|
||||
ZPL := '^FO760,70^A045,25^FD':WfrQty:'^FS':CRLF$
|
||||
****** Third Line
|
||||
ZPL := '^FO30,105^AC,18^FDShip Dt:^FS'
|
||||
ZPL := '^FO140,105^A0,,25^FD':ReqShipDate:'^FS':CRLF$
|
||||
ZPL := '^FO250,105^AC,18^FDCust:^FS':CRLF$
|
||||
ZPL := '^FO320,105^A045,25^FD':CustName:'^FS':CRLF$
|
||||
ZPL := '^FO560,105^AC,18^FDPO:^FS':CRLF$
|
||||
ZPL := '^FO600,105^A045,25^FD':PONo:'^FS':CRLF$
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,128^GB795,1^FS'
|
||||
****** Fourth Line
|
||||
ZPL := '^FO30,135^AC,18^FDLot No:^FS':CRLF$
|
||||
ZPL := '^FO120,135^A0,20^FD':LotNo:'^FS':CRLF$
|
||||
ZPL := '^FO410,135^AC,18^FDPart No:^FS':CRLF$
|
||||
ZPL := '^FO510,135^A0,20^FD':PartNo:'^FS':CRLF$
|
||||
****** Fifth Line
|
||||
ZPL := '^FO30,160^AC,18^FDSub PN:^FS':CRLF$
|
||||
ZPL := '^FO120,160^A0,20^FD':SubPartNo:'^FS':CRLF$
|
||||
IF SuppCd NE '' THEN
|
||||
ZPL := '^FO410,160^AC,18^FDSupp Cd:^FS':CRLF$
|
||||
ZPL := '^FO510,160^A0,20^FD':SuppCd:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO610,160^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,183^GB795,1^FS'
|
||||
****** Seventh Line
|
||||
ZPL := '^FO30,210^AC,18^FDPre:^FS':CRLF$
|
||||
ZPL := '^FO90,210^A0,20^FD':SubPreClean:'^FS':CRLF$
|
||||
IF PreAkrionRecipe NE '' THEN
|
||||
ZPL := '^FO210,210^AC,18^FDAkrion:^FS':CRLF$
|
||||
ZPL := '^FO300,210^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO450,210^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END
|
||||
****** Eighth Line
|
||||
ZPL := '^FO30,235^AC,18^FDRecipe:^FS':CRLF$
|
||||
ZPL := '^FO120,235^A0,20^FD':RecipeInfo:'^FS':CRLF$
|
||||
ZPL := '^FO410,235^AC,18^FDEpi Dopant:^FS':CRLF$
|
||||
ZPL := '^FO560,235^A040,20^FD':Dopant:'^FS':CRLF$
|
||||
****** Tenth, Eleventh and Twelfth Lines
|
||||
ZPL := '^FO30,285^AC,18^FDThk Spec:^FS':CRLF$
|
||||
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
|
||||
BaseLine = 285 + (M-1)*20
|
||||
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
|
||||
NEXT M
|
||||
ZPL := '^FO410,285^AC,18^FDRes Spec:^FS':CRLF$
|
||||
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
|
||||
BaseLine = 285 + (M-1)*20
|
||||
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
|
||||
NEXT M
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,373^GB795,1^FS'
|
||||
****** Fourteenth Line
|
||||
ZPL := '^FO30,385^AC,18^FDProd Spec No:^FS':CRLF$
|
||||
ZPL := '^FO190,385^A0,25^FD':PSNo:'^FS':CRLF$
|
||||
IF SpecType = 'Production' THEN
|
||||
SpecType = 'Prod'
|
||||
end else IF SpecType = 'Pre-Production' THEN
|
||||
SpecType = 'Pre'
|
||||
end
|
||||
ZPL := '^FO275,385^AC,18^FDSpec Type:^FS':CRLF$
|
||||
ZPL := '^FO400,385^A0,25^FD':SpecType:'^FS':CRLF$
|
||||
****** Data Matrix barcode
|
||||
ZPL := '^FO720,280^CI28':CRLF$
|
||||
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMInKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
|
||||
ZPL:= '^XZ'
|
||||
Next
|
||||
* Check to see if they get the monitor wafers based on the PSN
|
||||
MonitorWafer = CustEpiPartRec<CUST_EPI_PART_MONITOR_WAFER_LABEL$>
|
||||
IF MonitorWafer THEN
|
||||
RDSIds = ''
|
||||
ZPL := '^XA^CFD'
|
||||
ZPL := '^LH0,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL325' ;* Label length in dots
|
||||
ZPL := '^MD15' ;* Media darkness
|
||||
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||
ZPL := '^FO30,30^A060,40^FDMonitor Wafer^FS':CRLF$
|
||||
ZPL := '^FO550,30^A060,40^FDReactor#_____^FS':CRLF$
|
||||
ZPL := '^FO30,70^A060,40^FDDate_____________^FS':CRLF$
|
||||
ZPL := '^FO30,130^A060,40^FDCustomer Name: ':CustName<I>:'^FS':CRLF$
|
||||
ZPL := '^FO30,190^A060,40^FDRDS#: ':RDSIds<I>:'^FS':CRLF$
|
||||
ZPL := '^FO400,190^A060,40^FDLot#: ':LotNo<I>:'^FS':CRLF$
|
||||
ZPL := '^FO30,250^A060,40^FDThick Avg__________^FS':CRLF$
|
||||
ZPL := '^FO400,250^A060,40^FDWafer Type__________^FS':CRLF$
|
||||
ZPL := '^FO30,280^A060,40^FDRes Avg____________^FS':CRLF$
|
||||
ZPL := '^FO400,280^A060,40^FDWafer Type__________^FS':CRLF$
|
||||
ZPL := '^XZ'
|
||||
END
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WM_IN ':WmInKey:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WmInKey passed in.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = ZPL
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service ConvertRecordToJSON(KeyID, Record, ItemURL)
|
||||
|
||||
jsonRecord = ''
|
||||
|
||||
If KeyID NE '' then
|
||||
|
||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WM_IN', KeyID)
|
||||
If Error_Services('NoError') then
|
||||
@DICT = Database_Services('GetTableHandle', 'DICT.WM_IN')
|
||||
@ID = KeyID
|
||||
@RECORD = Record
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objWmIn = ''
|
||||
If SRP_JSON(objWmIn, 'New', 'Object') then
|
||||
SRP_JSON(objWmIn, 'SetValue', 'keyId', @ID)
|
||||
SRP_JSON(objJSON, 'Set', 'wmIn', objWmIn)
|
||||
SRP_JSON(objWmIn, 'Release')
|
||||
end
|
||||
|
||||
If itemURL NE '' then
|
||||
// The itemURL was passed in so add HAL+JSON properties.
|
||||
// Create the _links property and then all link objects needed for this resource.
|
||||
objLinks = ''
|
||||
If SRP_JSON(objLinks, 'New', 'Object') then
|
||||
// Create a self link.
|
||||
objLink = ''
|
||||
If SRP_JSON(objLink, 'New', 'Object') then
|
||||
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
|
||||
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
|
||||
SRP_JSON(objLinks, 'Set', 'self', objLink)
|
||||
SRP_JSON(objLink, 'Release')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||
SRP_JSON(objLinks, 'Release')
|
||||
end
|
||||
// Create the _class property for this resource.
|
||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||
end
|
||||
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
Response = jsonRecord
|
||||
|
||||
End Service
|
||||
|
||||
|
||||
@ -1,130 +0,0 @@
|
||||
Function WM_OUT_API(@API)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from SRP Computer Solutions, Inc.
|
||||
|
||||
Name : WM_OUT_Api
|
||||
|
||||
Description : API logic for the WM_OUT resource.
|
||||
|
||||
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||
|
||||
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||
FullEndpointURL - The URL submitted by the client, including query params.
|
||||
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||
EndpointSegment - The URL endpoint segment.
|
||||
ParentURL - The URL path preceeding the current endpoint.
|
||||
CurrentAPI - The name of this stored procedure.
|
||||
|
||||
Parameters :
|
||||
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||
- APIPattern must follow this structure Rds[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Rds.POST
|
||||
- Rds.ID.PUT
|
||||
- Rds.ID.firstName.GET
|
||||
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||
services do not rely upon anything being returned in the response. This is what the
|
||||
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||
value is only helpful if the developers want to use it for debug purposes.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
08/28/25 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function WM_Out_Services
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API wm_out.ID.HEAD
|
||||
API wm_out.ID.GET
|
||||
|
||||
GoSub CreateHALItem
|
||||
|
||||
end api
|
||||
|
||||
API wm_out.ID.zpl.HEAD
|
||||
API wm_out.ID.zpl.GET
|
||||
|
||||
GoSub CreateZPLItem
|
||||
|
||||
end api
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateHALItem
|
||||
//
|
||||
// Creates a HAL+JSON object based on the OpenInsight data row representation of the scan.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateHALItem:
|
||||
|
||||
WMOutKey = EndpointSegment
|
||||
Convert '-' to '*' in WMOutKey
|
||||
WmOutJson = WM_Out_Services('ConvertRecordToJSON', WMOutKey, '', FullEndpointURL)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', WmOutJson, False$, 'application/hal+json')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateZPLItem
|
||||
//
|
||||
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateZPLItem:
|
||||
|
||||
WmOutKey = ParentSegment
|
||||
ZPL = Wm_Out_Services('GetWmOutZpl', WmOutKey)
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
@ -49,7 +49,7 @@ Compile function WM_Out_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert APP_INSERTS
|
||||
$Insert LOGICAL
|
||||
$Insert MSG_EQUATES
|
||||
$Insert DICT_EQUATES
|
||||
$Insert WM_OUT_EQUATES
|
||||
@ -57,28 +57,20 @@ $Insert WO_MAT_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert COMPANY_EQUATES
|
||||
$Insert RETURN_TO_FAB_LOTS_EQUATES
|
||||
$INSERT PROD_SPEC_EQUATES
|
||||
$INSERT WO_STEP_EQUATES
|
||||
$INSERT EPI_PART_EQUATES
|
||||
$INSERT CUST_EPI_PART_EQUATES
|
||||
$INSERT PRS_STAGE_EQUATES
|
||||
$insert UNIT_EQUATES
|
||||
|
||||
Declare function Database_Services, SRP_JSON, Error_Services, Clean_Insp_Services, WO_Mat_QA_Services
|
||||
Declare function PSN_Services, SRP_Rotate_Array, Datetime, Return_To_Fab_Services, Environment_Services
|
||||
Declare function Logging_Services
|
||||
Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log
|
||||
Declare subroutine Logging_Services, Btree.Extract
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
GoToService else
|
||||
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||
end
|
||||
GoToService
|
||||
|
||||
Return Response else ''
|
||||
Return Response or ""
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Services
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
@ -653,299 +645,3 @@ Service VerifyWOMatWMOKeyIndex(WMOKey)
|
||||
|
||||
end service
|
||||
|
||||
Service GetWMOutKeys(WOLogId)
|
||||
|
||||
ErrorMsg = ''
|
||||
WMOutKeys = ''
|
||||
|
||||
If WOLogId NE '' then
|
||||
Open 'DICT.WM_OUT' to hWmOutDict then
|
||||
SearchString = ''
|
||||
SearchString := 'WO_NO':@VM:WOLogId:@FM
|
||||
Btree.Extract(SearchString, 'WM_OUT', hWmOutDict, WMOutKeys, 0, 0)
|
||||
end else
|
||||
ErrorMsg = 'Error opening WM_OUT dictionary.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'WOLogId was null'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
Response = WMOutKeys
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetWmOutZpl(WmOutKey)
|
||||
|
||||
ZPL = ''
|
||||
ErrorMsg = ''
|
||||
If WmOutKey NE '' then
|
||||
Swap '-' with '*' in WmOutKey
|
||||
Swap '.' with '*' in WmOutKey
|
||||
If RowExists('WM_OUT', WmOutKey) then
|
||||
WONo = Field(WmOutKey, '*', 1, 1)
|
||||
WOStep = Field(WmOutKey, '*', 2, 1)
|
||||
WOStepKeys = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
|
||||
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||
PrintWONo = WONo:'.':WOStep
|
||||
END ELSE
|
||||
PrintWONo = WONo
|
||||
END
|
||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||
Captive = XLATE('COMPANY',CustNo,'CAPTIVE','X')
|
||||
PONo = WORec<WO_LOG_CUST_PO_NO$>
|
||||
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
|
||||
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
|
||||
|
||||
CustSpecNo = ''
|
||||
IF Captive THEN
|
||||
CustSpecNos = PSRec<PROD_SPEC_SPEC_NUM$>
|
||||
CustSpecDescs = PSRec<PROD_SPEC_SPEC_DESC$>
|
||||
CustSpecRevNos = PSRec<PROD_SPEC_REV_NUM$>
|
||||
CustSpecRevDts = PSRec<PROD_SPEC_REV_DATE$>
|
||||
SpecCnt = COUNT(CustSpecNos,@VM) + (CustSpecNos NE '')
|
||||
FOR I = 1 TO SpecCnt
|
||||
IF CustSpecDescs<1,I> _EQC 'GENERAL' THEN
|
||||
CustSpecNo = CustSpecNos<1,I>
|
||||
CustSpecDesc = CustSpecDescS<1,I>
|
||||
CustSpecRevNo = CustSpecRevNos<1,I>
|
||||
CustSpecRevDt = OCONV(CustSpecRevDts<1,I>,'D4/')
|
||||
END
|
||||
UNTIL CustSpecNo NE ''
|
||||
NEXT I
|
||||
END
|
||||
|
||||
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
|
||||
PreSurfscan = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||
FirstSurfscan = XLATE('PRS_STAGE',PSNo:'*WFR',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||
PostCleanSurfScan = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_SIG_REQ$,'X')
|
||||
PostCleanSSSampleQty = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SS_SAMP_QTY$, 'X' )
|
||||
PostCleanSurfscanRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURFSCAN_RECIPE$,'X')
|
||||
PostCleanSurfDefects = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_DEFECTS$,'X')
|
||||
PostCleanSurfHaze = OCONV(XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_SURF_HAZE$,'X'),'MD2')
|
||||
SubPreClean = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||
SubPostClean = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||
PreCleanTool = XLATE('PRS_STAGE',PSNo:'*PRE','TOOL_DISPLAY','X')
|
||||
PostCleanTool = XLATE('PRS_STAGE',PSNo:'*POST','TOOL_DISPLAY','X')
|
||||
PreAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*PRE',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||
PostAkrionRecipe = XLATE('PRS_STAGE',PSNo:'*POST',PRS_STAGE_CLEAN_RECIPE$,'X')
|
||||
* * * * * * * * Following needs update to point to the PRS_LAYER & PRS_STAGE tables as required.
|
||||
* * * * * * * * It's the required part that needs sorted out JCH 1/28/2014
|
||||
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
|
||||
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
|
||||
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
|
||||
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
|
||||
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
|
||||
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
|
||||
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
|
||||
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
|
||||
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
|
||||
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
|
||||
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
|
||||
CleaningReqs = ''
|
||||
|
||||
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
|
||||
PrintThickTargets = ''
|
||||
FOR J = 1 TO ThickCnt
|
||||
PrintThickTargets<1,J> = ThickTarget<1,J>:ThickUnit<1,J>
|
||||
NEXT J
|
||||
|
||||
ResCnt = FIELDCOUNT( ResTarget<1>, @VM )
|
||||
PrintResTargets = ''
|
||||
FOR J = 1 TO ResCnt
|
||||
IF ResTarget<1,J>[1,1] = '.' THEN
|
||||
TargetVal = '0':ResTarget<1,J>
|
||||
END ELSE
|
||||
TargetVal = ResTarget<1,J>
|
||||
END
|
||||
PrintResTargets<1,J> = TargetVal:ResUnit<1,J>
|
||||
NEXT J
|
||||
|
||||
APreRec = ''
|
||||
APostRec = ''
|
||||
IF ( PreAkrionRecipe<1> <> '' ) THEN
|
||||
APreRec = ' ':PreAkrionRecipe:' '
|
||||
SubOxide = 'No' ;* If Akrion then no oxide strip
|
||||
END
|
||||
|
||||
IF ( PostAkrionRecipe<1> <> '' ) THEN
|
||||
APostRec = ' ':PostAkrionRecipe
|
||||
END
|
||||
|
||||
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
|
||||
|
||||
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
|
||||
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
|
||||
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
|
||||
swap UNIT_A$ with 'A' in PrintThickTargets
|
||||
|
||||
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
|
||||
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
|
||||
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
|
||||
swap UNIT_A$ with 'A' in PrintResTargets
|
||||
|
||||
MakeupBox = XLATE('WM_OUT',WMOutKey,WM_OUT_MAKEUP_BOX$ ,'X')
|
||||
|
||||
PrintWMOutKey = WMOutKey
|
||||
CONVERT '*' TO '.' IN PrintWMOutKey
|
||||
|
||||
CassNo = FIELD(WMOutKey,'*',3)
|
||||
LotNo = 'Multiple'
|
||||
WfrQty = XLATE('WM_OUT',WMOutKey,'WFRS_SCHED','X')
|
||||
SubPartNo = WORec<WO_LOG_ORD_SUB_PART_NO$>
|
||||
CustPartNo = WORec<WO_LOG_CUST_PART_NO$>
|
||||
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||
CustPartDesc = XLATE('EPI_PART',EpiPartNo,EPI_PART_EPI_PART_DESC$,'X')
|
||||
PartNo = CustPartNo ;* Temporary for 4x2 to 4x4 conversion
|
||||
PartDesc = CustPartDesc ;* Temporary for 4x2 to 4x4 conversion
|
||||
SubVendCode = WORec<WO_LOG_EXP_VEND_CD$>
|
||||
Vendor = XLATE('SEMI_VEND_CODE', SubVendCode, 'EPI_VEND_CD', 'X')
|
||||
|
||||
SuppCd = TRIM(SubPartNo[-1,'B-'])
|
||||
IF LEN(SuppCd) NE '2' THEN SuppCd =''
|
||||
|
||||
For cnt = 1 to 2
|
||||
***** Start of label ZPL
|
||||
ZPL := '^XA'
|
||||
***** Label setup
|
||||
ZPL := '^LH0,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL406' ;* Label length 203 dpi
|
||||
ZPL := '^PW900' ;* Print width 900 dpi
|
||||
ZPL := '^MD2' ;* Media darkness
|
||||
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||
***** Border
|
||||
ZPL := '^FO10,5^GB795,398,3,B^FS':CRLF$
|
||||
****** First Line
|
||||
Company = 'IFX Epi Services'
|
||||
ZPL := '^FO30,20^A0,45,36^FD':Company:'^FS':CRLF$
|
||||
ZPL := '^FO290,25^AC,18^FDWO No:^FS':CRLF$
|
||||
ZPL := '^FO370,20^A045,36^FD':PrintWONo:'^FS':CRLF$
|
||||
IF CassNo = 1 THEN
|
||||
ZPL := '^FO535,15^GB120,40,40,,3^FS':CRLF$
|
||||
ZPL := '^FO540,25^AC,18^FR^FDCass:^FS':CRLF$
|
||||
ZPL := '^FO600,20^A045,36^FR^FD':CassNo:'^FS':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO540,25^AC,18^FDCass:^FS':CRLF$
|
||||
ZPL := '^FO600,20^A045,36^FD':CassNo:'^FS':CRLF$
|
||||
END
|
||||
ZPL:= '^FO665,20^A045,36^FDWM Out^FS':CRLF$
|
||||
****** Second Line
|
||||
ZPL:= '^FO30,70^AC,18^FDWM Out:^FS':CRLF$
|
||||
ZPL:= '^FO120,65^A050,30^FD':PrintWMOutKey:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO300,58^B3,,37,N^FD':'O':PrintWMOutKey:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
ZPL:= '^FO700,60^AC,18^FDQty:^FS':CRLF$
|
||||
ZPL:= '^FO760,60^A045,25^FD':WfrQty:'^FS':CRLF$
|
||||
****** Third Line
|
||||
ZPL:= '^FO30,100^AC,18^FDShip Dt:^FS':CRLF$
|
||||
ZPL:= '^FO140,100^A0,,25^FD':ReqShipDate:'^FS':CRLF$
|
||||
ZPL:= '^FO250,100^AC,18^FDCust:^FS':CRLF$
|
||||
ZPL:= '^FO320,100^A045,25^FD':CustName:'^FS':CRLF$
|
||||
ZPL:= '^FO560,100^AC,18^FDPO:^FS':CRLF$
|
||||
ZPL:= '^FO600,100^A045,25^FD':PONo:'^FS':CRLF$
|
||||
****** Separator bar
|
||||
ZPL:= '^FO15,125^GB790,1^FS':CRLF$
|
||||
****** Fourth Line
|
||||
ZPL := '^FO30,130^AC,18^FDLot No:^FS':CRLF$
|
||||
ZPL := '^FO120,130^A0,20^FD':LotNo:'^FS':CRLF$
|
||||
ZPL := '^FO410,130^AC,18^FDPart No:^FS':CRLF$
|
||||
ZPL := '^FO510,130^A0,20^FD':PartNo:'^FS':CRLF$
|
||||
****** Fifth Line
|
||||
ZPL := '^FO30,155^AC,18^FDSub PN:^FS':CRLF$
|
||||
ZPL := '^FO120,155^A0,20^FD':SubPartNo:'^FS':CRLF$
|
||||
IF SuppCd NE '' THEN
|
||||
ZPL := '^FO410,155^AC,18^FDSupp Cd:^FS':CRLF$
|
||||
ZPL := '^FO510,155^A0,20^FD':SuppCd:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO610,155^A040,20^B3,,23,N^FD':SuppCd:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,180^GB790,1^FS':CRLF$
|
||||
IF MakeupBox THEN
|
||||
ZPL := '^FO410,190^A050,30^FD* * * M a k e u p B o x * * *^FS':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO410,190^AC,18^FDReact Type:^FS':CRLF$
|
||||
ZPL := '^FO560,190^A0,20^FDEpiPro^FS':CRLF$
|
||||
END
|
||||
****** Seventh Line
|
||||
ZPL := '^FO30,190^AC,18^FDPre:^FS':CRLF$
|
||||
ZPL := '^FO90,190^A0,20^FD':SubPreClean:'^FS':CRLF$
|
||||
IF PreAkrionRecipe NE '' THEN
|
||||
ZPL := '^FO210,190^AC,18^FDAkrion:^FS':CRLF$
|
||||
ZPL := '^FO300,190^A0,20^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO450,190^A040,20^B3,,23,N^FD':PreAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END
|
||||
****** Eighth Line
|
||||
ZPL := '^FO30,225^AC,18^FDRecipe:^FS':CRLF$
|
||||
ZPL := '^FO120,225^A0,20^FD':RecipeInfo:'^FS':CRLF$
|
||||
ZPL := '^FO410,225^AC,18^FDEpi Dopant:^FS':CRLF$
|
||||
ZPL := '^FO560,225^A040,20^FD':Dopant:'^FS':CRLF$
|
||||
****** Ninth, Tenth and Eleventh Lines
|
||||
ZPL := '^FO30,260^AC,18^FDThk Spec:^FS':CRLF$
|
||||
FOR M = 1 TO COUNT(PrintThickTargets,@VM) + (PrintThickTargets NE '')
|
||||
BaseLine = 260 + (M-1)*20
|
||||
ZPL := '^FO140,':BaseLine:'^A040,20^FD':PrintThickTargets<1,M>:'^FS':CRLF$
|
||||
NEXT M
|
||||
ZPL := '^FO410,260^AC,18^FDRes Spec:^FS':CRLF$
|
||||
FOR M = 1 TO COUNT(PrintResTargets,@VM) + (PrintResTargets NE '')
|
||||
BaseLine = 260 + (M-1)*20
|
||||
ZPL := '^FO520,':BaseLine:'^A040,20^FD':PrintResTargets<1,M>:'^FS':CRLF$
|
||||
NEXT M
|
||||
IF PostAkrionRecipe NE '' THEN
|
||||
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
|
||||
ZPL := '^FO90,335^A0,20^FD':SubPostClean:'^FS':CRLF$
|
||||
ZPL := '^FO210,335^AC,18^FDAkrion:^FS':CRLF$
|
||||
ZPL := '^FO300,335^A0,20^FD':PostAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,2.0':CRLF$
|
||||
ZPL := '^FO450,335^A040,20^B3,,23,N^FD':PostAkrionRecipe:'^FS':CRLF$
|
||||
ZPL := '^BY2,3.0':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO30,335^AC,18^FDPost:^FS':CRLF$
|
||||
ZPL := '^FO120,335^A0,20^FD':SubPostClean:'^FS':CRLF$
|
||||
END
|
||||
****** Separator bar
|
||||
ZPL := '^FO15,365^GB790,1^FS':CRLF$
|
||||
****** Data Matrix barcode
|
||||
ZPL := '^FO720,280^CI28':CRLF$
|
||||
ZPL := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMOutKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
|
||||
****** Fourteenth Line
|
||||
ZPL := '^FO30,375^AC,18^FDProd Spec No:^FS':CRLF$
|
||||
ZPL := '^FO190,375^A0,25^FD':PSNo:'^FS':CRLF$
|
||||
IF SpecType = 'Production' THEN SpecType = 'Prod'
|
||||
IF SpecType = 'Pre-Production' THEN SpecType = 'Pre'
|
||||
ZPL := '^FO275,375^AC,18^FDSpec Type:^FS':CRLF$
|
||||
ZPL := '^FO400,375^A0,25^FD':SpecType:'^FS':CRLF$
|
||||
ZPL := '^FO480,375^AC,18^FDBag:^FS':CRLF$
|
||||
ZPL := '^FO530,375^A0,20^FD':ShipBagReq:'^FS':CRLF$
|
||||
***** End of Label
|
||||
ZPL := '^XZ'
|
||||
Next
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WM_OUT ':WmOutKey:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WmOutKey passed in.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = ZPL
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -51,18 +51,17 @@ $Insert IFX_EQUATES
|
||||
$Insert CUST_EPI_PART_EQUATES
|
||||
|
||||
Equ MAX_NUM_CASS$ to 150
|
||||
Equ NUM_ATTEMPTS$ to 10
|
||||
|
||||
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
|
||||
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
|
||||
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
|
||||
Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
|
||||
Declare subroutine obj_WO_Mat, obj_Post_Log, Delay
|
||||
Declare subroutine obj_WO_Mat, obj_Post_Log
|
||||
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
|
||||
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, obj_WO_Log, obj_WO_Step, Memberof, Datetime
|
||||
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services
|
||||
Declare function SRP_Datetime, RTI_CreateGUID, RDS_Services, UCase, Date_Services
|
||||
Declare function SRP_Datetime, RTI_CreateGUID, RDS_Services, UCase
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -1141,86 +1140,6 @@ Service UpdateReleasedQty(WONo)
|
||||
end service
|
||||
|
||||
|
||||
Service AdjustReleasedQty(WONo, AdjustQty)
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Released Qty Log.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
||||
objAdjRelLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
OrigRelQty = ''
|
||||
RelQty = ''
|
||||
UnrelQty = ''
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (WONo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
||||
Case (AdjustQty EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
|
||||
Case Not(Num(AdjustQty))
|
||||
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
|
||||
Case Index(AdjustQty, '.', 1)
|
||||
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
If (ErrorMsg EQ '' ) then
|
||||
If RowExists('WO_LOG', WONo) then
|
||||
For Attempt = 1 to NUM_ATTEMPTS$
|
||||
If Attempt GT 0 then Delay(Attempt)
|
||||
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
|
||||
If HaveLock then
|
||||
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||
OrigRelQty = WORec<WO_LOG_REL_QTY_STATIC$>
|
||||
RelQty = OrigRelQty + AdjustQty
|
||||
UnrelQty = WOQty - RelQty
|
||||
If UnrelQty LT 0 then UnrelQty = 0
|
||||
WORec<WO_LOG_REL_QTY_STATIC$> = RelQty
|
||||
WORec<WO_LOG_UNREL_QTY_STATIC$> = UnRelQty
|
||||
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RelQty:' on REL_QTY_STATIC '
|
||||
ErrorMsg := 'field and ':UnrelQty:' on UNREL_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
||||
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
||||
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
|
||||
end
|
||||
Until HaveLock or (ErrorMsg NE '')
|
||||
Next Attempt
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
||||
end
|
||||
end
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDtm
|
||||
LogData<2> = WONo
|
||||
If ErrorMsg EQ '' then
|
||||
LogResult = 'Successfully adjusted WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty
|
||||
LogResult := '. Updated WO_LOG record ':WONo:' field REL_QTY_STATIC with released quantity ':RelQty
|
||||
LogResult := ' and field UNREL_QTY_STATIC with unreleased quantity ':UnRelQty:'.'
|
||||
LogData<3> = LogResult
|
||||
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
|
||||
end else
|
||||
LogResult = 'Failed to adjust WO_LOG ':WONo:' released and unreleased quantities by ':AdjustQty:'.'
|
||||
LogData<3> = LogResult
|
||||
Logging_Services('AppendLog', objAdjRelLog, LogData, @RM, @FM)
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UpdateReceivedQty(WONo)
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
@ -1237,9 +1156,7 @@ Service UpdateReceivedQty(WONo)
|
||||
If RowExists('WO_LOG', WONo) then
|
||||
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
|
||||
OpenQty = WOQty - RXQty
|
||||
Open 'WO_LOG' to hTable then
|
||||
ReadV OrigRXQty from hTable, WONo, WO_LOG_RX_QTY_STATIC$ then
|
||||
If OrigRXQty NE RXQty then
|
||||
@ -1252,19 +1169,6 @@ Service UpdateReceivedQty(WONo)
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading RX_QTY_STATIC column from WO_LOG ':WONo:'.'
|
||||
end
|
||||
If ErrorMsg EQ '' then
|
||||
ReadV OrigOpenQty from hTable, WONo, WO_LOG_OPEN_QTY_STATIC$ then
|
||||
If OrigOpenQty NE OpenQty then
|
||||
WriteV OpenQty on hTable, WONo, WO_LOG_OPEN_QTY_STATIC$ else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to write received quantity ':RXQty
|
||||
ErrorMsg := ' to the OPEN_QTY_STATIC field of WO_LOG record ':WONo:'.'
|
||||
ErrorMsg := '@FILE_ERROR: ':@FILE_ERROR
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading OPEN_QTY_STATIC column from WO_LOG ':WONo:'.'
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to open the WO_LOG table.'
|
||||
end
|
||||
@ -1296,84 +1200,6 @@ Service UpdateReceivedQty(WONo)
|
||||
end service
|
||||
|
||||
|
||||
Service AdjustReceivedQty(WONo, AdjustQty)
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Adjust Received Qty Log.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'WONo' : @FM : 'Notes'
|
||||
objAdjRecLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
RXQty = ''
|
||||
OrigRXQty = ''
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (WONo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service'
|
||||
Case (AdjustQty EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null AdjustQty passed into service'
|
||||
Case Not(Num(AdjustQty))
|
||||
ErrorMsg = 'Error in ':Service:' service. AdjustQty is not a number'
|
||||
Case Index(AdjustQty, '.', 1)
|
||||
ErrorMsg = 'Error in ':Service:' service. AdjustQty cannot be a decimal value'
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
If (ErrorMsg EQ '' ) then
|
||||
If RowExists('WO_LOG', WONo) then
|
||||
For Attempt = 1 to NUM_ATTEMPTS$
|
||||
If Attempt GT 0 then Delay(Attempt)
|
||||
HaveLock = Database_Services('GetKeyIDLock', 'WO_LOG', WONo, True$)
|
||||
If HaveLock then
|
||||
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
WOQty = WORec<WO_LOG_WO_QTY$>
|
||||
OrigRxQty = WORec<WO_LOG_RX_QTY_STATIC$>
|
||||
RxQty = OrigRxQty + AdjustQty
|
||||
OpenQty = WOQty - RXQty
|
||||
WORec<WO_LOG_RX_QTY_STATIC$> = RxQty
|
||||
WORec<WO_LOG_OPEN_QTY_STATIC$> = OpenQty
|
||||
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec, True$, False$, False$)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to write ':RxQty:' on RX_QTY_STATIC field '
|
||||
ErrorMsg := 'and ':OpenQty:' on OPEN_QTY_STATIC to WO_LOG ':WONo:'. Error message: '
|
||||
ErrorMsg := Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to read record ':WONo:' from the WO_LOG table. '
|
||||
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
If ( Not(HaveLock) and (Attempt GE NUM_ATTEMPTS$) ) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Failed to lock WO_LOG ':WoNo:' for update after ':Attempt:' attempts.'
|
||||
end
|
||||
Until HaveLock or (ErrorMsg NE '')
|
||||
Next Attempt
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. ':WONo:' does not exist in the WO_LOG table.'
|
||||
end
|
||||
end
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDtm
|
||||
LogData<2> = WONo
|
||||
If ErrorMsg EQ '' then
|
||||
LogResult = 'Successfully adjusted WO_LOG ':WONo:' received and open quantities by ':AdjustQty
|
||||
LogResult := '. Updated WO_LOG record ':WONo:' field RX_QTY_STATIC with received quantity ':RXQty
|
||||
LogResult := ' and field OPEN_QTY_STATIC with open quantity ':OpenQty:'.'
|
||||
LogData<3> = LogResult
|
||||
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
|
||||
end else
|
||||
LogResult = 'Failed to adjust WO_LOG ':WONo:' received and open quantities by ':AdjustQty
|
||||
LogData<3> = LogResult
|
||||
Logging_Services('AppendLog', objAdjRecLog, LogData, @RM, @FM)
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UpdateShippedQty(WONo)
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
@ -1505,76 +1331,44 @@ end service
|
||||
|
||||
Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
||||
|
||||
ErrorMsg = ''
|
||||
jsonRecord = ''
|
||||
IF WONo NE '' then
|
||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
EpiPartNo = Record<WO_LOG_EPI_PART_NO$>
|
||||
EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo)
|
||||
If Error_Services('NoError') then
|
||||
SubSuppBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
|
||||
ProdVerNo = Record<WO_LOG_PROD_VER_NO$>
|
||||
ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVerNo)
|
||||
If Error_Services('NoError') then
|
||||
SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
|
||||
// Create the JSON response object
|
||||
@DICT = Database_Services('GetTableHandle', 'DICT.WO_LOG')
|
||||
@ID = WONo
|
||||
@RECORD = Record
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objWOLog = ''
|
||||
If SRP_JSON(objWOLog, 'New', 'Object') then
|
||||
SRP_JSON(objWOLog, 'SetValue', 'KeyId', WONo)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', Record<WO_LOG_PROD_ORD_NO$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'PSN', Xlate('WO_LOG', WONo, 'PS_NO', 'X'))
|
||||
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', EpiPartNo)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'HotFlag', Record<WO_LOG_HOT_FLAG$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'WoQty', Record<WO_LOG_WO_QTY$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'RxQty', Record<WO_LOG_RX_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'RelQty', Record<WO_LOG_REL_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'UnRelQty', Record<WO_LOG_UNREL_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ShipQty', Record<WO_LOG_SHIP_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ScrapQty', Record<WO_LOG_SCRAP_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'OpenQty', Record<WO_LOG_OPEN_QTY_STATIC$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'CustNo', Record<WO_LOG_CUST_NO$>)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'Customer', Xlate('WO_LOG', WONo, 'CUST_NAME', 'X'))
|
||||
|
||||
ExpectedVendorCd = Record<WO_LOG_EXP_VEND_CD$>
|
||||
If ( (Len(ExpectedVendorCd) NE 2) or (SubSuppBy NE 'L') ) then ExpectedVendorCd = ''
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ExpectedVendorCd', ExpectedVendorCd)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'SubPartNo', SubPartNo)
|
||||
|
||||
// Create a list of cassettes
|
||||
CassIDs = Record<WO_LOG_WO_MAT_KEY$>
|
||||
SRP_JSON(objWOLog, 'SetValue', 'KeyId', @ID)
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ProdOrdNo', {PROD_ORD_NO})
|
||||
SRP_JSON(objWOLog, 'SetValue', 'PSN', {PROD_SPEC_ID})
|
||||
SRP_JSON(objWOLog, 'SetValue', 'EpiPartNo', {EPI_PART_NO})
|
||||
SRP_JSON(objWOLog, 'SetValue', 'HOT_FLAG', {HOT_FLAG})
|
||||
//Create a list of cassettes
|
||||
CassIDs = {WO_MAT_KEY}
|
||||
objChildCassettes = ''
|
||||
If SRP_JSON(objChildCassettes, 'New', 'Array') then
|
||||
If CassIDs NE '' then
|
||||
for each Cass in CassIDs using @VM setting vPos
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', Cass)
|
||||
If Error_Services('NoError') then
|
||||
// Add in each indv. cassette object
|
||||
SAPBatchNo = XLATE('WO_MAT', Cass, WO_MAT_SAP_BATCH_NO$, 'X')
|
||||
SAPTXDtm = XLATE('WO_MAT', Cass, WO_MAT_SAP_TX_DTM$, 'X')
|
||||
RDSNo = XLATE('WO_MAT', Cass, WO_MAT_RDS_NO$, 'X')
|
||||
ShipNo = XLATE('WO_MAT', Cass, WO_MAT_SHIP_NO$, 'X')
|
||||
//Add in each indv. cassette object
|
||||
objChildCassette = ''
|
||||
If SRP_JSON(objChildCassette, 'New', 'Object') then
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'KeyId', Cass)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'CassNo', Field(Cass, '*', 2, 1))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPBatchNo', SAPBatchNo)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'SAPTXDtm', OCONV(SAPTXDtm, 'DT'))
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'RDSNo', RDSNo)
|
||||
SRP_JSON(objChildCassette, 'SetValue', 'ShipNo', ShipNo)
|
||||
SRP_JSON(objChildCassettes, 'Add', objChildCassette)
|
||||
SRP_JSON(objChildCassette, 'Release')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
Next Cass
|
||||
end else
|
||||
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
|
||||
@ -1601,28 +1395,19 @@ Service ConvertRecordToJSON(WONo, Record, ItemURL)
|
||||
SRP_JSON(objJSON, 'Set', '_links', objLinks)
|
||||
SRP_JSON(objLinks, 'Release')
|
||||
end
|
||||
|
||||
// Create the _class property for this resource.
|
||||
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
|
||||
end
|
||||
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WONo passed into service.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = jsonRecord
|
||||
|
||||
end service
|
||||
@ -2528,57 +2313,6 @@ Service UpdateWorkOrderData(WONo)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetWoLogZpl(WoNo)
|
||||
|
||||
ZPL = ''
|
||||
ErrorMsg = ''
|
||||
If WoNo NE '' then
|
||||
If RowExists('WO_LOG', WoNo) then
|
||||
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
|
||||
IF INDEX(WOStepKeys,@VM,1) THEN
|
||||
PrintWONo = WONo:'.':WOStep
|
||||
END ELSE
|
||||
PrintWONo = WONo
|
||||
END
|
||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||
ReqShipDate = OCONV(WORec<WO_LOG_PROMISE_SHIP_DT$>,'D2/')
|
||||
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||
CustName = XLATE('COMPANY',CustNo,'ABBREV_OR_CO_NAME','X')
|
||||
ZPL := '^XA^CFD'
|
||||
ZPL := '^LH0,0'
|
||||
ZPL := '^PR2' ;* Print speed 2 inches per second
|
||||
ZPL := '^LL325' ;* Label length in dots
|
||||
ZPL := '^MD15' ;* Media darkness
|
||||
ZPL := '^PQ2' ;* Print 2 labels for each pass through here
|
||||
ZPL := '^MMT':CRLF$ ;* Media mode t=tear off mode
|
||||
IF INDEX(PrintWONo,'.',1) THEN
|
||||
ZPL := '^FO10,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
|
||||
END ELSE
|
||||
ZPL := '^FO70,30^A0,220,210^FD':PrintWONo:'^FS':CRLF$
|
||||
END
|
||||
CharCnt = Len(CustName)
|
||||
NameLength = CharCnt*72
|
||||
WhiteSpace = INT(((2103 - NameLength)/2103) * 806)
|
||||
StartingXPos = INT(WhiteSpace/2)
|
||||
ZPL:= '^FO':StartingXPos:',230^A0,75,72^FD':CustName:'^FS':CRLF$
|
||||
ZPL:= '^FO160,320^A080,50^FD':'Commit Date: ':OCONV( XLATE( 'WO_LOG', WONo, WO_LOG_COMMIT_DATE$, 'X' ), 'D2/' ):'^FS':CRLF$
|
||||
ZPL:= '^XZ'
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WO_LOG ':WoNo:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WoNo passed in.'
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = ZPL
|
||||
end else
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -35,15 +35,16 @@ Function Wo_API(@API)
|
||||
10/20/23 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
|
||||
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
Declare function Environment_Services, SRP_Datetime, Logging_Services, Work_Order_Services
|
||||
Declare Subroutine Btree.Extract, Logging_Services, Http_Services
|
||||
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO'
|
||||
@ -54,8 +55,6 @@ LoggingDTM = LogDate : ' ' : LogTime
|
||||
ResponseCode = ''
|
||||
ResponseMessage = ''
|
||||
LogData = ''
|
||||
Response = ''
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
ResponseCode = 204
|
||||
@ -77,6 +76,14 @@ Return Response OR ''
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API wo.HEAD
|
||||
API wo.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API wo.ID.HEAD
|
||||
API wo.ID.GET
|
||||
|
||||
@ -84,20 +91,7 @@ API wo.ID.GET
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API wo.ID.zpl.HEAD
|
||||
API wo.ID.zpl.GET
|
||||
|
||||
GoSub CreateZPLItem
|
||||
|
||||
end api
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CreateHALItem:
|
||||
|
||||
ResponseCode = 200
|
||||
MaterialKey = EndpointSegment
|
||||
WOLogKey = ''
|
||||
@ -154,32 +148,4 @@ CreateHALItem:
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// CreateZPLItem
|
||||
//
|
||||
// Creates a HAL+JSON object with the ZPL for the given WM_IN row
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
CreateZPLItem:
|
||||
|
||||
WoLogKey = ParentSegment
|
||||
ZPL = Work_Order_Services('GetWoLogZpl', WoLogKey)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
StatusCode = 200
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', ZPL, False$, 'text/plain')
|
||||
If Assigned(Message) then
|
||||
HTTP_Services('SetResponseStatus', StatusCode, Message)
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', StatusCode)
|
||||
end
|
||||
end else
|
||||
Message = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
@ -616,24 +616,12 @@ WRITE_RECORD:
|
||||
NewRelDtm = Record<WO_MAT_REL_DTM$>
|
||||
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
|
||||
NewRecDtm = Record<WO_MAT_RX_DTM$>
|
||||
AdjustQty = NewWfrQty - OrigWfrQty
|
||||
|
||||
If ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) and (OrigRecDtm NE '' and NewRecDtm NE '') ) then
|
||||
// Cassette already received, but casssette quantity has changed.
|
||||
If AdjustQty NE 0 then Work_Order_Services('AdjustReceivedQty', WONo, AdjustQty)
|
||||
If ( ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) ) then
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReceivedQty':SD$:WONo)
|
||||
end
|
||||
If ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) then
|
||||
// Cassette was just received. Increment received quantity of work order by the entire cassette wafer count.
|
||||
Work_Order_Services('AdjustReceivedQty', WONo, NewWfrQty)
|
||||
end
|
||||
|
||||
If ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) and ( (OrigRelDtm NE '') and (NewRelDtm NE '') ) ) then
|
||||
// Cassette already released, but casssette quantity has changed.
|
||||
If AdjustQty NE 0 then Work_Order_Services('AdjustReleasedQty', WONo, AdjustQty)
|
||||
end
|
||||
If ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) then
|
||||
// Cassette was just released. Increment released quantity of work order by the entire cassette wafer count.
|
||||
Work_Order_Services('AdjustReleasedQty', WONo, NewWfrQty)
|
||||
If ( ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) ) then
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':SD$:WONo)
|
||||
end
|
||||
|
||||
If {REACTOR_TYPE} NE 'EPP' then
|
||||
|
||||
@ -44,7 +44,6 @@ Declare Subroutine Logging_Services
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Materials\WO_MAT'
|
||||
@ -55,8 +54,6 @@ LoggingDTM = LogDate : ' ' : LogTime
|
||||
ResponseCode = ''
|
||||
ResponseMessage = ''
|
||||
LogData = ''
|
||||
Response = ''
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
@ -70,6 +67,14 @@ Return Response OR ''
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API wo_mat.HEAD
|
||||
API wo_mat.GET
|
||||
|
||||
HTTP_Resource_Services('LoremIpsum')
|
||||
|
||||
end api
|
||||
|
||||
|
||||
API wo_mat.ID.HEAD
|
||||
API wo_mat.ID.GET
|
||||
|
||||
@ -77,12 +82,6 @@ API wo_mat.ID.GET
|
||||
|
||||
end api
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
CreateHalItem:
|
||||
|
||||
ResponseCode = 200
|
||||
@ -120,6 +119,4 @@ CreateHalItem:
|
||||
LogData<4> = ResponseCode
|
||||
LogData<5> = ResponseMessage
|
||||
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM)
|
||||
|
||||
return
|
||||
|
||||
|
||||
@ -182,7 +182,6 @@ WRITE_RECORD_PRE:
|
||||
Case Record EQ ''
|
||||
|
||||
// Unscheduled record write attempt. Block the write and log the event.
|
||||
// Empty WO_MAT_QA records can cause undesireable issues processing lots.
|
||||
ErrorMessage = 'Empty WO_MAT_QA profile. Unscheduled record write attempt!'
|
||||
Error_Services('Add', 'FS104: ':ErrorMessage)
|
||||
OrigFileError = 104 : @FM : ErrorMessage
|
||||
@ -201,8 +200,21 @@ WRITE_RECORD_PRE:
|
||||
LogData<4> = Stack
|
||||
LogData<5> = CRLF$:RecordSnapshot:CRLF$
|
||||
LogData<6> = 'FS104: ':ErrorMessage
|
||||
|
||||
// Sending a null message will send the LogData instead
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
|
||||
|
||||
// Send an internal OI message to OI admins
|
||||
Recipients = Xlate('SEC_GROUPS', 'OI_ADMIN', 'USER', 'X')
|
||||
SentFrom = 'SYSTEM'
|
||||
Subject = 'Unscheduled WO_MAT_QA record write attempt.'
|
||||
Message = ErrorMessage
|
||||
AttachWindow = ''
|
||||
AttachKey = ''
|
||||
SendToGroup = ''
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
|
||||
@ -421,57 +421,35 @@ end service
|
||||
|
||||
Service GetQAMetComplete(WOMatKey)
|
||||
|
||||
ErrorMsg = ''
|
||||
QAMetComplete = True$
|
||||
|
||||
If WOMatKey NE '' then
|
||||
// Lack of WO_MAT_QA record may not be an error here. Gen5 Products do not have WO_MAT_QA Records
|
||||
If Rowexists('WO_MAT_QA', WOMatKey) then
|
||||
Response = ''
|
||||
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
|
||||
If Error_Services('NoError') then
|
||||
Stages = QAMetRec<WO_MAT_QA_STAGE$>
|
||||
Results = QAMetRec<WO_MAT_QA_RESULT$>
|
||||
StageCount = DCount(Stages, @VM)
|
||||
QAStagePresent = False$
|
||||
StageCount = Count(Stages, @VM)
|
||||
For I = 1 to StageCount
|
||||
If Stages<1, I> EQ 'QA' then QAStagePresent = True$
|
||||
If Results<1,I> EQ '' then
|
||||
QAMetComplete = False$
|
||||
Response = False$
|
||||
end
|
||||
Until QAMetComplete EQ False$
|
||||
Until Response EQ False$
|
||||
Next I
|
||||
If QAMetComplete EQ True$ AND QAStagePresent = True$ then
|
||||
QAMUMetComplete = WO_Mat_QA_Services('GetMUWaferQAComplete', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
If Not(QAMUMetComplete) then
|
||||
QAMetComplete = False$
|
||||
If Response = '' then
|
||||
Response = Wo_Mat_Qa_Services('GetMUWaferQAComplete', WOMatKey)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Response = True$
|
||||
end
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Missing WOMatKey parameter.'
|
||||
Error_Services('Add', 'Missing WOMatKey parameter.')
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
Response = QAMetComplete
|
||||
end else
|
||||
Response = False$
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetMUWaferQAComplete(WOMatKey)
|
||||
|
||||
ErrorMsg = ''
|
||||
|
||||
If WOMatKey NE '' then
|
||||
Response = True$
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$)
|
||||
@ -509,14 +487,10 @@ Service GetMUWaferQAComplete(WOMatKey)
|
||||
Next Box
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Failed to open WO_MAT record.'
|
||||
Error_Services('Add', 'Failed to open WO_MAT record.')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Missing WOMatKey parameter.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Error_Services('Add', 'Missing WOMatKey parameter.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
@ -55,7 +55,7 @@ $Insert SERVICE_SETUP
|
||||
$Insert DICT_EQUATES
|
||||
|
||||
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
|
||||
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array, Date_Services
|
||||
Declare function Datetime, Rds_Services, GetTickCount, SRP_Array
|
||||
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
|
||||
Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services, Btree.Extract
|
||||
Declare subroutine Transaction_Services
|
||||
@ -86,7 +86,6 @@ Return Response or ""
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
||||
|
||||
jsonRecord = ''
|
||||
IF WOMatKey NE '' then
|
||||
If Record EQ '' then Record = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
@ -291,50 +290,6 @@ Service ConvertRecordToJSON(WOMatKey, Record, ItemURL)
|
||||
End Service
|
||||
|
||||
|
||||
Service ConvertRecordToJsonOIWizard(WOMatKey, WOMatRec)
|
||||
|
||||
Json = ''
|
||||
If WOMatKey NE '' then
|
||||
If WOMatRec EQ '' then WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
objJSON = ''
|
||||
If SRP_JSON(objJSON, 'New', 'Object') then
|
||||
objWOMat = ''
|
||||
If SRP_JSON(objWOMat, 'New', 'Object') then
|
||||
SRP_JSON(objWOMat, 'SetValue', 'KeyId', WOMatKey)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'CassNo', Field(WOMatKey, '*', 2, 1))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'SAPBatchNo', WOMatRec<WO_MAT_SAP_BATCH_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'SAPTXDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_SAP_TX_DTM$>))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RDSNo', WOMatRec<WO_MAT_RDS_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'ShipNo', WOMatRec<WO_MAT_SHIP_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'LotNo', WOMatRec<WO_MAT_LOT_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'Qty', WOMatRec<WO_MAT_WAFER_QTY$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'CustPartNo', WOMatRec<WO_MAT_CUST_PART_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'SubPartNo', WOMatRec<WO_MAT_SUB_PART_NO$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'VendorCd', WOMatRec<WO_MAT_SUB_VEND_CD$>)
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RecDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_RX_DTM$>))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RelDtm', Date_Services('ConvertDateTimeToISO8601', WOMatRec<WO_MAT_REL_DTM$>))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RecUser', OConv(WOMatRec<WO_MAT_RX_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||
SRP_JSON(objWOMat, 'SetValue', 'RelUser', OConv(WOMatRec<WO_MAT_REL_BY$>, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ))
|
||||
SRP_JSON(objJSON, 'Set', 'WO_Mat', objWOMat)
|
||||
SRP_JSON(objWOMat, 'Release')
|
||||
Json = SRP_JSON(objJSON, 'Stringify', 'Fast')
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
SRP_JSON(objJSON, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
Response = Json
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// GetWaferMap
|
||||
//
|
||||
@ -492,43 +447,37 @@ Service CassetteIsLastInWo(WoMatKey)
|
||||
|
||||
IsLastInWo = False$
|
||||
|
||||
ErrMsg = ''
|
||||
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then
|
||||
ErrMsg = 'invalid WO_MAT key'
|
||||
Error_Services('Add', 'invalid WO_MAT key')
|
||||
end
|
||||
|
||||
WO = Field(WoMatKey, '*', 1)
|
||||
If WO EQ '' then
|
||||
ErrMsg = 'WO# not found in WO_MAT record'
|
||||
Error_Services('Add', 'WO# not found in WO_MAT record')
|
||||
end
|
||||
If ErrMsg EQ '' and Num(WO) EQ False$ then
|
||||
ErrMsg = 'WO# is not numeric'
|
||||
If Error_Services('NoError') and Num(WO) EQ False$ then
|
||||
Error_Services('Add', 'WO# is not numeric')
|
||||
end
|
||||
|
||||
CassNo = Field(WoMatKey, '*', 2)
|
||||
If ErrMsg EQ '' and CassNo EQ '' then
|
||||
ErrMsg = 'Cassette# not found in WO_MAT record'
|
||||
If Error_Services('NoError') and CassNo EQ '' then
|
||||
Error_Services('Add', 'Cassette# not found in WO_MAT record')
|
||||
end
|
||||
If ErrMsg EQ '' and Num(CassNo) EQ False$ then
|
||||
ErrMsg = 'Cassette# is not numeric'
|
||||
If Error_Services('NoError') and Num(CassNo) EQ False$ then
|
||||
Error_Services('Add', 'Cassette# is not numeric')
|
||||
end
|
||||
|
||||
If ErrMsg EQ '' then
|
||||
If Error_Services('NoError') then
|
||||
WoMatKeys = Xlate('WO_LOG', WO, WO_LOG_WO_MAT_KEY$, 'X')
|
||||
If WoMatKeys NE '' then
|
||||
If Error_Services('NoError') and WoMatKeys NE '' then
|
||||
TotalCassettes = DCount(WoMatKeys, @VM)
|
||||
IsLastInWo = TotalCassettes EQ CassNo
|
||||
end else
|
||||
ErrMsg = 'WO_MAT keys not found in WO_LOG for WO ':WO
|
||||
end
|
||||
end
|
||||
|
||||
Response = IsLastInWo
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
If ErrMsg NE '' then
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDtm
|
||||
LogData<2> = WOMatKey
|
||||
@ -540,6 +489,11 @@ Service CassetteIsLastInWo(WoMatKey)
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
|
||||
Response = IsLastInWo
|
||||
|
||||
EndTick = GetTickCount()
|
||||
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -592,13 +546,8 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
|
||||
end service
|
||||
|
||||
|
||||
Service MakeupFlagOn(WOMatKey)
|
||||
Service MakeupFlagOn(RDSNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
If (WOMatKey NE '') then
|
||||
If RowExists('WO_MAT', WOMatKey) then
|
||||
RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WOMatKey, WO_MAT_RDS_NO$)
|
||||
If Error_Services('NoError') then
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
BioRadDown = False$
|
||||
Bio4Down = False$
|
||||
@ -625,16 +574,6 @@ Service MakeupFlagOn(WOMatKey)
|
||||
Rds_Services('ApplyQA100PercentADE', RDSNo)
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading RDS_NO from WO_MAT record ':WOMatKey:'. '
|
||||
ErrorMsg := 'Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WO_MAT record ':WOMatKey:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed into service.'
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
@ -757,3 +696,4 @@ Service VerifyWOLogWOMatKeyColumn(WOMatKey)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
@ -242,10 +242,6 @@ Equ API_COLOR_BTNTEXT$ To 18
|
||||
Equ API_COLOR_INACTIVECAPTIONTEXT$ To 19
|
||||
Equ API_COLOR_BTNHIGHLIGHT$ To 20
|
||||
|
||||
// Edit Line Color Equates
|
||||
Equ READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
||||
Equ EDIT_ACTIVE_WHITE$ TO 16777215
|
||||
|
||||
// Preference Manager
|
||||
Equ ImagePath$ to Memory_Services('GetValue', 'PM_CURRENT_IMAGE_PATH') : '\'
|
||||
PMSystemFont = Memory_Services('GetValue', 'PM_SYSTEM_FONT')
|
||||
|
||||
@ -1,19 +0,0 @@
|
||||
compile insert ARCHIVE_EQUATES
|
||||
/*----------------------------------------
|
||||
Author : Table Create Insert Routine
|
||||
Written : 28/08/2025
|
||||
Description : Insert for Table ARCHIVE
|
||||
----------------------------------------*/
|
||||
#ifndef __ARCHIVE_EQUATES__
|
||||
#define __ARCHIVE_EQUATES__
|
||||
|
||||
equ ARCHIVE_ARCHIVE_DTM$ to 1
|
||||
equ ARCHIVE_COMPLETE$ to 2
|
||||
equ ARCHIVE_CHILD_RECORD$ to 3
|
||||
equ ARCHIVE_CHILD_TABLE$ to 4
|
||||
equ ARCHIVE_CHILD_RECORD_ARCHIVED$ to 5
|
||||
equ ARCHIVE_CHILD_RECORD_DELETED$ to 6
|
||||
equ ARCHIVE_CHILD_RECORD_ARCHIVE_DTM$ to 7
|
||||
equ ARCHIVE_CHILD_RECORD_DELETE_DTM$ to 8
|
||||
|
||||
#endif
|
||||
@ -1,17 +0,0 @@
|
||||
compile insert DIALOG_RESPONSE_LOG_EQUATES
|
||||
/*----------------------------------------
|
||||
Author : Table Create Insert Routine
|
||||
Written : 22/08/2025
|
||||
Description : Insert for Table DIALOG_RESPONSE_LOG
|
||||
----------------------------------------*/
|
||||
#ifndef __DIALOG_RESPONSE_LOG_EQUATES__
|
||||
#define __DIALOG_RESPONSE_LOG_EQUATES__
|
||||
|
||||
equ DIALOG_RESPONSE_LOG_RESPONSE_DTM$ to 1
|
||||
equ DIALOG_RESPONSE_LOG_ENTITY_ID$ to 2
|
||||
equ DIALOG_RESPONSE_LOG_ENTITY_TYPE$ to 3
|
||||
equ DIALOG_RESPONSE_LOG_USER_ID$ to 4
|
||||
equ DIALOG_RESPONSE_LOG_DIALOG_TYPE$ to 5
|
||||
equ DIALOG_RESPONSE_LOG_DATA$ to 6
|
||||
|
||||
#endif
|
||||
@ -14,8 +14,3 @@ Equ POST_LOG_REC_KEY3$ To 0
|
||||
Equ POST_LOG_FIELD_NO$ To 1
|
||||
Equ POST_LOG_FIELD_VALUE$ To 2
|
||||
Equ POST_LOG_FIELD_ADD_MV_BY$ To 3
|
||||
Equ POST_LOG_FAILED$ To 4
|
||||
Equ POST_LOG_FAILURE_REASON$ To 5
|
||||
Equ POST_LOG_FAILURE_NOTIFICATION_SENT$ To 6
|
||||
Equ POST_LOG_FAILURE_NOTIFICATION_DTM$ To 7
|
||||
|
||||
|
||||
@ -261,6 +261,3 @@ Equ RDS_WAFER_COUNTER_QTY$ To 308
|
||||
Equ RDS_WAFER_COUNTER_DTM$ To 309
|
||||
Equ RDS_POST_SUPERCEDE$ To 310
|
||||
Equ RDS_ALL_TW_USE_SIGNED$ To 311
|
||||
Equ RDS_LOAD_EXTRA_1_REACTOR$ To 312
|
||||
Equ RDS_LOAD_EXTRA_2_REACTOR$ To 313
|
||||
|
||||
|
||||
@ -96,5 +96,4 @@ Equ WO_LOG_RX_STAMPS$ To 83
|
||||
Equ WO_LOG_REL_STAMPS$ To 84
|
||||
Equ WO_LOG_CURR_STATUS_STATIC$ To 85
|
||||
Equ WO_LOG_SCRAP_QTY_STATIC$ To 86
|
||||
Equ WO_LOG_OPEN_QTY_STATIC$ To 87
|
||||
|
||||
|
||||
Reference in New Issue
Block a user