Compare commits

1 Commits

Author SHA1 Message Date
51da9ef7c2 http, hurl for api testing
txt for metrology proof

settings for vscode
2025-08-21 11:28:11 -07:00
100 changed files with 13400 additions and 35997 deletions

16
.vscode/.http vendored Normal file
View 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
View 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
View 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
View File

@ -0,0 +1,6 @@
{
"files.associations": {
"*.txt": "vb",
},
"cSpell.words": []
}

View File

@ -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"
}
}
}

View File

@ -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"
}
}
}

View File

@ -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

View File

@ -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>": {

View File

@ -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>": {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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>": ""
}
}
}

View File

@ -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"
}
}
}

View File

@ -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"
}
}
}

View File

@ -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"
}
}
}

View File

@ -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"
}
}
}

View File

@ -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"
}
}
}

View File

@ -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"
}
}
}

View File

@ -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"
}
}
}

View File

@ -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'
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$)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ActiveDirectoryAuthLog.csv'
Headers = 'Logging DTM' : @FM : 'Username' : @FM : 'Authenticated'
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

View File

@ -1,261 +1,85 @@
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 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/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ArchiveService.csv'
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Cutoff Date'
objLogArchiveService = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service ArchiveRecords()
Errors = ''
StatusMessage = 'Starting Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
//Archive Change Log Records
GoSub ChangeLogArchive
//Finish
Locate True$ in Errors using @FM setting ePos then
StatusMessage = 'Archive script complete. Errors detected. Check individual archive logs for more info.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end else
StatusMessage = 'Archive script complete. No errors detected.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end
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
end service
ChangeLogArchive:
StatusMessage = 'Starting Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
ChangeLogArchiveDate = SRP_Datetime('AddYears', Datetime(), -1)
Change_Log_Services('ArchiveChangeLogRecByDate', ChangeLogArchiveDate)
If Error_Services('NoError') then
StatusMessage = 'Starting Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end else
StatusMessage = 'Error in Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
Errors<-1> = True$
end
return
Compile function Archive_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$insert APP_INSERTS
EQU COMMA$ To ','
Declare subroutine Change_Log_Services, Logging_Services
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ArchiveService.csv'
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Cutoff Date'
objLogArchiveService = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
GoToService
Return Response or ""
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service ArchiveRecords()
Errors = ''
StatusMessage = 'Starting Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
//Archive Change Log Records
GoSub ChangeLogArchive
//Finish
Locate True$ in Errors using @FM setting ePos then
StatusMessage = 'Archive script complete. Errors detected. Check individual archive logs for more info.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end else
StatusMessage = 'Archive script complete. No errors detected.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end
End Service
Service DearchiveRecord(Table, ID)
end service
ChangeLogArchive:
StatusMessage = 'Starting Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
ChangeLogArchiveDate = SRP_Datetime('AddYears', Datetime(), -1)
Change_Log_Services('ArchiveChangeLogRecByDate', ChangeLogArchiveDate)
If Error_Services('NoError') then
StatusMessage = 'Starting Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
end else
StatusMessage = 'Error in Change_Log Archive Script.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = StatusMessage
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
Errors<-1> = True$
end
return

View File

@ -231,9 +231,15 @@ RETURN
* * * * * * *
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
@ -376,11 +382,11 @@ return
* * * * * * *
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)
@ -1762,8 +1768,22 @@ AddMakeup:
AvailMU_WMOKeys = ''
UserResp = Response
MakeupBox = ''
CheckValue = 1
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$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT
@ -1980,42 +2000,51 @@ MakeupClick:
End Case
If Not(InvalidRequest) then
Send_Event(CtrlEnt,'GOTFOCUS')
OrgMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
// Log the makeup flag change
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = WONo:'*':ProcStepNo:'*':CassNo
LogData<3> = CheckValue
LogData<4> = @User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
IF Get_Status(errCode) THEN ErrMsg(errCode)
* Added 10/11/2010 JCH
NewMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
IndexTransactionRow = 'MU_PART_NO':@FM:WMOKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
OPEN "!WM_OUT" TO BangTable THEN
LOCK BangTable, 0 THEN
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
PendingTrans := IndexTransactionRow
WRITE PendingTrans ON BangTable, 0 ELSE
ErrMsg('Unable to write index transaction to !WM_OUT. ':WMOutKey)
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
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = WONo:'*':ProcStepNo:'*':CassNo
LogData<3> = CheckValue
LogData<4> = @User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Send_Event(@WINDOW,'WRITE') ;************* 6/30/2010
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
IF Get_Status(errCode) THEN ErrMsg(errCode)
* Added 10/11/2010 JCH
NewMUPart = XLATE('WM_OUT',WMOKey,'MU_PART_NO','X')
IndexTransactionRow = 'MU_PART_NO':@FM:WMOKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
OPEN "!WM_OUT" TO BangTable THEN
LOCK BangTable, 0 THEN
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
PendingTrans := IndexTransactionRow
WRITE PendingTrans ON BangTable, 0 ELSE
ErrMsg('Unable to write index transaction to !WM_OUT. ':WMOutKey)
END
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Unlock !WM_OUT while adding index transaction. ':WMOutKey)
END ELSE
ErrMsg('Unable to Lock !WM_OUT to add index transaction. ':WMOutKey)
END
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Unlock !WM_OUT while adding index transaction. ':WMOutKey)
END ELSE
ErrMsg('Unable to Lock !WM_OUT to add index transaction. ':WMOutKey)
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
END
END ELSE
ErrMsg('Unable to Open !WM_OUT to add index transaction. ':WMOutKey)
END
* End of 10/11/2010 update
* End of 10/11/2010 update
end else
InvalidRequest = True$
end
end
end else
InvalidRequest = True$

View File

@ -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

View File

@ -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,23 +1066,37 @@ MakeUpLot:
End Case
If Not(InvalidRequest) then
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
If EpiCheck EQ False$ then
IF Get_Status(errCode) THEN
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
InvalidRequest = True$
END else
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'))
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
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
InvalidRequest = True$
END else
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
If (CheckValue EQ True$) then
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
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
InvalidRequest = True$
ErrMsg('WARNING: Error starting wafer counter check. RDS No is missing.')
end
end
end else
@ -1208,3 +1233,7 @@ LogRecord:
return

View File

@ -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

View File

@ -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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -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

View File

@ -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

View File

@ -111,6 +111,7 @@ API Lock.HEAD
API Lock.POST
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'

View File

@ -1618,4 +1618,3 @@ end service
// Internal GoSubs
//----------------------------------------------------------------------------------------------------------------------

View File

@ -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

View File

@ -1,410 +1,187 @@
Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
#pragma precomp SRP_PreCompiler
#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
$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
end
Return EventFlow or 1
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
RDSNo = CreateParam
If RowExists('RDS', RDSNo) then
Set_Property(@Window : '.EDL_RDS', 'TEXT', RDSNo)
GoSub Refresh
end else
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
Post_Event(@Window, 'CLOSE')
end
End Event
Event WINDOW.CLOSE(CancelFlag)
ResponseValue = Get_Property(@Window, '@responsevalue')
End_Dialog(@Window, ResponseValue)
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
Event PUB_CLEAR_UNLOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignUnloadExtra1', RDSNo, @User4)
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 1 unsigned!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_CLEAR_LOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignLoadExtra1', RDSNo, @User4)
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 1 unsigned!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_CLEAR_UNLOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignUnloadExtra2', RDSNo, @User4)
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 2 unsigned!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_CLEAR_LOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignLoadExtra2', RDSNo, @User4)
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 2 unsigned!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
//-----------------------------------------------------------------------------
// INTERNAL GO-SUBS
//-----------------------------------------------------------------------------
***************
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' )
UnloadExtra1Date = OConv(RDSRec<RDS_OP_OUT_EX1_DATE$>, 'D')
UnloadExtra1Time = Oconv(RDSRec<RDS_OP_OUT_EX1_TIME$>, 'MT')
//Load Extra 1
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
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' )
UnloadExtra2Date = Oconv(RDSRec<RDS_OP_OUT_EX2_DATE$>, 'D')
UnloadExtra2Time = Oconv(RDSRec<RDS_OP_OUT_EX2_TIME$>, 'MT')
//Load Extra 2
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
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)
Set_Property(@Window : '.EDL_UNLOAD_EX_1_DATE', 'TEXT', UnloadExtra1Date)
Set_Property(@Window : '.EDL_UNLOAD_EX_1_TIME', 'TEXT', UnloadExtra1Time)
Set_Property(@Window : '.EDL_LOAD_EX_1_USER', 'TEXT', LoadExtra1UserFirstLast)
Set_Property(@Window : '.EDL_LOAD_EX_1_DATE', 'TEXT', LoadExtra1Date)
Set_Property(@Window : '.EDL_LOAD_EX_1_TIME', 'TEXT', LoadExtra1Time)
Set_Property(@Window : '.EDL_UNLOAD_EX_2_USER', 'TEXT', UnloadExtra2UserFirstLast)
Set_Property(@Window : '.EDL_UNLOAD_EX_2_DATE', 'TEXT', UnloadExtra2Date)
Set_Property(@Window : '.EDL_UNLOAD_EX_2_TIME', 'TEXT', UnloadExtra2Time)
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')
end
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
Compile function NDW_LOAD_UNLOAD_EXTRA_EVENTS(CtrlEntId, Event, @PARAMS)
#pragma precomp SRP_PreCompiler
#window NDW_LOAD_UNLOAD_EXTRA
Declare subroutine End_Dialog, Post_Event, Database_Services, Error_Services, Msg
Declare subroutine Set_Property, Rds_Services
Declare function Database_Services, Error_Services
Declare function Get_Property
$Insert EVENT_SETUP
$Insert LOGICAL
$Insert RDS_EQUATES
GoToEvent Event for CtrlEntId else
// Event not implemented
end
Return EventFlow or 1
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
RDSNo = CreateParam
If RowExists('RDS', RDSNo) then
Set_Property(@Window : '.EDL_RDS', 'TEXT', RDSNo)
GoSub Refresh
end else
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
Post_Event(@Window, 'CLOSE')
end
End Event
Event WINDOW.CLOSE(CancelFlag)
ResponseValue = Get_Property(@Window, '@responsevalue')
End_Dialog(@Window, ResponseValue)
end event
//Signature buttons
Event PUB_SIGN_UNLOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('SignUnloadExtra1', RDSNo, @USER4)
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 1 Signed!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_SIGN_LOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('SignLoadExtra1', RDSNo, @USER4)
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 1 Signed!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_SIGN_UNLOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('SignUnloadExtra2', RDSNo, @USER4)
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 2 Signed!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_SIGN_LOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('SignLoadExtra2', RDSNo, @USER4)
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 2 Signed!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
//Clear Signature Buttons
Event PUB_CLEAR_UNLOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignUnloadExtra1', RDSNo, @User4)
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 1 unsigned!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_CLEAR_LOAD_EX_1.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignLoadExtra1', RDSNo, @User4)
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 1 unsigned!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_CLEAR_UNLOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignUnloadExtra2', RDSNo, @User4)
If Error_Services('NoError') then
Msg(@Window, 'Unload Extra 2 unsigned!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
Event PUB_CLEAR_LOAD_EX_2.CLICK()
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
Rds_Services('UnsignLoadExtra2', RDSNo, @User4)
If Error_Services('NoError') then
Msg(@Window, 'Load Extra 2 unsigned!')
end else
Msg(@Window, Error_Services('GetMessage'))
end
GoSub Refresh
end event
//-----------------------------------------------------------------------------
// INTERNAL GO-SUBS
//-----------------------------------------------------------------------------
***************
Refresh:
***************
RDSNo = Get_Property(@Window : '.EDL_RDS', 'TEXT')
If RowExists('RDS', RDSNo) then
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
//Unload Extra 1
UnloadExtra1Signature = RDSRec<RDS_OP_OUT_EX1$>
UnloadExtra1UserFirstLast = xlate( 'LSL_USERS', UnloadExtra1Signature, 'FIRST_LAST', 'X' )
UnloadExtra1Date = OConv(RDSRec<RDS_OP_OUT_EX1_DATE$>, 'D')
UnloadExtra1Time = Oconv(RDSRec<RDS_OP_OUT_EX1_TIME$>, 'MT')
//Load Extra 1
LoadExtra1Signature = RDSRec<RDS_OP_IN_EX2$>
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')
//Unload Extra 2
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
UnloadExtra2UserFirstLast = xlate( 'LSL_USERS', UnloadExtra2Signature, 'FIRST_LAST', 'X' )
UnloadExtra2Date = Oconv(RDSRec<RDS_OP_OUT_EX2_DATE$>, 'D')
UnloadExtra2Time = Oconv(RDSRec<RDS_OP_OUT_EX2_TIME$>, 'MT')
//Load Extra 2
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
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')
//Populate text fields
Set_Property(@Window : '.EDL_UNLOAD_EX_1_USER', 'TEXT', UnloadExtra1UserFirstLast)
Set_Property(@Window : '.EDL_UNLOAD_EX_1_DATE', 'TEXT', UnloadExtra1Date)
Set_Property(@Window : '.EDL_UNLOAD_EX_1_TIME', 'TEXT', UnloadExtra1Time)
Set_Property(@Window : '.EDL_LOAD_EX_1_USER', 'TEXT', LoadExtra1UserFirstLast)
Set_Property(@Window : '.EDL_LOAD_EX_1_DATE', 'TEXT', LoadExtra1Date)
Set_Property(@Window : '.EDL_LOAD_EX_1_TIME', 'TEXT', LoadExtra1Time)
Set_Property(@Window : '.EDL_UNLOAD_EX_2_USER', 'TEXT', UnloadExtra2UserFirstLast)
Set_Property(@Window : '.EDL_UNLOAD_EX_2_DATE', 'TEXT', UnloadExtra2Date)
Set_Property(@Window : '.EDL_UNLOAD_EX_2_TIME', 'TEXT', UnloadExtra2Time)
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)
end else
ResponseValue = Set_Property(@Window, '@responsevalue', 0)
Post_Event(@Window, 'CLOSE')
end
return

View File

@ -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

View File

@ -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
@ -127,7 +127,7 @@ Event PUB_GEN_REPORT.CLICK()
LocationEnabled = Flags<0, vPos>
If LocationEnabled then RptLocations<0, -1> = Location
Next Location
Report_Services('PrintMaterialTrackReport', RptColumns, RptLocations, NoMatFlag, OldReport)
end event

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -97,7 +97,17 @@ Event WINDOW.CREATE(CreateParam)
LogData<5> = ToolLoc
LogData<6> = @Window:'.CREATE'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
QAMetComplete = ''
If CassID NE '' then
If RowExists('WM_OUT', CassID) then
WOMatKey = Xlate('WM_OUT', CassID, 'WO_MAT_KEY', 'X')
end else
WOMatKey = Xlate('RDS', CassID, 'WO_MAT_KEY', 'X')
end
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
end
Convert '.' to '*' in CassID
ExpectedQty = ''
ExpectedWfrMap = ''
@ -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,32 +333,42 @@ Event EDL_CASS_BARCODE.LOSTFOCUS(Flag, FocusID)
Begin Case
Case RowExists('RDS', CassetteID)
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
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
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('RDS', CassetteID, 'WFRS_OUT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass RDS')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass RDS 2D')
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
CurrWfrMap = WO_Mat_Services('GetWaferMap', WOMatKey)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
ErrorMsg = 'Wafer Counter Operation Not Allowed. A Metrology stage is incomplete.'
end
Case RowExists('WM_OUT', CassetteID)
WOMatKey = Xlate('WM_OUT', CassetteID, 'WO_MAT_KEY', 'X')
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
QAMetComplete = Wo_Mat_Qa_Services('GetQAMetComplete', WOMatKey)
If QAMetComplete EQ True$ then
ExpectedQty = Xlate('WM_OUT', CassetteID, 'WAFER_CNT', 'X')
Set_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT', ExpectedQty)
Set_Property(@Window:'.LBL_CASS_ID', 'TEXT', 'Cass WMO')
Set_Property(@Window:'.LBL_CASS_BARCODE', 'TEXT', 'Cass WMO 2D')
CurrWfrMap = WM_Out_Services('GetWaferMap', CassetteID)
If Error_Services('NoError') then
ExpectedWfrMap = CurrWfrMap
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = Error_Services('GetMessage')
end
ErrorMsg = 'Wafer Counter Operation Not Allowed. QA Metrology Incomplete.'
end
End Case
If ErrorMsg EQ '' then
@ -401,7 +423,7 @@ end event
Event EDL_TOOL_BARCODE.LOSTFOCUS(Flag, FocusID)
If Flag EQ 1 then
ErrorMsg = ''
ScanData = Get_Property(CtrlEntID, 'TEXT')
@ -416,155 +438,110 @@ 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
Area = Field(ScanData, '|', 2)
Def = ""
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
Def<MTYPE$> = "U"
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
MsgUp = Msg(@window, Def) ;* display the processing message
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
Msg(@window, MsgUp) ;* take down the processing message
If Error_Services('NoError') then
objJSON = ''
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
SRP_JSON(objJSON, 'Release')
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
If Error_Services('NoError') then
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
RowIndex = 1
ResultArray = ''
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
For SlotIndex = 1 to 25
SlotFilled = SlotMap[SlotIndex, 1]
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
ResultArray<1, SlotIndex> = 26 - SlotIndex
If SlotFilled EQ ExpectedVal then
ResultArray<2, SlotIndex> = ''
end else
ResultArray<2, SlotIndex> = 'Error'
end
RowIndex += 1
Next SlotIndex
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
RowIndex = 1
For SlotIndex = 1 to 25
SlotFilled = SlotMap[SlotIndex, 1]
If SlotFilled then
CellColorArray = FilledColorArray
end else
CellColorArray = EmptyColorArray
end
Send_Message(@Window:'.EDT_WAFER_COUNTER', 'COLOR_BY_POS', 2, RowIndex, CellColorArray)
RowIndex += 1
Next SlotIndex
Begin Case
Case WaferCount NE ExpectedQty
ErrorMsg = 'Scanned wafer count "':WaferCount:'" does not match expected quantity "':ExpectedQty:'".'
Case SlotMap NE ExpectedWfrMap
ErrorMsg = 'Scanned wafer map does not match expected wafer map.'
Case Otherwise$
SuccessMessage = 'Wafer count verification complete!'
LogData = ''
LogData<1> = OConv(Datetime(), 'DT2/^H')
LogData<2> = @User4
LogData<3> = SuccessMessage
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
MsgStruct = ""
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
MsgStruct<MCOL$> = -300
MsgStruct<MROW$> = 500
MsgStruct<MTYPE$> = "T4"
Msg(@Window, MsgStruct, 'PROCESS_COMPLETE', '', SuccessMessage)
AltFlow = Get_Property(@Window, '@ALTERNATE')
If AltFlow then
GoSub ClearForm
end else
End_Dialog(@Window, True$)
end
End Case
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error parsing tool scan data.'
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg EQ '' then
Def = ""
Def<MTEXT$> = "Retreiving Wafer Counter Data..."
Def<MTYPE$> = "U"
CassID = Get_Property(@Window:'.EDL_CASS_BARCODE', 'TEXT')
MsgUp = Msg(@window, Def) ;* display the processing message
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
Msg(@window, MsgUp) ;* take down the processing message
If Error_Services('NoError') then
objJSON = ''
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
SRP_JSON(objJSON, 'Release')
Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, @User4, Area, SlotMap)
If Error_Services('NoError') then
Set_Property(@Window:'.EDL_SCAN_DTM', 'TEXT', ScanDtm)
Set_Property(@Window:'.EDL_TOOL_ID', 'TEXT', ToolID)
Set_Property(@Window:'.EDL_WAFER_COUNT', 'TEXT', WaferCount)
EmptyColorArray = RED$ : @FM : '' : @FM : '' : @FM : ''
FilledColorArray = GREEN$ : @FM : '' : @FM : '' : @FM : ''
RowIndex = 1
ResultArray = ''
ExpectedWfrMap = Get_Property(@Window, '@EXPECTED_WFR_MAP')
For SlotIndex = 1 to 25
SlotFilled = SlotMap[SlotIndex, 1]
ExpectedVal = ExpectedWfrMap[SlotIndex, 1]
ResultArray<1, SlotIndex> = 26 - SlotIndex
If SlotFilled EQ ExpectedVal then
ResultArray<2, SlotIndex> = ''
end else
ResultArray<2, SlotIndex> = 'Error'
end
RowIndex += 1
Next SlotIndex
ExpectedQty = Get_Property(@Window:'.EDL_EXPECTED_QTY', 'TEXT')
Set_Property(@Window:'.EDT_WAFER_COUNTER', 'ARRAY', ResultArray)
RowIndex = 1
For SlotIndex = 1 to 25
SlotFilled = SlotMap[SlotIndex, 1]
If SlotFilled then
CellColorArray = FilledColorArray
end else
CellColorArray = EmptyColorArray
end
Send_Message(@Window:'.EDT_WAFER_COUNTER', 'COLOR_BY_POS', 2, RowIndex, CellColorArray)
RowIndex += 1
Next SlotIndex
Begin Case
Case WaferCount NE ExpectedQty
ErrorMsg = 'Scanned wafer count "':WaferCount:'" does not match expected quantity "':ExpectedQty:'".'
Case SlotMap NE ExpectedWfrMap
ErrorMsg = 'Scanned wafer map does not match expected wafer map.'
Case Otherwise$
SuccessMessage = 'Wafer count verification complete!'
LogData = ''
LogData<1> = OConv(Datetime(), 'DT2/^H')
LogData<2> = @User4
LogData<3> = SuccessMessage
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
MsgStruct = ""
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
MsgStruct<MCOL$> = -300
MsgStruct<MROW$> = 500
MsgStruct<MTYPE$> = "T4"
Msg(@Window, MsgStruct, 'PROCESS_COMPLETE', '', SuccessMessage)
AltFlow = Get_Property(@Window, '@ALTERNATE')
If AltFlow then
GoSub ClearForm
end else
End_Dialog(@Window, True$)
end
End Case
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error parsing tool scan data.'
end
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

View File

@ -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

View File

@ -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

View File

@ -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,17 +147,9 @@ 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
END
IF Get_Status(errCode) THEN
END
END ;* End of LOCATE check for Install RI number already in the reactor
NEXT I

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,20 +3284,7 @@ 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
IF WMOStatus = 'COMP' THEN
WMOStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
END
@ -5736,5 +5714,3 @@ ExpCOA:
RETURN

View File

@ -117,24 +117,11 @@ API oiwizard.POST
ParseResponse = SRP_JSON(hWizardJSON, 'PARSE', WizardJSON)
If (ParseResponse EQ '') then
// 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')
UserID = SRP_JSON(hWizardJSON, 'GetValue', 'userID')
Password = SRP_JSON(hWizardJSON, 'GetValue', 'password')
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

View File

@ -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$>
lsData<I,10> = PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
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$>
lsData<I,10> = lsData<I,10>:CRLF$:PropRec<PRS_PROP_MET_RECIPE_PATTERN$>
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,10 +840,14 @@ Main:
end else
colData<StepNo,STEP_PRODUCT$> = CHAR(185):obj_Met_Prop('GetPropDesc',StageRec<PRS_STAGE_MET_PROP$,M>)
end
colData<StepNo,STEP_RECIPE$> = StageRec<PRS_STAGE_MET_RECIPE$,M>:CRLF$:StageRec<PRS_STAGE_MET_RECIPE_PATTERN$,M>
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>
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>
if processName EQ 'FQA' then
colData<StepNo,STEP_CTRL_METHOD$> = "WI"
colData<StepNo,STEP_REACT_PLAN$> = "EpiMSA WI-0485"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)
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$>
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
end service
@ -2386,106 +2288,54 @@ 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$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If LoadExtra1Signature NE '' then
If UnloadExtra2Signature EQ '' AND LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
end
end else
ErrorMsg = Error_Services('GetMessage')
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$>
If LoadExtra1Signature NE '' then
If UnloadExtra2Signature EQ '' AND LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
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')
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$>
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
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$>
UnloadExtra2Signature = RDSRec<RDS_OP_OUT_EX2$>
LoadExtra2Signature = RDSRec<RDS_OP_IN_EX3$>
StandardUnloadSignature = RDSRec<RDS_OPERATOR_OUT$>
If LoadExtra2Signature NE '' then
If StandardUnloadSignature EQ '' then
Response = True$
end
end
end else
ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
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$>
If LoadExtra2Signature NE '' then
If StandardUnloadSignature EQ '' then
Response = True$
end
end
end service
@ -2550,6 +2400,62 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
Response = False$
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' )
@ -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

View File

@ -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'
@ -768,10 +766,10 @@ WRITE_RECORD_PRE:
// Look for UNLOAD_DTM override
Override = Override_Services('GetOverride', 'RDS', RDSNo, 'UNLOAD_DTM')
Begin Case
Case ( (OrigTimeOutSig NE '') and (OrigReactor NE NewReactor) )
Case ( (OrigLoadSig NE '') and (OrigReactor NE NewReactor) )
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
@ -780,11 +778,28 @@ 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$
Case ( (VerDTM GT CurrDTM) or (LoadDTM GT CurrDTM) or (LoadEx2DTM GT CurrDTM) or (LoadEx3DTM GT CurrDTM) |
or (UnloadEx1DTM GT CurrDTM) or (UnloadEx2DTM GT CurrDTM) or (UnloadDTM GT CurrDTM) |
@ -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,16 +861,11 @@ WRITE_RECORD_PRE:
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
return
WRITE_RECORD:
StartTick = GetTickCount()
MetricName = 'WriteRecord'
@ -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

View File

@ -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

View File

@ -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
@ -168,7 +170,7 @@ end event
Event PUB_SIGN.CLICK()
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','TEXT')
LoadLockVal = Get_Property(@WINDOW:'.LOAD_LOCK_SIDE_HIDDEN','TEXT')
@ -181,354 +183,365 @@ 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
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
if Error_Services('NoError') then
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
// Don't allow tracking in on down reactor
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
Override = False$
UserVerification = ''
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
If (ReactorIsDown EQ True$) then
// Allow override during prove in
If ReactorType EQ 'EPP' then
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
end
If Override EQ False$ then
UserMsg = "Reactor down. Override required from a lead or supervisor."
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
end
end
If (ReactorIsDown NE True$) OR (Override EQ True$) then
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
If ROTRStatus EQ 'F' then
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
Message = 'Unable to load reactor.' : CRLF$ : FailReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
// Don't allow tracking in on down reactor
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
Override = False$
UserVerification = ''
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
If (ReactorIsDown EQ True$) then
// Allow override during prove in
If ReactorType EQ 'EPP' then
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
If Response EQ True$ then
If UserVerification EQ '' then
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
end
If Override EQ False$ then
UserMsg = "Reactor down. Override required from a lead or supervisor."
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
end
end
If (ReactorIsDown NE True$) OR (Override EQ True$) then
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
If ROTRStatus EQ 'F' then
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
Message = 'Unable to load reactor.' : CRLF$ : FailReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
If Response EQ True$ then
If UserVerification EQ '' then
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
end
Valid = UserVerification<1>
If Valid EQ True$ then
// Prompt user for a comment
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
IF ResponseComment<2> NE '' THEN
// Clear ROTR reactor load block.
overrideLogTable = 'RDS':@VM:'REACTOR'
overrideLogKey = RDSNo:@VM:Reactor
overrideLogUser = Response<2>
overrideLogComment = ResponseComment<2>
overrideLogCategory = 'ROTR_BLOCK'
overrideLogCause = FailReason
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
//Add override key to RDS
RDSRec = Xlate('RDS', RDSNo, '', 'X')
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
ReactorRec<REACTOR_ROTR_STATUS$> = 'P'
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
end else
//No Comment added. Block Load Signaure
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
return
end
end else
// ROTR override not verified. Block load signature.
return
end
end else
// Block load signature
return
end
end
end
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
IF (SupplAckReq NE FALSE$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
If Response EQ False$ then
return
end else
PreAuthenticated = TRUE$
end
end
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
If RDSLayerAckReq EQ True$ then
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
ErrMsg(ErrorMessage)
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
// Just display the first layer
RDSLSID = LayerKeys<0, 1>
Dialog_Box('RDS_LAYER', @Window, RDSLSID)
Valid = UserVerification<1>
If Valid EQ True$ then
// Prompt user for a comment
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
ErrMsg(ErrorMessage)
IF ResponseComment<2> NE '' THEN
// Clear ROTR reactor load block.
overrideLogTable = 'RDS':@VM:'REACTOR'
overrideLogKey = RDSNo:@VM:Reactor
overrideLogUser = Response<2>
overrideLogComment = ResponseComment<2>
overrideLogCategory = 'ROTR_BLOCK'
overrideLogCause = FailReason
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
//Add override key to RDS
RDSRec = Xlate('RDS', RDSNo, '', 'X')
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
ReactorRec<REACTOR_ROTR_STATUS$> = 'P'
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
end else
//No Comment added. Block Load Signaure
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
return
end
end
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
If (FWIInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
If Response EQ False$ then return
end
LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
If (LoadInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
If Response EQ False$ then return
end
SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
IF (SupplAckReq EQ True$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
If Response EQ False$ then return
end
//Check if TW Required
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ AND (ReactorType EQ 'HTR' OR ReactorType EQ 'ASM' OR ReactorType 'ASM+') then
UsingTestWafers = False$
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
If ExistingTestWafersLogged NE True$ then
If Not(IsTWReqd) then
//Test wafer logging is NOT required here.
If ReactorType NE 'EPP' then
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
If UsingTestWafers EQ True$ then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If Not(ContinueSign) then return
end
end
end
end else
//Test wafer logging is Required here.
Begin Case
Case ReactorType EQ 'ASM' OR ReactorType EQ 'HTR'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on this run':@FM:'Are any test wafers loaded?')
Case ReactorType EQ 'ASM+'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on the next run.':@FM:'Are any test wafers loaded?')
End Case
If UsingTestWafers EQ True$ then
//User has stated that they are using test wafers
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
//User exited the the TW log prompt answering that they are not using any test wafers.
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end else
//User has stated that they are NOT using test wafers
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end
end
end
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
If ReadyToSign EQ True$ then
If PreAuthenticated EQ FALSE$ then
initParams = ''
initParams<4> = 'Sign Load'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If (Valid EQ True$) then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
end else
// ROTR override not verified. Block load signature.
return
end
end else
ErrorMsg = Error_Services('GetMessage')
Msg(@Window, ErrorMsg)
// Block load signature
return
end
end
end
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
IF (SupplAckReq NE FALSE$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
If Response EQ False$ then
return
end else
PreAuthenticated = TRUE$
end
end
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
If RDSLayerAckReq EQ True$ then
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
ErrMsg(ErrorMessage)
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
// Just display the first layer
RDSLSID = LayerKeys<0, 1>
Dialog_Box('RDS_LAYER', @Window, RDSLSID)
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
ErrMsg(ErrorMessage)
return
end
end
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
If (FWIInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
If Response EQ False$ then return
end
LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
If (LoadInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
If Response EQ False$ then return
end
SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
IF (SupplAckReq EQ True$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
If Response EQ False$ then return
end
//Check if TW Required
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ AND (ReactorType EQ 'HTR' OR ReactorType EQ 'ASM' OR ReactorType 'ASM+') then
UsingTestWafers = False$
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
If ExistingTestWafersLogged NE True$ then
If Not(IsTWReqd) then
//Test wafer logging is NOT required here.
If ReactorType NE 'EPP' then
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
If UsingTestWafers EQ True$ then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If Not(ContinueSign) then return
end
end
end
end else
//Test wafer logging is Required here.
Begin Case
Case ReactorType EQ 'ASM' OR ReactorType EQ 'HTR'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on this run':@FM:'Are any test wafers loaded?')
Case ReactorType EQ 'ASM+'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on the next run.':@FM:'Are any test wafers loaded?')
End Case
If UsingTestWafers EQ True$ then
//User has stated that they are using test wafers
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
//User exited the the TW log prompt answering that they are not using any test wafers.
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end else
//User has stated that they are NOT using test wafers
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end
end
end
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
If ReadyToSign EQ True$ then
If PreAuthenticated EQ FALSE$ then
initParams = ''
initParams<4> = 'Sign Load'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If (Valid EQ True$) then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else
Msg(@Window, "RDS is not assigned to a reactor.")
end
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
end
end else
ErrorMsg = Error_Services('GetMessage')
Msg(@Window, ErrorMsg)
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
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)
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>
OverrideUser = Response<2>
If Valid then
Machine = Environment_Services('GetServer')
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = 'R':RDSNo:'.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
// 4. Remove WO_MAT Unload signature, date, and time
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
Locate '1LOAD' in SigProf using @VM setting vPos then
Sigs<1, vPos> = ''
SigDTMs<1, vPos> = ''
WOMatRec<WO_MAT_SIGNATURE$> = Sigs
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
end
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
Locate '1LOAD' in InvActions using @VM setting vPos then
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOCATION$> = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_ACTION$> = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_DTM$> = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_USER$> = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TAG$> = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TOOL_ID$> = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOC$> = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
end
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
// 6. Remove RDS Unload signature, date, and time
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
Set_Property(@Window:'.OP_IN', 'TEXT', '')
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Send_Event(@Window, 'WRITE')
IOOptions<6> = False$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
// Check if ROTR override was preformed when signing this load
If (PreviousRotrOverrideRds EQ RDSNo) then
// Reset the override flag
ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
end
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
If ReactorType EQ 'EPP' then
Reactor_Services('DecrementWfrMetrics', RDSNo)
end
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
end else
Return 0
end
end else
ErrorMessage = Error_Services('GetMessage')
Msg(@Window, ErrorMessage)
// 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
// 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>
OverrideUser = Response<2>
If Valid then
Machine = Environment_Services('GetServer')
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = 'R':RDSNo:'.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
// 4. Remove WO_MAT Unload signature, date, and time
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
Locate '1LOAD' in SigProf using @VM setting vPos then
Sigs<1, vPos> = ''
SigDTMs<1, vPos> = ''
WOMatRec<WO_MAT_SIGNATURE$> = Sigs
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
end
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
Locate '1LOAD' in InvActions using @VM setting vPos then
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOCATION$> = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_ACTION$> = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_DTM$> = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_USER$> = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TAG$> = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TOOL_ID$> = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOC$> = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
end
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
// 6. Remove RDS Unload signature, date, and time
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
Set_Property(@Window:'.OP_IN', 'TEXT', '')
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Send_Event(@Window, 'WRITE')
IOOptions<6> = False$
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$>
// Check if ROTR override was preformed when signing this load
If (PreviousRotrOverrideRds EQ RDSNo) then
// Reset the override flag
ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
end
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
If ReactorType EQ 'EPP' then
Reactor_Services('DecrementWfrMetrics', RDSNo)
end
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
end else
Return 0
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

View File

@ -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>
@ -93,16 +95,20 @@ 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')
@ -220,29 +156,23 @@ SignPreEpi:
Valid = Response<1>
If (Valid EQ True$) then
QA_Services('SignPreEpiStage', RDSNo, @USER4, WfrQty, Reactor)
end
end
end else
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

View File

@ -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

View File

@ -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,17 +220,13 @@ API ReactItems.ID.PUT
SRP_JSON(hJSON, 'Release')
KeyID = EndpointSegment
Record = React_Item_Services('ConvertJSONToRecord', JSON)
If KeyID NE '' and Record NE '' then
Database_Services('WriteDataRow', 'REACT_ITEM', KeyID, Record)
end
If Error_Services('NoError') then
If KeyID NE '' and Record NE '' then
React_Item_Services('UpdateReactItem', KeyID, Record)
end
If Error_Services('NoError') then
StatusCode = 200
Message = 'React Item Updated'
GoSub CreateHalItem
end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end
StatusCode = 200
Message = 'React Item Updated'
GoSub CreateHalItem
end else
HTTP_Services('SetResponseStatus', 400, Error_Services('GetMessage'))
end
@ -361,3 +356,4 @@ CreateHALCollection:
end
return

View File

@ -148,8 +148,9 @@ WRITE_RECORD:
end else
ModeUser = @User4
end
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
OrderTypeAlreadyActive = (CurrActiveHgCVOrders NE '')
CurrActiveHgCVOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', Name, 'IQS_HGCV_ALARM')
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

View File

@ -165,14 +165,10 @@ 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')
// 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
end
@ -965,4 +961,3 @@ ClearCursors:
return

View File

@ -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')
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

View File

@ -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
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
RetVal = Popup(@WINDOW,'','WAFER_SIZES')
IF RetVal NE '' THEN
oaParms = RetVal:@RM:@WINDOW:'.PKT_SIZE'
obj_Appwindow('LUValReturn',oaParms)
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

View File

@ -135,70 +135,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}
ErrMsg = ''
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
// Req'd parameter checks
ItemType = {RI_TYPE}
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
If ErrMsg NE '' then
Error_Services('Add', '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

View File

@ -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)
@ -373,7 +370,7 @@ Service GetReactItemTemplateJSON()
end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
end
Response = jsonRecord
end service
@ -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

View File

@ -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

View File

@ -243,3 +243,4 @@ API reports.GET
HTTP_Resource_Services('LoremIpsum')
end api

View File

@ -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]')
@ -1903,12 +1898,9 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
ErrorTitle = 'Error in service ':Service
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 = ''
@ -1929,13 +1921,13 @@ Service PrintMaterialTrackReport(RptColumns, LocationFilter, NoMatFlag, OldRepor
RETURN
END
Done = 0
CurrSchedDetKey = ''
Done = 0
@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
I.ATID = S.ATID
S.ReactNo = CurrSchedDetRec<SCHED_DET_NG.REACT_NO$>
I.ReactNo = S.ReactNo
S.WoNo = CurrSchedDetRec<SCHED_DET_NG.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')
I.WO_Qty = S.WO_Qty
S.WO_RX_Qty = Xlate('WO_LOG', S.WoNo, 'RX_QTY', 'X')
I.WO_RX_Qty = S.WO_RX_Qty
S.WO_UnRel_QTY = Xlate('WO_LOG', S.WoNo, '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.ATID = {@ID}
I.ATID = S.ATID
S.ReactNo = {REACT_NO}
I.ReactNo = S.ReactNo
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', {WO_NO}, WO_LOG_WO_QTY$, 'X')
I.WO_Qty = S.WO_Qty
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', {WO_NO}, 'UNREL_QTY', 'X')
I.WO_UnRel_QTY = S.WO_UnRel_QTY
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

View File

@ -1320,4 +1320,3 @@ Service MigrateLegacyRTFRecord(RTFRecordId)
end
end service

View File

@ -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

View File

@ -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)
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
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,77 +973,76 @@ 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$>
If (ScannedSuppLot NE '') then
If (ScannedSuppLot _EQC RDSSuppLot) then
IsTWLoggingReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
If IsTWLoggingReqd NE True$ OR TestWaferLotData NE '' then
WaferCountAckReq = Xlate('RDS', RDSNo, 'WAFER_COUNT_ACK_REQ', 'X')
If WaferCountAckReq EQ False$ then
PreStageReady = ''
LoadStageReady = ''
PreStageReady = QA_Services('PreEpiSignatureReady', RDSNo, Username, WaferQty, Reactor)
If PreStageReady EQ True$ then
LoadStageReady = QA_Services('LoadSignatureReady', RDSNo, Username, WaferQty, LLSide, True$, Reactor)
If (LoadStageReady NE True$) then
// Why is it not ready?
ErrMsg = Error_Services('GetMessage')
Begin Case
Case IndexC(ErrMsg, '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)
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$)
If ( (ROTRBlock NE 'P') AND (ROTREnabled EQ True$) ) then
// Clear the error to return a JSON payload and allow for OVERRIDE scan.
ScansRow<SCANS.OVERRIDE_REQD$> = True$
ScansRow<SCANS.OVERRIDE_REASON$> = ROTRBlockReason
ScansRow<SCANS.OVERRIDE_TYPE$> = 'ROTR'
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', "ROTR Load Block Enabled")
end else
ScansRow<SCANS.OVERRIDE_REQD$> = False$
ScansRow<SCANS.OVERRIDE_REASON$> = ''
ScansRow<SCANS.OVERRIDE_TYPE$> = ''
end
End Case
end
end else
// Supplier lot verification
ScannedSuppLot = ScansRow<SCANS.SUPPLIER_LOT$>
RDSSuppLot = RDSRec<RDS_LOT_NUM$>
If (ScannedSuppLot NE '') then
If (ScannedSuppLot _EQC RDSSuppLot) then
IsTWLoggingReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
If IsTWLoggingReqd NE True$ OR TestWaferLotData NE '' then
WaferCountAckReq = Xlate('RDS', RDSNo, 'WAFER_COUNT_ACK_REQ', 'X')
If WaferCountAckReq EQ False$ then
PreStageReady = ''
LoadStageReady = ''
PreStageReady = QA_Services('PreEpiSignatureReady', RDSNo, Username, WaferQty, Reactor)
If PreStageReady EQ True$ then
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)
End Case
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$)
If ( (ROTRBlock NE 'P') AND (ROTREnabled EQ True$) ) then
// Clear the error to return a JSON payload and allow for OVERRIDE scan.
ScansRow<SCANS.OVERRIDE_REQD$> = True$
ScansRow<SCANS.OVERRIDE_REASON$> = ROTRBlockReason
ScansRow<SCANS.OVERRIDE_TYPE$> = 'ROTR'
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', "ROTR Load Block Enabled")
end else
ScansRow<SCANS.OVERRIDE_REQD$> = False$
ScansRow<SCANS.OVERRIDE_REASON$> = ''
ScansRow<SCANS.OVERRIDE_TYPE$> = ''
end
End Case
end
end else
Scan_Services('AddNotAcceptableReason', 'The cassette wafer count must be verified against the scheduled wafer count to proceed.')
// Why is it not ready?
ErrorMsg = Error_Services('GetMessage')
Begin Case
Case IndexC(ErrorMsg, 'supplement', 1)
Error_Services('Clear')
Scan_Services('AddNotAcceptableReason', ErrorMsg)
End Case
end
end else
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
Scan_Services('AddNotAcceptableReason', 'The cassette wafer count must be verified against the scheduled wafer count to proceed.')
end
end else
ScansRow<SCANS.SUPPLIER_LOT$> = ''
ErrMsg = '(':CassetteID:') Supplier lot mismatch.'
Scan_Services('AddNotAcceptableReason', 'Test wafers are required to be logged with this run.')
end
end else
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
ScansRow<SCANS.SUPPLIER_LOT$> = ''
Error_Services('Add', '(':CassetteID:') Supplier lot mismatch.')
end
end else
ErrMsg = Error_Services('GetMessage')
Scan_Services('AddNotAcceptableReason', 'Supplier lot scan required in order to complete a tool scan.')
end
end else
ErrMsg = '(':CassetteID:') The first run must be completed using the OpenInsight user interface.'
Error_Services('Add', '(':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
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow, True$, False$, True$)
// 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)
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
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
Scan_Services('SetScansRow', ScanID, ScansRow)
// 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)
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
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

View File

@ -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 HotLotFlag
BackColor = 'LightCoral'
Case WOClosedFlag
BackColor = 'LightGray'
Case HotLotFlag
BackColor = 'LightCoral'
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'
@ -818,22 +818,20 @@ Service GetCurrentEvent(ReactNo)
ReadNext SchedDetKey else EOF = True$
Response = SchedDetKey
end else
ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode
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
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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -381,3 +381,5 @@ API wafercounter.ID.GET
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api

View File

@ -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

View File

@ -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

View File

@ -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
//-----------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------
@ -101,13 +76,15 @@ Return Response else ''
Service GetComments(WMINNo)
CommentArray = ''
WMInRow = Database_Services('ReadDataRow', 'WM_IN', WMInNo)
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
Comments = WMInRow<WM_IN_EPP_COMMENT_NOTE$>
CommentList = CommentDates :@FM: CommentUsers :@FM: Comments
CommentArray = SRP_Rotate_Array(CommentList)
Response = CommentArray
Response = CommentArray
End Service
@ -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

View File

@ -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

View File

@ -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

View File

@ -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'
@ -1236,10 +1155,8 @@ Service UpdateReceivedQty(WONo)
If WONo NE '' then
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
If Error_Services('NoError') then
RXQty = obj_WO_Log('RxQty', WONo:@RM:WORec)
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,124 +1331,83 @@ end service
Service ConvertRecordToJSON(WONo, Record, ItemURL)
ErrorMsg = ''
jsonRecord = ''
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
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$>
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
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(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', '')
@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', @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
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', '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
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
SRP_JSON(objChildCassettes, 'Release')
end
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
SRP_JSON(objWOLog, 'Release')
Next Cass
end else
SRP_JSON(objWOLog, 'SetValue', 'ChildCassettes', '')
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
ErrorMsg = 'Error in ':Service:' service. Unable to create JSON object'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
SRP_JSON(objWOLog, 'Set', 'ChildCassettes', objChildCassettes)
SRP_JSON(objChildCassettes, 'Release')
end
SRP_JSON(objJSON, 'Set', 'WO_Log', objWOLog)
SRP_JSON(objWOLog, '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
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
Error_Services('Add', 'Unable to create JSON representation 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. Null WONo passed into service.'
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' 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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -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 = ''
@ -128,7 +122,7 @@ CreateHALItem:
end
IF WOLogKey NE '' then
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
JSON = Work_Order_Services('ConvertRecordToJSON', WOLogKey, '', FullEndpointURL)
end else
IF ResponseCode NE 500 then
ResponseCode = 406
@ -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

View File

@ -616,25 +616,13 @@ 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)
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)
end
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 ( ( (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
If {MAKEUP_BOX} then

View File

@ -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

View File

@ -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$

View File

@ -420,58 +420,36 @@ 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
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$
For I = 1 to StageCount
If Stages<1, I> EQ 'QA' then QAStagePresent = True$
If Results<1,I> EQ '' then
QAMetComplete = False$
end
Until QAMetComplete 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$
end
end else
ErrorMsg = Error_Services('GetMessage')
end
Response = ''
QAMetRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey, '', True$, 0, False$)
Stages = QAMetRec<WO_MAT_QA_STAGE$>
Results = QAMetRec<WO_MAT_QA_RESULT$>
StageCount = Count(Stages, @VM)
For I = 1 to StageCount
If Results<1,I> EQ '' then
Response = False$
end
end else
ErrorMsg = Error_Services('GetMessage')
Until Response EQ False$
Next I
If Response = '' then
Response = Wo_Mat_Qa_Services('GetMUWaferQAComplete', WOMatKey)
end
end else
Response = True$
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

View File

@ -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
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
If ErrMsg NE '' then
If Error_Services('HasError') then
ErrMsg = Error_Services('GetMessage')
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = WOMatKey
@ -539,6 +488,11 @@ Service CassetteIsLastInWo(WoMatKey)
Error_Services('Add', ErrMsg)
end
Response = IsLastInWo
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -592,49 +546,34 @@ 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$
Bio5Down = False$
Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X')
Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X')
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X')
Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X')
If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$
If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$
If (Bio4Down) AND (Bio5Down) then BioRadDown = True$
If EpiCheck EQ False$ then
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
PropRow = WOMatQARec<3>
If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
CurrentStage = Rds_Services('GetCurrentStage', RDSNo)
If CurrentStage EQ 'COMP' then
Signature_Services('UnsignFQAStage', RDSNo)
end
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
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
BioRadDown = False$
Bio4Down = False$
Bio5Down = False$
Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X')
Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X')
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X')
Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X')
If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$
If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$
If (Bio4Down) AND (Bio5Down) then BioRadDown = True$
If EpiCheck EQ False$ then
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
PropRow = WOMatQARec<3>
If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
CurrentStage = Rds_Services('GetCurrentStage', RDSNo)
If CurrentStage EQ 'COMP' then
Signature_Services('UnsignFQAStage', RDSNo)
end
Rds_Services('ApplyQA100PercentADE', RDSNo)
end
end
end service
@ -757,3 +696,4 @@ Service VerifyWOLogWOMatKeyColumn(WOMatKey)
end service

View File

@ -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')

View File

@ -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

View File

@ -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

View File

@ -11,11 +11,6 @@ Equ POST_LOG_REC_KEY1$ To 0
Equ POST_LOG_REC_KEY2$ To 0
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
Equ POST_LOG_FIELD_NO$ To 1
Equ POST_LOG_FIELD_VALUE$ To 2
Equ POST_LOG_FIELD_ADD_MV_BY$ To 3

View File

@ -260,7 +260,4 @@ Equ RDS_COMMENT_NOTE$ To 307
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
Equ RDS_ALL_TW_USE_SIGNED$ To 311

View File

@ -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