diff --git a/LSL2/STPROC/AUTOMATED_WORKFLOW_SERVICES.txt b/LSL2/STPROC/AUTOMATED_WORKFLOW_SERVICES.txt index 7e2fcae..c91b348 100644 --- a/LSL2/STPROC/AUTOMATED_WORKFLOW_SERVICES.txt +++ b/LSL2/STPROC/AUTOMATED_WORKFLOW_SERVICES.txt @@ -1,415 +1,420 @@ -Compile function Automated_Workflow_Services(@Service, @Params) - -/* -Initial Author: Jonathan Ouellette -This service module has a catalogued list of functions to quickly and easily perform certain functions related to lot -processing. - -1. CreateAWO - Imitates the process of getting data from SAP and processing the WO start in OI. -2. RouteWO - Imitates routing of a WO, AKA selecting a ProdVer and Assigning the WO to a reactor Type -3. PrescribeWafers - Imitates creating the child lots for a WO, AKA creating WO_MAT records -4. ReleaseCassettes - Assigns raw substrates to the WO_MAT records. RDS for non-epipro is created at this point. -5. PerformPTI - Imitates Receiving operator moving the lot into the fab. -6. Perform1VER - Performs the 1VER operation for an RDS. -7. PerformLoad - Performs the load operation for an RDS. -8. PerformUnload - Performs the unload operation for a non-epipro RDS. -9. EnterRecipeParms - Used in conjunction with PerformLoad. Used to enter the parameters for the Reactor Recipe upon load -typically this is the first load of a Work Order. -10. VerifyRecipeParms - Used in conjunction with PerformLoad. Used to verify the current recipe setpoints for an RDS load. - - -*/ -#pragma precomp SRP_PreCompiler -Declare function Gan_Services, Obj_Notes_Sent, msg, Check_Notes, Jonathan_Services, Database_Services, SRP_Datetime -Declare function Lsl_Users_Services, SRP_Time, RList, Error_Services, Obj_Wo_Mat, Pm_Services, Date_Services, Test_Run_Services -Declare function Reactor_Services, Reactor_Log_Services, obj_react_item, Utility, Environment_Services, obj_wo_log, Qa_Services -Declare subroutine Start_Window, RList, Set_Status, Database_Services, Obj_Sap, Sap_Services, Btree.Extract, Qa_Services -Declare subroutine Reactor_Services, Obj_Wo_Log, obj_wo_mat, Work_Order_Services, Material_Movement_Services, Automated_Workflow_Services -Declare subroutine Override_Services, Obj_Wo_Mat_Log, obj_post_log, Obj_Sap - -$insert LOGICAL -$insert NOTE_PTRS_EQU -$insert MSG_EQUATES -$Insert APP_INSERTS -$Insert RLIST_EQUATES -$Insert WO_LOG_EQUATES -$Insert RDS_EQUATES -$Insert WO_STEP_EQUATES -$Insert WO_MAT_QA_EQUATES -$Insert REACT_RUN_EQUATES -$Insert RDS_LAYER_EQUATES -$Insert RDS_TEST_EQUATES -$Insert PM_EQUATES -$Insert PM_SPEC_EQUATES -$Insert WO_MAT_EQUATES -$Insert WM_OUT_EQUATES -$Insert TEST_RUN_EQUATES -$Insert TEST_RUN_WAFER_EQUATES -$Insert TEST_WAFER_PROD_EQUATES -$Insert TEST_RUN_TYPE_EQUATES -$Insert EPI_PART_EQUATES -$Insert POPUP_EQUATES -$Insert REACTOR_EQUATES - -GoToService - -Return Response or "" - -//----------------------------------------------------------------------------- -// SERVICES -//----------------------------------------------------------------------------- - -Service CreatAWO() - - //Step 1: Start a WO WOLogFileIn variable emulates what an SAP file would have - /* - ProdOrdNo = FileIn<1,1> - CustPONo = FileIn<1,2> - PromiseShipDt = FileIn<1,3> - EpiPartNo = FileIn<1,4> - SubPartNo = FileIn<1,5> - SubRevNo = FileIn<1,6> - WOQty = FileIn<1,7> - VendCd = FileIn<1,8> - */ - WOLogFileIn = 'M124567.1':@VM:'NA':@VM:'02/29/2024':@VM:'400149S':@VM:'827906':@VM:'1.0':@VM:'150':@VM:'NA' - RetVal = obj_WO_LOG('SAPCreate',WOLogFileIn) - Response = RetVal -end service - -Service RouteWO(WO_No) - //Step 2: Route a WO with a Product Version - - WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WO_No) - EpiPartNo = WOLogRec - If EpiPartNo NE '' then - AllProdVerNos = XLATE('EPI_PART',EpiPartNo,EPI_PART_PROD_VER_NO$,'X') - TypeOver = '' - TypeOver = AllProdVerNos - TypeOver = 1 - TypeOver = 'K' - SelectedProdVerNo = Popup(@WINDOW,TypeOver,'PROD_VER') - If SelectedProdVerNo NE '' then - obj_WO_Log('Route',WO_No:@RM:SelectedProdVerNo) - end - end -end service - -Service PrescribeWafers(WONo, AmountToRX) - //Step 3: prescribe wafers. This is the same as assigning lot numbers to individual lots of raw material. AKA creating WO_MAT records - /* - a. User clicks the PUB_RX button on the WO_LOG form. - b. Opens WO Receipt form - c. Users clicks on WO's Due in - d. User selects or enters a WO. - e. User clicks scan codes, opens - */ -debug - ProdVerNo = XLATE('WO_LOG', WONo, 'PROD_VER_NO', 'X') - ReactType = XLATE('WO_LOG', WONo, 'REACT_TYPE', 'X') - CassLotNo = '123456789' - CustPartNo = XLATE('WO_LOG', WONo, 'CUST_PART_NO', 'X') - CassQty = 25 - NumCassToRX = AmountToRX / 25 - ExistingWOMatList = XLATE('WO_LOG', WONo, 'WO_MAT_KEY', 'X') - LastCassNo = 0 - for each cass in ExistingWOMatList using @VM setting iPos - thisCassNo = FIELD(cass, '*', 2) - if thisCassNo GT LastCassNo then LastCassNo = thisCassNo - Next cass - for i = 1 to NumCassToRX - NextCassNo = LastCassNo + 1 - LastCassNo = nextCassNo - Parms = WONo:@RM - Parms := NextCassNo:@RM - Parms := ProdVerNo:@RM - Parms := CassLotNo:@RM - Parms := CassQty:@RM - Parms := CustPartNo:@RM ;* This is the CUSTOMER part No - Parms := 1:@RM - Parms := ReactType:@RM ;* 3 character Reactor Type Code - Parms := '':@RM - Parms := 'SR':@RM ;* Warehouse = 'SR' - Shipping/Receiving Area - Parms := 'RB':@RM ;* Location = 'RB' - Receiving Bench - Parms := OCONV(SRP_Datetime('Now'), 'DT/4'):@RM - Parms := 'JONATHAN_O':@RM - Parms := '':@RM - Parms := '':@RM - Parms := '':@RM ;* Added 8/18/2009 JCH - Parms := '':@RM ;* Added 12/16/2009 JCH - Parms := 25:@RM ;* Added 11/4/2009 JCH - Parms := 0:@RM ;* Added 05/14/2010 JCH - Parms := '':@RM ;* Added 07/14/2011 for SAP Project JCH - Parms := 25 ; // Added 02/01/2018 dmb - obj_WO_Mat('Create',Parms) - If Error_Services('NoError') then - WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo) - WOLogRec = WONo : '*' : LastCassNo - Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, 1, 0, 1) - end - Next i - Work_Order_Services('UpdateReceivedQty', WONo) - - -end service - -Service ReleaseCassettes(WONo) - - //Step 4: User clicks release cassettes(PUB_RELEASE) from WO_LOG form - Work_Order_Services('ReleaseCassettes', WONo) - //Can get RDS number at this point -end service - -Service PerformPTI(CassID) - //Step 5: User performs a PTI scan to tag lot into the fab. - Warehouse = '1K' - Location = 'PTI' - Material_Movement_Services('SaveRecord', CassID, Warehouse, Location, @USER4) -end service - -* Service BatchProcessLotList() -* RDSList = '' -* -* RDSList<1> = 627134 -* RDSList<2> = 627135 -* RDSList<3> = 627136 -* RDSList<4> = 627132 -* RDSList<5> = 627133 -* -* for each rds in RDSList using @FM -* //Automated_Workflow_Services('Perform1VER', rds, 63, 25) -* Automated_Workflow_Services('PerformUnload', rds) -* Next rds -* end service - -Service Perform1VER(CassID, ReactorID, WfrQty) - - //Step 6 - If RowExists('RDS', CassID) AND ReactorID NE '' then - ReadyToSign = QA_Services('PreEpiSignatureReady', CassID, @User4, WfrQty, ReactorID) - If (ReadyToSign EQ True$) then - QA_Services('SignPreEpiStage', CassID, @USER4, WfrQty, ReactorID) - end - end - -end service - -Service PerformLoad(CassID, WfrInQty, LorRLL) - - //Step 7 - If RowExists('RDS', CassID) then - ReadyToSign = Qa_Services('LoadSignatureReady', CassID, @User4, WfrInQty, LorRLL, 0) - If ReadyToSign then - Qa_Services('SignLoadStage', CassID, @User4, WfrInQty, LorRLL, 0) - end else - ErrorReason = Error_Services('GetMessage') - Begin Case - Case ErrorReason EQ 'Process Error: Recipe parameters have not been entered.' - //Get the expected parameters and enter them. This is in the RDS_Layer Record - //First lets get limits from the RDS Layer Record(s) - RDSLayerKeys = XLATE('RDS', CassID, RDS_RDS_LAYER_KEYS$, 'X') - for each RDSLayerKey in RDSLayerKeys using @VM setting rlPos - Automated_Workflow_Services('EnterRecipeParams', RDSLayerKey) - If Error_Services('NoError') then - Automated_Workflow_Services('PerformLoad', CassID, WfrInQty, LorRLL) - end else - //Die - Return - end - Next RDSLayerKey - Case ErrorReason EQ 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.' - Automated_Workflow_Services('VerifyRecipeParams', CassID) - If Error_Services('NoError') then - Automated_Workflow_Services('PerformLoad', CassID, WfrInQty, LorRLL) - end else - //Die - Return - end - End Case - end - end -end service - -Service PerformUnload(RDSNo) - //Step 8 - - If RDSNo NE '' then - Reactor = XLATE('RDS', RDSNo, 'REACTOR', 'X') - If Reactor NE '' then - ReadyToSign = QA_Services('UnloadSignatureReady', RDSNo, @User4, Reactor) - If Error_Services('HasError') then - If ErrorMsg EQ 'Cassette runtime exceeds three days! An override by a LEAD or SUPERVISOR is required.' then - Override_Services('SetOverride', 'RDS', RDSNo, 'UNLOAD_DTM', @USER4) - ReadyToSign = True$ - end - end - If ReadyToSign then - QA_Services('SignUnloadStage', RDSNo, @User4) - end - end else - Error_Services('Add', 'No Reactor assigned to RDS!') - end - end else - Error_Services('Add', 'No RDS No. Supplied!') - end -end service - -Service PerformFQA(RDSNo) - - ToolID = '' - WHCd = 'CR' - LocCD = 'QA' - Tag = '' - SigDt = Date() - SigTm = Time() - WONo = XLATE('RDS', RDSNo, RDS_WO$, 'X') - CassNo = XLATE('RDS', RDSNo, RDS_CASS_NO$, 'X') - -Equ COL$LOG_FILE to 1 -Equ COL$LOG_DTM to 2 -Equ COL$ACTION to 3 -Equ COL$WH_CD to 4 -Equ COL$LOC_CD to 5 -Equ COL$WO_NOS to 6 -Equ COL$CASS_NOS to 7 -Equ COL$USER_ID to 8 -Equ COL$TAGS to 9 -Equ COL$TOOL_ID to 10 -EventParms = '' - EventParms = 'WO_MAT' - EventParms = SigDt:' ':SigTm - EventParms = 1:'QA' - EventParms = 'CR' - EventParms = 'QA' - EventParms = WONo - EventParms = CassNo - EventParms = @USER4 - EventParms = '' - EventParms = '' - - CONVERT @FM TO @RM IN EventParms - - obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * * - Obj_Post_Log('POST') - - Qa_Services('SignFQAStage', RDSNo, @USER4) -end service - - -Service EnterRecipeParams(RDSLayerKey) - - RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey) - If RDSLayerRec NE '' then - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //Epi Deposit Time - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //Diluent - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //Dopant Flow - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //HCL Flow - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //Bake Time - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //H2 Flow - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //TCS Flow - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //DCS Flow - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //AUX 1 - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //AUX2 - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //F_OFFSET - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //S_OFFSET - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //R OFFSET - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //ETCH 1 - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //ETCH 2 - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //ETCH 3 - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //UL_TEMP - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - - If RDSLayerRec NE '' AND RDSLayerRec NE '' then - //Susceptor Etch - RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec - end - Database_Services('WriteDataRow', 'RDS_LAYER', RDSLayerKey, RDSLayerRec, True$, False$, True$) - end - -end service - -Service VerifyRecipeParams(RDSNo) - //Used to verify exisiting recipe params. This is if they are already set. - IF RDSNo NE '' then - RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) - RDSRec = True$ - Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) - end else - Error_Services('Add', 'RDS No was blank!!!') - end -end service - -Service SendCassComp(WoMatKey) - Sap_Services('RetransmitCassComp', WoMatKey) - obj_sap('SendOutbound') -end service - - - - +Compile function Automated_Workflow_Services(@Service, @Params) + +/* +Initial Author: Jonathan Ouellette +This service module has a catalogued list of functions to quickly and easily perform certain functions related to lot +processing. + +1. CreateAWO - Imitates the process of getting data from SAP and processing the WO start in OI. +2. RouteWO - Imitates routing of a WO, AKA selecting a ProdVer and Assigning the WO to a reactor Type +3. PrescribeWafers - Imitates creating the child lots for a WO, AKA creating WO_MAT records +4. ReleaseCassettes - Assigns raw substrates to the WO_MAT records. RDS for non-epipro is created at this point. +5. PerformPTI - Imitates Receiving operator moving the lot into the fab. +6. Perform1VER - Performs the 1VER operation for an RDS. +7. PerformLoad - Performs the load operation for an RDS. +8. PerformUnload - Performs the unload operation for a non-epipro RDS. +9. EnterRecipeParms - Used in conjunction with PerformLoad. Used to enter the parameters for the Reactor Recipe upon load +typically this is the first load of a Work Order. +10. VerifyRecipeParms - Used in conjunction with PerformLoad. Used to verify the current recipe setpoints for an RDS load. + + +*/ +#pragma precomp SRP_PreCompiler +Declare function Gan_Services, Obj_Notes_Sent, msg, Check_Notes, Jonathan_Services, Database_Services, SRP_Datetime +Declare function Lsl_Users_Services, SRP_Time, RList, Error_Services, Obj_Wo_Mat, Pm_Services, Date_Services, Test_Run_Services +Declare function Reactor_Services, Reactor_Log_Services, obj_react_item, Utility, Environment_Services, obj_wo_log, Qa_Services +Declare subroutine Start_Window, RList, Set_Status, Database_Services, Obj_Sap, Sap_Services, Btree.Extract, Qa_Services +Declare subroutine Reactor_Services, Obj_Wo_Log, obj_wo_mat, Work_Order_Services, Material_Movement_Services, Automated_Workflow_Services +Declare subroutine Override_Services, Obj_Wo_Mat_Log, obj_post_log, Obj_Sap + +$insert LOGICAL +$insert NOTE_PTRS_EQU +$insert MSG_EQUATES +$Insert APP_INSERTS +$Insert RLIST_EQUATES +$Insert WO_LOG_EQUATES +$Insert RDS_EQUATES +$Insert WO_STEP_EQUATES +$Insert WO_MAT_QA_EQUATES +$Insert REACT_RUN_EQUATES +$Insert RDS_LAYER_EQUATES +$Insert RDS_TEST_EQUATES +$Insert PM_EQUATES +$Insert PM_SPEC_EQUATES +$Insert WO_MAT_EQUATES +$Insert WM_OUT_EQUATES +$Insert TEST_RUN_EQUATES +$Insert TEST_RUN_WAFER_EQUATES +$Insert TEST_WAFER_PROD_EQUATES +$Insert TEST_RUN_TYPE_EQUATES +$Insert EPI_PART_EQUATES +$Insert POPUP_EQUATES +$Insert REACTOR_EQUATES + +GoToService + +Return Response or "" + +//----------------------------------------------------------------------------- +// SERVICES +//----------------------------------------------------------------------------- + +Service CreatAWO() + + //Step 1: Start a WO WOLogFileIn variable emulates what an SAP file would have + /* + ProdOrdNo = FileIn<1,1> + CustPONo = FileIn<1,2> + PromiseShipDt = FileIn<1,3> + EpiPartNo = FileIn<1,4> + SubPartNo = FileIn<1,5> + SubRevNo = FileIn<1,6> + WOQty = FileIn<1,7> + VendCd = FileIn<1,8> + */ + debug + WOLogFileIn = 'M999930.1':@VM:'NA':@VM:'02/29/2024':@VM:'U053':@VM:'931968':@VM:'1.0':@VM:'2400':@VM:'NA' + RetVal = obj_WO_LOG('SAPCreate',WOLogFileIn) + Response = RetVal +end service + +Service RouteWO(WO_No) + //Step 2: Route a WO with a Product Version + + WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WO_No) + EpiPartNo = WOLogRec + If EpiPartNo NE '' then + AllProdVerNos = XLATE('EPI_PART',EpiPartNo,EPI_PART_PROD_VER_NO$,'X') + TypeOver = '' + TypeOver = AllProdVerNos + TypeOver = 1 + TypeOver = 'K' + SelectedProdVerNo = Popup(@WINDOW,TypeOver,'PROD_VER') + If SelectedProdVerNo NE '' then + obj_WO_Log('Route',WO_No:@RM:SelectedProdVerNo) + end + end +end service + +Service PrescribeWafers(WONo, AmountToRX) + //Step 3: prescribe wafers. This is the same as assigning lot numbers to individual lots of raw material. AKA creating WO_MAT records + /* + a. User clicks the PUB_RX button on the WO_LOG form. + b. Opens WO Receipt form + c. Users clicks on WO's Due in + d. User selects or enters a WO. + e. User clicks scan codes, opens + */ +debug + ProdVerNo = XLATE('WO_LOG', WONo, 'PROD_VER_NO', 'X') + ReactType = XLATE('WO_LOG', WONo, 'REACT_TYPE', 'X') + CassLotNo = '123456789' + CustPartNo = XLATE('WO_LOG', WONo, 'CUST_PART_NO', 'X') + CassQty = 25 + NumCassToRX = AmountToRX / 25 + ExistingWOMatList = XLATE('WO_LOG', WONo, 'WO_MAT_KEY', 'X') + LastCassNo = 0 + for each cass in ExistingWOMatList using @VM setting iPos + thisCassNo = FIELD(cass, '*', 2) + if thisCassNo GT LastCassNo then LastCassNo = thisCassNo + Next cass + for i = 1 to NumCassToRX + NextCassNo = LastCassNo + 1 + LastCassNo = nextCassNo + Parms = WONo:@RM + Parms := NextCassNo:@RM + Parms := ProdVerNo:@RM + Parms := CassLotNo:@RM + Parms := CassQty:@RM + Parms := CustPartNo:@RM ;* This is the CUSTOMER part No + Parms := 1:@RM + Parms := ReactType:@RM ;* 3 character Reactor Type Code + Parms := '':@RM + Parms := 'SR':@RM ;* Warehouse = 'SR' - Shipping/Receiving Area + Parms := 'RB':@RM ;* Location = 'RB' - Receiving Bench + Parms := OCONV(SRP_Datetime('Now'), 'DT/4'):@RM + Parms := 'JONATHAN_O':@RM + Parms := '':@RM + Parms := '':@RM + Parms := '':@RM ;* Added 8/18/2009 JCH + Parms := '':@RM ;* Added 12/16/2009 JCH + Parms := 25:@RM ;* Added 11/4/2009 JCH + Parms := 0:@RM ;* Added 05/14/2010 JCH + Parms := '':@RM ;* Added 07/14/2011 for SAP Project JCH + Parms := 25 ; // Added 02/01/2018 dmb + obj_WO_Mat('Create',Parms) + If Error_Services('NoError') then + WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo) + WOLogRec = WONo : '*' : LastCassNo + Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, 1, 0, 1) + end + Next i + Work_Order_Services('UpdateReceivedQty', WONo) + + +end service + +Service ReleaseCassettes(WONo) + + //Step 4: User clicks release cassettes(PUB_RELEASE) from WO_LOG form + Work_Order_Services('ReleaseCassettes', WONo) + //Can get RDS number at this point +end service + +Service PerformPTI(CassID) + debug + //Step 5: User performs a PTI scan to tag lot into the fab. + Warehouse = '1K' + Location = 'PTI' + Material_Movement_Services('SaveRecord', CassID, Warehouse, Location, @USER4) +end service + +* Service BatchProcessLotList() +* RDSList = '' +* +* RDSList<1> = 627134 +* RDSList<2> = 627135 +* RDSList<3> = 627136 +* RDSList<4> = 627132 +* RDSList<5> = 627133 +* +* for each rds in RDSList using @FM +* //Automated_Workflow_Services('Perform1VER', rds, 63, 25) +* Automated_Workflow_Services('PerformUnload', rds) +* Next rds +* end service + +Service Perform1VER(CassID, ReactorID, WfrQty) + + //Step 6 + If RowExists('RDS', CassID) AND ReactorID NE '' then + ReadyToSign = QA_Services('PreEpiSignatureReady', CassID, @User4, WfrQty, ReactorID) + If (ReadyToSign EQ True$) then + QA_Services('SignPreEpiStage', CassID, @USER4, WfrQty, ReactorID) + end + end + +end service + +Service PerformLoad(CassID, WfrInQty, LorRLL) + + //Step 7 + If RowExists('RDS', CassID) then + ReadyToSign = Qa_Services('LoadSignatureReady', CassID, @User4, WfrInQty, LorRLL, 0) + If ReadyToSign then + Qa_Services('SignLoadStage', CassID, @User4, WfrInQty, LorRLL, 0) + end else + ErrorReason = Error_Services('GetMessage') + Begin Case + Case ErrorReason EQ 'Process Error: Recipe parameters have not been entered.' + //Get the expected parameters and enter them. This is in the RDS_Layer Record + //First lets get limits from the RDS Layer Record(s) + RDSLayerKeys = XLATE('RDS', CassID, RDS_RDS_LAYER_KEYS$, 'X') + for each RDSLayerKey in RDSLayerKeys using @VM setting rlPos + Automated_Workflow_Services('EnterRecipeParams', RDSLayerKey) + If Error_Services('NoError') then + Automated_Workflow_Services('PerformLoad', CassID, WfrInQty, LorRLL) + end else + //Die + Return + end + Next RDSLayerKey + Case ErrorReason EQ 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.' + Automated_Workflow_Services('VerifyRecipeParams', CassID) + If Error_Services('NoError') then + Automated_Workflow_Services('PerformLoad', CassID, WfrInQty, LorRLL) + end else + //Die + Return + end + End Case + end + end +end service + +Service PerformUnload(RDSNo) + //Step 8 + + If RDSNo NE '' then + Reactor = XLATE('RDS', RDSNo, 'REACTOR', 'X') + If Reactor NE '' then + ReadyToSign = QA_Services('UnloadSignatureReady', RDSNo, @User4, Reactor) + If Error_Services('HasError') then + If ErrorMsg EQ 'Cassette runtime exceeds three days! An override by a LEAD or SUPERVISOR is required.' then + Override_Services('SetOverride', 'RDS', RDSNo, 'UNLOAD_DTM', @USER4) + ReadyToSign = True$ + end + end + If ReadyToSign then + QA_Services('SignUnloadStage', RDSNo, @User4) + end + end else + Error_Services('Add', 'No Reactor assigned to RDS!') + end + end else + Error_Services('Add', 'No RDS No. Supplied!') + end +end service + +Service PerformFQA(RDSNo) + + ToolID = '' + WHCd = 'CR' + LocCD = 'QA' + Tag = '' + SigDt = Date() + SigTm = Time() + WONo = XLATE('RDS', RDSNo, RDS_WO$, 'X') + CassNo = XLATE('RDS', RDSNo, RDS_CASS_NO$, 'X') + +Equ COL$LOG_FILE to 1 +Equ COL$LOG_DTM to 2 +Equ COL$ACTION to 3 +Equ COL$WH_CD to 4 +Equ COL$LOC_CD to 5 +Equ COL$WO_NOS to 6 +Equ COL$CASS_NOS to 7 +Equ COL$USER_ID to 8 +Equ COL$TAGS to 9 +Equ COL$TOOL_ID to 10 +EventParms = '' + EventParms = 'WO_MAT' + EventParms = SigDt:' ':SigTm + EventParms = 1:'QA' + EventParms = 'CR' + EventParms = 'QA' + EventParms = WONo + EventParms = CassNo + EventParms = @USER4 + EventParms = '' + EventParms = '' + + CONVERT @FM TO @RM IN EventParms + + obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * * + Obj_Post_Log('POST') + + Qa_Services('SignFQAStage', RDSNo, @USER4) +end service + + +Service EnterRecipeParams(RDSLayerKey) + + RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey) + If RDSLayerRec NE '' then + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //Epi Deposit Time + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //Diluent + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //Dopant Flow + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //HCL Flow + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //Bake Time + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //H2 Flow + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //TCS Flow + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //DCS Flow + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //AUX 1 + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //AUX2 + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //F_OFFSET + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //S_OFFSET + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //R OFFSET + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //ETCH 1 + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //ETCH 2 + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //ETCH 3 + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //UL_TEMP + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + + If RDSLayerRec NE '' AND RDSLayerRec NE '' then + //Susceptor Etch + RDSLayerRec = ((RDSLayerRec - RDSLayerRec) / 2) + RDSLayerRec + end + Database_Services('WriteDataRow', 'RDS_LAYER', RDSLayerKey, RDSLayerRec, True$, False$, True$) + end + +end service + +Service VerifyRecipeParams(RDSNo) + //Used to verify exisiting recipe params. This is if they are already set. + IF RDSNo NE '' then + RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) + RDSRec = True$ + Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) + end else + Error_Services('Add', 'RDS No was blank!!!') + end +end service + +Service SendCassComp(WoMatKey) + debug + Sap_Services('RetransmitCassComp', WoMatKey) + obj_sap('SendOutbound') +end service + + + + + + diff --git a/LSL2/STPROC/HOLD_SERVICES.txt b/LSL2/STPROC/HOLD_SERVICES.txt index b8df49d..a0a0a1a 100644 --- a/LSL2/STPROC/HOLD_SERVICES.txt +++ b/LSL2/STPROC/HOLD_SERVICES.txt @@ -58,7 +58,7 @@ $INSERT NOTIFICATION_EQU Declare function Database_Services, Error_Services, Obj_Wm_In, Obj_Wm_Out, Unassigned, Wm_In_Services, Wm_Out_Services Declare function PSN_Services, SRP_Rotate_Array, Datetime, Hold_Services, Memberof, Error_Services, Rds_Services Declare subroutine Database_Services, Error_Services, Obj_notes, Hold_Services, Obj_Wm_In, Obj_Wm_Out, Wm_In_Services -Declare subroutine Wm_Out_Services, Rds_Services +Declare subroutine Wm_Out_Services, Rds_Services, Lot_Services GoToService else Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') @@ -361,6 +361,29 @@ Service OnHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, OperatorI If Error_Services("NoError") then Hold_Services("HoldNotification", HoldEntity, HoldEntityID, Reason, True$, HoldType, OperatorID) Hold_Services("CreateComment", HoldEntity, HoldEntityID, Reason, True$, HoldType, OperatorID) + //Add in logging lot event + If UserId EQ '' then + UserId = OperatorId + end + Begin Case + Case HoldEntity EQ 'WM_IN' + WONo = Field(WOMatKey, '*', 1) + StepNo = 1 + CassNo = Field(WOMatKey, '*', 2) + WMInKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMInKey, 'WM_IN', CurrDTM, 'HOLD_ON', 'Placed on hold', '', '', '', '', UserId) + Case HoldEntity EQ 'WM_OUT' + WONo = Field(WOMatKey, '*', 1) + StepNo = 1 + CassNo = Field(WOMatKey, '*', 2) + WMOutKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMOutKey, 'WM_OUT', CurrDTM, 'HOLD_ON', 'Placed on hold', '', '', '', '', UserId) + Case HoldEntity EQ 'RDS' + RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X') + Lot_Services('CreateLotEvent', RDSNo, 'RDS', CurrDTM, 'HOLD_ON', 'Placed on hold', '', '', '', '', UserId) + Case HoldEntity EQ 'WO_MAT' + Lot_Services('CreateLotEvent', WOMatKey, 'RDS', CurrDTM, 'HOLD_ON', 'Placed on hold', '', '', '', '', UserId) + End Case end end else Error_Services('Add', 'Lot is already on hold.') @@ -474,6 +497,29 @@ Service OffHold(WOMatKey, HoldEntity, HoldEntityID, HoldType, HoldData, Operator If Error_Services("NoError") then Hold_Services("HoldNotification", HoldEntity, HoldEntityID, Reason, False$, HoldType, OperatorID) Hold_Services("CreateComment", HoldEntity, HoldEntityID, Reason, False$, HoldType, OperatorID) + //Add in logging lot event + if UserID EQ '' then + UserId = OperatorId + end + Begin Case + Case HoldEntity EQ 'WM_IN' + WONo = Field(WOMatKey, '*', 1) + StepNo = 1 + CassNo = Field(WOMatKey, '*', 2) + WMInKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMInKey, 'WM_IN', CurrDTM, 'HOLD_OFF', 'Placed on hold', '', '', '', '', UserID) + Case HoldEntity EQ 'WM_OUT' + WONo = Field(WOMatKey, '*', 1) + StepNo = 1 + CassNo = Field(WOMatKey, '*', 2) + WMOutKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMOutKey, 'WM_OUT', CurrDTM, 'HOLD_OFF', 'Placed on hold', '', '', '', '', UserID) + Case HoldEntity EQ 'RDS' + RDSNo = Xlate('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X') + Lot_Services('CreateLotEvent', RDSNo, 'RDS', CurrDTM, 'HOLD_OFF', 'Placed on hold', '', '', '', '', UserID) + Case HoldEntity EQ 'WO_MAT' + Lot_Services('CreateLotEvent', WOMatKey, 'RDS', CurrDTM, 'HOLD_OFF', 'Placed on hold', '', '', '', '', UserID) + End Case end end else Error_Services('Add', 'Lot is not on hold.') diff --git a/LSL2/STPROC/JONATHAN_SERVICES.txt b/LSL2/STPROC/JONATHAN_SERVICES.txt index a195bea..74b1a11 100644 --- a/LSL2/STPROC/JONATHAN_SERVICES.txt +++ b/LSL2/STPROC/JONATHAN_SERVICES.txt @@ -1,11 +1,14 @@ Compile function JONATHAN_Services(@Service, @Params) #pragma precomp SRP_PreCompiler -Declare function Gan_Services, Obj_Notes_Sent, msg, Check_Notes, Jonathan_Services, Database_Services, SRP_Datetime +Declare function Gan_Services, Obj_Notes_Sent, msg, Check_Notes, Jonathan_Services, Database_Services, SRP_Datetime, Datetime Declare function Lsl_Users_Services, SRP_Time, RList, Error_Services, Obj_Wo_Mat, Pm_Services, Date_Services, Test_Run_Services Declare function Reactor_Services, Reactor_Log_Services, Environment_Services, Logging_Services, Obj_Wm_out, Obj_wo_mat +Declare function Test_Wafer_Prod_Services, RDS_Services, SRP_Sort_Array, Return_To_Fab_Services, Lot_Services +DECLARE FUNCTION obj_WO_Mat , obj_WO_Mat_QA, Active_Directory_Services, SRP_Array, obj_vendor_code, obj_wm_out Declare subroutine Start_Window, RList, Set_Status, Database_Services, Obj_Sap, Sap_Services, Btree.Extract -Declare subroutine Reactor_Services, Logging_Services +Declare subroutine Reactor_Services, Logging_Services, Extract_SI_Keys, Get_Status, obj_notes, obj_wo_react +Declare subroutine OBJ_WO_MAT_QA, PSN_Services, Print_Shipment_dev, obj_shipment, SRP_Run_Command $insert LOGICAL $insert NOTE_PTRS_EQU @@ -23,6 +26,14 @@ $Insert PM_EQUATES $Insert PM_SPEC_EQUATES $Insert WO_MAT_EQUATES $Insert WM_OUT_EQUATES +$Insert ICAR_EQUATES +$Insert LSL_USERS_EQUATES +$Insert TEST_WAFER_PROD_EQUATES +$Insert PRODUCT_OPERATION_EQUATES +$Insert WO_REACT_EQUATES +$Insert COMPANY_EQUATES +$Insert CUST_EPI_PART_EQUATES +$Insert EPI_PART_EQUATES /*$Insert TEST_RUN_EQUATES $Insert TEST_RUN_WAFER_EQUATES $Insert TEST_WAFER_PROD_EQUATES @@ -39,819 +50,1615 @@ Return Response or "" // SERVICES //----------------------------------------------------------------------------- -Service GetRDSwithMultipleRDSTestKeys() +Service GetWMONextOpenSlots() debug - LotsWithBadRDSTestKeys = '' - RDSList = Database_Services('ReadDataRow', 'SYSLISTS', 'TEST_JONATHAN') - for each RDS in RDSList using @FM setting rPos - RDSLayerKeys = XLATE('REACT_RUN', RDS, 5, 'X') - for each RDSLayerKey in RDSLayerKeys using @Fm - RDSTestKeys = XLATE('RDS_LAYER', RDSLayerKey, 3, 'X') - IF Dcount(RDSTestKeys, @VM) GE 2 then - LotsWithBadRDSTestKeys<-1> = RDSLayerKey - end - Next RDSLayerKey - Next RDS + test = obj_wm_out('NextOpenSlots', '173330':@RM:1) end service -Service GetWOMatRepStatus() - debug - WONo = 173078 - CassNo = 5 - ID = WONo : '*' : CassNo - WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', ID) - test = obj_WO_Mat('ReportStatus',ID:@RM:WOMatRec) -end service +Service PrintReactorLabel(ReactNo, LoadLockSide) -Service GetWMOutRepStatus() - debug - WONo = 173078 - CassNo = 5 - RepStatus = XLATE('WO_MAT',WONo:'*':CassNo,'REP_STATUS','X')[-1,'B':@VM] - IF RepStatus = '' OR RepStatus[1,3] NE 'WMO' THEN - CurrStatus = Jonathan_Services('GetWMOutCurrStatus') - test = OCONV(CurrStatus,'[WM_OUT_CURR_STATUS_CONV]') + If ( (ReactNo NE '') and (LoadLockSide NE '') ) then + BaseZpl = '^XA^LH10,10^FO35,5^BY2^B3N,,80,N^FD10SR{ReactNo}.{LoadLockSidePrefix}^FS^FO10,105^A045,90^FB400,1,,C^FDR{ReactNo} {LoadLockSide}^FS^XZ' + Convert 'R' to '' in ReactNo + If LoadLockSide _EQC 'Both' then + LoadLockSidePrefix = 'L' + ZplLeft = BaseZpl + Swap '{ReactNo}' with ReactNo in ZplLeft + Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in ZplLeft + Swap '{LoadLockSide}' with 'Left' in ZplLeft + ZplRight = BaseZpl + LoadLockSidePrefix = 'R' + Swap '{ReactNo}' with ReactNo in ZplRight + Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in ZplRight + Swap '{LoadLockSide}' with 'Right' in ZplRight + Zpl = ZplLeft:ZplRight + end else + LoadLockSidePrefix = LoadLockSide[1, 1] + Zpl = BaseZpl + Swap '{ReactNo}' with ReactNo in Zpl + Swap '{LoadLockSidePrefix}' with LoadLockSidePrefix in Zpl + Swap '{LoadLockSide}' with LoadLockSide in Zpl + end + //Labeling_Services('PrintLabel', Zpl, '\\messp1003.infineon.com\MESZBRPRT008') + OSWrite ZPL to 'C:\Users\MESOuellette\Desktop\ReactorLabel' : ReactNo : '.zpl' end else - test = RepStatus - END -end service - -Service GetWMOutCurrStatus() - debug - RecID = '173078*1*5' - Record = Database_Services('ReadDataRow', 'WM_OUT', RecID) - CurrStatus = OBJ_WM_OUT('CurrStatus', RecID:@RM:Record) - Response = CurrStatus -end service - -Service Get5SType() - Datalist = Database_Services('ReadDataRow', 'SYSLISTS', 'TEST_JONATHAN') - PMSpecs = '' - for each data in datalist using @FM setting iPos - PMSpecs = data - Is5S = Xlate('PM_SPEC', data, PM_SPEC_FIVE_S_FLAG$, 'X') - PMSpecs = Is5S - Next data - debug -end service - -Service TestLogging() - Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log' - ColumnWidths = 20 : @FM : 15 : @FM : 300 - LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\JonathansTest' - LogDate = Oconv(Date(), 'D4/') - LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_ReactorLogPM.csv' - objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$) - - LogData = '' - LogData<1> = '' - LogData<2> = '' - LogData<3> = 'This is a test' - Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) -end service - - -Service UpdateYesterdayAvail() - Today = 20702 - DataArray = '' - //ASM Reactors - ASMRecordKey = 'ASM*': Today - ASMUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'ASM') - Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', ASMRecordKey, ASMUptimeRec, True$, False$, True$) - //HTR Reactors - HTRRecordKey = 'HTR*': Today - HTRUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'HTR') - Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', HTRRecordKey, HTRUptimeRec, True$, False$, True$) - //EPP Reactors - EPPRecordKey = 'EPP*': Today - EPPUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'EPP') - Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', EPPRecordKey, EPPUptimeRec, True$, False$, True$) - //All Reactors - ALLRecordKey = 'ALL*': Today - ALLUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'ALL') - Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', ALLRecordKey, ALLUptimeRec, True$, False$, True$) -end service - - - -Service SetReactorMetrics() - Reactors = Reactor_Services('GetReactorNumbers') - table = 'REACTOR_LOG' - for each ReactorNo in Reactors using @FM setting rPos - LatestTubeChangeRLIDASM = '' - LatestTubeChangeASMDTM = '' - LatestSuscChangRLIDASM = '' - LatestArmChangeIDASM = '' - LatestSuscChangRLIDHTR = '' - LatestArmChangeIDHTR = '' - ReactorType = XLATE('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X') - - //Reset all metrics to 0 - ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - ReactorRec = 0; - ReactorRec = 0; - ReactorRec = 0; - ReactorRec = 0; - ReactorRec = 0; - ReactorRec = 0; - ReactorRec = 0; - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactorRec) - - - Begin Case - Case ReactorType EQ 'ASM' OR ReactorType EQ 'ASM+' - //Susceptor 699 - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '699')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - - CurrTubeBellJarThk = OldReactorRec - CurrTubeBellJarCnt = OldReactorRec - CurrSuscThk = OldReactorRec - CurrSuscWfrCnt = OldReactorRec - CurrLowerQuartzThk = OldReactorRec - CurrLowerQuartzWfr = OldReactorRec - - // Set values to 0 if blank - If CurrTubeBellJarThk = '' then CurrTubeBellJarThk = 0 - If CurrTubeBellJarCnt = '' then CurrTubeBellJarCnt = 0 - If CurrSuscThk = '' then CurrSuscThk = 0 - If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 - If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 - If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 - - RDSNo = RDSRow<1,1> - TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') - TargetThickness = OConv(TargetThickness, 'MD3') - WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') - ThkAddition = WaferCount * TargetThickness - NewReactorRec = OldReactorRec - NewReactorRec = CurrSuscThk + ThkAddition - NewReactorRec = CurrSuscWfrCnt + WaferCount - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - - //TubeChange 240 - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '240')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - - CurrTubeBellJarThk = OldReactorRec - CurrTubeBellJarCnt = OldReactorRec - - // Set values to 0 if blank - If CurrTubeBellJarThk = '' then CurrTubeBellJarThk = 0 - If CurrTubeBellJarCnt = '' then CurrTubeBellJarCnt = 0 - - RDSNo = RDSRow<1,1> - TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') - TargetThickness = OConv(TargetThickness, 'MD3') - WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') - ThkAddition = WaferCount * TargetThickness - NewReactorRec = OldReactorRec - NewReactorRec = CurrTubeBellJarThk + ThkAddition - NewReactorRec = CurrTubeBellJarCnt + WaferCount - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - //Arms 21 - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '21')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - CurrArmsWfrCnt = OldReactorRec - If CurrArmsWfrCnt = '' then CurrArmsWfrCnt = 0 - RDSNo = RDSRow<1,1> - WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') - NewReactorRec = OldReactorRec - NewReactorRec = CurrArmsWfrCnt + WaferCount - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - Case ReactorType EQ 'HTR' - //Susceptor 699 - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '699')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - - CurrSuscThk = OldReactorRec - CurrSuscWfrCnt = OldReactorRec - - // Set values to 0 if blank - If CurrSuscThk = '' then CurrSuscThk = 0 - If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 - - RDSNo = RDSRow<1,1> - TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') - TargetThickness = OConv(TargetThickness, 'MD3') - WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') - CntAddition = (WaferCount / 5) - ThkAddition = (WaferCount / 5) * TargetThickness - NewReactorRec = OldReactorRec - NewReactorRec = CurrSuscThk + ThkAddition - NewReactorRec = CurrSuscWfrCnt + CntAddition - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - - //TubeChange 1280 - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '1280')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - - CurrTubeBellJarThk = OldReactorRec - CurrTubeBellJarCnt = OldReactorRec - - // Set values to 0 if blank - If CurrTubeBellJarThk = '' then CurrTubeBellJarThk = 0 - If CurrTubeBellJarCnt = '' then CurrTubeBellJarCnt = 0 - - RDSNo = RDSRow<1,1> - TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') - TargetThickness = OConv(TargetThickness, 'MD3') - WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') - CntAddition = (WaferCount / 5) - ThkAddition = (WaferCount / 5) * TargetThickness - NewReactorRec = OldReactorRec - NewReactorRec = CurrTubeBellJarThk + ThkAddition - NewReactorRec = CurrTubeBellJarCnt + CntAddition - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - - //Arms 21 - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '21')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - CurrArmsWfrCnt = OldReactorRec - If CurrArmsWfrCnt = '' then CurrArmsWfrCnt = 0 - RDSNo = RDSRow<1,1> - WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') - NewReactorRec = OldReactorRec - NewReactorRec = CurrArmsWfrCnt + WaferCount - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - - Case ReactorType EQ 'EPP' - - //BellJar 1092 - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '1092')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - RDSNo = RDSRow<1,1> - TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') - TargetThickness = OConv(TargetThickness, 'MD3') - NewReactorRec = OldReactorRec - CurrTubeBellJarThk = OldReactorRec - CurrTubeBellJarCnt = OldReactorRec - - // Set values to 0 if blank - If CurrTubeBellJarThk = '' then CurrTubeBellJarThk = 0 - If CurrTubeBellJarCnt = '' then CurrTubeBellJarCnt = 0 - NewReactorRec = CurrTubeBellJarThk + TargetThickness - NewReactorRec = CurrTubeBellJarCnt + 1 - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - - - //1067 Lower Quartz - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '1067')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - RDSNo = RDSRow<1,1> - TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') - TargetThickness = OConv(TargetThickness, 'MD3') - NewReactorRec = OldReactorRec - CurrLowerQuartzThk = OldReactorRec - CurrLowerQuartzCnt = OldReactorRec - - // Set values to 0 if blank - If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 - If CurrLowerQuartzCnt = '' then CurrLowerQuartzCnt = 0 - NewReactorRec = CurrLowerQuartzThk + TargetThickness - NewReactorRec = CurrLowerQuartzCnt + 1 - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - - //699 Susceptor - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '699')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - - for each RDSRow in RDSList using @FM - OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) - RDSNo = RDSRow<1,1> - TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') - TargetThickness = OConv(TargetThickness, 'MD3') - NewReactorRec = OldReactorRec - CurrSuscThk = OldReactorRec - CurrSuscCnt = OldReactorRec - - // Set values to 0 if blank - If CurrSuscThk = '' then CurrSuscThk = 0 - If CurrSuscCnt = '' then CurrSuscCnt = 0 - NewReactorRec = CurrSuscThk + TargetThickness - NewReactorRec = CurrSuscCnt + 1 - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - Next RDSRow - LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '699')<1,4> - RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') - RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) - NewReactorRec = CurrSuscThk + TargetThickness - NewReactorRec = CurrSuscWfrCnt + 1 - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) - End Case - Next ReactorNo -end service - -Service LaunchWindow() - Start_Window('NDW_VIEW_TEST_RUN','', '10000001') -end service - -Service GetTestRunObj(TestRunID) - debug - TestRunObj = '' - TestRunRec = Test_Run_Services('GetTestRunById', TestRunID) - //Start getting translated values for object - RunDTM = OConv(TestRunRec, 'DT') - ReasonForTest = Xlate('TEST_RUN_TYPE', TestRunRec, TEST_RUN_TYPE_RUN_TYPE$, 'X') - RelatedRDS = TestRunRec - RelatedPSN = TestRunRec - EqpType = TestRunRec - EqpID = TestRunRec - TWKeys = TestRunRec - TWUsageProds = '' - TWUsageQtys = '' - for each TWKey in TWKeys using @VM setting tPos - TRWRec = Test_Run_Services('GetTestRunWaferByID', TWKey) - TestWaferProdName = XLATE('TEST_WAFER_PROD', TRWRec, TEST_WAFER_PROD_PART_NAME$, 'X') - Locate TestWaferProdName in TWUsageProds setting iPos then - TWUsageProds<1,iPos> = TestWaferProdName - TWUsageQtys<1,iPos> = TWUsageQtys<1,iPos> + 1 - end else - TWUsageProds<1,-1> = TestWaferProdName - TWUsageQtys<1,-1> = 1 - end - Next TWKey -end service - -Service WFR_STATUS(WMOKey) - - Result = '' - WfrStatus = '' - WMOSlots = Xlate('WM_OUT', WMOKey, 'RDS', 'X') - WMOZoneProfile = Xlate('WM_OUT', WMOKey, WM_OUT_ZONE$, 'X') - WMORDSTestKeys = XLATE('WM_OUT', WMOKey, 'CASS_RDS_MET_KEYS', 'X') - for each RDSNo in WMOSlots using @VM setting sPos - - ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo) - SlotZone = Xlate('WM_OUT', WMOKey, WM_OUT_ZONE$, 'X')<1, sPos> - //Get the RDS_Test for this slot. - //Find the right RDS Test Key - ThisSlotRDSTestKeys = '' - for each RDSTestKey in WMORDSTestKeys using @VM - RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKey) - If RDSTestRec EQ SlotZone AND RDSTestRec EQ RDSNo then - ThisSlotRDSTestKeys<1, -1> = RDSTestKey - - end - - Next RDSTestKey - RDSTestDataEntered = XLATE('RDS_TEST', ThisSlotRDSTestKeys, 'MET_ENTERED', 'X') - If RDSTestDataEntered NE '' then - Locate False$ in RDSTestDataEntered using @VM setting iPos then Result = 'ULMET' else - MetOutOfSpec = Sum(Xlate('RDS_TEST', ThisSlotRDSTestKeys, 'OUT_OF_SPEC', 'X')) - If MetOutOfSpec then - //Check for an NCR - SlotNcr = Xlate('WM_OUT', WMOKey, 'WM_OUT_SLOT_NCR', 'X')<1, sPos> - If SlotNcr NE '' then - MetOutOfSpec = False$ - end - end - If MetOutOfSpec then - Result = 'SPEC' - end else - Result = 'ULOAD' - end - end - end else - Result = 'ULMET' - end - - WfrStatus = Result - Next RDSNo - debug -end service - -Service Test() - Debug - RDSTestKeys = XLATE('WM_OUT', '172172*1*10', 'CASS_RDS_MET_KEYS', 'X') - TestDataEntered = XLATE('RDS_TEST', RDSTestKeys, 'MET_ENTERED', 'X') - //WMOWafers = XLATE('WM_OUT', '172172*1*10', 'WFR_STATUS', 'X') -end service - -Service TestEquates() - debug - test = WO_MAT_MAKEUP_BOX$ -end service - -Service GetWWInfo() - debug - WWInfo = Date_Services('GetWeekNum', '20345.12345') -end service - -Service PMINformation() - -end service - -Service RGBToInt() - debug - R = 242 - G = 156 - B = 63 - IntegerVal = (B * 65536) + (G * 256) + R -end service - -Service TestPMMFS() - Debug - - PMRec = Database_Services('ReadDataRow', 'PM', '10115') - Late = XLATE('PM', '10115', 'LATE', 'X') - SchedQty = XLATE('PM_SPEC', PMRec, 'LATE_START_QTY', 'X') - CompQty = PMRec - -end service - -Service AddComments() - debug - Response = Dialog_Box('NDW_ADD_COMMENT', @WINDOW) -end service - -Service Get5SPMs() - test = Pm_Services('Get5SPMs', True$) -end service - - -Service GetOnShiftSupervisor() - debug - Response = Lsl_Users_Services('GetShiftByDate', '8/23/2023 06:00') -end service - -Service TriggerCassComp(WOMatKey) - debug - SAP_Services('AddCassCompTransaction', WOMatKey) -end service - -Service TestGRProps(WOMatKey) - *172174 - *1 - debug - WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) - GRProps = obj_WO_Mat('GetGRProps',WOMatKey:@RM:WOMatRec) - -end service - -Service TriggerScrap(WorkOrderNo, CassNo, TransQty) - //172172 - //1 - //2 - obj_SAP('AddTransaction','SCRAP_IN':@RM:WorkOrderNo:@RM:CassNo:@RM:TransQty) -end service - -Service TriggerBatchMove - -end service - -Service TestOEE - keyId = '20259*35*5117*U442' - stopDTM = XLATE('DAILY_PERFORMANCE_REPORT', keyId, 'STOP_DTM', 'X') - OEE = XLATE('DAILY_PERFORMANCE_REPORT', keyId, 'OEE_CALCULATION', 'X') - Response = OEE -end service - -Service TestZero() - debug - ShouldBeZero = 1 - 1 -end service - -Service IsRDSMetOutOfSpec(RDSNo) - debug - *RDSNo = '586181' - RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) - RDSWaferZones = RDSRec - ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X') - IsEpiPro = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X') EQ 'EPP' - LSKeys = XLATE('REACT_RUN',RDSNo, REACT_RUN_RDS_LAYER_KEYS$, 'X') - for each LayerSpecKey in LSKeys using @VM setting lPos - LSRec = Database_Services('ReadDataRow', 'RDS_LAYER', LayerSpecKey) - IsMetOOS = XLATE('RDS_LAYER',LayerSpecKey,'TEST_OUT_OF_SPEC','X')<1, lPos> - IF IsMetOOS then - If IsEpiPro then - RDSTestKey = LSRec - RDSTestZone = XLate('RDS_TEST', RDSTestKey, RDS_TEST_ZONE$, 'X') - RDSTestLayer = XLate('RDS_TEST', RDSTestKey, RDS_TEST_LS_ID$, 'X') - WafersInZone = '' - - for each WaferZone in RDSWaferZones using @VM setting wPos - If WaferZone EQ RDSTestZone then - WafersInZone<-1> = wPos - end - Next WaferZone - Response = RDSTestLayer : ' Zone ' : RDSTestZone : ' Out of Spec' - end else - Response = 'Out of Spec' - end - end - - Next LayerSpec -* TestOutOfSpec = XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X') -* MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) - - - -end service - - -Service TestCOMB_Status() - debug - - - RDSNo = '586181' - RDSWOMatKey = XLATE('RDS', RDSNo, 'WO_MAT_KEY', 'X') - WOMatRepStatus = XLATE('WO_MAT',RDSWOMatKey,'REP_STATUS','X') - RunStatus = XLATE('REACT_RUN',RDSNo,'RUN_STATUS','X') - RunStatus = OCONV(RunStatus,'[RUN_STATUS_CONV]') -Ans = '' -BEGIN CASE - CASE WOMatRepStatus NE '' AND RunStatus NE '' - Ans = WOMatRepStatus - - CASE WOMatRepStatus = '' AND RunStatus NE '' - Ans = RunStatus - - CASE WOMatRepStatus NE '' AND RunStatus = '' - Ans = WOMatRepStatus - - CASE 1 - Ans = '' -END CASE - CombStatus = Xlate('RDS', RDSNo, 'COMB_STATUS', 'X') - Response = CombStatus -end service - -Service TestChatGPT() - Stop -end service - -Service getWOMat() - debug - effectedCassettes = '' - for WONo = 171809 to 172010 - for CassNo = 1 to 99 - WOMatKey = WONo : '*' : CassNo - WOMatQaRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey) - Profiles = WOMatQaRec - DataPoints = WOMatQARec - For each Profile in Profiles using @VM setting ProfIndex - If Profile EQ '1THICK_ONLY' then - - List = DataPoints<1, ProfIndex> - IF DCOUNT(List, @SVM) LT 5 AND DCOUNT(List, @SVM) GT 0 then - debug - EffectedCassettes<-1> = WOMatKey : ',' : XLATE('WO_MAT', WOMatKey, 'RDS_NO', 'X') : CRLF$ - end - end - - Next Profile - - - Next CassNo - Next WONo - OSWrite effectedCassettes To 'C:\users\ecouellette\desktop\effectedCassettes.csv' -end service - -Service ChangeCustNoByWO(WONo, NewCustNo, NewProdVerNo, NewPSNo) - // Update WO_LOG record - WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo) - If Error_Services('NoError') then - WOLogRec = NewCustNo - WOLogRec = NewProdVerNo - Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, True$, False$, True$) - If Error_Services('NoError') then - WOStepKey = WONo:'*1' - // Update WO_STEP record - WOStepRec = Database_Services('ReadDataRow', 'WO_STEP', WOStepKey) - If Error_Services('NoError') then - WOStepRec = NewPSNo - Database_Services('WriteDataRow', 'WO_STEP', WOStepKey, WOStepRec, True$, False$, True$) - If Error_Services('NoError') then - // Update RDS Keys - RDSKeys = Xlate('WO_STEP', WOStepKey, 'RDS_KEY', 'X') - If RDSKeys NE '' then - For each RDSKey in RDSKeys using @VM setting vPos - RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey) - If Error_Services('NoError') then - RDSRec = NewCustNo - RDSRec = NewPSNo - Database_Services('WriteDataRow', 'RDS', RDSKey, RDSRec, True$, False$, True$) - end - Until Error_Services('HasError') - Next RDSKey - end - end - end - end - end - If Error_Services('HasError') then - Error_Services('DisplayError') - end - -return -end service - -Service GetRDSMovesByDays(Day, FilePath) - - SelectSent = 'SELECT RDS WITH DATE_OUT EQ ':QUOTE(Day) - Set_Status(0) - RList(SelectSent, TARGET_ACTIVELIST$, "", "", "") - - - rdsArray = '' - IF @RecCount then - EoF = 0 - NumKeys = @RecCount - Cnt = 0 - - Loop - ReadNext rds Else EoF = 1 - until EoF - rdsMoves = XLATE('RDS', rds, 'WAFERS_IN', 'X') - rdsArray := rds : ',' : rdsMoves : CRLF$ - Repeat - - end - OSWrite rdsArray to FilePath - ClearSelect TARGET_ACTIVELIST$ -end service - -Service DetermineNearShiftChange - debug - - CurrTime = 64320 - CurrHour = SRP_TIME('Hour', CurrTime) -end service - -Service OutPutSchedule(StartDate, EndDate) - debug - OutputData = '' - StartDateConv = IConv(StartDate, 'D') - EndDateConv = IConv(EndDate, 'D') - - for i = StartDateConv to EndDateConv - //DayStartDTM = i : '.' : 21600 - //NightStartDTM = i : '.' : 64800 - DayStartDTM = SRP_Datetime('AddHours', i, 7) - NightStartDTM = SRP_Datetime('AddHours', i, 18) - - DayShift = Lsl_Users_Services('GetShiftByDate', OCONV(DayStartDTM, 'DT'))<1,1> - NightShift = Lsl_Users_Services('GetShiftByDate', OCONV(NightStartDTM, 'DT'))<1,1> - OutputData := OConv(i, 'D4/H') : ',' : DayShift : ' and ' : NightShift : CRLF$ - Next i - OSWrite OutputData to 'C:\Users\MESOuellette\Desktop\ShiftCalendar.csv' -end service - -Service TestMassDates() - OutputData = '' - ExpectedCalRec = Database_Services('ReadDataRow', 'SYSLISTS', 'CAL_EXPECTED') - for i = 1 to DCOUNT(ExpectedCalRec<1>, @VM) - Dtm = ExpectedCalRec<1, i> - ExpectedShift = ExpectedCalRec<2, i> - ReturnedShift = Lsl_Users_Services('GetShiftByDate', Dtm)<1,1> - Pass = (ExpectedShift EQ ReturnedShift) - - ExpectedCalRec<3,i> = ReturnedShift - ExpectedCalRec<4,i> = Pass - OutputData := Dtm : ',' : ExpectedShift : ',' : ReturnedShift : ',' : Pass : CRLF$ - Next i - OSWrite OutputData to 'C:\Users\MESOuellette\Desktop\CalDataTestResults.csv' -end service - -Service TestShiftCalendar - debug - shiftCalData = '' - for date = 20090 to 20454 - - DayShift = SRP_Datetime('AddHours', date, 12) - NightShift = SRP_Datetime('AddHours', DayShift, 11) - - OnShiftDay = Lsl_Users_Services('GetShiftByDate', OCONV(DayShift, 'DT'), 1) - OnShiftNight = Lsl_Users_Services('GetShiftByDate', OCONV(NightShift, 'DT'), 1) - ShiftCalData := OCONV(DayShift, 'DT') : ',' : OnShiftDay<1,1> : ',' : OnShiftNight : CRLF$ - Next date - - OSWrite shiftCalData to 'C:\Users\MESOuellette\Desktop\CalData.csv' -end service - -Service GetInboundPending - debug - rv = Set_Status(0) - LookBack = 15 /* Days */ - StartDate = OCONV(Date()-LookBack, 'D4/') -* SelectStatement = "SELECT WO_MAT WITH SAP_TX_DT >= ": Quote(StartDate) :" AND WITHOUT SAP_BATCH_NO" - RowCount = 0 - SelectStatement = "SELECT WO_MAT WITH SAP_BATCH_NO EQ ''" - RList(SelectStatement, 5) - If @List_Active EQ 3 then - SelectStatement = "SELECT WO_MAT WITH SAP_TX_DT >= ": Quote(StartDate) - RList(SelectStatement, 5) - If @List_Active EQ 3 then - EOF = False$ - Loop - ReadNext KeyID else EOF = True$ - Until EOF - WOMatRow = Database_Services('ReadDataRow', 'WO_MAT', KeyID) - If WOMatRow<87> EQ '' then RowCount += 1 - Repeat - end - end -end service - -Service CheckForNew() - -Response = True$ - if xlate( 'NOTE_PTRS', @user4, 'NEW_MESSAGES', 'X' ) then - NotePtrRec = xlate( 'NOTE_PTRS', @user4, '', 'X' ) - LOCATE 'Yes' in NotePtrRec using @VM setting mPos then - * the top one is new meaning they got a new one - Response = True$ - end else - Response = False$ - end - end -end service - -Service GetNewNotes() - debug - void = Jonathan_Services('CheckForNew') -end service - -Service TestGit() - debug -end service - -Service TestMessages() - debug - if xlate( 'NOTE_PTRS', @user4, 'NEW_MESSAGES', 'X' ) then - NotePtrRec = xlate( 'NOTE_PTRS', @user4, '', 'X' ) - if NotePtrRec = 'Yes' then - * the top one is new meaning they got a new one - MsgInfo = '' - MsgInfo = '!' - Mtext = 'You have a new message from ':NotePtrRec:'.' - MsgInfo = MText - MsgInfo = -2 - MsgInfo = -2 - Void = msg( '', MsgInfo ) - end + Error_Services('Add', 'Error in ':Service:' service. Null ReactNo or LoadLockSide passed in.') end - NotesSent = obj_Notes_Sent('GetUserKeys','LEHRICH') - NewMessages = XLATE('NOTE_PTRS','LEHRICH','NEW_MESSAGES','X') - //NotesSent = obj_Notes_Sent('GetUserKeys','JONATHAN_O') - IF NotesSent NE '' OR NewMessages > 0 THEN - Start_Window( 'NOTE_PTRS', @WINDOW, '*CENTER', '', '' ) +end service + +Service DeleteTWUseKeyByRDS(RDSNo) + Debug + Response = 0 + ErrorMessage = '' + TestRunKeys = Test_Run_Services('GetTestRunKeysByRDS', RDSNo) + for each testrunkey in testrunkeys using @VM + Table = 'TEST_RUN' + KeyID = testrunkey + Resp = Database_Services('UnlockKeyID', Table, KeyID) + If Resp then + Database_Services('DeleteDataRow', 'TEST_RUN', testrunkey) + if error_services('NoError') then + Response = 1 + end else + errorMessage = Error_Services('GetMessage') + Response = 0 + end + end else + errorMessage = 'Error: unable to unlock record' + Response = 0 + end + + Next testrunkey + +end service + +Service PrintRDSLabel(RDSNo) + WONo = XLATE('RDS', RDSNo, RDS_WO$, 'X') + CustNo = XLATE( 'WO_LOG', WONo, wo_log_cust_no$, 'X' ) + PrintCompany = XLATE('COMPANY', CustNo, COMPANY_CO_NAME$, 'X') + PrintRONum = XLATE('RDS', RDSNo, RDS_CASS_NO$, 'X') + + EpiPartNo = XLATE('WO_LOG', WONo, WO_LOG_EPI_PART_NO$, 'X') + CustEpiPartSpecNo = XLATE('EPI_PART', EpiPartNo, CUST_EPI_PART_SPEC_NO$,'X')[-1,'B':@VM] ;* Last (current) Customer Spec Number + + PrintPSN = XLATE( 'RDS', RdsIds, rds_prod_spec_id$, 'X' ) + + PrintSpecType = OCONV( XLATE( 'RDS', RDSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' ) + PrintLotNum = XLATE( 'RDS', RDSNo, rds_lot_num$, 'X' ) + + PrintQty = XLATE( 'RDS', RDSNo, 'WAFERS_SCHEDULED', 'X' ) + + PrintRDSId = RDSNo + + PrintSubPartNum = XLATE( 'RDS', RDSNo, 'SUB_PART_NUM', 'X' ) + + WOMatRec = WONo : '*' : PrintRONum + SubSupplier = obj_Vendor_Code('SemiToEpi',WOMatRec) + VendCd = XLATE('COMPANY',CustNo,COMPANY_VEND_CD$,'X') + IF VendCd NE '' THEN + SubSupplier = VendCd ;* Substrate supplier code found in the EPI_PART window. 12/9/2011 for cust 7067 END + PrintSuppCd = SubSupplier + PSStageKey = PrintPSN:'*QA' + PrintRecipe = XLATE('PRS_STAGE',PSStageKey,'MET_RECIPE','X') + PrintQARecipe = FIELD(PrintRecipe, @VM, 1) + Str = '' + Str := '^XA' + Str := '^LH0,0' + Str := '^PR1' ;* Print speed 2 inches per second + Str := '^LL406' ;* Label length @203 dpi + Str := '^PW900' + Str := '^MD22' ;* Media darkness + Str := '^MMT' ;* Media mode t=tear off mode + *Str := '^PQ2' ;* Print 2 labels for each pass through here + + ****** First Line, Cust, WO and RO + Str := '^FO25,25^AC,18^FDCust: ^FS':CRLF$ + Str := '^FO95,14^A045,35^FD':PrintCompany:'^FS':CRLF$ + Str := '^FO570,25^AC18^FDWO: ^FS':CRLF$ + Str := '^FO610,14^A045,35^FD':WONo:'^FS':CRLF$ + Str := '^FO730,25^AC18^FDRO: ^FS':CRLF$ + Str := '^FO770,14^A045,35^FD':PrintRONum:'^FS':CRLF$ + + ****** Second Line, Cust Spec, PSN and Type + Str := '^FO25,75^AC18^FD(P)Cust Spec: ^FS':CRLF$ + Str := '^FO185,65^A045,35^FD':CustEpiPartSpecNo:'^FS':CRLF$ + Str := '^FO25,95^BY2,2.0^B3,,50,N^FDP':CustEpiPartSpecNo:'^FS':CRLF$ + Str := '^FO640,75^AC18^FDPSN:^FS':CRLF$ + Str := '^FO690,65^A045,35^FD':PrintPSN:'^FS':CRLF$ + Str := '^FO630,125^AC18^FDType:^FS':CRLF$ + Str := '^FO690,115^A045,30^FD':PrintSpecType:'^FS':CRLF$ + + ****** Third Line, Sub Lot, Qty and RDS + Str := '^FO25,175^AC18^FD(2T)Sub Lot:^FS':CRLF$ + Str := '^FO175,165^A045,35^FD':PrintLotNum:'^FS':CRLF$ + Str := '^FO25,195^BY1,3.0^B3,,50,N^FD2T':PrintLotNum:'^FS':CRLF$ + Str := '^FO400,175^AC18^FD(Q)Qty:^FS':CRLF$ + Str := '^FO500,165^A045,35^FD':PrintQty:'^FS':CRLF$ + Str := '^FO400,195^B3,,50,N^FDQ':PrintQty:'^FS':CRLF$ + Str := '^FO590,175^AC18^FD(1T)RDS: ^FS':CRLF$ + Str := '^FO690,165^A045,35^FD':PrintRDSId:'^FS':CRLF$ + Str := '^FO630,195^B3,,50,N^FD1T':PrintRDSId:'^FS':CRLF$ + + ****** Fourth Line, SubPN, Vendor and QA Metrology recipe + Str := '^FO25,275^AC18^FD(S)Sub PN:^FS':CRLF$ + Str := '^FO145,265^A045,35^FD':PrintSubPartNum:'^FS':CRLF$ + Str := '^FO25,295^B3,,50,N^FDS':PrintSubPartNum:'^FS':CRLF$ + Str := '^FO400,275^AC18^FD(1V)Vend:^FS':CRLF$ + Str := '^FO510,265^A045,35^FD':PrintSuppCd:'^FS':CRLF$ + Str := '^FO400,295^B3,,50,N^FD1V':PrintSuppCd:'^FS':CRLF$ + Str := '^FO590,275^AC18^FD':PrintQARecipe:'^FS':CRLF$ + + ****** Fifth Line, Motto and Data Matrix barcode + Str := '^FO25,370^A045,28':CRLF$ + Str := "^FDWe do what we promise. That's quality made by Infineon.^FS":CRLF$ + Str := '^FO725,320^CI28':CRLF$ + Str := '^BXN,2,200^FDP':CustEpiPartSpecNo:'|S':PrintSubPartNum:'|1T':PrintRDSId:'|2T':PrintLotNum:'|':PrintPSN:'|Q':PrintQty:'|1V':PrintSuppCd:'|SEQ':1:'^FS':CRLF$ + + ****** End the print job (ZPL script) + Str:= '^XZ' + + OSWrite Str to 'C:\Users\mesouellette\Desktop\' : RDSNo : 'zpl.zpl' end service -Service GetSAPYield +Service GetTestRunKeyByRDS(RDSNo) + Debug + Response = Test_Run_Services('GetTestRunKeysByRDS', RDSNo) +end service + + +Service ReactorAssignmentHistoryByWO(ReactorNo, WO) debug - counts = Gan_Services('GetYieldInfo', 223271 , '') + table = "RDS" + ErrorMessage = '' + RDSRecords = '' + RDSSortedByAssignmentDTM = '' + Open "DICT ":table To @DICT Else + ErrorMessage = 'Error opening RDS dictionary' + End + If ErrorMessage EQ '' then + srch_strng = "WO":@VM:WO:@FM:"REACTOR":@VM:ReactorNo:@FM + option = "" + flag = "" + Btree.Extract(srch_strng, table, @DICT, RDSRecords, option, flag) + end + RDSRecordsWithPreEpiSig = '' + for each RDSKey in RDSRecords using @VM setting RDSPos + ThisRDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey, True$, 0, False$) + ThisRDSPreEpiDT = ThisRDSRec + ThisRDSPreEpiTM = ThisRDSRec + ThisRDSPreEpiDTM = SRP_Datetime('Combine', ThisRDSPreEpiDT, ThisRDSPreEpiTM) + RDSRecordsWithPreEpiSig<1, RDSPos> = RDSKey + RDSRecordsWithPreEpiSig<2, RDSPos> = ThisRDSPreEpiDTM + Next RDSKey + + RDSSortedByAssignmentDTM = SRP_Sort_Array(RDSRecordsWithPreEpiSig, 'AN2', 0) + FinalRDSSortedByAssignmentDTM = '' + + for each RDS in RDSSortedByAssignmentDTM<1> using @VM setting SortedRDSPos + ThisRDSDtm = RDSSortedByAssignmentDTM<2, SortedRDSPos> + if ThisRDSDtm GT 0 then + FinalRDSSortedByAssignmentDTM<1, -1> = RDS + FinalRDSSortedByAssignmentDTM<2, -1> = OConv(ThisRDSDtm, 'DT') + end + Next RDS + + Response = FinalRDSSortedByAssignmentDTM<1> end service -Service DoSomething() - - Response = "Hello, World!" - -End Service +* Service ReactorLoadHistoryByWO(ReactNo, WO) +* Response = '' +* If ( (ReactNo NE '') and (StartDTM NE '') and (StopDTM NE '')) then +* Open 'RDS' to RDSTable then +* OPEN 'DICT.RDS' TO @DICT then +* SelectSent = 'SELECT RDS WITH REACTOR EQ ':ReactNo:' AND WITH WO EQ ':WO:' BY-DSND PRE_EPI_SIG_DT' +* Set_Status(0) +* errCode = '' +* RList(SelectSent, TARGET_ACTIVELIST$, "", "", "") +* If Not(Get_Status(errCode)) then +* @RecCount = 0 +* EOF = False$ +* Loop +* Readnext @ID else EOF = True$ +* While EOF EQ False$ +* READO @RECORD FROM RDSTable,@ID then +* @RecCount += 1 +* RDSNo = {SEQ} +* DateIn = OCONV({DATETIME_IN},'DT2/^HS') +* DateOut = OCONV({DATETIME_OUT},'DT2/^HS') +* LoadOperator = {OPERATOR_IN} +* UnLoadOperator = {OPERATOR_OUT} +* +* Response<@RecCount, 1> = RDSNo +* Response<@RecCount, 2> = DateIn +* Response<@RecCount, 3> = DateOut +* Response<@RecCount, 4> = LoadOperator +* Response<@RecCount, 5> = UnLoadOperator +* end +* Repeat +* end else +* ErrMsg = 'Error in service ':Service:'. Error code: ':errCode:'.' +* Error_Services('Add', ErrorMsg) +* end +* end else +* ErrorMsg = 'Unable to Open "DICT.RDS" table!' +* Error_Services('Add', ErrorMsg) +* end +* end else +* ErrorMsg = 'Unable to Open "RDS" table!' +* Error_Services('Add', ErrorMsg) +* end +* end +* +* +* end service + +Service GetMetroReqd(RdsNo) + + IsTWReqd = False$ + RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) + WONo = RDSRec<6> + WoStepNo = 1 + ReactNo = RDSRec<2> + ThisReactorRunOrder = 0 + + //This gets all the RDS's for this WO that have run on the same reactor in the order that they were assgined to that reactor. + ReactRDSNos = Jonathan_Services('ReactorAssignmentHistoryByWO', ReactNo, WONo) + RDSNosMetroData = '' + //Row 1 is RDS No + //Row 2 is Layer 1 THICK + //Row 3 is Layer 1 SheetRho + //Row 4 is Layer 1 CRES + //Row 5 is Layer 2 THICK + //Row 6 is Layer 2 SheetRho + //Row 7 is Layer 2 CRES + + for each RDSId in ReactRDSNos using @VM setting iPos + RDSNosMetroData<1, iPos> = RDSId + ThisRDSLayerKeys = XLATE('RDS', RDSId, 150, 'X') + for each RDSLayerKey in ThisRDSLayerKeys using @VM + MetRecIds = XLATE('RDS_LAYER', RDSLayerKey, 3, 'X') + for each MetRecId in MetRecIds using @VM + ThisMetRecLayerRec = Database_Services('ReadDataRow', 'RDS_TEST', MetRecId, True$, 0, False$) + ThisMetRecLayerId = ThisMetRecLayerRec<2> + ThisMetRecThickDtm = ThisMetRecLayerRec<144> + ThisMetRecSheetRhoDtm = ThisMetRecLayerRec<145> + ThisMetRecHgcvDtm = ThisMetRecLayerRec<146> + Begin Case + Case ThisMetRecLayerId EQ 'L1' + RDSNosMetroData<2, iPos> = ThisMetRecThickDtm + RDSNosMetroData<3, iPos> = ThisMetRecSheetRhoDtm + RDSNosMetroData<4, iPos> = ThisMetRecHgcvDtm + Case ThisMetRecLayerId EQ 'L2' + RDSNosMetroData<5, iPos> = ThisMetRecThickDtm + RDSNosMetroData<6, iPos> = ThisMetRecSheetRhoDtm + RDSNosMetroData<7, iPos> = ThisMetRecHgcvDtm + End Case + Next MetRecId + Next RDSLayerKey + Next RDSId + LOCATE RdsNo IN ReactRDSNos USING @VM SETTING ThisReactorRunOrder ELSE Return + PSNo = RDSRec<114> + PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo) + PRSLayerKeys = PSRec<145> + for each PRSLayerKey in PRSLayerKeys using @VM + PRSPropKeys = Database_Services('ReadDataColumn', 'PRS_LAYER', PRSLayerKey, 5) + for each PRSPropKey in PRSPropKeys using @VM + PRSPropRec = Database_Services('ReadDataRow', 'PRS_PROP', PRSPropKey) + WaferType = PRSPropRec<6> + TestType = Field(PRSPropKey, '*', 3) + Layer = Field(PRSPropKey, '*', 2) + MeasureFreq = PRSPropRec<8> + Start = PRSPropRec<17> + If WaferType NE 'Product' AND WaferType NE 'Prod' then + BEGIN CASE + CASE MeasureFreq = 'F' AND ThisReactorRunOrder = 1 ; IsTWReqd = 1 + CASE ThisReactorRunOrder = Start ; IsTWReqd = 1 + CASE NUM(MeasureFreq) + //FindLastEntryArray = SRP_Array('Reverse', RDSNosMetroData, @VM) + Begin Case + Case TestType EQ 'CRES' + LastCresEntryRDS = '' + Case TestType EQ 'RES' + ///////////////////////////// + if Layer EQ 1 then + LastResEntryLayer1RDS = '' + for each resEntry in RDSNosMetroData<3> using @VM setting tPos + if resEntry NE '' then + LastResEntryLayer1RDS = RDSNosMetroData<1, tPos> + end + Until RDSNosMetroData<1, tPos> EQ RDSNo + Next resEntry + If LastResEntryLayer1RDS NE '' then + Locate LastResEntryLayer1RDS in ReactRDSNos using @VM setting LastMeasurePos then + RunsSinceLastTest = ThisReactorRunOrder - LastMeasurePos + If RunsSinceLastTest GE MeasureFreq OR RunsSinceLastTest EQ 0 then + IsTWReqd = true$ + end + end + end else + IsTWReqd = true$ + end + end + if Layer EQ 2 then + LastResEntryLayer2RDS = '' + for each resEntry in RDSNosMetroData<6> using @VM setting tPos + if resEntry NE '' then + LastResEntryLayer2RDS = RDSNosMetroData<1, tPos> + end + Until RDSNosMetroData<1, tPos> EQ RDSNo + Next resEntry + If LastResEntryLayer2RDS NE '' then + Locate LastResEntryLayer2RDS in ReactRDSNos using @VM setting LastMeasurePos then + RunsSinceLastTest = ThisReactorRunOrder - LastMeasurePos + If RunsSinceLastTest GE MeasureFreq OR RunsSinceLastTest EQ 0 then + IsTWReqd = true$ + end + end + end else + IsTWReqd = true$ + end + end + + ////////////////////////////////////////// + Case TestType EQ 'THICK' + if Layer EQ 1 then + + LastThickEntryLayer1RDS = '' + for each thickEntry in RDSNosMetroData<2> using @VM setting tPos + if thickEntry NE '' then + LastThickEntryLayer1RDS = RDSNosMetroData<1, tPos> + end + Until RDSNosMetroData<1, tPos> EQ RDSNo + Next thickEntry + If LastThickEntryLayer1RDS NE '' then + Locate LastThickEntryLayer1RDS in ReactRDSNos using @VM setting LastMeasurePos then + RunsSinceLastTest = ThisReactorRunOrder - LastMeasurePos + If RunsSinceLastTest GE MeasureFreq OR RunsSinceLastTest EQ 0 then + IsTWReqd = true$ + end + end + end else + IsTWReqd = true$ + end + end + if Layer EQ 2 then + LastThickEntryLayer2RDS = '' + for each thickEntry in RDSNosMetroData<5> using @VM setting tPos + if thickEntry NE '' then + LastThickEntryLayer2RDS = RDSNosMetroData<1, tPos> + end + Until RDSNosMetroData<1, tPos> EQ RDSNo + Next thickEntry + If LastThickEntryLayer2RDS NE '' then + Locate LastThickEntryLayer2RDS in ReactRDSNos using @VM setting LastMeasurePos then + RunsSinceLastTest = ThisReactorRunOrder - LastMeasurePos + If RunsSinceLastTest GE MeasureFreq OR RunsSinceLastTest EQ 0 then + IsTWReqd = true$ + end + end + end else + IsTWReqd = true$ + end + end + + End Case + + END CASE + end + Until IsTWReqd EQ True$ + Next PRSPropKey + Until IsTWReqd EQ True$ + Next PRSLayerKey + Response = IsTWReqd +end service + +* Service UnlockRecord() +* Response = Database_Services('ReleaseKeyIDLock', 'WO_MAT', '172548*2') +* end service +* +* +* Service LaunchOIWizardEdge() +* Command = 'explorer https://goto.infineon.com/oiwizard/returntofab' +* SRP_Run_Command(Command) +* end service +* +* Service CheckOIWizardValid(OIWizardId) +* +* Valid = XLATE('OI_WIZARD', OIWizardId, 'VALID', 'X') +* Response = Valid +* end service +* +* Service DeleteAllRTFRecords() +* AllRTFRecord = Return_To_Fab_Services('GetAllReturnToFabRecords', False$) +* for each RTFRecordId in AllRTFRecord using @VM +* Database_Services('DeleteDataRow', 'RETURN_TO_FAB_LOTS', RTFRecordId, True$, False$) +* Next RTFRecordId +* end service +* +* Service GetWMORDSNos(WMOKeyId) +* debug +* //AllRDSNos = XLATE('WM_OUT',WMOutKeys,WM_OUT_RDS$,'X') +* Response = XLATE('WM_OUT',WMOKeyId,WM_OUT_RDS$,'X') +* end service +* +* Service SendShipDoc() +* debug +* ShipNo = 171117 +* ShipNo = 171497 +* ShipRec = Database_Services('ReadDataRow', 'COC', ShipNo) +* Print_Shipment_Dev(ShipNo,ShipRec,1) +* end service +* +* Service GetReactPMKeys() +* debug +* PMKeyList = Database_Services('ReadDataRow', 'SYSLISTS', 'REACT_PM_KEYS_TO_CHECK') +* Data = '' +* for i = 2 to DCOUNT(PMKEYLIST, @FM) +* thisId = PMKeyList +* ReactorPMRec = Database_Services('ReadDataRow', 'REACTOR_PM', thisId) +* Reactor = ReactorPMRec<4> +* ReactorServId = ReactorPMRec<1> +* ServDesc = XLATE('REACT_SERVS', ReactorServId, 1, 'X') +* LineToAdd = Reactor : ',' : ServDesc : ',' : thisId : CRLF$ +* Data := LineToAdd +* Next i +* OSWrite Data to 'C:\Users\mesouellette.INFINEON\Desktop\reactpms.csv' +* end service +* +* Service ClearEmailBox() +* debug +* emailList = Database_Services('ReadDataRow', 'SYSLISTS', 'EMAIL_RECS') +* for each email in emailList using @FM +* Database_Services('DeleteDataRow', 'EMAIL_BOX', email) +* Next email +* end service +* +* Service TestDelimiters() +* debug +* String = 'TWUPDATE|TW123456|2' +* Operation = Field(String, '|', 1) +* TWLotId = Field(String, '|', 2) +* TWLotQuantity = Field(String, '|', 3) +* end service +* +* Service SetupTestWaferProds() +* debug +* ProdIdList = Test_Wafer_Prod_Services('GetAllTestWaferProdIDs') +* for each ProdId in ProdIdList using @FM +* //Create TW_CREATE LotOperation Record +* TWCreateID = ProdId : '*TW_CREATE' +* TWProdOperationCreateRec = '' +* TWProdOperationCreateRec = ProdID +* TWProdOperationCreateRec = 'TW_CREATE' +* TWProdOperationCreateRec = 1 +* TWProdOperationCreateRec = ProdId +* Database_Services('WriteDataRow', 'PRODUCT_OPERATION', TWCreateId, TWProdOperationCreateRec) +* //Create TW_READY_TO_USE LotOperation Record +* TWRTUID = ProdId : '*TW_READY_TO_USE' +* TWProdOperationCreateRec = '' +* TWProdOperationCreateRec = ProdID +* TWProdOperationCreateRec = 'TW_READY_TO_USE' +* TWProdOperationCreateRec = 2 +* TWProdOperationCreateRec = ProdId +* Database_Services('WriteDataRow', 'PRODUCT_OPERATION', TWRTUID, TWProdOperationCreateRec) +* //Create TW_IN_USE LotOperation Record +* TWInUseId = ProdId : '*TW_IN_USE' +* TWProdOperationCreateRec = '' +* TWProdOperationCreateRec = ProdID +* TWProdOperationCreateRec = 'TW_IN_USE' +* TWProdOperationCreateRec = 3 +* TWProdOperationCreateRec = ProdId +* Database_Services('WriteDataRow', 'PRODUCT_OPERATION', TWInUseId, TWProdOperationCreateRec) +* //Create TW_CLOSE LotOperation Record +* TWCloseId = ProdId : '*TW_CLOSE' +* TWProdOperationCreateRec = '' +* TWProdOperationCreateRec = ProdID +* TWProdOperationCreateRec = 'TW_CLOSE' +* TWProdOperationCreateRec = 4 +* TWProdOperationCreateRec = ProdId +* Database_Services('WriteDataRow', 'PRODUCT_OPERATION', TWCloseId, TWProdOperationCreateRec) +* Next ProdId +* end service +* +* Service TestLotNumberGeneration() +* LotNums = '' +* SRP_Stopwatch('Reset') +* SRP_Stopwatch('Start', 'LotNumGen') +* for i = 1 to 96 +* LotNum = Lot_Services('GenerateNewLotId', 'TW') +* LotNums<1,-1> = LotNum +* Database_Services('WriteDataRow', 'LOT', LotNum, '') +* Next i +* SRP_Stopwatch('Stop', 'LotNumGen') +* debug +* Result = SRP_Stopwatch("GetBenchmark", "LotNumGen") +* +* end service +* +* +* Service UpdateICARRecs() +* debug +* ICARList = Database_Services('ReadDataRow', 'SYSLISTS', 'ICAR_UPDATE') +* For each IcarKey in ICARList using @FM +* ICARRec = Database_Services('ReadDataRow', 'ICAR', IcarKey) +* ThisShift = ICARRec +* NewShift = '' +* Begin Case +* Case ThisShift = '1' +* NewShift = 'A' +* Case ThisShift = '2' +* NewShift = 'B' +* Case ThisShift = '3' +* NewShift = 'C' +* Case ThisShift = '4' +* NewShift = 'D' +* End Case +* If NewShift NE '' then +* ICARRec = NewShift +* Database_Services('WriteDataRow', 'ICAR', IcarKey, ICARRec) +* end +* Next IcarKey +* end service +* +* Service UpdateNCRs() +* for i = 204484 to 204535 +* NCRRecord = Database_Services('ReadDataRow', 'NCR', i) +* NCRRecordShift = NCRRecord +* NewNCRShift = '' +* Begin Case +* Case NCRRecordShift EQ 1 +* NewNCRShift = 'A' +* Case NCRRecordShift EQ 2 +* NewNCRShift = 'B' +* Case NCRRecordShift EQ 3 +* NewNCRShift = 'C' +* Case NCRRecordShift EQ 4 +* NewNCRShift = 'D' +* End Case +* NCRRecord = NewNCRShift +* Database_Services('WriteDataRow', 'NCR', i, NCRRecord) +* Next i +* end service +* +* Service FixWMOQAStatus() +* debug +* WOMatData = Database_Services('ReadDataRow', 'SYSLISTS', 'WMO_FIX_UP_QA') +* for each WOMatKey in WOMatData using @FM +* If RowExists('WO_MAT', WOMatKey) then +* WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) +* LastTranIndex = Dcount(WOMatRec, @VM) +* LastInvWH = WOMatRec +* LastInvLoc = WOMatRec +* LastInvAction = WOMatRec +* //LastInvTag = WOMatRec +* +* NewIndex = LastTranIndex + 1 +* WOMatRec = LastInvWH +* WOMatRec = LastInvLoc +* WOMatRec = LastInvAction +* //New Data +* WOMatRec = SRP_DateTime('Now') +* WOMatRec = 'OI_ADMIN' +* WOMatRec = 'Duplicating Last Transaction to update Fabtime Reporting.' +* Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec) +* end +* Next WOMatKey +* +* end service +* +* Service MatchOItoFabtime() +* OIRTSList = Database_Services('ReadDataRow', 'SYSLISTS', 'OI_RTS') +* FabtimeRTSList = Database_Services('ReadDataRow', 'SYSLISTS', 'FABTIME_RTS') +* MissingLots = '' +* for each WOMatKey in OIRTSList using @FM +* Locate WOMatKey in FabtimeRTSList using @FM setting iPos else +* MissingLot = '' +* MissingLot<1, 1> = WOMatKey +* InvDTMs = XLATE('WO_MAT', WoMatKey, 9, 'X') +* LastInvDtmIndex = Dcount(InvDTMs, @VM) +* LastInvDtm = InvDTMs<1,LastInvDtmIndex> +* MissingLot<1, 2> = Oconv(LastInvDtm, 'DT') +* MissingLots<-1> = MissingLot +* end +* Next WOMatKey +* swap @FM with CRLF$ in MissingLots +* swap @VM with ',' in MissingLots +* OSWrite MissingLots on 'C:\Users\mesouellette.INFINEON\Desktop\OIFabtimeRTSCompare.csv' +* end service +* +* Service GetCurrStatus(WOMatKey) +* Response = Xlate('WO_MAT', WOMatKey, 'CURR_STATUS', 'X') +* end service +* +* Service TestPrintingShipLabels(WONo, StepNo, CassNo) +* debug +* //Cassette1 variable is the cassette id, WMO Key for EPP and RDS for non epp +* //RDSType is either EPP or SIC. derives from whether it is a WMO key or an RDS key +* //EPP Input would be ex: 172123.1.23 +* //Non-Epp Input would be ex: 1T456789 +* ReactType = XLATE('WO_LOG', WONo, 67, 'X') +* If ReactType NE 'EPP' then +* WOMatKey = WONo : '*' : CassNo +* Cassette1 = Xlate('WO_MAT', WOMatKey, 12, 'X') +* RDSType = 'SIC' +* end else +* Cassette1 = WONo : '*1*' : CassNo +* RDSType = 'EPP' +* end +* +* +* Print_SAP_Cass_Ship_Label(WONo,StepNo,CassNo,Cassette1, RDSType) +* end service +* +* Service UpdateEPIParts() +* debug +* DataList = Database_Services('ReadDataRow', 'SYSLISTS', 'LIST_EPI_PART_SPECTRUM') +* for each EpiPart in DataList using @FM +* if RowExists('EPI_PART', EpiPart) then +* EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART',EpiPart) +* EpiPartRec = True$ +* Database_Services('WriteDataRow', 'EPI_PART', EpiPart, EpiPartRec) +* end +* Next EpiPart +* end service +* +* Service UpdateToVarmPartNumsSecond() +* debug +* DataList = Database_Services('ReadDataRow', 'SYSLISTS', 'AFFECTED_PSN_VARM') +* For each PSN in DataList using @FM +* PSNRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSN) +* ProdVers = XLATE('PROD_SPEC', PSN, 'PROD_VER_NO', 'X') +* for each ProdVer in ProdVers using @VM +* ProdVerActive = XLATE('PROD_VER', ProdVer, 33, 'X') +* If ProdVerActive EQ 'A' then +* ProdVerEpiPartNo = XLATE('PROD_VER', ProdVer, 2, 'X') +* //Now Create a new Epi Part rec based on the VARM Part No +* CurrEpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', ProdVerEpiPartNo) +* VMPartNumber = CurrEpiPartRec +* If VMPartNumber NE ProdVerEpiPartNo AND VMPartNumber NE '' then +* NewEpiPartKey = VMPartNumber +* NewEpiPartRec = CurrEpiPartRec +* NewEpiPartRec = ProdVerEpiPartNo +* Database_Services('WriteDataRow', 'EPI_PART', NewEpiPartKey, NewEpiPartRec) +* //Now create new Customer Epi Part +* CustNo = XLATE('PROD_VER', ProdVer, PROD_VER_CUST_NO$, 'X') +* OldCustEpiPartKey = CustNo : '*' : ProdVerEpiPartNo +* NewCustEpiPartKey = CustNo : '*' : VMPartNumber +* OldCustEpiPartRec = Database_Services('ReadDataRow', 'CUST_EPI_PART', OldCustEpiPartKey) +* +* NewCustEpiPartRec = OldCustEpiPartRec +* NewCustEpiPartRec = VMPartNumber +* Database_Services('WriteDataRow', 'CUST_EPI_PART', NewCustEpiPartKey, NewCustEpiPartRec) +* +* //Update Prod Ver to have the new VM Part Number +* ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVer) +* ProdVerRec = VMPartNumber +* Database_Services('WriteDataRow', 'PROD_VER', ProdVer, ProdVerRec) +* UpdatePSNRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSN) +* UpdatePSNRec = Insert(UpdatePSNRec, PROD_SPEC_CUST_PART_NO$, -1, 0, VMPartNumber) +* Database_Services('WriteDataRow', 'PROD_SPEC', PSN, UpdatePSNRec) +* end +* end +* Next ProdVer +* Next PSN +* end service +* +* Service UpdateSinglePSN(PSN) +* PSNRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSN) +* ProdVers = XLATE('PROD_SPEC', PSN, 'PROD_VER_NO', 'X') +* for each ProdVer in ProdVers using @VM +* ProdVerActive = XLATE('PROD_VER', ProdVer, 33, 'X') +* If ProdVerActive EQ 'A' then +* ProdVerEpiPartNo = XLATE('PROD_VER', ProdVer, 2, 'X') +* //Now Create a new Epi Part rec based on the VARM Part No +* CurrEpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', ProdVerEpiPartNo) +* VMPartNumber = CurrEpiPartRec +* If VMPartNumber NE ProdVerEpiPartNo AND VMPartNumber NE '' then +* NewEpiPartKey = VMPartNumber +* NewEpiPartRec = CurrEpiPartRec +* NewEpiPartRec = ProdVerEpiPartNo +* Database_Services('WriteDataRow', 'EPI_PART', NewEpiPartKey, NewEpiPartRec) +* //Now create new Customer Epi Part +* CustNo = XLATE('PROD_VER', ProdVer, PROD_VER_CUST_NO$, 'X') +* OldCustEpiPartKey = CustNo : '*' : ProdVerEpiPartNo +* NewCustEpiPartKey = CustNo : '*' : VMPartNumber +* OldCustEpiPartRec = Database_Services('ReadDataRow', 'CUST_EPI_PART', OldCustEpiPartKey) +* +* NewCustEpiPartRec = OldCustEpiPartRec +* NewCustEpiPartRec = VMPartNumber +* Database_Services('WriteDataRow', 'CUST_EPI_PART', NewCustEpiPartKey, NewCustEpiPartRec) +* +* //Update Prod Ver to have the new VM Part Number +* ProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', ProdVer) +* ProdVerRec = VMPartNumber +* Database_Services('WriteDataRow', 'PROD_VER', ProdVer, ProdVerRec) +* UpdatePSNRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSN) +* UpdatePSNRec = Insert(UpdatePSNRec, PROD_SPEC_CUST_PART_NO$, -1, 0, VMPartNumber) +* Database_Services('WriteDataRow', 'PROD_SPEC', PSN, UpdatePSNRec) +* end +* end +* Next ProdVer +* end service +* +* Service UpdateToVarmPartNums() +* debug +* NewVarmMappingData = Database_Services('ReadDataRow', 'SYSLISTS', 'NEW_VARM_MAPPING') +* +* For each NewVarmMapping in NewVarmMappingData using @FM +* swap ',' with @VM in NewVarmMapping +* OldEpiPartNo = NewVarmMapping<1,1> +* NewEpiPartNo = NewVarmMapping<1,2> +* +* //Get Old Epi Part Rec +* OldEpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', OldEpiPartNo) +* //Add the old part number in the description +* OldEpiPartRec = OldEpiPartNo +* //Write the OldEpiPartRec +* Database_Services('WriteDataRow', 'EPI_PART', OldEpiPartNo, OldEpiPartRec) +* +* //Get Fresh version of old record +* NewEpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', OldEpiPartNo, True$, 0) +* //Write new record with new VARM Part # +* Database_Services('WriteDataRow', 'EPI_PART', NewEpiPartNo, NewEpiPartRec) +* +* //Get Old Customer Epi Part Key +* OldCustEpiPartkEY = NewEpiPartRec +* //Get Old Customer Epi Part Rec +* OldCustEpiPartRec = Database_Services('ReadDataRow', 'CUST_EPI_PART', OldCustEpiPartkEY) +* NewCustEpiPartKey = OldCustEpiPartkEY +* swap OldEpiPartNo with NewEpiPartNo in NewCustEpiPartKey +* NewCustEpiPartRec = OldCustEpiPartRec +* NewCustEpiPartRec = NewEpiPartNo +* Database_Services('WriteDataRow', 'EPI_PART', NewCustEpiPartKey, NewCustEpiPartRec) +* +* //Update Prod ver record with the new Epi Part Number. +* CurrProdVerKey = NewEpiPartRec +* CurrProdVerRec = Database_Services('ReadDataRow', 'PROD_VER', CurrProdVerKey) +* CurrProdVerRec = NewEpiPartNo +* Database_Services('WriteDataRow', 'PROD_VER', CurrProdVerKey, CurrProdVerRec) +* +* +* swap ',' with @VM in NewVarmMapping +* EpiPartNo = NewVarmMapping<1,1> +* NewVarmPartNum = NewVarmMapping<1,2> +* EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo) +* EpiPartRec = NewVarmPartNum +* Database_Services('WriteDataRow', 'EPI_PART', EpiPartNo, EpiPartRec) +* Next NewVarmMapping +* +* end service +* +* Service UpdateVARmPartMapping() +* debug +* NewVarmMappingData = Database_Services('ReadDataRow', 'SYSLISTS', 'NEW_VARM_MAPPING') +* +* For each NewVarmMapping in NewVarmMappingData using @FM +* swap ',' with @VM in NewVarmMapping +* EpiPartNo = NewVarmMapping<1,1> +* NewVarmPartNum = NewVarmMapping<1,2> +* EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo) +* EpiPartRec = NewVarmPartNum +* Database_Services('WriteDataRow', 'EPI_PART', EpiPartNo, EpiPartRec) +* Next NewVarmMapping +* end service +* +* Service GetRDSwithMultipleRDSTestKeys() +* debug +* LotsWithBadRDSTestKeys = '' +* RDSList = Database_Services('ReadDataRow', 'SYSLISTS', 'TEST_JONATHAN') +* for each RDS in RDSList using @FM setting rPos +* RDSLayerKeys = XLATE('REACT_RUN', RDS, 5, 'X') +* for each RDSLayerKey in RDSLayerKeys using @Fm +* RDSTestKeys = XLATE('RDS_LAYER', RDSLayerKey, 3, 'X') +* IF Dcount(RDSTestKeys, @VM) GE 2 then +* LotsWithBadRDSTestKeys<-1> = RDSLayerKey +* end +* Next RDSLayerKey +* Next RDS +* end service +* +* Service GetWOMatRepStatus() +* debug +* WONo = 173078 +* CassNo = 5 +* ID = WONo : '*' : CassNo +* WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', ID) +* test = obj_WO_Mat('ReportStatus',ID:@RM:WOMatRec) +* end service +* +* Service GetWMOutRepStatus() +* debug +* WONo = 173078 +* CassNo = 5 +* RepStatus = XLATE('WO_MAT',WONo:'*':CassNo,'REP_STATUS','X')[-1,'B':@VM] +* IF RepStatus = '' OR RepStatus[1,3] NE 'WMO' THEN +* CurrStatus = Jonathan_Services('GetWMOutCurrStatus') +* test = OCONV(CurrStatus,'[WM_OUT_CURR_STATUS_CONV]') +* end else +* test = RepStatus +* END +* end service +* +* Service GetWMOutCurrStatus() +* debug +* RecID = '173078*1*5' +* Record = Database_Services('ReadDataRow', 'WM_OUT', RecID) +* CurrStatus = OBJ_WM_OUT('CurrStatus', RecID:@RM:Record) +* Response = CurrStatus +* end service +* +* Service Get5SType() +* Datalist = Database_Services('ReadDataRow', 'SYSLISTS', 'TEST_JONATHAN') +* PMSpecs = '' +* for each data in datalist using @FM setting iPos +* PMSpecs = data +* Is5S = Xlate('PM_SPEC', data, PM_SPEC_FIVE_S_FLAG$, 'X') +* PMSpecs = Is5S +* Next data +* debug +* end service +* +* Service TestLogging() +* Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log' +* ColumnWidths = 20 : @FM : 15 : @FM : 300 +* LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\JonathansTest' +* LogDate = Oconv(Date(), 'D4/') +* LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_ReactorLogPM.csv' +* objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$) +* +* LogData = '' +* LogData<1> = '' +* LogData<2> = '' +* LogData<3> = 'This is a test' +* Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) +* end service +* +* +* Service UpdateYesterdayAvail() +* Today = 20702 +* DataArray = '' +* //ASM Reactors +* ASMRecordKey = 'ASM*': Today +* ASMUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'ASM') +* Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', ASMRecordKey, ASMUptimeRec, True$, False$, True$) +* //HTR Reactors +* HTRRecordKey = 'HTR*': Today +* HTRUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'HTR') +* Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', HTRRecordKey, HTRUptimeRec, True$, False$, True$) +* //EPP Reactors +* EPPRecordKey = 'EPP*': Today +* EPPUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'EPP') +* Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', EPPRecordKey, EPPUptimeRec, True$, False$, True$) +* //All Reactors +* ALLRecordKey = 'ALL*': Today +* ALLUptimeRec = Reactor_Services('GetReactorUptimeMetricsByTypeAndTimeSpan', Today, Today + 1, 'ALL') +* Database_Services('WriteDataRow', 'REACTOR_DAILY_UPTIME', ALLRecordKey, ALLUptimeRec, True$, False$, True$) +* end service +* +* +* +* Service SetReactorMetrics() +* Reactors = Reactor_Services('GetReactorNumbers') +* table = 'REACTOR_LOG' +* for each ReactorNo in Reactors using @FM setting rPos +* LatestTubeChangeRLIDASM = '' +* LatestTubeChangeASMDTM = '' +* LatestSuscChangRLIDASM = '' +* LatestArmChangeIDASM = '' +* LatestSuscChangRLIDHTR = '' +* LatestArmChangeIDHTR = '' +* ReactorType = XLATE('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X') +* +* //Reset all metrics to 0 +* ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* ReactorRec = 0; +* ReactorRec = 0; +* ReactorRec = 0; +* ReactorRec = 0; +* ReactorRec = 0; +* ReactorRec = 0; +* ReactorRec = 0; +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactorRec) +* +* +* Begin Case +* Case ReactorType EQ 'ASM' OR ReactorType EQ 'ASM+' +* //Susceptor 699 +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '699')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* +* CurrTubeBellJarThk = OldReactorRec +* CurrTubeBellJarCnt = OldReactorRec +* CurrSuscThk = OldReactorRec +* CurrSuscWfrCnt = OldReactorRec +* CurrLowerQuartzThk = OldReactorRec +* CurrLowerQuartzWfr = OldReactorRec +* +* // Set values to 0 if blank +* If CurrTubeBellJarThk = '' then CurrTubeBellJarThk = 0 +* If CurrTubeBellJarCnt = '' then CurrTubeBellJarCnt = 0 +* If CurrSuscThk = '' then CurrSuscThk = 0 +* If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 +* If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 +* If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 +* +* RDSNo = RDSRow<1,1> +* TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') +* TargetThickness = OConv(TargetThickness, 'MD3') +* WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') +* ThkAddition = WaferCount * TargetThickness +* NewReactorRec = OldReactorRec +* NewReactorRec = CurrSuscThk + ThkAddition +* NewReactorRec = CurrSuscWfrCnt + WaferCount +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* +* //TubeChange 240 +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '240')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* +* CurrTubeBellJarThk = OldReactorRec +* CurrTubeBellJarCnt = OldReactorRec +* +* // Set values to 0 if blank +* If CurrTubeBellJarThk = '' then CurrTubeBellJarThk = 0 +* If CurrTubeBellJarCnt = '' then CurrTubeBellJarCnt = 0 +* +* RDSNo = RDSRow<1,1> +* TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') +* TargetThickness = OConv(TargetThickness, 'MD3') +* WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') +* ThkAddition = WaferCount * TargetThickness +* NewReactorRec = OldReactorRec +* NewReactorRec = CurrTubeBellJarThk + ThkAddition +* NewReactorRec = CurrTubeBellJarCnt + WaferCount +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* //Arms 21 +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '21')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* CurrArmsWfrCnt = OldReactorRec +* If CurrArmsWfrCnt = '' then CurrArmsWfrCnt = 0 +* RDSNo = RDSRow<1,1> +* WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') +* NewReactorRec = OldReactorRec +* NewReactorRec = CurrArmsWfrCnt + WaferCount +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* Case ReactorType EQ 'HTR' +* //Susceptor 699 +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '699')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* +* CurrSuscThk = OldReactorRec +* CurrSuscWfrCnt = OldReactorRec +* +* // Set values to 0 if blank +* If CurrSuscThk = '' then CurrSuscThk = 0 +* If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 +* +* RDSNo = RDSRow<1,1> +* TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') +* TargetThickness = OConv(TargetThickness, 'MD3') +* WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') +* CntAddition = (WaferCount / 5) +* ThkAddition = (WaferCount / 5) * TargetThickness +* NewReactorRec = OldReactorRec +* NewReactorRec = CurrSuscThk + ThkAddition +* NewReactorRec = CurrSuscWfrCnt + CntAddition +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* +* //TubeChange 1280 +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '1280')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* +* CurrTubeBellJarThk = OldReactorRec +* CurrTubeBellJarCnt = OldReactorRec +* +* // Set values to 0 if blank +* If CurrTubeBellJarThk = '' then CurrTubeBellJarThk = 0 +* If CurrTubeBellJarCnt = '' then CurrTubeBellJarCnt = 0 +* +* RDSNo = RDSRow<1,1> +* TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') +* TargetThickness = OConv(TargetThickness, 'MD3') +* WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') +* CntAddition = (WaferCount / 5) +* ThkAddition = (WaferCount / 5) * TargetThickness +* NewReactorRec = OldReactorRec +* NewReactorRec = CurrTubeBellJarThk + ThkAddition +* NewReactorRec = CurrTubeBellJarCnt + CntAddition +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* +* //Arms 21 +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '21')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* CurrArmsWfrCnt = OldReactorRec +* If CurrArmsWfrCnt = '' then CurrArmsWfrCnt = 0 +* RDSNo = RDSRow<1,1> +* WaferCount = XLATE('RDS', RDSNo, RDS_WAFERS_IN$, 'X') +* NewReactorRec = OldReactorRec +* NewReactorRec = CurrArmsWfrCnt + WaferCount +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* +* Case ReactorType EQ 'EPP' +* +* //BellJar 1092 +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '1092')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* RDSNo = RDSRow<1,1> +* TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') +* TargetThickness = OConv(TargetThickness, 'MD3') +* NewReactorRec = OldReactorRec +* CurrTubeBellJarThk = OldReactorRec +* CurrTubeBellJarCnt = OldReactorRec +* +* // Set values to 0 if blank +* If CurrTubeBellJarThk = '' then CurrTubeBellJarThk = 0 +* If CurrTubeBellJarCnt = '' then CurrTubeBellJarCnt = 0 +* NewReactorRec = CurrTubeBellJarThk + TargetThickness +* NewReactorRec = CurrTubeBellJarCnt + 1 +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* +* +* //1067 Lower Quartz +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '1067')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* RDSNo = RDSRow<1,1> +* TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') +* TargetThickness = OConv(TargetThickness, 'MD3') +* NewReactorRec = OldReactorRec +* CurrLowerQuartzThk = OldReactorRec +* CurrLowerQuartzCnt = OldReactorRec +* +* // Set values to 0 if blank +* If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 +* If CurrLowerQuartzCnt = '' then CurrLowerQuartzCnt = 0 +* NewReactorRec = CurrLowerQuartzThk + TargetThickness +* NewReactorRec = CurrLowerQuartzCnt + 1 +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* +* //699 Susceptor +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '699')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* +* for each RDSRow in RDSList using @FM +* OldReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo) +* RDSNo = RDSRow<1,1> +* TargetThickness = Xlate('RDS', RDSNo, 'THICK_TARGET_TOT', 'X', '') +* TargetThickness = OConv(TargetThickness, 'MD3') +* NewReactorRec = OldReactorRec +* CurrSuscThk = OldReactorRec +* CurrSuscCnt = OldReactorRec +* +* // Set values to 0 if blank +* If CurrSuscThk = '' then CurrSuscThk = 0 +* If CurrSuscCnt = '' then CurrSuscCnt = 0 +* NewReactorRec = CurrSuscThk + TargetThickness +* NewReactorRec = CurrSuscCnt + 1 +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* Next RDSRow +* LatestSusceptorChangeRLID = Reactor_Log_Services('GetLogsByReactorAndServID', ReactorNo, '699')<1,4> +* RLDTM = XLATE('REACTOR_LOG', LatestSusceptorChangeRLID, 'END_DTM', 'X') +* RDSList = Reactor_Services('GetReactorCassLoadHistoryRange', ReactorNo, RLDTM, SRP_Datetime('Now')) +* NewReactorRec = CurrSuscThk + TargetThickness +* NewReactorRec = CurrSuscWfrCnt + 1 +* Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec) +* End Case +* Next ReactorNo +* end service +* +* Service LaunchWindow() +* Start_Window('NDW_VIEW_TEST_RUN','', '10000001') +* end service +* +* Service GetTestRunObj(TestRunID) +* debug +* TestRunObj = '' +* TestRunRec = Test_Run_Services('GetTestRunById', TestRunID) +* //Start getting translated values for object +* RunDTM = OConv(TestRunRec, 'DT') +* ReasonForTest = Xlate('TEST_RUN_TYPE', TestRunRec, TEST_RUN_TYPE_RUN_TYPE$, 'X') +* RelatedRDS = TestRunRec +* RelatedPSN = TestRunRec +* EqpType = TestRunRec +* EqpID = TestRunRec +* TWKeys = TestRunRec +* TWUsageProds = '' +* TWUsageQtys = '' +* for each TWKey in TWKeys using @VM setting tPos +* TRWRec = Test_Run_Services('GetTestRunWaferByID', TWKey) +* TestWaferProdName = XLATE('TEST_WAFER_PROD', TRWRec, TEST_WAFER_PROD_PART_NAME$, 'X') +* Locate TestWaferProdName in TWUsageProds setting iPos then +* TWUsageProds<1,iPos> = TestWaferProdName +* TWUsageQtys<1,iPos> = TWUsageQtys<1,iPos> + 1 +* end else +* TWUsageProds<1,-1> = TestWaferProdName +* TWUsageQtys<1,-1> = 1 +* end +* Next TWKey +* end service +* +* Service WFR_STATUS(WMOKey) +* +* Result = '' +* WfrStatus = '' +* WMOSlots = Xlate('WM_OUT', WMOKey, 'RDS', 'X') +* WMOZoneProfile = Xlate('WM_OUT', WMOKey, WM_OUT_ZONE$, 'X') +* WMORDSTestKeys = XLATE('WM_OUT', WMOKey, 'CASS_RDS_MET_KEYS', 'X') +* for each RDSNo in WMOSlots using @VM setting sPos +* +* ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo) +* SlotZone = Xlate('WM_OUT', WMOKey, WM_OUT_ZONE$, 'X')<1, sPos> +* //Get the RDS_Test for this slot. +* //Find the right RDS Test Key +* ThisSlotRDSTestKeys = '' +* for each RDSTestKey in WMORDSTestKeys using @VM +* RDSTestRec = Database_Services('ReadDataRow', 'RDS_TEST', RDSTestKey) +* If RDSTestRec EQ SlotZone AND RDSTestRec EQ RDSNo then +* ThisSlotRDSTestKeys<1, -1> = RDSTestKey +* +* end +* +* Next RDSTestKey +* RDSTestDataEntered = XLATE('RDS_TEST', ThisSlotRDSTestKeys, 'MET_ENTERED', 'X') +* If RDSTestDataEntered NE '' then +* Locate False$ in RDSTestDataEntered using @VM setting iPos then Result = 'ULMET' else +* MetOutOfSpec = Sum(Xlate('RDS_TEST', ThisSlotRDSTestKeys, 'OUT_OF_SPEC', 'X')) +* If MetOutOfSpec then +* //Check for an NCR +* SlotNcr = Xlate('WM_OUT', WMOKey, 'WM_OUT_SLOT_NCR', 'X')<1, sPos> +* If SlotNcr NE '' then +* MetOutOfSpec = False$ +* end +* end +* If MetOutOfSpec then +* Result = 'SPEC' +* end else +* Result = 'ULOAD' +* end +* end +* end else +* Result = 'ULMET' +* end +* +* WfrStatus = Result +* Next RDSNo +* debug +* end service +* +* Service Test() +* Debug +* RDSTestKeys = XLATE('WM_OUT', '172172*1*10', 'CASS_RDS_MET_KEYS', 'X') +* TestDataEntered = XLATE('RDS_TEST', RDSTestKeys, 'MET_ENTERED', 'X') +* //WMOWafers = XLATE('WM_OUT', '172172*1*10', 'WFR_STATUS', 'X') +* end service +* +* Service TestEquates() +* debug +* test = WO_MAT_MAKEUP_BOX$ +* end service +* +* Service GetWWInfo() +* debug +* WWInfo = Date_Services('GetWeekNum', '20345.12345') +* end service +* +* Service PMINformation() +* +* end service +* +* Service RGBToInt() +* debug +* R = 242 +* G = 156 +* B = 63 +* IntegerVal = (B * 65536) + (G * 256) + R +* end service +* +* Service TestPMMFS() +* Debug +* +* PMRec = Database_Services('ReadDataRow', 'PM', '10115') +* Late = XLATE('PM', '10115', 'LATE', 'X') +* SchedQty = XLATE('PM_SPEC', PMRec, 'LATE_START_QTY', 'X') +* CompQty = PMRec +* +* end service +* +* Service AddComments() +* debug +* Response = Dialog_Box('NDW_ADD_COMMENT', @WINDOW) +* end service +* +* Service Get5SPMs() +* test = Pm_Services('Get5SPMs', True$) +* end service +* +* +* Service GetOnShiftSupervisor() +* debug +* Response = Lsl_Users_Services('GetShiftByDate', '8/23/2023 06:00') +* end service +* +* Service TriggerCassComp(WOMatKey) +* debug +* SAP_Services('AddCassCompTransaction', WOMatKey) +* end service +* +* Service TestGRProps(WOMatKey) +* *172174 +* *1 +* debug +* WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) +* GRProps = obj_WO_Mat('GetGRProps',WOMatKey:@RM:WOMatRec) +* +* end service +* +* Service TriggerScrap(WorkOrderNo, CassNo, TransQty) +* //172172 +* //1 +* //2 +* obj_SAP('AddTransaction','SCRAP_IN':@RM:WorkOrderNo:@RM:CassNo:@RM:TransQty) +* end service +* +* Service TriggerBatchMove +* +* end service +* +* Service TestOEE +* keyId = '20259*35*5117*U442' +* stopDTM = XLATE('DAILY_PERFORMANCE_REPORT', keyId, 'STOP_DTM', 'X') +* OEE = XLATE('DAILY_PERFORMANCE_REPORT', keyId, 'OEE_CALCULATION', 'X') +* Response = OEE +* end service +* +* Service TestZero() +* debug +* ShouldBeZero = 1 - 1 +* end service +* +* Service IsRDSMetOutOfSpec(RDSNo) +* debug +* *RDSNo = '586181' +* RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) +* RDSWaferZones = RDSRec +* ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X') +* IsEpiPro = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X') EQ 'EPP' +* LSKeys = XLATE('REACT_RUN',RDSNo, REACT_RUN_RDS_LAYER_KEYS$, 'X') +* for each LayerSpecKey in LSKeys using @VM setting lPos +* LSRec = Database_Services('ReadDataRow', 'RDS_LAYER', LayerSpecKey) +* IsMetOOS = XLATE('RDS_LAYER',LayerSpecKey,'TEST_OUT_OF_SPEC','X')<1, lPos> +* IF IsMetOOS then +* If IsEpiPro then +* RDSTestKey = LSRec +* RDSTestZone = XLate('RDS_TEST', RDSTestKey, RDS_TEST_ZONE$, 'X') +* RDSTestLayer = XLate('RDS_TEST', RDSTestKey, RDS_TEST_LS_ID$, 'X') +* WafersInZone = '' +* +* for each WaferZone in RDSWaferZones using @VM setting wPos +* If WaferZone EQ RDSTestZone then +* WafersInZone<-1> = wPos +* end +* Next WaferZone +* Response = RDSTestLayer : ' Zone ' : RDSTestZone : ' Out of Spec' +* end else +* Response = 'Out of Spec' +* end +* end +* +* Next LayerSpec +* TestOutOfSpec = XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X') +* MetOutOfSpec = SUM(XLATE('RDS_LAYER',LSKeys,'TEST_OUT_OF_SPEC','X')) +* +* +* +* end service +* +* +* Service TestCOMB_Status() +* debug +* +* +* RDSNo = '586181' +* RDSWOMatKey = XLATE('RDS', RDSNo, 'WO_MAT_KEY', 'X') +* WOMatRepStatus = XLATE('WO_MAT',RDSWOMatKey,'REP_STATUS','X') +* RunStatus = XLATE('REACT_RUN',RDSNo,'RUN_STATUS','X') +* RunStatus = OCONV(RunStatus,'[RUN_STATUS_CONV]') +* Ans = '' +* BEGIN CASE +* CASE WOMatRepStatus NE '' AND RunStatus NE '' +* Ans = WOMatRepStatus +* +* CASE WOMatRepStatus = '' AND RunStatus NE '' +* Ans = RunStatus +* +* CASE WOMatRepStatus NE '' AND RunStatus = '' +* Ans = WOMatRepStatus +* +* CASE 1 +* Ans = '' +* END CASE +* CombStatus = Xlate('RDS', RDSNo, 'COMB_STATUS', 'X') +* Response = CombStatus +* end service +* +* Service TestChatGPT() +* Stop +* end service +* +* Service getWOMat() +* debug +* effectedCassettes = '' +* for WONo = 171809 to 172010 +* for CassNo = 1 to 99 +* WOMatKey = WONo : '*' : CassNo +* WOMatQaRec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey) +* Profiles = WOMatQaRec +* DataPoints = WOMatQARec +* For each Profile in Profiles using @VM setting ProfIndex +* If Profile EQ '1THICK_ONLY' then +* +* List = DataPoints<1, ProfIndex> +* IF DCOUNT(List, @SVM) LT 5 AND DCOUNT(List, @SVM) GT 0 then +* debug +* EffectedCassettes<-1> = WOMatKey : ',' : XLATE('WO_MAT', WOMatKey, 'RDS_NO', 'X') : CRLF$ +* end +* end +* +* Next Profile +* +* +* Next CassNo +* Next WONo +* OSWrite effectedCassettes To 'C:\users\ecouellette\desktop\effectedCassettes.csv' +* end service +* +* Service ChangeCustNoByWO(WONo, NewCustNo, NewProdVerNo, NewPSNo) +* // Update WO_LOG record +* WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo) +* If Error_Services('NoError') then +* WOLogRec = NewCustNo +* WOLogRec = NewProdVerNo +* Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, True$, False$, True$) +* If Error_Services('NoError') then +* WOStepKey = WONo:'*1' +* // Update WO_STEP record +* WOStepRec = Database_Services('ReadDataRow', 'WO_STEP', WOStepKey) +* If Error_Services('NoError') then +* WOStepRec = NewPSNo +* Database_Services('WriteDataRow', 'WO_STEP', WOStepKey, WOStepRec, True$, False$, True$) +* If Error_Services('NoError') then +* // Update RDS Keys +* RDSKeys = Xlate('WO_STEP', WOStepKey, 'RDS_KEY', 'X') +* If RDSKeys NE '' then +* For each RDSKey in RDSKeys using @VM setting vPos +* RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey) +* If Error_Services('NoError') then +* RDSRec = NewCustNo +* RDSRec = NewPSNo +* Database_Services('WriteDataRow', 'RDS', RDSKey, RDSRec, True$, False$, True$) +* end +* Until Error_Services('HasError') +* Next RDSKey +* end +* end +* end +* end +* end +* If Error_Services('HasError') then +* Error_Services('DisplayError') +* end +* +* return +* end service +* +* Service GetRDSMovesByDays(Day, FilePath) +* +* SelectSent = 'SELECT RDS WITH DATE_OUT EQ ':QUOTE(Day) +* Set_Status(0) +* RList(SelectSent, TARGET_ACTIVELIST$, "", "", "") +* +* +* rdsArray = '' +* IF @RecCount then +* EoF = 0 +* NumKeys = @RecCount +* Cnt = 0 +* +* Loop +* ReadNext rds Else EoF = 1 +* until EoF +* rdsMoves = XLATE('RDS', rds, 'WAFERS_IN', 'X') +* rdsArray := rds : ',' : rdsMoves : CRLF$ +* Repeat +* +* end +* OSWrite rdsArray to FilePath +* ClearSelect TARGET_ACTIVELIST$ +* end service +* +* Service DetermineNearShiftChange +* debug +* +* CurrTime = 64320 +* CurrHour = SRP_TIME('Hour', CurrTime) +* end service +* +* Service OutPutSchedule(StartDate, EndDate) +* debug +* OutputData = '' +* StartDateConv = IConv(StartDate, 'D') +* EndDateConv = IConv(EndDate, 'D') +* +* for i = StartDateConv to EndDateConv +* //DayStartDTM = i : '.' : 21600 +* //NightStartDTM = i : '.' : 64800 +* DayStartDTM = SRP_Datetime('AddHours', i, 7) +* NightStartDTM = SRP_Datetime('AddHours', i, 18) +* +* DayShift = Lsl_Users_Services('GetShiftByDate', OCONV(DayStartDTM, 'DT'))<1,1> +* NightShift = Lsl_Users_Services('GetShiftByDate', OCONV(NightStartDTM, 'DT'))<1,1> +* OutputData := OConv(i, 'D4/H') : ',' : DayShift : ' and ' : NightShift : CRLF$ +* Next i +* OSWrite OutputData to 'C:\Users\MESOuellette\Desktop\ShiftCalendar.csv' +* end service +* +* Service TestMassDates() +* OutputData = '' +* ExpectedCalRec = Database_Services('ReadDataRow', 'SYSLISTS', 'CAL_EXPECTED') +* for i = 1 to DCOUNT(ExpectedCalRec<1>, @VM) +* Dtm = ExpectedCalRec<1, i> +* ExpectedShift = ExpectedCalRec<2, i> +* ReturnedShift = Lsl_Users_Services('GetShiftByDate', Dtm)<1,1> +* Pass = (ExpectedShift EQ ReturnedShift) +* +* ExpectedCalRec<3,i> = ReturnedShift +* ExpectedCalRec<4,i> = Pass +* OutputData := Dtm : ',' : ExpectedShift : ',' : ReturnedShift : ',' : Pass : CRLF$ +* Next i +* OSWrite OutputData to 'C:\Users\MESOuellette\Desktop\CalDataTestResults.csv' +* end service +* +* Service TestShiftCalendar +* debug +* shiftCalData = '' +* for date = 20090 to 20454 +* +* DayShift = SRP_Datetime('AddHours', date, 12) +* NightShift = SRP_Datetime('AddHours', DayShift, 11) +* +* OnShiftDay = Lsl_Users_Services('GetShiftByDate', OCONV(DayShift, 'DT'), 1) +* OnShiftNight = Lsl_Users_Services('GetShiftByDate', OCONV(NightShift, 'DT'), 1) +* ShiftCalData := OCONV(DayShift, 'DT') : ',' : OnShiftDay<1,1> : ',' : OnShiftNight : CRLF$ +* Next date +* +* OSWrite shiftCalData to 'C:\Users\MESOuellette\Desktop\CalData.csv' +* end service +* +* Service GetInboundPending +* debug +* rv = Set_Status(0) +* LookBack = 15 /* Days */ +* StartDate = OCONV(Date()-LookBack, 'D4/') +* SelectStatement = "SELECT WO_MAT WITH SAP_TX_DT >= ": Quote(StartDate) :" AND WITHOUT SAP_BATCH_NO" +* RowCount = 0 +* SelectStatement = "SELECT WO_MAT WITH SAP_BATCH_NO EQ ''" +* RList(SelectStatement, 5) +* If @List_Active EQ 3 then +* SelectStatement = "SELECT WO_MAT WITH SAP_TX_DT >= ": Quote(StartDate) +* RList(SelectStatement, 5) +* If @List_Active EQ 3 then +* EOF = False$ +* Loop +* ReadNext KeyID else EOF = True$ +* Until EOF +* WOMatRow = Database_Services('ReadDataRow', 'WO_MAT', KeyID) +* If WOMatRow<87> EQ '' then RowCount += 1 +* Repeat +* end +* end +* end service +* +* Service CheckForNew() +* +* Response = True$ +* if xlate( 'NOTE_PTRS', @user4, 'NEW_MESSAGES', 'X' ) then +* NotePtrRec = xlate( 'NOTE_PTRS', @user4, '', 'X' ) +* LOCATE 'Yes' in NotePtrRec using @VM setting mPos then +* * the top one is new meaning they got a new one +* Response = True$ +* end else +* Response = False$ +* end +* end +* end service +* +* Service GetNewNotes() +* debug +* void = Jonathan_Services('CheckForNew') +* end service +* +* Service TestGit() +* debug +* end service +* +* Service TestMessages() +* debug +* if xlate( 'NOTE_PTRS', @user4, 'NEW_MESSAGES', 'X' ) then +* NotePtrRec = xlate( 'NOTE_PTRS', @user4, '', 'X' ) +* if NotePtrRec = 'Yes' then +* * the top one is new meaning they got a new one +* MsgInfo = '' +* MsgInfo = '!' +* Mtext = 'You have a new message from ':NotePtrRec:'.' +* MsgInfo = MText +* MsgInfo = -2 +* MsgInfo = -2 +* Void = msg( '', MsgInfo ) +* end +* end +* +* NotesSent = obj_Notes_Sent('GetUserKeys','LEHRICH') +* NewMessages = XLATE('NOTE_PTRS','LEHRICH','NEW_MESSAGES','X') +* //NotesSent = obj_Notes_Sent('GetUserKeys','JONATHAN_O') +* IF NotesSent NE '' OR NewMessages > 0 THEN +* Start_Window( 'NOTE_PTRS', @WINDOW, '*CENTER', '', '' ) +* END +* end service +* +* Service GetSAPYield +* debug +* counts = Gan_Services('GetYieldInfo', 223271 , '') +* end service +* +* Service DoSomething() +* +* Response = "Hello, World!" +* +* End Service +* +* Service DoSomethingWithParameters(Input, Ref Output) +* +* Output = Input:", World!" +* +* End Service + -Service DoSomethingWithParameters(Input, Ref Output) - - Output = Input:", World!" - -End Service diff --git a/LSL2/STPROC/LOCK_SERVICES.txt b/LSL2/STPROC/LOCK_SERVICES.txt index 380ef5b..1b89abf 100644 --- a/LSL2/STPROC/LOCK_SERVICES.txt +++ b/LSL2/STPROC/LOCK_SERVICES.txt @@ -1,372 +1,374 @@ -Compile function Lock_Services(@Service, @Params) -/*********************************************************************************************************************** - - Name : Lock_Services - - Description : Handler program for all Lock services. - - Notes : Application errors should be logged using the Error Services module. There are a few methodological - assumptions built into way errors are managed which are important to understand in order to properly - work with Error Services: - - - The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to - the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger - this will appear backwards since the originating procedure always appears at the bottom of the - list and the current routine appears at the top of the list. We are using this orientation because - it is common to refer to the process of calling other procedures as 'drilling down'. - - - The reason for defining the orientation of the call stack is because Error_Services allows for - multiple error conditions to be appended to an original error. In most cases this will happen when - a procedure at the bottom of the stack generates an error condition and then returns to its - calling procedure. This higher level procedure can optionally add more information relevant to - itself. This continues as the call stack 'bubbles' its way back to the top to where the - originating procedure is waiting. - - - Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus) - preserve their error state until explicitly cleared. This can hinder the normal execution of code - since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists. - Our philosophy is that error conditions should automatically be cleared before a new procedure - is executed to avoid this problem. However, the nature of Basic+ does not make this easy to - automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our - philosophy then it should include a call into the 'Clear' service request at the top of the - program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.) - - - Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any - error conditions that were set before. - - Parameters : - Service [in] -- Name of the service being requested - Param1-10 [in/out] -- Additional request parameter holders - Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure - - Metadata : - - History : (Date, Initials, Notes) - 3/18/24 djm Original programmer. - -***********************************************************************************************************************/ -#pragma precomp SRP_PreCompiler -$insert LOGICAL -$Insert SERVICE_SETUP -$Insert UNLOCK_REQUESTS_EQUATES -$Insert REACT_RUN_EQUATES -$Insert WO_MAT_EQUATES -$Insert WM_OUT_EQUATES -$Insert RDS_EQUATES -$Insert RDS_LAYER_EQUATES - -Declare function Database_Services, Oi_Wizard_Services, Memberof, Lock_Services, SRP_Json, List_Volume_Sub, Datetime -Declare subroutine SRP_Json, Database_Services - - -GoToService - -Return Response or "" - -//----------------------------------------------------------------------------- -// SERVICES -//----------------------------------------------------------------------------- - - -//---------------------------------------------------------------------------------------------------------------------- -// GetLockPermissions -// -// CurrUser - [Required] -// -// Returns LockPermissionLevel 0 - No lock access, 1 - Lock access to unprotected tables, or 2 - Lock access to all tables. -// -//---------------------------------------------------------------------------------------------------------------------- -Service GetLockPermissions(CurrUser) - - LockPermissionLevel = 0 - OIAdmin = Memberof(CurrUser, 'OI_ADMIN') - SupervisorLead = MemberOf(CurrUser, 'LEAD') OR MemberOf(CurrUser, 'SUPERVISOR') - If OIAdmin then - LockPermissionLevel = 2 - end else - If SupervisorLead then - LockPermissionLevel = 1 - end - end - Response = LockPermissionLevel - -End Service - - -//---------------------------------------------------------------------------------------------------------------------- -// GetAllowedLocks -// -// CurrUser - [Required] -// -// Returns an array of accessible locks based on user LockPermissionLevel -// -//---------------------------------------------------------------------------------------------------------------------- -Service GetAllowedLocks(CurrUser) - - LockPermissionLevel = Lock_Services('GetLockPermissions', CurrUser) - LockJSON = '' - - If LockPermissionLevel NE 0 then - - LockList = Database_Services('GetUserLocks') - If Error_Services('NoError') then - If SRP_JSON(objJSON, 'New', 'Object') then - If SRP_JSON(LockArray, 'New', 'Array') then - For each Row in LockList using @FM setting fPos - If Row<0,3> = "Rev30536" then Row<0,3> = 'RDS*LSL2' - If Field(Row<0,3>, "*", 2) EQ 'LSL2' OR LockPermissionLevel EQ 2 then - If SRP_JSON(objRow, 'New', 'Object') then - SRP_JSON(objRow, 'SetValue', 'ComputerName', Row<0, 1>) - SRP_JSON(objRow, 'SetValue', 'Volume', Row<0, 2>) - If Field(Row<0,3>, "*", 2) EQ 'LSL2' then Row<0,3> = Field(Row<0,3>, "*", 1) - SRP_JSON(objRow, 'SetValue', 'OSFile', Row<0, 3>) - SRP_JSON(objRow, 'SetValue', 'RecordKey', Row<0, 4>, "String") - SRP_JSON(objRow, 'SetValue', 'Exclusive', Row<0, 5>) - SRP_JSON(objRow, 'SetValue', 'REVFile', Row<0, 6>) - SRP_JSON(LockArray, 'Add', objRow) - SRP_JSON(objRow, 'Release') - end - End - Next Row - SRP_JSON(objJSON, 'Set', 'Locks', LockArray) - SRP_JSON(LockArray, 'Release') - end - LockJSON = SRP_JSON(objJSON, 'Stringify', 'Styled') - SRP_JSON(objJSON, 'Release') - end - end - End - - Response = LockJSON - -End Service - -//---------------------------------------------------------------------------------------------------------------------- -// AttemptUnlock -// -// CurrUser - [Required] -// LotType - [Required] -// Key - [Required] -// -// Returns either 1 for success, or error message -// -//---------------------------------------------------------------------------------------------------------------------- - -Service AttemptUnlock(CurrUser, LotType, Key) - - LockPermissionLevel = Lock_Services('GetLockPermissions', CurrUser) - If LockPermissionLevel NE 0 then - If LotType EQ 'RDS' or LotType EQ 'WM_OUT' then - If Xlate(LotType, Key, '', 'X', '') NE '' then - LockArray = Lock_Services('GetChildRecords', LotType, Key) - LockCount = DCount(LockArray<1>, @VM) - For I = 1 to LockCount - Table = LockArray<1,I> - KeyID = LockArray<2,I> - Resp = Database_Services('UnlockKeyID', Table, KeyID) - Next I - If Error_Services('NoError') Then - Response = TRUE$ - end else - Response = FALSE$ - Error_Services('Add', 'Records failed to unlock.') - end - end else - Response = FALSE$ - Error_Services('Add', 'This record does not exist.') - end - End Else - Response = FALSE$ - Error_Services('Add', 'LotType must be either RDS or WM_OUT.') - end - end else - Response = FALSE$ - Error_Services('Add', 'User is not permitted to access this resource.') - end - -End Service - - -//---------------------------------------------------------------------------------------------------------------------- -// GetChildRecords -// -// LotType - [Required] -// Key - [Required] -// -// Returns an array of associated child records for unlocking -// -//---------------------------------------------------------------------------------------------------------------------- - -Service GetChildRecords(LotType, Key) - - RecordArray = '' - - Begin Case - - Case LotType EQ 'RDS' - RDSRec = Xlate('RDS', Key, '', 'X', '') - If RDSRec NE '' then - //Add RDS key - RecordArray<1> = LotType - RecordArray<2> = Key - //Get REACT_RUN record - ReactRunRec = Xlate('REACT_RUN', Key, '', 'X', '') - //Get and Add CLEAN_INSP keys - CINos = ReactRunRec - If CINos NE '' then - CICount = Dcount(CINos, @VM) - For I = 1 to CICount - If CINos NE '' then - RecordArray<1,-1> = 'CLEAN_INSP' - RecordArray<2,-1> = CINos - end - Next I - end - //Get and Add RDS_TEST keys - RDSLayerKeys = ReactRunRec - If RDSLayerKeys NE '' then - LayerKeyCount = DCount(RDSLayerKeys, @VM) - For K = 1 to LayerKeyCount - RDSTestKeys = Xlate('RDS_LAYER', RDSLayerKeys, 'RDS_TEST_KEYS', 'X', '') - If RDSTestKeys NE '' then - RDSTestCount = DCount(RDSTestKeys, @VM) - For L = 1 to RDSTestCount - If RDSTestKeys NE '' then - RecordArray<1,-1> = 'RDS_TEST' - RecordArray<2,-1> = RDSTestKeys - end - Next L - end - Next K - end - //Get WO_MAT key - WONo = RDSRec - CassNo = RDSRec - WOMatKey = WONo : '*' : CassNo - //Get and Add WO_MAT_QA - WOMatQA = Xlate('WO_MAT_QA', WOMatKey, '', 'X', '') - If WOMatQA NE '' then - RecordArray<1,-1> = 'WO_MAT_QA' - RecordArray<2,-1> = WOMatKey - End - //Get and Add NCR keys - NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X', '') - If NCRKeys NE '' then - NCRCount = Dcount(NCRKeys, @VM) - For J = 1 to NCRCount - If NCRKeys NE '' then - RecordArray<1,-1> = 'NCR' - RecordArray<2,-1> = NCRKeys - end - Next J - end - end else - Error_Services('Add', 'This RDS does not exist.') - Return - end - - Case LotType EQ 'WM_OUT' - WMOutRec = Xlate('WM_OUT', Key, '', 'X', '') - If WMOutRec NE '' then - //Add WM_OUT key - RecordArray<1> = LotType - RecordArray<2> = Key - //Get and Add CLEAN_INSP keys - CINos = WMOutRec - If CINos NE '' then - CICount = Dcount(CINos, @VM) - For I = 1 to CICount - If CINos NE '' then - RecordArray<1,-1> = 'CLEAN_INSP' - RecordArray<2,-1> = CINos - end - Next I - end - //Get WO_MAT key - WONo = FIELD(Key,'*',1) - CassNo = FIELD(Key,'*',3) - WOMatKey = WONo : '*' : CassNo - //Get and Add WO_MAT_QA key - WOMatQA = Xlate('WO_MAT_QA', WOMatKey, '', 'X', '') - If WOMatQA NE '' then - RecordArray<1,-1> = 'WO_MAT_QA' - RecordArray<2,-1> = WOMatKey - End - //Get and Add NCR keys - NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X', '') - If NCRKeys NE '' then - NCRCount = Dcount(NCRKeys, @VM) - For J = 1 to NCRCount - If NCRKeys NE '' then - RecordArray<1,-1> = 'NCR' - RecordArray<2,-1> = NCRKeys - end - Next J - end - end else - Error_Services('Add', 'This WM_OUT does not exist.') - end - - Case OTHERWISE$ - Error_Services('Add', 'LotType must be either RDS or WM_OUT.') - return - - End Case - - If RecordArray NE '' then - Response = RecordArray - end - -End Service - - -//---------------------------------------------------------------------------------------------------------------------- -// GetUnprotectedTables -// -// Returns an array of unprotected tables -// -//---------------------------------------------------------------------------------------------------------------------- -Service GetUnprotectedTables() - - TableArray = List_Volume_Sub('LSL', '', 'TABLE_NAME', 'TABLE_NAME') - UnprotectedArray = '' - For Each Table in TableArray Using @FM - If Table[1,1] NE '!' AND Table[1,5] NE 'DICT.' then - UnprotectedArray<-1> = Table - end - Next Table - - Response = UnprotectedArray - -End Service - - - - - -//---------------------------------------------------------------------------------------------------------------------- -// LogUnlockRequest -// -// CurrUser - [Required] -// TableName - [Required] -// RecordKey - [Required] -// Success - [Required] -// -// Creates an UNLOCK_REQUESTS record to log unlock attempts. -// -//---------------------------------------------------------------------------------------------------------------------- -Service LogUnlockRequest(TableName, RecordKey, CurrUser, Success) - - NewRequestRec = '' - CurrDateTime = Datetime() - RecordID = CurrDateTime :'*': TableName - NewRequestRec = RecordKey - NewRequestRec = CurrUser - NewRequestRec = Success - Database_Services('WriteDataRow', 'UNLOCK_REQUESTS', RecordID, NewRequestRec, 1, 0, 0) - -End Service - - - - +Compile function Lock_Services(@Service, @Params) +/*********************************************************************************************************************** + + Name : Lock_Services + + Description : Handler program for all Lock services. + + Notes : Application errors should be logged using the Error Services module. There are a few methodological + assumptions built into way errors are managed which are important to understand in order to properly + work with Error Services: + + - The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to + the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger + this will appear backwards since the originating procedure always appears at the bottom of the + list and the current routine appears at the top of the list. We are using this orientation because + it is common to refer to the process of calling other procedures as 'drilling down'. + + - The reason for defining the orientation of the call stack is because Error_Services allows for + multiple error conditions to be appended to an original error. In most cases this will happen when + a procedure at the bottom of the stack generates an error condition and then returns to its + calling procedure. This higher level procedure can optionally add more information relevant to + itself. This continues as the call stack 'bubbles' its way back to the top to where the + originating procedure is waiting. + + - Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus) + preserve their error state until explicitly cleared. This can hinder the normal execution of code + since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists. + Our philosophy is that error conditions should automatically be cleared before a new procedure + is executed to avoid this problem. However, the nature of Basic+ does not make this easy to + automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our + philosophy then it should include a call into the 'Clear' service request at the top of the + program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.) + + - Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any + error conditions that were set before. + + Parameters : + Service [in] -- Name of the service being requested + Param1-10 [in/out] -- Additional request parameter holders + Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure + + Metadata : + + History : (Date, Initials, Notes) + 3/18/24 djm Original programmer. + +***********************************************************************************************************************/ +#pragma precomp SRP_PreCompiler +$insert LOGICAL +$Insert SERVICE_SETUP +$Insert UNLOCK_REQUESTS_EQUATES +$Insert REACT_RUN_EQUATES +$Insert WO_MAT_EQUATES +$Insert WM_OUT_EQUATES +$Insert RDS_EQUATES +$Insert RDS_LAYER_EQUATES + +Declare function Database_Services, Oi_Wizard_Services, Memberof, Lock_Services, SRP_Json, List_Volume_Sub, Datetime +Declare subroutine SRP_Json, Database_Services + + +GoToService + +Return Response or "" + +//----------------------------------------------------------------------------- +// SERVICES +//----------------------------------------------------------------------------- + + +//---------------------------------------------------------------------------------------------------------------------- +// GetLockPermissions +// +// CurrUser - [Required] +// +// Returns LockPermissionLevel 0 - No lock access, 1 - Lock access to unprotected tables, or 2 - Lock access to all tables. +// +//---------------------------------------------------------------------------------------------------------------------- +Service GetLockPermissions(CurrUser) + + LockPermissionLevel = 0 + OIAdmin = Memberof(CurrUser, 'OI_ADMIN') + SupervisorLead = MemberOf(CurrUser, 'LEAD') OR MemberOf(CurrUser, 'SUPERVISOR') + If OIAdmin then + LockPermissionLevel = 2 + end else + If SupervisorLead then + LockPermissionLevel = 1 + end + end + Response = LockPermissionLevel + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetAllowedLocks +// +// CurrUser - [Required] +// +// Returns an array of accessible locks based on user LockPermissionLevel +// +//---------------------------------------------------------------------------------------------------------------------- +Service GetAllowedLocks(CurrUser) + + LockPermissionLevel = Lock_Services('GetLockPermissions', CurrUser) + LockJSON = '' + + If LockPermissionLevel NE 0 then + + LockList = Database_Services('GetUserLocks') + If Error_Services('NoError') then + If SRP_JSON(objJSON, 'New', 'Object') then + If SRP_JSON(LockArray, 'New', 'Array') then + For each Row in LockList using @FM setting fPos + If Row<0,3> = "Rev30536" then Row<0,3> = 'RDS*LSL2' + If Field(Row<0,3>, "*", 2) EQ 'LSL2' OR LockPermissionLevel EQ 2 then + If SRP_JSON(objRow, 'New', 'Object') then + SRP_JSON(objRow, 'SetValue', 'ComputerName', Row<0, 1>) + SRP_JSON(objRow, 'SetValue', 'Volume', Row<0, 2>) + If Field(Row<0,3>, "*", 2) EQ 'LSL2' then Row<0,3> = Field(Row<0,3>, "*", 1) + SRP_JSON(objRow, 'SetValue', 'OSFile', Row<0, 3>) + SRP_JSON(objRow, 'SetValue', 'RecordKey', Row<0, 4>, "String") + SRP_JSON(objRow, 'SetValue', 'Exclusive', Row<0, 5>) + SRP_JSON(objRow, 'SetValue', 'REVFile', Row<0, 6>) + SRP_JSON(LockArray, 'Add', objRow) + SRP_JSON(objRow, 'Release') + end + End + Next Row + SRP_JSON(objJSON, 'Set', 'Locks', LockArray) + SRP_JSON(LockArray, 'Release') + end + LockJSON = SRP_JSON(objJSON, 'Stringify', 'Styled') + SRP_JSON(objJSON, 'Release') + end + end + End + + Response = LockJSON + +End Service + +//---------------------------------------------------------------------------------------------------------------------- +// AttemptUnlock +// +// CurrUser - [Required] +// LotType - [Required] +// Key - [Required] +// +// Returns either 1 for success, or error message +// +//---------------------------------------------------------------------------------------------------------------------- + +Service AttemptUnlock(CurrUser, LotType, Key) + + LockPermissionLevel = Lock_Services('GetLockPermissions', CurrUser) + If LockPermissionLevel NE 0 then + If LotType EQ 'RDS' or LotType EQ 'WM_OUT' then + If Xlate(LotType, Key, '', 'X', '') NE '' then + LockArray = Lock_Services('GetChildRecords', LotType, Key) + LockCount = DCount(LockArray<1>, @VM) + For I = 1 to LockCount + Table = LockArray<1,I> + KeyID = LockArray<2,I> + Resp = Database_Services('UnlockKeyID', Table, KeyID) + Next I + If Error_Services('NoError') Then + Response = TRUE$ + end else + Response = FALSE$ + Error_Services('Add', 'Records failed to unlock.') + end + end else + Response = FALSE$ + Error_Services('Add', 'This record does not exist.') + end + End Else + Response = FALSE$ + Error_Services('Add', 'LotType must be either RDS or WM_OUT.') + end + end else + Response = FALSE$ + Error_Services('Add', 'User is not permitted to access this resource.') + end + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetChildRecords +// +// LotType - [Required] +// Key - [Required] +// +// Returns an array of associated child records for unlocking +// +//---------------------------------------------------------------------------------------------------------------------- + +Service GetChildRecords(LotType, Key) + + RecordArray = '' + + Begin Case + + Case LotType EQ 'RDS' + RDSRec = Xlate('RDS', Key, '', 'X', '') + If RDSRec NE '' then + //Add RDS key + RecordArray<1> = LotType + RecordArray<2> = Key + //Get REACT_RUN record + ReactRunRec = Xlate('REACT_RUN', Key, '', 'X', '') + //Get and Add CLEAN_INSP keys + CINos = ReactRunRec + If CINos NE '' then + CICount = Dcount(CINos, @VM) + For I = 1 to CICount + If CINos NE '' then + RecordArray<1,-1> = 'CLEAN_INSP' + RecordArray<2,-1> = CINos + end + Next I + end + //Get and Add RDS_TEST keys + RDSLayerKeys = ReactRunRec + If RDSLayerKeys NE '' then + LayerKeyCount = DCount(RDSLayerKeys, @VM) + For K = 1 to LayerKeyCount + RDSTestKeys = Xlate('RDS_LAYER', RDSLayerKeys, 'RDS_TEST_KEYS', 'X', '') + If RDSTestKeys NE '' then + RDSTestCount = DCount(RDSTestKeys, @VM) + For L = 1 to RDSTestCount + If RDSTestKeys NE '' then + RecordArray<1,-1> = 'RDS_TEST' + RecordArray<2,-1> = RDSTestKeys + end + Next L + end + Next K + end + //Get WO_MAT key + WONo = RDSRec + CassNo = RDSRec + WOMatKey = WONo : '*' : CassNo + //Get and Add WO_MAT_QA + WOMatQA = Xlate('WO_MAT_QA', WOMatKey, '', 'X', '') + If WOMatQA NE '' then + RecordArray<1,-1> = 'WO_MAT_QA' + RecordArray<2,-1> = WOMatKey + End + //Get and Add NCR keys + NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X', '') + If NCRKeys NE '' then + NCRCount = Dcount(NCRKeys, @VM) + For J = 1 to NCRCount + If NCRKeys NE '' then + RecordArray<1,-1> = 'NCR' + RecordArray<2,-1> = NCRKeys + end + Next J + end + end else + Error_Services('Add', 'This RDS does not exist.') + Return + end + + Case LotType EQ 'WM_OUT' + WMOutRec = Xlate('WM_OUT', Key, '', 'X', '') + If WMOutRec NE '' then + //Add WM_OUT key + RecordArray<1> = LotType + RecordArray<2> = Key + //Get and Add CLEAN_INSP keys + CINos = WMOutRec + If CINos NE '' then + CICount = Dcount(CINos, @VM) + For I = 1 to CICount + If CINos NE '' then + RecordArray<1,-1> = 'CLEAN_INSP' + RecordArray<2,-1> = CINos + end + Next I + end + //Get WO_MAT key + WONo = FIELD(Key,'*',1) + CassNo = FIELD(Key,'*',3) + WOMatKey = WONo : '*' : CassNo + //Get and Add WO_MAT_QA key + WOMatQA = Xlate('WO_MAT_QA', WOMatKey, '', 'X', '') + If WOMatQA NE '' then + RecordArray<1,-1> = 'WO_MAT_QA' + RecordArray<2,-1> = WOMatKey + End + //Get and Add NCR keys + NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X', '') + If NCRKeys NE '' then + NCRCount = Dcount(NCRKeys, @VM) + For J = 1 to NCRCount + If NCRKeys NE '' then + RecordArray<1,-1> = 'NCR' + RecordArray<2,-1> = NCRKeys + end + Next J + end + end else + Error_Services('Add', 'This WM_OUT does not exist.') + end + + Case OTHERWISE$ + Error_Services('Add', 'LotType must be either RDS or WM_OUT.') + return + + End Case + + If RecordArray NE '' then + Response = RecordArray + end + +End Service + + +//---------------------------------------------------------------------------------------------------------------------- +// GetUnprotectedTables +// +// Returns an array of unprotected tables +// +//---------------------------------------------------------------------------------------------------------------------- +Service GetUnprotectedTables() + + TableArray = List_Volume_Sub('LSL', '', 'TABLE_NAME', 'TABLE_NAME') + UnprotectedArray = '' + For Each Table in TableArray Using @FM + If Table[1,1] NE '!' AND Table[1,5] NE 'DICT.' then + UnprotectedArray<-1> = Table + end + Next Table + + Response = UnprotectedArray + +End Service + + + + + +//---------------------------------------------------------------------------------------------------------------------- +// LogUnlockRequest +// +// CurrUser - [Required] +// TableName - [Required] +// RecordKey - [Required] +// Success - [Required] +// +// Creates an UNLOCK_REQUESTS record to log unlock attempts. +// +//---------------------------------------------------------------------------------------------------------------------- +Service LogUnlockRequest(TableName, RecordKey, CurrUser, Success) + + NewRequestRec = '' + CurrDateTime = Datetime() + RecordID = CurrDateTime :'*': TableName + NewRequestRec = RecordKey + NewRequestRec = CurrUser + NewRequestRec = Success + Database_Services('WriteDataRow', 'UNLOCK_REQUESTS', RecordID, NewRequestRec, 1, 0, 0) + +End Service + + + + + + diff --git a/LSL2/STPROC/LOT_SERVICES.txt b/LSL2/STPROC/LOT_SERVICES.txt index d275674..340828f 100644 --- a/LSL2/STPROC/LOT_SERVICES.txt +++ b/LSL2/STPROC/LOT_SERVICES.txt @@ -12,6 +12,7 @@ $Insert Lot_Operation_Equates $Insert PRODUCT_OPERATION_EQUATES $Insert LOT_EVENT_EQUATES $Insert NOTIFICATION_EQUATES +$Insert VOIDED_LOT_EQUATES LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot' LogDate = Oconv(Date(), 'D4/') @@ -35,7 +36,7 @@ Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Operator' : @FM : 'Mess objLotClosureLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE' -Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN' +Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT' GoToService @@ -46,52 +47,101 @@ Return Response or "" //----------------------------------------------------------------------------- Service GenerateNewLotId(LotType) - NewLotID = '' - RightNow = Datetime() - If LotType NE '' then - ValidLotNum = False$ - GeneratedLotID = '' - Begin Case - Case LotType EQ 'TW' - Loop - Until ValidLotNum EQ True$ - LotPrefix = 'TW' - LotYear = SRP_Datetime('Year', RightNow) - LotMonth = SRP_Datetime('Month', RightNow) - LotDay = SRP_Datetime('Day', RightNow) - LotTime = SRP_Datetime('Time', RightNow) - - GeneratedLotId = LotPrefix : LotYear : LotMonth : LotDay : LotTime - If Not(RowExists('LOT', GeneratedLotId)) then - ValidLotNum = True$ - end else - ValidLotNum = False$ - RightNow = Datetime() - end - Repeat - Case OTHERWISE$ - //null - End Case - If GeneratedLotID NE '' AND ValidLotNum then - //Write the new lot id now so it's reserved - Database_Services('WriteDataRow', 'LOT', GeneratedLotID, '') - If RowExists('LOT', GeneratedLotID) then - NewLotID = GeneratedLotID - end - end - end - Response = NewLotID + NewLotID = '' + RightNow = Datetime() + If LotType NE '' then + ValidLotNum = False$ + GeneratedLotID = '' + Begin Case + Case LotType EQ 'TW' + Loop + Until ValidLotNum EQ True$ + LotPrefix = 'TW' + LotYear = SRP_Datetime('Year', RightNow) + LotMonth = SRP_Datetime('Month', RightNow) + LotDay = SRP_Datetime('Day', RightNow) + LotTime = SRP_Datetime('Time', RightNow) + + GeneratedLotId = LotPrefix : LotYear : LotMonth : LotDay : LotTime + If Not(RowExists('LOT', GeneratedLotId)) then + ValidLotNum = True$ + end else + ValidLotNum = False$ + RightNow = Datetime() + end + Repeat + Case LotType EQ 'RDS' OR LotType EQ 'WM_IN' OR LotType EQ 'WM_OUT' OR LotType EQ 'WO_MAT' + Loop + Until ValidLotNum EQ True$ + LotPrefix = '' + Begin Case + Case LotType EQ 'RDS' + LotPrefix = 'R' + Case LotType EQ 'WM_IN' + LotPrefix = 'I' + Case LotType EQ 'WM_OUT' + LotPrefix = 'O' + Case LotType EQ 'WO_MAT' + LotPrefix = 'M' + End Case + HaveLockLotIdSequence = Database_Services('GetKeyIDLock', 'CONFIG', 'LOT_KEY_SEQUENCE_PROD') + If HaveLockLotIdSequence then + CurrLotSequence = Database_Services('ReadDataRow', 'CONFIG', 'LOT_KEY_SEQUENCE_PROD', True$, 0, False$) + NextLotSequence = CurrLotSequence + 1 + Database_Services('WriteDataRow', 'CONFIG', 'LOT_KEY_SEQUENCE_PROD', NextLotSequence, True$, False$, False$) + Database_Services('ReleaseKeyIDLock', 'CONFIG', 'LOT_KEY_SEQUENCE_PROD') + GeneratedLotId = LotPrefix : CurrLotSequence + If Not(RowExists('LOT', GeneratedLotId)) AND CurrLotSequence NE '' then + ValidLotNum = True$ + end else + ValidLotNum = False$ + end + end + Repeat + Case OTHERWISE$ + //null + End Case + If GeneratedLotID NE '' AND ValidLotNum then + //Write the new lot id now so it's reserved + Database_Services('WriteDataRow', 'LOT', GeneratedLotID, '') + If RowExists('LOT', GeneratedLotID) then + NewLotID = GeneratedLotID + end + end + end + Response = NewLotID +end service + +Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType) + Open 'DICT.LOT' to DictLot then + + SearchString = '' + SearchString := 'LEGACY_LOT_ID':@VM:LegacyLotId:@FM + //SearchString := 'TYPE':@VM:LegacyLotType:@FM + LotIdKeys = '' + Btree.Extract(SearchString, 'LOT', DictLot, LotIdKeys, '', '') + ErrCode = '' + IF Get_Status(ErrCode) then + ErrorMsg = 'Error in ':Service:' service. Error calling Btree.Extract. Error code ':ErrCode:'.' + end else + Response = LotIdKeys<1,1> + end + + end else + ErrorMsg = 'Error in ':Service:' service. Error opening LOT dictionary.' + end end service Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId) - CreatedLotNumber = '' - ErrorMessage = '' - Begin Case - Case LotType EQ 'RDS' - NewLotId = LotId + CreatedLotNumber = '' + ErrorMessage = '' + Begin Case + Case LotType EQ 'RDS' OR LotType EQ 'WM_IN' OR LotType EQ 'WM_OUT' OR LotType EQ 'WO_MAT' + //Case statement for legacy lot entity types + NewLotId = Lot_Services('GenerateNewLotId', LotType) If NewLotId NE '' then - If RowExists('LOT', NewLotId) EQ False$ then + If RowExists('LOT', NewLotId) NE False$ then LotRec = '' LotRec = LotType LotRec = '' @@ -100,9 +150,12 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo LotRec = VendorPartNo LotRec = VendorLotNo LotRec = VendorCode + LotRec = LotId Database_Services('WriteDataRow', 'LOT', NewLotId, LotRec) If Error_Services('HasError') then ErrorMessage = 'Error in ':Service:' service. ':Error_Services('GetMessage') + end else + CreatedLotNumber = NewLotId end end else ErrorMessage = 'Error in ':Service:' service. LOT record "':NewLotId:'" already exists.' @@ -110,7 +163,7 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo end else ErrorMessage = 'Error in ':Service:' service. No lot ID passed in.' end - Case LotType EQ 'TW' + Case LotType EQ 'TW' If ProdName NE '' then TWProdID = Test_Wafer_Prod_Services('GetTestWaferProdIDsByPartName', ProdName) If TWProdID NE '' then @@ -141,7 +194,7 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo //Get Curr Operation(Should be first one in sequence) ThisLotCurrOpId = Lot_Services('GetLotCurrOperationId', CreatedLotNumber) If ThisLotCurrOpId NE '' then - Lot_Services('CreateLotEvent', CreatedLotNumber, 'TW', Datetime(), 'MOVE_IN', 'Move Lot in.', '', 0, 0, ThisLotCurrOpId, Username) + Lot_Services('CreateLotEvent', CreatedLotNumber, 'TW', Datetime(), 'MOVE_IN', 'Move Lot in.', '', 0, 0, ThisLotCurrOpId, Username) if Error_Services('NoError') then //Set lot to open Lot_Services('CreateLotEvent', CreatedLotNumber, 'TW', Datetime(), 'OPEN', 'Setting lot to open.', '', 0, 0, '', Username) @@ -168,19 +221,19 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') end end else - //Close LOT record as there was an error - Lot_Services('CreateLotEvent', NewLotId, 'TW', Datetime(), 'CLOSE', 'Error occured while created lot. Automatically setting to close', '', 0, 0, '', 'SYSTEM') + //Close LOT record as there was an error + Lot_Services('CreateLotEvent', NewLotId, 'TW', Datetime(), 'CLOSE', 'Error occured while created lot. Automatically setting to close', '', 0, 0, '', 'SYSTEM') ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') end end else - //Close LOT record as there was an error - Lot_Services('CreateLotEvent', NewLotId, 'TW', Datetime(), 'CLOSE', 'Error occured while created lot. Automatically setting to close', '', 0, 0, '', 'SYSTEM') + //Close LOT record as there was an error + Lot_Services('CreateLotEvent', NewLotId, 'TW', Datetime(), 'CLOSE', 'Error occured while created lot. Automatically setting to close', '', 0, 0, '', 'SYSTEM') ErrorMessage = 'Error in Create New Test Wafer Lot Process, error getting current operation for lot: ' : NewLotId end end else - //Close LOT record as there was an error - //Database_Services('DeleteDataRow', 'LOT', NewLotId, True$, False$) - Lot_Services('CreateLotEvent', NewLotId, 'TW', Datetime(), 'CLOSE', 'Error occured while created lot. Automatically setting to close', '', 0, 0, '', 'SYSTEM') + //Close LOT record as there was an error + //Database_Services('DeleteDataRow', 'LOT', NewLotId, True$, False$) + Lot_Services('CreateLotEvent', NewLotId, 'TW', Datetime(), 'CLOSE', 'Error occured while created lot. Automatically setting to close', '', 0, 0, '', 'SYSTEM') ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') end end @@ -205,372 +258,372 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo end else ErrorMessage = 'Null value passed in for ProdID' end - Case Otherwise$ - ErrorMessage = 'Error in ':Service:' service. Lot Type "':LotType:'" is not currently supported.' - End Case - - If ErrorMessage EQ '' then - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = ProdName - LogData<3> = Username - LogData<4> = 'Successfully created lot id ' : CreatedLotNumber : ' of product type ' : ProdName '.' - Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) - end else - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = ProdName - LogData<3> = Username - LogData<4> = ErrorMessage - Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) - Error_Services('Add', ErrorMessage) - end - Response = CreatedLotNumber - + Case Otherwise$ + ErrorMessage = 'Error in ':Service:' service. Lot Type "':LotType:'" is not currently supported.' + End Case + + If ErrorMessage EQ '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = ProdName + LogData<3> = Username + LogData<4> = 'Successfully created lot id ' : CreatedLotNumber : ' of product type ' : ProdName '.' + Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) + end else + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = ProdName + LogData<3> = Username + LogData<4> = ErrorMessage + Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end + Response = CreatedLotNumber + End Service Service CreateNewTestWaferLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID) - CreatedLotNumber = '' - ErrorMessage = '' - If LotType EQ 'TW' then - If ProdName NE '' then - TWProdID = Test_Wafer_Prod_Services('GetTestWaferProdIDsByPartName', ProdName) - If TWProdID NE '' then - If DCount(TWProdID, @VM) EQ 1 then - NewLotId = Lot_Services('GenerateNewLotId', 'TW') - If NewLotId NE '' then - If RowExists('LOT', NewLotId) then - LotRec = Database_Services('ReadDataRow', 'LOT', NewLotId) - //Ensure the lot record is empty - If LotRec EQ '' AND LotRec EQ '' AND LotRec EQ '' AND LotRec EQ '' then - LotRec = LotType - LotRec = TWProdID - LotRec = LotQty - LotRec = LotQty - LotRec = VendorPartNo - LotRec = VendorLotNo - LotRec = VendorCode - Database_Services('WriteDataRow', 'LOT', NewLotId, LotRec) - //Now Ensure that the written lot matches what was just written - LotRecCheck = Database_Services('ReadDataRow', 'LOT', NewLotId) - If LotRecCheck EQ LotRec then - //Lot Created successfully - CreatedLotNumber = NewLotId - If RowExists('LOT', CreatedLotNumber) then - Lot_Services('CreateInitialLotOperationRecords', CreatedLotNumber) - If Error_Services('NoError') then - //Check in at first operation - //Get Curr Operation(Should be first one in sequence) - ThisLotCurrOpId = Lot_Services('GetLotCurrOperationId', CreatedLotNumber) - If ThisLotCurrOpId NE '' then - Lot_Services('MoveInLot', NewLotId, Username) - if Error_Services('NoError') then - //Set lot to open - Lot_Services('OpenLot', CreatedLotNumber) - if Error_Services('NoError') then - If PrinterID NE 'WEB' then - //If PrinterID is set to WEB this means the request comes from OI_Wizard and the client is going to handle printing. - Labeling_Services('PrintTestWaferLotLabel', CreatedLotNumber, Username, PrinterID) - If Error_Services('HasError') then - ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : CreatedLotNumber : ' , ' : Error_Services('GetMessage') - end - end - Lot_Services('MoveOutLot', NewLotId, Username) - If Error_Services('NoError') then - Lot_Services('MoveInLot', NewLotId, Username) - If Error_Services('HasError') then - ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, error getting current operation for lot: ' : NewLotId - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') - end - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, Lot attributes did not write correctly for lot: ' : NewLotId - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, Lot already had data, lot: ' : NewLotId - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, Created lot: ' : NewLotId : ' not found in LOT table.' - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, no lot id returned.' - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, ambiguous product passed to routine OR no matching products found.' - end - end else - ErrorMessage = 'Error in Create New Test Wafer Lot Process, product(':ProdName:') passed to routine not found.' - end - end else - ErrorMessage = 'Null value passed in for ProdID' - end - end else - ErrorMessage = 'Lot type was not test wafer' - end - If ErrorMessage EQ '' then - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = ProdName - LogData<3> = Username - LogData<4> = 'Successfully created lot id ' : CreatedLotNumber : ' of product type ' : ProdName '.' - Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) - end else - Error_Services('Add', ErrorMessage) - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = ProdName - LogData<3> = Username - LogData<4> = ErrorMessage - Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) - end - Response = CreatedLotNumber + CreatedLotNumber = '' + ErrorMessage = '' + If LotType EQ 'TW' then + If ProdName NE '' then + TWProdID = Test_Wafer_Prod_Services('GetTestWaferProdIDsByPartName', ProdName) + If TWProdID NE '' then + If DCount(TWProdID, @VM) EQ 1 then + NewLotId = Lot_Services('GenerateNewLotId', 'TW') + If NewLotId NE '' then + If RowExists('LOT', NewLotId) then + LotRec = Database_Services('ReadDataRow', 'LOT', NewLotId) + //Ensure the lot record is empty + If LotRec EQ '' AND LotRec EQ '' AND LotRec EQ '' AND LotRec EQ '' then + LotRec = LotType + LotRec = TWProdID + LotRec = LotQty + LotRec = LotQty + LotRec = VendorPartNo + LotRec = VendorLotNo + LotRec = VendorCode + Database_Services('WriteDataRow', 'LOT', NewLotId, LotRec) + //Now Ensure that the written lot matches what was just written + LotRecCheck = Database_Services('ReadDataRow', 'LOT', NewLotId) + If LotRecCheck EQ LotRec then + //Lot Created successfully + CreatedLotNumber = NewLotId + If RowExists('LOT', CreatedLotNumber) then + Lot_Services('CreateInitialLotOperationRecords', CreatedLotNumber) + If Error_Services('NoError') then + //Check in at first operation + //Get Curr Operation(Should be first one in sequence) + ThisLotCurrOpId = Lot_Services('GetLotCurrOperationId', CreatedLotNumber) + If ThisLotCurrOpId NE '' then + Lot_Services('MoveInLot', NewLotId, Username) + if Error_Services('NoError') then + //Set lot to open + Lot_Services('OpenLot', CreatedLotNumber) + if Error_Services('NoError') then + If PrinterID NE 'WEB' then + //If PrinterID is set to WEB this means the request comes from OI_Wizard and the client is going to handle printing. + Labeling_Services('PrintTestWaferLotLabel', CreatedLotNumber, Username, PrinterID) + If Error_Services('HasError') then + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : CreatedLotNumber : ' , ' : Error_Services('GetMessage') + end + end + Lot_Services('MoveOutLot', NewLotId, Username) + If Error_Services('NoError') then + Lot_Services('MoveInLot', NewLotId, Username) + If Error_Services('HasError') then + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, error getting current operation for lot: ' : NewLotId + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') + end + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, Lot attributes did not write correctly for lot: ' : NewLotId + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, Lot already had data, lot: ' : NewLotId + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, Created lot: ' : NewLotId : ' not found in LOT table.' + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, no lot id returned.' + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, ambiguous product passed to routine OR no matching products found.' + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, product(':ProdName:') passed to routine not found.' + end + end else + ErrorMessage = 'Null value passed in for ProdID' + end + end else + ErrorMessage = 'Lot type was not test wafer' + end + If ErrorMessage EQ '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = ProdName + LogData<3> = Username + LogData<4> = 'Successfully created lot id ' : CreatedLotNumber : ' of product type ' : ProdName '.' + Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) + end else + Error_Services('Add', ErrorMessage) + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = ProdName + LogData<3> = Username + LogData<4> = ErrorMessage + Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) + end + Response = CreatedLotNumber End Service Service GenerateInitialLotOperationRecords(LotId) - ErrorMessage = '' - If LotID NE '' then - if RowExists('LOT', LotId) then - LotRec = Database_Services('ReadDataRow', 'LOT', LotId) - ProdID = LotRec - If ProdID NE '' then - //Get product operations - ThisLotOperations = Lot_Services('GetPrescribedOperationsByProdId', ProdId) - If ThisLotOperations NE '' then - for each ProdOperationKey in ThisLotOperations using @FM - OperationRec = Database_Services('ReadDataRow', 'PRODUCT_OPERATION', ProdOperationKey) - - //NewOperationRecID = - Next operation - end else - ErrorMessage = 'No Operations found for ' : ProdId - end - end else - ErrorMessage = 'Prod ID not specified' - end - //ID will be LotNum + OperationID - //Get product operations - - end else - ErrorMessage = 'Lot ID does not exist.' - end - end else - ErrorMessage = 'Lot ID was null' - end - If ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) - end + ErrorMessage = '' + If LotID NE '' then + if RowExists('LOT', LotId) then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId) + ProdID = LotRec + If ProdID NE '' then + //Get product operations + ThisLotOperations = Lot_Services('GetPrescribedOperationsByProdId', ProdId) + If ThisLotOperations NE '' then + for each ProdOperationKey in ThisLotOperations using @FM + OperationRec = Database_Services('ReadDataRow', 'PRODUCT_OPERATION', ProdOperationKey) + + //NewOperationRecID = + Next operation + end else + ErrorMessage = 'No Operations found for ' : ProdId + end + end else + ErrorMessage = 'Prod ID not specified' + end + //ID will be LotNum + OperationID + //Get product operations + + end else + ErrorMessage = 'Lot ID does not exist.' + end + end else + ErrorMessage = 'Lot ID was null' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end end service Service GetPrescribedOperationsByProdId(ProdId, ProdType) - ProdOperationKeys = '' - If ProdId NE '' then - Begin Case - Case ProdType = 'TW' - ProdRec = Database_Services('ReadDataRow', 'TEST_WAFER_PROD', ProdId) - ProdOperationKeys = ProdRec - Case Otherwise$ - //error, no matching prod type. - End Case - end else - //Error: ProdID was null - end - Response = ProdOperationKeys + ProdOperationKeys = '' + If ProdId NE '' then + Begin Case + Case ProdType = 'TW' + ProdRec = Database_Services('ReadDataRow', 'TEST_WAFER_PROD', ProdId) + ProdOperationKeys = ProdRec + Case Otherwise$ + //error, no matching prod type. + End Case + end else + //Error: ProdID was null + end + Response = ProdOperationKeys end service Service CreateInitialLotOperationRecords(LotId) - ErrorMessage = '' - If LotId NE '' then - LotRec = Database_Services('ReadDataRow', 'LOT', LotId) - LotType = LotRec - ProdId = LotRec - ThisInitialProdOperations = Lot_Services('GetPrescribedOperationsByProdId', ProdId, LotType) - If Error_Services('NoError') AND ThisInitialProdOperations NE '' then - For each ProdOperation in ThisInitialProdOperations using @VM - - ProdOperationRec = Database_Services('ReadDataRow', 'PRODUCT_OPERATION', ProdOperation) - OperationID = ProdOperationRec - OperationSequence = ProdOperationRec - - LotOperationRecID = LotId : '*' : OperationID - If Not(RowExists('LOT_OPERATION', LotOperationRecID)) then - LotOperationRec = '' - LotOperationRec = LotId - LotOperationRec = OperationID - LotOperationRec = OperationSequence - LotOperationRec = False$ - Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationRecId, LotOperationRec) - TestRec = Database_Services('ReadDataRow', 'LOT', LotId) - end else - ErrorMessage = 'Lot Operation already existed, cannot overwrite' - end - - Next Operation - end else - ErrorMessage = 'Error getting prescribed operations for lot# ' : LotId - end - - end else - ErrorMessage = 'Lot ID was null' - end - If ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) - end + ErrorMessage = '' + If LotId NE '' then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId) + LotType = LotRec + ProdId = LotRec + ThisInitialProdOperations = Lot_Services('GetPrescribedOperationsByProdId', ProdId, LotType) + If Error_Services('NoError') AND ThisInitialProdOperations NE '' then + For each ProdOperation in ThisInitialProdOperations using @VM + + ProdOperationRec = Database_Services('ReadDataRow', 'PRODUCT_OPERATION', ProdOperation) + OperationID = ProdOperationRec + OperationSequence = ProdOperationRec + + LotOperationRecID = LotId : '*' : OperationID + If Not(RowExists('LOT_OPERATION', LotOperationRecID)) then + LotOperationRec = '' + LotOperationRec = LotId + LotOperationRec = OperationID + LotOperationRec = OperationSequence + LotOperationRec = False$ + Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationRecId, LotOperationRec) + TestRec = Database_Services('ReadDataRow', 'LOT', LotId) + end else + ErrorMessage = 'Lot Operation already existed, cannot overwrite' + end + + Next Operation + end else + ErrorMessage = 'Error getting prescribed operations for lot# ' : LotId + end + + end else + ErrorMessage = 'Lot ID was null' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end end service //Returns a @FM delimited list of operations in sequence Service GetLotOperationSequence(LotId) - LotOperationsInSequence = '' - If LotID NE '' then - //Get Operations - LotOperations = Xlate('LOT', LotId, LOT_LOT_OPERATIONS$, 'X') - for each LotOperation in LotOperations using @VM - ThisLotOperationSequence = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_OPERATION_SEQUENCE$, 'X') - LotOperationsInSequence = LotOperation - Next LotOperation - end else - //error: lot id was null - end - Response = LotOperationsInSequence + LotOperationsInSequence = '' + If LotID NE '' then + //Get Operations + LotOperations = Xlate('LOT', LotId, LOT_LOT_OPERATIONS$, 'X') + for each LotOperation in LotOperations using @VM + ThisLotOperationSequence = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_OPERATION_SEQUENCE$, 'X') + LotOperationsInSequence = LotOperation + Next LotOperation + end else + //error: lot id was null + end + Response = LotOperationsInSequence end service //Returns a @FM delimited list of events in sequence Service GetLotEventsInSequence(LotId) - - LotEventsUnsorted = '' - LotEventsSorted = '' - LotEventsToReturn = '' - If LotID NE '' then - //Get Operations - LotEvents = Xlate('LOT', LotId, LOT_LOT_EVENTS$, 'X') - for each LotEvent in LotEvents using @VM - ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X') - LotEventsToReturn = LotEvent - Next LotOperation - end else - //error: lot id was null - end - Response = LotEventsToReturn + + LotEventsUnsorted = '' + LotEventsSorted = '' + LotEventsToReturn = '' + If LotID NE '' then + //Get Operations + LotEvents = Xlate('LOT', LotId, LOT_LOT_EVENTS$, 'X') + for each LotEvent in LotEvents using @VM + ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X') + LotEventsToReturn = LotEvent + Next LotOperation + end else + //error: lot id was null + end + Response = LotEventsToReturn end service Service GetLotCurrOperationId(LotId) - CurrOperation = '' - If LotID NE '' then - //Get them in sequence first - LotOperationsInSequence = Lot_Services('GetLotOperationSequence', LotId) - for each LotOperation in LotOperationsInSequence using @FM - ThisLotOperationStartDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_IN$, 'X') - ThisLotOperationEndDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_OUT$, 'X') - If ThisLotOperationEndDTM Eq '' then - CurrOperation = LotOperation - end - until CurrOperation - Next LotOperation - end else - //error: lot id was null - end - Response = CurrOperation + CurrOperation = '' + If LotID NE '' then + //Get them in sequence first + LotOperationsInSequence = Lot_Services('GetLotOperationSequence', LotId) + for each LotOperation in LotOperationsInSequence using @FM + ThisLotOperationStartDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_IN$, 'X') + ThisLotOperationEndDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_OUT$, 'X') + If ThisLotOperationEndDTM Eq '' then + CurrOperation = LotOperation + end + until CurrOperation + Next LotOperation + end else + //error: lot id was null + end + Response = CurrOperation end service Service GetLotCurrOperationName(LotId) - CurrOperationId = '' - CurrOperationName = '' - If LotID NE '' then - //Get them in sequence first - LotOperationsInSequence = Lot_Services('GetLotOperationSequence', LotId) - for each LotOperation in LotOperationsInSequence using @FM - ThisLotOperationStartDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_IN$, 'X') - ThisLotOperationEndDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_OUT$, 'X') - If ThisLotOperationEndDTM Eq '' then - CurrOperationId = LotOperation - CurrOperationName = Database_Services('ReadDataColumn', 'LOT_OPERATION', CurrOperationId, LOT_OPERATION_OPERATION_ID$, True$, 0, False$) - end - until CurrOperationName - Next LotOperation - end else - //error: lot id was null - end - Response = CurrOperationName + CurrOperationId = '' + CurrOperationName = '' + If LotID NE '' then + //Get them in sequence first + LotOperationsInSequence = Lot_Services('GetLotOperationSequence', LotId) + for each LotOperation in LotOperationsInSequence using @FM + ThisLotOperationStartDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_IN$, 'X') + ThisLotOperationEndDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_OUT$, 'X') + If ThisLotOperationEndDTM Eq '' then + CurrOperationId = LotOperation + CurrOperationName = Database_Services('ReadDataColumn', 'LOT_OPERATION', CurrOperationId, LOT_OPERATION_OPERATION_ID$, True$, 0, False$) + end + until CurrOperationName + Next LotOperation + end else + //error: lot id was null + end + Response = CurrOperationName end service Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework) - ErrorMessage = '' - If LotId NE '' then - If NewSequence NE '' AND Num(NewSequence) then - //Get Current Operations in sequence - //CurrSequence = Lot_Services('GetLotOperationSequence', LotId) - LotCurrOperation = Lot_Services('GetLotCurrOperationId', LotId) - CurrOperationSequence = Xlate('LOT_OPERATION', LotCurrOperation, LOT_OPERATION_OPERATION_SEQUENCE$, 'X') - If CurrOperationSequence LE NewSequence then - //Get Curr Operation Sequence - Done = False$ - LotCurrOperationSequence = Lot_Services('GetLotOperationSequence', LotId) - for each Operation in LotCurrOperationSequence using @Fm setting OpPos - ThisOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', Operation) - ThisOperationSequence = ThisOperationRec - If ThisOperationSequence GE NewSequence then - NewOperationSequence = ThisOperationSequence + 1 - ThisOperationRec = NewOperationSequence - Database_Services('WriteDataRow', 'LOT_OPERATION', Operation, ThisOperationRec) - If Error_Services('HasError') then - Done = True$ - ErrorMessage = Error_Services('GetMessage') - end - end - Until Done - Next Operation - If ErrorMessage EQ '' then - LotOperationRecID = LotId : '*' : NewOperationId - If Not(RowExists('LOT_OPERATION', LotOperationRecID)) then - LotOperationRec = '' - LotOperationRec = LotId - LotOperationRec = NewOperationId - LotOperationRec = NewSequence - LotOperationRec = Rework - Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationRecId, LotOperationRec) - end else - //Error: Lot Operation already existed, cannot overwrite - end - end - end else - //Error: Not allowed to add new operations prior to current operation - end - end else - //Error: null or invalid sequence passed to routine - end - end else - //Error: Lot id was null - end - If ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) - end + ErrorMessage = '' + If LotId NE '' then + If NewSequence NE '' AND Num(NewSequence) then + //Get Current Operations in sequence + //CurrSequence = Lot_Services('GetLotOperationSequence', LotId) + LotCurrOperation = Lot_Services('GetLotCurrOperationId', LotId) + CurrOperationSequence = Xlate('LOT_OPERATION', LotCurrOperation, LOT_OPERATION_OPERATION_SEQUENCE$, 'X') + If CurrOperationSequence LE NewSequence then + //Get Curr Operation Sequence + Done = False$ + LotCurrOperationSequence = Lot_Services('GetLotOperationSequence', LotId) + for each Operation in LotCurrOperationSequence using @Fm setting OpPos + ThisOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', Operation) + ThisOperationSequence = ThisOperationRec + If ThisOperationSequence GE NewSequence then + NewOperationSequence = ThisOperationSequence + 1 + ThisOperationRec = NewOperationSequence + Database_Services('WriteDataRow', 'LOT_OPERATION', Operation, ThisOperationRec) + If Error_Services('HasError') then + Done = True$ + ErrorMessage = Error_Services('GetMessage') + end + end + Until Done + Next Operation + If ErrorMessage EQ '' then + LotOperationRecID = LotId : '*' : NewOperationId + If Not(RowExists('LOT_OPERATION', LotOperationRecID)) then + LotOperationRec = '' + LotOperationRec = LotId + LotOperationRec = NewOperationId + LotOperationRec = NewSequence + LotOperationRec = Rework + Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationRecId, LotOperationRec) + end else + //Error: Lot Operation already existed, cannot overwrite + end + end + end else + //Error: Not allowed to add new operations prior to current operation + end + end else + //Error: null or invalid sequence passed to routine + end + end else + //Error: Lot id was null + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end end service Service IsLotMovedIn(LotId) - Response = '' - If RowExists('LOT', LotId) then - CurrOperId = Lot_Services('GetLotCurrOperationId', LotId) - CurrOperDtmIn = Database_Services('ReadDataColumn', 'LOT_OPERATION', CurrOperId, LOT_OPERATION_DATETIME_IN$, True$, 0, False$) - If CurrOperDtmIn LE Datetime() AND CurrOperDtmIn NE '' then - Response = True$ - end else - Response = False$ - end - end + Response = '' + If RowExists('LOT', LotId) then + CurrOperId = Lot_Services('GetLotCurrOperationId', LotId) + CurrOperDtmIn = Database_Services('ReadDataColumn', 'LOT_OPERATION', CurrOperId, LOT_OPERATION_DATETIME_IN$, True$, 0, False$) + If CurrOperDtmIn LE Datetime() AND CurrOperDtmIn NE '' then + Response = True$ + end else + Response = False$ + end + end end service Service IsOperationCompleted(LotOperationId) @@ -589,51 +642,51 @@ Service IsOperationCompleted(LotOperationId) end service Service MoveInLot(LotID, Operator) - ErrorMessage = '' - ThisLotCurrOperationID = '' - If LotId NE '' then - If RowExists('LOT', LotId) then - ThisLotRec = Database_Services('ReadDataRow', 'LOT', LotId) - WaferQty = ThisLotRec - //Possibly Add locking here - If Error_Services('NoError') then - ThisLotCurrOperationID = Lot_Services('GetLotCurrOperationId', LotId) - If ThisLotCurrOperationID NE '' then - ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotCurrOperationID) - ThisLotCurrOperationRec = Datetime() - ThisLotCurrOperationRec = WaferQty - ThisLotCurrOperationRec = Operator - Database_Services('WriteDataRow', 'LOT_OPERATION', ThisLotCurrOperationID, ThisLotCurrOperationRec) - If Error_Services('NoError') then - LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X') - CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X') - If Error_Services('HasError') then - ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Error writing to lot operation record. ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Error getting lots current operation.' - end - end else - ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Lot ID not found in LOT table.' - end - end else - ErrorMessage = 'Error in Move In process. Lot id was not passed to routine.' - end - If ErrorMessage NE '' then - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = LotID - LogData<3> = Operator - LogData<4> = 'Successfully Moved Lot into operation ' : ThisLotCurrOperationID : '.' - Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) - Error_Services('Add', ErrorMessage) - end + ErrorMessage = '' + ThisLotCurrOperationID = '' + If LotId NE '' then + If RowExists('LOT', LotId) then + ThisLotRec = Database_Services('ReadDataRow', 'LOT', LotId) + WaferQty = ThisLotRec + //Possibly Add locking here + If Error_Services('NoError') then + ThisLotCurrOperationID = Lot_Services('GetLotCurrOperationId', LotId) + If ThisLotCurrOperationID NE '' then + ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotCurrOperationID) + ThisLotCurrOperationRec = Datetime() + ThisLotCurrOperationRec = WaferQty + ThisLotCurrOperationRec = Operator + Database_Services('WriteDataRow', 'LOT_OPERATION', ThisLotCurrOperationID, ThisLotCurrOperationRec) + If Error_Services('NoError') then + LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X') + CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X') + If Error_Services('HasError') then + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Error writing to lot operation record. ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Error getting lots current operation.' + end + end else + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Lot ID not found in LOT table.' + end + end else + ErrorMessage = 'Error in Move In process. Lot id was not passed to routine.' + end + If ErrorMessage NE '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotID + LogData<3> = Operator + LogData<4> = 'Successfully Moved Lot into operation ' : ThisLotCurrOperationID : '.' + Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end end service Service MoveOutLot(LotID, Operator) @@ -718,11 +771,8 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_ BeginWaferQty = Xlate('LOT', LotId, LOT_WAFER_QTY$, 'X') If OperationID EQ '' then OperationID = Lot_Services('GetLotCurrOperationId', LotId) - //CurrOperationName = XLATE('LOT_OPERATION', OperationID, LOT_OPERATION_OPERATION_ID$, 'X') end If OperationID NE '' then - * - Begin Case Case EventType EQ 'MOVE_IN' Lot_Services('MoveInLot', LotId, OperatorId) @@ -783,9 +833,7 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_ Case Otherwise$ ErrorMessage = 'Error in Create Lot Event routine, event type of ' : EventType : ' passed to routine is not valid for a lot of type TW.' End Case - * If Error_Services('HasError') then - * ErrorMessage = Error_Services('GetMessage') - * end + If ErrorMessage EQ '' then EndWaferQty = (BeginWaferQty + BonusWaferQty) - ReduceWaferQty @@ -829,20 +877,26 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_ end else ErrorMessage = 'Error in Create Lot Event routine, Operator ID was null.' end - Case LotType EQ 'RDS' - If EventType NE '' AND OperatorId NE '' then - If RowExists('LOT', LotId) EQ False$ then Lot_Services('CreateNewLot', 'RDS', '', '', '', '', '', OperatorId, '', LotId) - If RowExists('LOT', LotId) then - ValidId = False$ - NewEventId = '' - Loop - NewEventId = RTI_CreateGUID() - If Not(RowExists('LOT_EVENT', NewEventId)) then - ValidId = True$ - end - Until ValidId EQ True$ - Repeat - BeginWaferQty = Xlate('LOT', LotId, LOT_WAFER_QTY$, 'X') + Case LotType EQ 'RDS' OR LotType EQ 'WO_MAT' OR LotType EQ 'WM_IN' OR LotType EQ 'WM_OUT' + ExistingLotId = Lot_Services('GetLotIdByLegacyLotIdAndType', LotId, LotType) + LegacyLotId = LotId + If ExistingLotId NE '' then + LotId = ExistingLotId + end else + LotId = Lot_Services('CreateNewLot', LotType, '', '', '', '', '', OperatorId, '', LegacyLotId) + end + If RowExists('LOT', LotId) then + If EventType NE '' AND OperatorId NE '' then + ValidId = False$ + NewEventId = '' + Loop + NewEventId = RTI_CreateGUID() + If Not(RowExists('LOT_EVENT', NewEventId)) then + ValidId = True$ + end + Until ValidId EQ True$ + Repeat + BeginWaferQty = Xlate('LOT', LotId, LOT_WAFER_QTY$, 'X') If ReduceWaferQty NE '' then If Num(ReduceWaferQty) then EndWaferQty = BeginWaferQty - ReduceWaferQty @@ -854,244 +908,247 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_ end end If Not(Num(EventDatetime)) then EventDatetime = IConv(EventDatetime, 'DT') - NewEventRec = '' - NewEventRec = LotId - NewEventRec = EventType - NewEventRec = EventDatetime - NewEventRec = EventNote - NewEventRec = EventEquipmentId - NewEventRec = ReduceWaferQty - NewEventRec = BonusWaferQty - NewEventRec = BeginWaferQty - NewEventRec = EndWaferQty - NewEventRec = OperationId - NewEventRec = OperatorId - NewEventSequence = Lot_Services('GetLotEventNextSequence', LotId) - NewEventRec = NewEventSequence - Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec) - if Error_Services('HasError') then - ErrorMessage = 'Error in Create Lot Event routine, Error writing Lot Event record, ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Create Lot Event routine, Lot Id passed to routine was not found in LOT table.' - end - end else - ErrorMessage = 'Error in Create Lot Event routine, Missing event type or Operator ID.' - end - - Case LotType EQ 'WM_OUT' - ErrorMessage = 'Error in Create Lot Event routine, Lot type WM_OUT was passed to routine and this is currently not supported.' - Case LotType EQ 'WM_IN' - ErrorMessage = 'Error in Create Lot Event routine, Lot type WM_IN was passed to routine and this is currently not supported.' - Case Otherwise$ - ErrorMessage = 'Error in Create Lot Event routine, An invalid lot type was passed to routine.' - End Case - end else - ErrorMessage = 'Error in Create Lot Event routine, A null value for Lot Id was passed to routine.' - end - If ErrorMessage EQ '' then - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = LotId - LogData<3> = EventType - LogData<4> = OperatorId - LogData<5> = BeginWaferQty - LogData<6> = EndWaferQty - LogData<7> = BonusWaferQty - LogData<8> = ReduceWaferQty - LogData<9> = 'Successfully logged event.' - Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$) - end else - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = LotId - LogData<3> = EventType - LogData<4> = OperatorId - LogData<5> = BeginWaferQty - LogData<6> = EndWaferQty - LogData<7> = BonusWaferQty - LogData<8> = ReduceWaferQty - LogData<9> = ErrorMessage - Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$) - Error_Services('Add', ErrorMessage) - end + Begin Case + Case EventType EQ 'VOID' + Lot_Services('CreateNewVoidedLotRecord', LotId, LegacyLotId, LotType, OperatorId) + If Error_Services('HasError') then + ErrorMessage = Error_Services('GetMessage') + end + Case Otherwise$ + //Do Nothing extra + End Case + If ErrorMessage EQ '' then + NewEventRec = '' + NewEventRec = LotId + NewEventRec = EventType + NewEventRec = EventDatetime + NewEventRec = EventNote + NewEventRec = EventEquipmentId + NewEventRec = ReduceWaferQty + NewEventRec = BonusWaferQty + NewEventRec = BeginWaferQty + NewEventRec = EndWaferQty + NewEventRec = OperationId + NewEventRec = OperatorId + NewEventSequence = Lot_Services('GetLotEventNextSequence', LotId) + NewEventRec = NewEventSequence + Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec) + end + end else + ErrorMessage = 'Operator ID was null.' + end + end else + ErrorMessage = 'Error in Create Lot Event routine, Lot Id passed to routine was not found in LOT table.' + end + Case Otherwise$ + ErrorMessage = 'Error in Create Lot Event routine, An invalid lot type was passed to routine.' + End Case + end else + ErrorMessage = 'Error in Create Lot Event routine, A null value for Lot Id was passed to routine.' + end + If ErrorMessage EQ '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotId + LogData<3> = EventType + LogData<4> = OperatorId + LogData<5> = BeginWaferQty + LogData<6> = EndWaferQty + LogData<7> = BonusWaferQty + LogData<8> = ReduceWaferQty + LogData<9> = 'Successfully logged event.' + Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$) + end else + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotId + LogData<3> = EventType + LogData<4> = OperatorId + LogData<5> = BeginWaferQty + LogData<6> = EndWaferQty + LogData<7> = BonusWaferQty + LogData<8> = ReduceWaferQty + LogData<9> = ErrorMessage + Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end end service Service GetLotEventNextSequence(LotId) - ErrorMessage = '' - NextSequence = 1 - If LotID NE '' then - If RowExists('LOT', LotId) then - LotEvents = XLATE('LOT', LotId, LOT_LOT_EVENTS$, 'X') - for each LotEvent in LotEvents using @VM - ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X') - If ThisEventSequence GE NextSequence then NextSequence = ThisEventSequence + 1 - Next LotEvent - end else - ErrorMessage = 'Unable to get lot event sequence: Lot ID not found.' - end - end else - ErrorMessage = 'Unable to get lot event sequence: Lot ID was null.' - end - If ErrorMessage EQ '' then - Response = NextSequence - end else - Error_Services('Add', ErrorMessage) - end + ErrorMessage = '' + NextSequence = 1 + If LotID NE '' then + If RowExists('LOT', LotId) then + LotEvents = XLATE('LOT', LotId, LOT_LOT_EVENTS$, 'X') + for each LotEvent in LotEvents using @VM + ThisEventSequence = XLATE('LOT_EVENT', LotEvent, LOT_EVENT_SEQUENCE$, 'X') + If ThisEventSequence GE NextSequence then NextSequence = ThisEventSequence + 1 + Next LotEvent + end else + ErrorMessage = 'Unable to get lot event sequence: Lot ID not found.' + end + end else + ErrorMessage = 'Unable to get lot event sequence: Lot ID was null.' + end + If ErrorMessage EQ '' then + Response = NextSequence + end else + Error_Services('Add', ErrorMessage) + end end service Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN) - - ErrorMessage = '' - JsonString = '' - If FullObject EQ '' then - FullObject = True$ - end - If RowExists('LOT', LotId) then - objJSON = '' - If SRP_JSON(objJSON, 'New', 'Object') then - LotRec = Database_Services('ReadDataRow', 'LOT', LotId) - If Error_Services('NoError') then - If SRP_JSON(objLot, 'New', 'Object') then - - SRP_JSON(objLot, 'SetValue', 'LotId', LotId) - SRP_JSON(objLot, 'SetValue', 'Type', LotRec) - SRP_JSON(objLot, 'SetValue', 'ProdId', LotRec) - Begin Case - Case LotRec = 'TW' - ProdName = XLATE('TEST_WAFER_PROD', LotRec, TEST_WAFER_PROD_PART_NAME$, 'X') - Case Otherwise$ - ProdName = '' - End Case - SRP_JSON(objLot, 'SetValue', 'ProdName', ProdName) - SRP_JSON(objLot, 'SetValue', 'OrigWaferQty', LotRec) - SRP_JSON(objLot, 'SetValue', 'WaferQty', LotRec) - SRP_JSON(objLot, 'SetValue', 'VendorPartNo', LotRec) - SRP_JSON(objLot, 'SetValue', 'VendorLotNo', LotRec) - SRP_JSON(objLot, 'SetValue', 'Vendor', LotRec) - CurrOperation = Lot_Services('GetLotCurrOperationId', LotId) - CurrOperation = Field(CurrOperation, '*', 2) - SRP_JSON(objLot, 'SetValue', 'CurrOperation', CurrOperation) - If FullObject then - //Events Array - EventsArrayJson = '' - If SRP_Json(EventsArrayJson, 'New', 'Array') then - LotEventKeys = Lot_Services('GetLotEventsInSequence', LotId) - for each LotEventKey in LotEventKeys using @FM - objEvent = '' - EventRec = Database_Services('ReadDataRow', 'LOT_EVENT', LotEventKey) - If SRP_Json(objEvent, 'New', 'Object') then - SRP_JSON(objEvent, 'SetValue', 'LotEventId', LotEventKey) - SRP_JSON(objEvent, 'SetValue', 'LotId', EventRec) - SRP_JSON(objEvent, 'SetValue', 'LotEventType', EventRec) - SRP_JSON(objEvent, 'SetValue', 'EventDatetime', OConv(EventRec, 'DT')) - SRP_JSON(objEvent, 'SetValue', 'EventNote', EventRec) - SRP_JSON(objEvent, 'SetValue', 'EquipmentId', EventRec) - SRP_JSON(objEvent, 'SetValue', 'EventReduceWaferQty', EventRec) - SRP_JSON(objEvent, 'SetValue', 'EventBonusWaferQty', EventRec) - SRP_JSON(objEvent, 'SetValue', 'EventBeginWaferQty', EventRec) - SRP_JSON(objEvent, 'SetValue', 'EventEndWaferQty', EventRec) - SRP_JSON(objEvent, 'SetValue', 'EventOperationId', EventRec) - SRP_JSON(objEvent, 'SetValue', 'EventOperatorId', EventRec) - SRP_JSON(objEvent, 'SetValue', 'Sequence', EventRec) - SRP_JSON(EventsArrayJson, 'Add', objEvent) - SRP_JSON(objEvent, 'Release') - end - Next LotEventKey - SRP_JSON(objLot, 'Set', 'LotEvents', EventsArrayJson) - SRP_JSON(EventsArrayJson, 'Release') - end else - ErrorMessage = 'Error Creating Events JSON Array' - end - //Operations Array - OperationsArrayJson = '' - If SRP_Json(OperationsArrayJson, 'New', 'Array') then - LotOperationKeys = Lot_Services('GetLotOperationSequence', LotId) - for each LotOperationKey in LotOperationKeys using @FM - objOperation = '' - OperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationKey) - If SRP_Json(objOperation, 'New', 'Object') then - SRP_JSON(objOperation, 'SetValue', 'LotOperationId', LotOperationKey) - SRP_JSON(objOperation, 'SetValue', 'LotId', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'OperationId', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'DatetimeIn', OConv(OperationRec, 'DT')) - SRP_JSON(objOperation, 'SetValue', 'DatetimeOut', Oconv(OperationRec, 'DT')) - SRP_JSON(objOperation, 'SetValue', 'EquipmentId', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'WaferInQty', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'WaferOutQty', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'OperatorInId', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'OperatorOutId', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'OperationSequence', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'Rework', OperationRec) - SRP_JSON(objOperation, 'SetValue', 'DatetimeStart', OConv(OperationRec, 'DT')) - SRP_JSON(objOperation, 'SetValue', 'DatetimeStop', OConv(OperationRec, 'DT')) - SRP_JSON(OperationsArrayJson, 'Add', objOperation) - SRP_JSON(objOperation, 'Release') - end - - Next LotOperationKey - SRP_JSON(objLot, 'Set', 'LotOperations', OperationsArrayJson) - SRP_JSON(OperationsArrayJson, 'Release') - end else - ErrorMessage = 'Error Creating Operations JSON Array' - end - end - - SRP_JSON(objJSON, 'Set', 'Lot', objLot) - SRP_JSON(objLot, 'Release') - end else - ErrorMessage = 'Error creating new Lot Json Object' - end - end else - ErrorMessage = 'Error reading ':LotId:' from lot table.' - end - JsonString = SRP_JSON(objJSON, 'Stringify', 'Styled') - SRP_JSON(objJSON, 'Release') - end else - ErrorMessage = 'Error creating new Json Object' - end - end else - ErrorMessage = 'Invalid or null lot number passed to routine.' - end - If ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) - end - Response = JsonString + + ErrorMessage = '' + JsonString = '' + If FullObject EQ '' then + FullObject = True$ + end + If RowExists('LOT', LotId) then + objJSON = '' + If SRP_JSON(objJSON, 'New', 'Object') then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId) + If Error_Services('NoError') then + If SRP_JSON(objLot, 'New', 'Object') then + + SRP_JSON(objLot, 'SetValue', 'LotId', LotId) + SRP_JSON(objLot, 'SetValue', 'Type', LotRec) + SRP_JSON(objLot, 'SetValue', 'ProdId', LotRec) + Begin Case + Case LotRec = 'TW' + ProdName = XLATE('TEST_WAFER_PROD', LotRec, TEST_WAFER_PROD_PART_NAME$, 'X') + Case Otherwise$ + ProdName = '' + End Case + SRP_JSON(objLot, 'SetValue', 'ProdName', ProdName) + SRP_JSON(objLot, 'SetValue', 'OrigWaferQty', LotRec) + SRP_JSON(objLot, 'SetValue', 'WaferQty', LotRec) + SRP_JSON(objLot, 'SetValue', 'VendorPartNo', LotRec) + SRP_JSON(objLot, 'SetValue', 'VendorLotNo', LotRec) + SRP_JSON(objLot, 'SetValue', 'Vendor', LotRec) + CurrOperation = Lot_Services('GetLotCurrOperationId', LotId) + CurrOperation = Field(CurrOperation, '*', 2) + SRP_JSON(objLot, 'SetValue', 'CurrOperation', CurrOperation) + If FullObject then + //Events Array + EventsArrayJson = '' + If SRP_Json(EventsArrayJson, 'New', 'Array') then + LotEventKeys = Lot_Services('GetLotEventsInSequence', LotId) + for each LotEventKey in LotEventKeys using @FM + objEvent = '' + EventRec = Database_Services('ReadDataRow', 'LOT_EVENT', LotEventKey) + If SRP_Json(objEvent, 'New', 'Object') then + SRP_JSON(objEvent, 'SetValue', 'LotEventId', LotEventKey) + SRP_JSON(objEvent, 'SetValue', 'LotId', EventRec) + SRP_JSON(objEvent, 'SetValue', 'LotEventType', EventRec) + SRP_JSON(objEvent, 'SetValue', 'EventDatetime', OConv(EventRec, 'DT')) + SRP_JSON(objEvent, 'SetValue', 'EventNote', EventRec) + SRP_JSON(objEvent, 'SetValue', 'EquipmentId', EventRec) + SRP_JSON(objEvent, 'SetValue', 'EventReduceWaferQty', EventRec) + SRP_JSON(objEvent, 'SetValue', 'EventBonusWaferQty', EventRec) + SRP_JSON(objEvent, 'SetValue', 'EventBeginWaferQty', EventRec) + SRP_JSON(objEvent, 'SetValue', 'EventEndWaferQty', EventRec) + SRP_JSON(objEvent, 'SetValue', 'EventOperationId', EventRec) + SRP_JSON(objEvent, 'SetValue', 'EventOperatorId', EventRec) + SRP_JSON(objEvent, 'SetValue', 'Sequence', EventRec) + SRP_JSON(EventsArrayJson, 'Add', objEvent) + SRP_JSON(objEvent, 'Release') + end + Next LotEventKey + SRP_JSON(objLot, 'Set', 'LotEvents', EventsArrayJson) + SRP_JSON(EventsArrayJson, 'Release') + end else + ErrorMessage = 'Error Creating Events JSON Array' + end + //Operations Array + OperationsArrayJson = '' + If SRP_Json(OperationsArrayJson, 'New', 'Array') then + LotOperationKeys = Lot_Services('GetLotOperationSequence', LotId) + for each LotOperationKey in LotOperationKeys using @FM + objOperation = '' + OperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', LotOperationKey) + If SRP_Json(objOperation, 'New', 'Object') then + SRP_JSON(objOperation, 'SetValue', 'LotOperationId', LotOperationKey) + SRP_JSON(objOperation, 'SetValue', 'LotId', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'OperationId', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'DatetimeIn', OConv(OperationRec, 'DT')) + SRP_JSON(objOperation, 'SetValue', 'DatetimeOut', Oconv(OperationRec, 'DT')) + SRP_JSON(objOperation, 'SetValue', 'EquipmentId', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'WaferInQty', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'WaferOutQty', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'OperatorInId', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'OperatorOutId', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'OperationSequence', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'Rework', OperationRec) + SRP_JSON(objOperation, 'SetValue', 'DatetimeStart', OConv(OperationRec, 'DT')) + SRP_JSON(objOperation, 'SetValue', 'DatetimeStop', OConv(OperationRec, 'DT')) + SRP_JSON(OperationsArrayJson, 'Add', objOperation) + SRP_JSON(objOperation, 'Release') + end + + Next LotOperationKey + SRP_JSON(objLot, 'Set', 'LotOperations', OperationsArrayJson) + SRP_JSON(OperationsArrayJson, 'Release') + end else + ErrorMessage = 'Error Creating Operations JSON Array' + end + end + + SRP_JSON(objJSON, 'Set', 'Lot', objLot) + SRP_JSON(objLot, 'Release') + end else + ErrorMessage = 'Error creating new Lot Json Object' + end + end else + ErrorMessage = 'Error reading ':LotId:' from lot table.' + end + JsonString = SRP_JSON(objJSON, 'Stringify', 'Styled') + SRP_JSON(objJSON, 'Release') + end else + ErrorMessage = 'Error creating new Json Object' + end + end else + ErrorMessage = 'Invalid or null lot number passed to routine.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end + Response = JsonString end service Service OpenLot(LotId) - ErrorMessage = '' - If RowExists('LOT', LotId) then - LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) - LotRec = True$ - Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) - If Error_Services('HasError') then - ErrorMessage = 'Error setting lot ' : LotId : ' to open.' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Unable to Open Lot ' : LotId : '. Lot ID was not found in LOT table.' - end - If ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) - end + ErrorMessage = '' + If RowExists('LOT', LotId) then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) + LotRec = True$ + Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) + If Error_Services('HasError') then + ErrorMessage = 'Error setting lot ' : LotId : ' to open.' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Unable to Open Lot ' : LotId : '. Lot ID was not found in LOT table.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end end service Service CloseLot(LotId) - ErrorMessage = '' - If RowExists('LOT', LotId) then - LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) - LotRec = False$ - Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) - If Error_Services('HasError') then - ErrorMessage = 'Error setting lot ' : LotId : ' to closed.' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Unable to Close Lot ' : LotId : '. Lot ID was not found in LOT table.' - end - If ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) - end + ErrorMessage = '' + If RowExists('LOT', LotId) then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) + LotRec = False$ + Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) + If Error_Services('HasError') then + ErrorMessage = 'Error setting lot ' : LotId : ' to closed.' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Unable to Close Lot ' : LotId : '. Lot ID was not found in LOT table.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end end service Service AutoCloseTestWaferLot(LotId, CloseUserId) @@ -1190,11 +1247,11 @@ Service AutoCloseTestWaferLot(LotId, CloseUserId) end service Service HoldLot(LotId, OperatorId) - + end service Service UnholdLot(LotId, OperatorId) - + end service @@ -1245,51 +1302,125 @@ Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId) end service Service IncreaseLotWaferCount(LotId, IncreaseQty) - ErrorMessage = '' - If RowExists('LOT', LotId) then - LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) - LotHold = LotRec - LotOpen = LotRec - if LotOpen then - If Not(LotHold) then - LotCurrWfrQty = LotRec - LotNewWfrQty = LotCurrWfrQty + IncreaseQty - - If LotNewWfrQty LE 25 AND LotNewWfrQty GT 0 then - LotRec = LotNewWfrQty - Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) - If Error_Services('HasError') then - ErrorMessage = 'Error in Increase Lot Wafer Count service, Error writing Lot Id ' : LotId : ' with new quantity.' - end - end else - Begin Case - Case LotNewWfrQty GT 25 - ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity great than 25.' - Case LotNewWfrQty LT 0 - ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity less than 0.' - End Case - end - end else - ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' is currently on hold.' - end - end else - ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' is closed.' - end - - end else - ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' not found in lot table.' - end - if ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) - end + ErrorMessage = '' + If RowExists('LOT', LotId) then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) + LotHold = LotRec + LotOpen = LotRec + if LotOpen then + If Not(LotHold) then + LotCurrWfrQty = LotRec + LotNewWfrQty = LotCurrWfrQty + IncreaseQty + + If LotNewWfrQty LE 25 AND LotNewWfrQty GT 0 then + LotRec = LotNewWfrQty + Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) + If Error_Services('HasError') then + ErrorMessage = 'Error in Increase Lot Wafer Count service, Error writing Lot Id ' : LotId : ' with new quantity.' + end + end else + Begin Case + Case LotNewWfrQty GT 25 + ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity great than 25.' + Case LotNewWfrQty LT 0 + ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity less than 0.' + End Case + end + end else + ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' is currently on hold.' + end + end else + ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' is closed.' + end + + end else + ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' not found in lot table.' + end + if ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end end service Service OpenOIWizardCreateTWLotInBrowser() - Command = 'explorer https://goto.infineon.com/oiwizard/Lot/CreateTestWaferLot/' - SRP_Run_Command(Command) + Command = 'explorer https://goto.infineon.com/oiwizard/Lot/CreateTestWaferLot/' + SRP_Run_Command(Command) +end service + +Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username) + ErrorMessage = '' + If RowExists('LSL_USERS', Username) then + If LotType NE '' then + NewVoidedLotRecordId = RTI_CreateGUID() + If Not(RowExists('VOIDED_LOT', NewVoidedLotRecordId)) then + NewVoidedLotRec = '' + Begin Case + Case LotType EQ 'RDS' + WONo = XLate('RDS', LegacyLotId, RDS_WO$, 'X') + CassNo = XLATE('RDS', LotId, RDS_CASS_NO$, 'X') + WoMatKey = WONo : '*' : CassNo + If RowExists('RDS', LegacyLotId) then + WoNo = Field(LotId, '*', 1) + NewVoidedLotRec = WoNo + NewVoidedLotRec = 'RDS' + NewVoidedLotRec = LegacyLotId + end else + ErrorMessage = 'Error when creating a voided lot record for ' : LotId : ' of type ' : LotType : '. RDS record not found.' + end + Case LotType EQ 'WO_MAT' + If RowExists('WO_MAT', LegacyLotId) then + WoNo = Field(LotId, '*', 1) + NewVoidedLotRec = WoNo + NewVoidedLotRec = 'WO_MAT' + NewVoidedLotRec = LegacyLotId + end else + ErrorMessage = 'Error when creating a voided lot record for ' : LotId : ' of type ' : LotType : '. WoMat record not found.' + end + Case LotType EQ 'WM_IN' + If RowExists('WM_IN', LegacyLotId) then + WoNo = Field(LotId, '*', 1) + NewVoidedLotRec = WoNo + NewVoidedLotRec = 'WM_IN' + NewVoidedLotRec = LegacyLotId + end else + ErrorMessage = 'Error when creating a voided lot record for ' : LotId : ' of type ' : LotType : '. WM_IN record not found.' + end + Case LotType EQ 'WM_OUT' + If RowExists('WM_OUT', LegacyLotId) then + WoNo = Field(LotId, '*', 1) + NewVoidedLotRec = WoNo + NewVoidedLotRec = 'WM_OUT' + NewVoidedLotRec = LegacyLotId + end else + ErrorMessage = 'Error when creating a voided lot record for ' : LotId : ' of type ' : LotType : '. WM_OUT record not found.' + end + Case Otherwise$ + ErrorMessage = 'Error when creating a voided lot record for ' : LotId : ' of type ' : LotType : '. Non supported lot type.' + End Case + If ErrorMessage EQ '' then + NewVoidedLotRec = Username + NewVoidedLotRec = Datetime() + NewVoidedLotRec = LotId + Database_Services('WriteDataRow', 'VOIDED_LOT', NewVoidedLotRecordId, NewVoidedLotRec) + If Error_Services('HasError') then + ErrorMessage = Error_Services('GetMessage') + end + end + end else + ErrorMessage = 'Go buy a lottery ticket, we ran into a GUID collision with an existing GUID ' : NewVoidedLotRecordId : ' when trying to create a Voided Lot record for ' : LotId + end + end else + ErrorMessage = 'Null lot type of passed to CreateVoidedLotRecord routine.' + end + end else + ErrorMessage = 'Username ' : Username : ' passed to CreateVoidedLotRecord routine does not exist.' + end + If ErrorMessage NE '' then + //Todo Log Error Message + end end service + diff --git a/LSL2/STPROC/NDW_WO_LOG_EVENTS.txt b/LSL2/STPROC/NDW_WO_LOG_EVENTS.txt index 7e289cf..17ffe62 100644 --- a/LSL2/STPROC/NDW_WO_LOG_EVENTS.txt +++ b/LSL2/STPROC/NDW_WO_LOG_EVENTS.txt @@ -69,10 +69,10 @@ $Insert QUOTE_DET_EQU $Insert QUOTE_SIGS_EQU $Insert REACT_RUN_EQUATES $Insert WM_OUT_EQUATES -$Insert WO_STEP_EQU $Insert ORDER_EQU $Insert ORDER_DET_EQU $Insert RLIST_EQUATES +$Insert WO_STEP_EQUATES EQU COL$QUOTE_DESC TO 1 EQU COL$SETUP_CHG TO 4 @@ -116,10 +116,10 @@ EQU COL$STEP_SCHED_DTM TO 11 EQU COMMA$ to ',' Declare subroutine Errmsg, Btree.Extract, Set_Status, Logging_Services, Work_Order_Services, Start_Window, obj_WO_Log -Declare subroutine obj_Notes, Comm_Customer_Epi, Print_WO, obj_WO_Mat, obj_WM_In, obj_WO_Mat, obj_RDS -Declare subroutine Security_Err_Msg, obj_WM_Out, Database_Services, End_Window, Print_Shelf_Label +Declare subroutine obj_Notes, Comm_Customer_Epi, Print_WO, obj_WO_Mat, obj_WM_In, obj_WO_Mat, obj_RDS, Msg +Declare subroutine Security_Err_Msg, obj_WM_Out, Database_Services, End_Window, Print_Shelf_Label, Signature_Services Declare function obj_WO_Log, Work_Order_Services, Environment_Services, Logging_Services, Memberof, NextKey -Declare function Database_Services, Unassigned, obj_WO_Mat, obj_RDS, Security_Check, obj_WM_Out +Declare function Database_Services, Unassigned, obj_WO_Mat, obj_RDS, Security_Check, obj_WM_Out, Error_Services LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG' LogDate = Oconv(Date(), 'D4/') @@ -1187,15 +1187,13 @@ end event Event PUB_REM_CASS.CLICK() - WONo = Get_Property(@WINDOW:'.EDL_WO_NO','TEXT') + WOStepKey = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X') IF WONo NE '' then WORec = XLATE('WO_LOG',WONo,'','X') WOMatKeys = WORec - WMInKeys = XLATE('WO_MAT',WOMatKeys,WO_MAT_WMI_KEY$,'X') - - WMInKeys = XLATE('WO_MAT',WOMatKeys,WO_MAT_WMI_KEY$,'X') + WMInKeys = XLATE('WO_STEP', WOStepKey, WO_STEP_WM_IN_KEYS$, 'X') WMInTestSTring = WMInKeys CONVERT @VM TO '' IN WMInTestString @@ -1212,7 +1210,7 @@ Event PUB_REM_CASS.CLICK() DispLine = 1 IF WMInTestString NE '' THEN - + //EPP Case for WMI FOR I = WMInCnt TO 1 STEP -1 WMIRec = XLATE('WM_IN',WMInKeys<1,I>,'','X') WMIRdsNos = WMIRec @@ -1256,26 +1254,15 @@ Event PUB_REM_CASS.CLICK() NEXT I TestWMInKeys = DelWMInKeys - CONVERT @VM TO '' IN TestWMInKeys IF TestWMInKeys NE '' THEN Set_Status(0) - obj_WM_In('Delete',DelWMInKeys) ;* Removes WMI records from system - - IF Get_Status(errCode) THEN - ErrMsg(errCode) - END - END - - Set_Status(0) - obj_WO_Log('RemoveCassettes',WONo:@RM:CassNos) - - IF Get_Status(errCode) THEN - ErrMsg(errCode) - END - + for each DelWMInKey in DelWMInKeys using @VM + Work_Order_Services('SignVoidWMI', DelWMInKey, @USER4) + Next DelWMInKey + END END ELSE - + //Non-EPP Case for RDS CassCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '') FOR I = CassCnt TO 1 STEP -1 @@ -1289,14 +1276,15 @@ Event PUB_REM_CASS.CLICK() CONVERT @VM TO '' IN WOMatSigs UNTIL WOMatSigs NE '' - Display<1,DispLine,1> = WOMatKeys<1,I>[-1,'B*'] - Display<1,DispLine,2> = WOMatRec - Display<1,DispLine,3> = WOMatRec - Display<1,DispLine,4> = WOMatRec - Display<1,DispLine,5> = OCONV(WOMatCurrStatus,'[WO_MAT_CURR_STATUS_CONV]') - DispLine += 1 + If WoMatCurrStatus NE 'VOID' then + Display<1,DispLine,1> = WOMatKeys<1,I>[-1,'B*'] + Display<1,DispLine,2> = WOMatRec + Display<1,DispLine,3> = WOMatRec + Display<1,DispLine,4> = WOMatRec + Display<1,DispLine,5> = OCONV(WOMatCurrStatus,'[WO_MAT_CURR_STATUS_CONV]') + DispLine += 1 + end NEXT I - IF Display NE '' THEN TypeOver = '' TypeOver = Display @@ -1322,23 +1310,18 @@ Event PUB_REM_CASS.CLICK() END NEXT I - TestRDSNos = RDSNos - CONVERT @VM TO '' IN TestRDSNos - IF TestRDSNos NE '' THEN - Set_Status(0) - InProcessRDSNos = obj_RDS('Delete',RDSNos) ;* Removes RDS records from system - - IF Get_Status(errCode) THEN - ErrMsg(errCode) - END - END - - Set_Status(0) - obj_WO_Log('RemoveCassettes',WONo:@RM:CassNos) - - IF Get_Status(errCode) THEN - ErrMsg(errCode) - END + VoidStatusMessage = '' + for each CassNo in CassNos using @VM + WoMatKey = WONo : '*' : CassNo + Work_Order_Services('SignVoidNonEpp', WoMatKey, @USER4) + If Error_Services('HasError') then + VoidStatusMessage = Error_Services('GetMessage') + end + Next CassNo + If VoidStatusMessage EQ '' then + VoidStatusMessage = 'All cassettes have been queued for void.' + end + Msg(@Window, VoidStatusMessage) END IF Display = '' THEN @@ -1374,14 +1357,13 @@ end event Event PUB_REM_WM_OUT.CLICK() - WONo = Get_Property(@WINDOW:'.EDL_WO_NO','TEXT') + WOStepKey = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X') IF WONo NE '' then WORec = XLATE('WO_LOG',WONo,'','X') WOMatKeys = WORec - - WMOutKeys = XLATE('WO_MAT',WOMatKeys,WO_MAT_WMO_KEY$,'X') + WMOutKeys = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKey, WO_STEP_WM_OUT_KEYS$, True$, 0, False$) WMOutCnt = COUNT(WMOutKeys,@VM) + (WMOutKeys NE '') Display = '' @@ -1422,21 +1404,15 @@ Event PUB_REM_WM_OUT.CLICK() NEXT I TestWMOutKeys = DelWMOutKeys - CONVERT @VM TO '' IN TestWMOutKeys IF TestWMOutKeys NE '' THEN - Set_Status(0) - obj_WM_Out('Delete',DelWMOutKeys) ;* Removes WMO records from system - - IF Get_Status(errCode) THEN - ErrMsg(errCode) - END + for each WMOutKey in TestWMOutKeys using @VM + Work_Order_Services('SignVoidWMO', WMOutKey, @USER4) + Next WMOutKey + If Error_Services('HasError') then + Msg(@Window, Error_Services('GetMessage')) + end END - - IF Get_Status(errCode) THEN - ErrMsg(errCode) - END - END IF Display = '' THEN @@ -2163,3 +2139,6 @@ StartStopDate: return + + + diff --git a/LSL2/STPROC/OBJ_WM_IN.txt b/LSL2/STPROC/OBJ_WM_IN.txt index cfd33f3..900314f 100644 --- a/LSL2/STPROC/OBJ_WM_IN.txt +++ b/LSL2/STPROC/OBJ_WM_IN.txt @@ -296,7 +296,6 @@ RETURN * * * * * * * RemainingSlots: * * * * * * * - WONo = Parms[1,@RM] WOStep = Parms[COL2()+1,@RM] CassNos = Parms[COL2()+1,@RM] @@ -321,7 +320,7 @@ RemainingSlots: WMInRec = XLATE('WM_IN',WONo:'*':WOStep:'*':CassNo,'','X') WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X') - IF WOMatRec = 1 AND WOMatRec = 'WM_IN' THEN + IF (WOMatRec = 1 AND WOMatRec = 'WM_IN') OR WMInRec EQ True$ THEN NULL ;* Box is on hold - skip it END ELSE SlotCnt = COUNT(WMInRec,@VM) + (WMInRec NE '') @@ -935,3 +934,5 @@ RepProdTW: RETURN + + diff --git a/LSL2/STPROC/OBJ_WM_OUT.txt b/LSL2/STPROC/OBJ_WM_OUT.txt index 3e6f096..68d35cf 100644 --- a/LSL2/STPROC/OBJ_WM_OUT.txt +++ b/LSL2/STPROC/OBJ_WM_OUT.txt @@ -585,7 +585,7 @@ RETURN * * * * * * * NextOpenSlots: * * * * * * * - + WONo = Parms[1,@RM] WOStep = Parms[COL2()+1,@RM] CassNos = Parms[COL2()+1,@RM] @@ -632,7 +632,8 @@ NextOpenSlots: SlotCnt = COUNT(WMOutRec,@VM) + (WMOutRec NE '') IsMULot = WMOutRec EQ True$ IsFQASigned = WMOutRec NE '' - If Not(IsMULot) AND Not(IsFQASigned) then + IsVoided = WMOutRec + If Not(IsMULot) AND Not(IsFQASigned) AND Not(IsVoided) then FOR N = SlotCnt TO 1 STEP -1 IF WMOutRec NE '' AND WMOutRec = '' AND WMOutRec = '' AND WMOutRec = '' THEN @@ -2010,3 +2011,5 @@ ConvertCleanInsp: RETURN + + diff --git a/LSL2/STPROC/OBJ_WO_MAT.txt b/LSL2/STPROC/OBJ_WO_MAT.txt index 50d46ea..17d2278 100644 --- a/LSL2/STPROC/OBJ_WO_MAT.txt +++ b/LSL2/STPROC/OBJ_WO_MAT.txt @@ -800,6 +800,12 @@ IF WMIKey NE '' OR WMOKey NE '' THEN Result = 'RTB' Case WMIStatus EQ 'HOLD' and WMOStatus NE '' Result = WMOStatus + Case WMIStatus EQ 'VOID' and WMOStatus EQ 'VOID' + Result = 'VOID' + Case WMIStatus EQ 'VOID' and WMOStatus NE 'VOID' + Result = WMOStatus + Case WMIStatus NE 'VOID' and WMOStatus EQ 'VOID' + Result = WMIStatus CASE InboundStat = '' AND OutboundStat = '' Result = '' @@ -3254,9 +3260,9 @@ ReportStatus: RETURN END - + IF WMIKey NE '' THEN - IF WMIStatus = 'MT' OR WMIStatus = 'VOID' THEN + IF WMIStatus = 'MT' THEN NULL END ELSE InboundStat = WMIStatus @@ -3267,41 +3273,49 @@ ReportStatus: * Removed "( WMOMakeup = 1 AND WMOStatus = 'MT' ) from the OR conditions * 5/1/2014 JCH - IF WMOStatus = 'RTB' OR WMOStatus = 'VOID' THEN + IF WMOStatus = 'RTB' THEN NULL END ELSE OutboundStat = WMOStatus END END - - BEGIN CASE - CASE InboundStat = '' AND OutboundStat = '' - Result = '' - - CASE InboundStat = '' AND OutboundStat NE '' - IF WMOMakeup = 1 THEN - OutboundStat = 'WMO':' - M/U - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]') - END ELSE - OutboundStat = 'WMO':' - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]') - END - Result = OutboundStat - - - CASE InboundStat NE '' AND OutboundStat = '' - Result = 'WMI':' - ':OCONV(WMIStatus,'[WM_IN_CURR_STATUS_CONV]') - - - CASE InboundStat NE '' AND OutboundStat NE '' - Result = 'WMI':' - ':OCONV(WMIStatus,'[WM_IN_CURR_STATUS_CONV]'):@VM - - IF WMOMakeup = 1 THEN - OutboundStat = 'WMO':' - M/U - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]') - END ELSE - OutboundStat = 'WMO':' - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]') - END - Result = Result:OutboundStat - - END CASE + BEGIN CASE + CASE InboundStat = '' AND OutboundStat = '' + Result = '' + CASE InboundStat = '' AND OutboundStat NE '' + IF WMOMakeup = 1 THEN + OutboundStat = 'WMO':' - M/U - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]') + END ELSE + OutboundStat = 'WMO':' - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]') + END + Result = OutboundStat + + + CASE InboundStat NE '' AND OutboundStat = '' + Result = 'WMI':' - ':OCONV(WMIStatus,'[WM_IN_CURR_STATUS_CONV]') + + CASE InboundStat NE '' AND OutboundStat NE '' + Result = 'WMI':' - ':OCONV(WMIStatus,'[WM_IN_CURR_STATUS_CONV]'):@VM + + IF WMOMakeup = 1 THEN + OutboundStat = 'WMO':' - M/U - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]') + END ELSE + OutboundStat = 'WMO':' - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]') + END + Result = Result:OutboundStat + + + END CASE + Begin Case + Case InboundStat NE 'VOID' AND OutboundStat NE 'VOID' + Result = Result + Case InboundStat EQ 'VOID' AND OutboundStat NE 'VOID' + Result = OutboundStat + Case InboundStat NE 'VOID' AND OutboundStat EQ 'VOID' + Result = InboundStat + Case InboundStat EQ 'VOID' AND OutboundStat EQ 'VOID' + Result = 'VOID' + End Case RETURN @@ -5604,3 +5618,4 @@ RETURN + diff --git a/LSL2/STPROC/OBJ_WO_MAT_LOG.txt b/LSL2/STPROC/OBJ_WO_MAT_LOG.txt index f0633c6..80eaff0 100644 --- a/LSL2/STPROC/OBJ_WO_MAT_LOG.txt +++ b/LSL2/STPROC/OBJ_WO_MAT_LOG.txt @@ -17,9 +17,9 @@ COMPILE FUNCTION obj_WO_Mat_Log(Method,Parms) DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, NextKey, Popup, Get_Property, obj_RDS, Database_Services -Declare function Logging_Services, Environment_Services, RTI_CreateGUID, Error_Services +Declare function Logging_Services, Environment_Services, RTI_CreateGUID, Error_Services, Datetime DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS -DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, Logging_Services, Database_Services +DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, Logging_Services, Database_Services, Lot_Services $INSERT MSG_EQUATES $INSERT WO_MAT_LOG_EQUATES @@ -27,6 +27,7 @@ $INSERT WM_OUT_EQUATES $INSERT WM_IN_EQUATES $INSERT WO_MAT_EQUATES $INSERT RDS_EQU +$Insert WO_LOG_EQUATES $INSERT LSL_USERS_EQUATES $INSERT SRPMail_Inserts @@ -158,10 +159,79 @@ Create: * END Database_Services('WriteDataRow', 'WO_MAT_LOG', WOMatLogKey, WOMatLogRec, True$, False$, True$) - If Error_Services('HasError') then - ErrorMsg = Error_Services('GetMessage') - end else + If Error_Services('NoError') then + ReactType = XLATE('WO_LOG', WONos, WO_LOG_REACT_TYPE$, 'X') + If ReactType NE 'EPP' then + WONo = WoNos + CassNo = CassNos + WOMatKey = WONo : '*' : CassNo + RDSKey = XLATE('WO_MAT', WOMatKey, WO_MAT_RDS_NO$, 'X') + Lot_Services('CreateLotEvent', RDSKey, 'RDS', Datetime(), Action, '', '', 0, 0, '', UserID) + Lot_Services('CreateLotEvent', WOMatKey, 'WO_MAT', Datetime(), Action, '', '', 0, 0, '', UserID) + end else + Begin Case + Case Action EQ 'RCVD' + //WMI + WONo = WoNos + StepNo = 1 + CassNo = CassNos + WMInKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMInKey, 'WM_IN', Datetime(), Action, '', '', 0, 0, '', UserID) + Case Action EQ 'REL' + //WMI + WONo = WoNos + StepNo = 1 + CassNo = CassNos + WMInKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMInKey, 'WM_IN', Datetime(), Action, '', '', 0, 0, '', UserID) + Case Action EQ '1VER' + //RDS action, do nothing for now + Case Action EQ '1LOAD' + //RDS, do nothing for now + Case Action EQ '1UNLOAD' + //RDS, do nothing for now + Case Action EQ '1MO_PSTI' + WONo = WoNos + StepNo = 1 + CassNo = CassNos + WMOutKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMOutKey, 'WM_OUT', Datetime(), Action, '', '', 0, 0, '', UserID) + Case Action EQ '1MO_QA' + WONo = WoNos + StepNo = 1 + CassNo = CassNos + WMOutKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMOutKey, 'WM_OUT', Datetime(), Action, '', '', 0, 0, '', UserID) + Case Action EQ 'PACK' + WONo = WoNos + StepNo = 1 + CassNo = CassNos + WMOutKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMOutKey, 'WM_OUT', Datetime(), Action, '', '', 0, 0, '', UserID) + Case Action EQ 'PSVER' + WONo = WoNos + StepNo = 1 + CassNo = CassNos + WMOutKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMOutKey, 'WM_OUT', Datetime(), Action, '', '', 0, 0, '', UserID) + Case Action EQ 'SHIP' + WONo = WoNos + StepNo = 1 + CassNo = CassNos + WMOutKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMOutKey, 'WM_OUT', Datetime(), Action, '', '', 0, 0, '', UserID) + Case Action EQ 'LBLCHK' + //WMO + WONo = WoNos + StepNo = 1 + CassNo = CassNos + WMOutKey = WONo : '*' : StepNo : '*' : CassNo + Lot_Services('CreateLotEvent', WMOutKey, 'WM_OUT', Datetime(), Action, '', '', 0, 0, '', UserID) + End Case + end ErrorMsg = '' + end else + ErrorMsg = Error_Services('GetMessage') end RETURN @@ -270,11 +340,7 @@ Post: LockedToolID = ScanToolID LockedScanEntry = ScanEntry - END ELSE - NULL - END - - + END NEXT I WMLRec = LockedWONos @@ -298,5 +364,3 @@ Post: end RETURN - - diff --git a/LSL2/STPROC/QA_SERVICES.txt b/LSL2/STPROC/QA_SERVICES.txt index 0439aa7..af0b159 100644 --- a/LSL2/STPROC/QA_SERVICES.txt +++ b/LSL2/STPROC/QA_SERVICES.txt @@ -2517,8 +2517,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry) Error_Services('Set', ErrorMsg) Response = False$ return - end else - Lot_Services('CreateLotEvent', RDSNo, 'RDS', Datetime(), 'LOAD', 'Load stage signed', Reactor, '', '', '', Username) end IF ReactorType NE 'EPP' THEN @@ -3893,3 +3891,5 @@ ClearCursors: return + + diff --git a/LSL2/STPROC/RDS_ACTIONS.txt b/LSL2/STPROC/RDS_ACTIONS.txt index 9f05912..25be014 100644 --- a/LSL2/STPROC/RDS_ACTIONS.txt +++ b/LSL2/STPROC/RDS_ACTIONS.txt @@ -686,8 +686,9 @@ WRITE_RECORD_PRE: If NewLoadSig EQ '' then // Audit the LOT_EVENT table for missing LOAD event (i.e., signature) - If RowExists('LOT', RDSNo) then - LotEvents = Lot_Services('GetLotEventsInSequence', RDSNo) + ExistingNGLotId = Lot_Services('GetLotIdByLegacyLotIdAndType', RDSNo, 'RDS') + If RowExists('LOT', ExistingNGLotId) then + LotEvents = Lot_Services('GetLotEventsInSequence', ExistingNGLotId) If LotEvents NE '' then LotEventsRev = SRP_Array('Reverse', LotEvents, @FM) LotEventsTypesRev = Xlate('LOT_EVENT', LotEventsRev, LOT_EVENT_LOT_EVENT_TYPE$, 'X') diff --git a/LSL2/STPROC/RDS_EVENTS.txt b/LSL2/STPROC/RDS_EVENTS.txt index f334e9e..c451cd7 100644 --- a/LSL2/STPROC/RDS_EVENTS.txt +++ b/LSL2/STPROC/RDS_EVENTS.txt @@ -427,7 +427,6 @@ Event PUB_SIGN.CLICK() Send_Event(@Window, 'READ') Case SignEventType EQ 'Unsign' - // 1. Check if on hold. If so, then block event and inform user WOMatKey = WONo:'*':CassNo WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey) diff --git a/LSL2/STPROC/RDS_SERVICES.txt b/LSL2/STPROC/RDS_SERVICES.txt index 8dc1879..bc7d09b 100644 --- a/LSL2/STPROC/RDS_SERVICES.txt +++ b/LSL2/STPROC/RDS_SERVICES.txt @@ -1759,6 +1759,26 @@ Service ApplyAbortMetrology(RdsKeys) end service +Service DetachRDSFromWO(RDSNo) + ErrorMessage = '' + If RowExists('RDS', RDSNo) then + RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) + if Error_Services('NoError') then + RDSRec = '' + Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, False$, False$, False$) + If Error_Services('HasError') then + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error detaching RDS ' : RDSNo ' from work order. RDS No not found in RDS table.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end +end service //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs @@ -1778,3 +1798,5 @@ return + + diff --git a/LSL2/STPROC/SERVICE_SERVICES.txt b/LSL2/STPROC/SERVICE_SERVICES.txt index 7848d14..105c0c1 100644 --- a/LSL2/STPROC/SERVICE_SERVICES.txt +++ b/LSL2/STPROC/SERVICE_SERVICES.txt @@ -64,9 +64,9 @@ Options BOOLEAN = True$, False$ // Returns an array of active services for the indicated server. //---------------------------------------------------------------------------------------------------------------------- Service GetServices(Server) - + Services = '' - + If Server NE '' then Sentence = 'SELECT SERVICES WITH SERVER EQ ' : Quote(Server) : ' AND WITH ACTIVE EQ "Yes"' rv = Set_Status(0) @@ -82,7 +82,7 @@ Service GetServices(Server) end Repeat end - + Sentence = 'SELECT SERVICES WITH SERVER EQ "" AND WITH ACTIVE EQ "Yes"' rv = Set_Status(0) RList(Sentence, TARGET_ACTIVELIST$, '', '', '') @@ -101,9 +101,9 @@ Service GetServices(Server) end else Error_Services('Add', 'Server argument was missing from the ' : Service : ' service.') end - + Response = Services - + end service @@ -113,7 +113,7 @@ end service // Returns an array of active services for the indicated server. //---------------------------------------------------------------------------------------------------------------------- Service GetServiceKeys() - + Services = '' Sentence = 'SELECT SERVICES BY NAME' rv = Set_Status(0) @@ -127,9 +127,9 @@ Service GetServiceKeys() Repeat end Services[-1, 1] = '' - + Response = Services - + end service @@ -139,35 +139,36 @@ end service // Returns the details of the indicated service. //---------------------------------------------------------------------------------------------------------------------- Service GetService(Service) - + ServiceDetails = '' - + If Service NE '' then ServiceDetails = Database_Services('ReadDataRow', 'SERVICES', Service) end else Error_Services('Add', 'Service argument was missing from the ' : Service : ' service.') end - + Response = ServiceDetails - + end service Service ProcessProcedureQueue() Open 'PROC_QUEUE' to hProcQueue then - Select hProcQueue + Select hProcQueue EOF = False$ Loop ReadNext RequestKeyID else EOF = True$ Until EOF - Lock hProcQueue, RequestKeyID then + Lock hProcQueue, RequestKeyID then + Database_Services('GetKeyIDLock', 'PROC_QUEUE', RequestKeyId) RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID) If RequestRow NE '' then Procedure = RequestRow Params = RequestRow If Procedure NE '' then - Dim ProcParams(10) + Dim ProcParams(11) For each Param in Params using @VM setting pPos ProcParams(pPos) = Param Next Param @@ -183,7 +184,8 @@ Service ProcessProcedureQueue() Case NumArguments EQ 7 ; Call @Procedure(ProcParams(1), ProcParams(2), ProcParams(3), ProcParams(4), ProcParams(5), ProcParams(6), ProcParams(7)) Case NumArguments EQ 8 ; Call @Procedure(ProcParams(1), ProcParams(2), ProcParams(3), ProcParams(4), ProcParams(5), ProcParams(6), ProcParams(7), ProcParams(8)) Case NumArguments EQ 9 ; Call @Procedure(ProcParams(1), ProcParams(2), ProcParams(3), ProcParams(4), ProcParams(5), ProcParams(6), ProcParams(7), ProcParams(8), ProcParams(9)) - Case Otherwise$ ; Call @Procedure(ProcParams(1), ProcParams(2), ProcParams(3), ProcParams(4), ProcParams(5), ProcParams(6), ProcParams(7), ProcParams(8), ProcParams(9), ProcParams(10)) + Case NumArguments EQ 10 ; Call @Procedure(ProcParams(1), ProcParams(2), ProcParams(3), ProcParams(4), ProcParams(5), ProcParams(6), ProcParams(7), ProcParams(8), ProcParams(9), ProcParams(10)) + Case Otherwise$ ; Call @Procedure(ProcParams(1), ProcParams(2), ProcParams(3), ProcParams(4), ProcParams(5), ProcParams(6), ProcParams(7), ProcParams(8), ProcParams(9), ProcParams(10), ProcParams(11)) End Case end end @@ -197,12 +199,13 @@ Service ProcessProcedureQueue() Unlock hProcQueue, RequestKeyID else Null end Repeat + end - + end service -Service PostProcecure(ProcedureName, Params) +Service PostProcedure(ProcedureName, Params) Response = '' If (ProcedureName NE '') then @@ -210,17 +213,17 @@ Service PostProcecure(ProcedureName, Params) RequestRow = '' RequestRow = ProcedureName RequestRow = Params + RequestRow = Datetime() Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$) end else Error_Services('Add', 'Error in ':Service:' service. Null ProcedureName passed in.') end - + return //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Internal GoSubs +/// Internal GoSubs //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - diff --git a/LSL2/STPROC/WM_IN_SERVICES.txt b/LSL2/STPROC/WM_IN_SERVICES.txt index 0b9b540..e59d1b8 100644 --- a/LSL2/STPROC/WM_IN_SERVICES.txt +++ b/LSL2/STPROC/WM_IN_SERVICES.txt @@ -55,7 +55,7 @@ $Insert WM_IN_EQUATES Declare function Database_Services Declare function PSN_Services, SRP_Rotate_Array, Datetime -Declare subroutine Database_Services, +Declare subroutine Database_Services, Set_Status, OBJ_WO_MAT_LOG GoToService @@ -121,3 +121,46 @@ Service AddComment(WMInNo, Comment) End Service +Service SetVoidFlag(WMInKey, Username) + ErrorMessage = '' + If RowExists('WM_IN', WMInKey) then + WMInRec = Database_Services('ReadDataRow', 'WM_IN', WMInKey, True$, 0, False$) + If Error_Services('NoError') then + WMInRec = True$ + Database_Services('WriteDataRow', 'WM_IN', WMInKey, WMInRec, True$, False, False$) + If Error_Services('NoError') then + Set_Status(0) + WONo = Field(WMInKey, '*', 1) + CassNo = Field(WMInKey, '*', 3) + WOMLParms = '' + LogFile = 'WO_MAT' ; WOMLParms = LogFile:@RM + LogDTM = OConv(Datetime(), 'DT') ; WOMLParms := LogDTM:@RM + Action = 'WM_IN_VOID' ; WOMLParms := Action:@RM + WhCd = 'CR' ; WOMLParms := WhCd:@RM + LocCd = 'VOID' ; WOMLParms := LocCd:@RM + WONos = WONo ; WOMLParms := WONos:@RM + CassNos = CassNo ; WOMLParms := CassNos:@RM + UserID = Username ; WOMLParms := UserID:@RM + Tags = '' ; WOMLParms := Tags:@RM + ToolID = '' ; WOMLParms := ToolID:@RM + WOMLParms := '' + obj_WO_Mat_Log('Create',WOMLParms) + IF Get_Status(errCode) THEN + ErrorMessage = 'Error writing inventory transactions' + end + end else + ErrorMessage = 'Failed to write to the WM_IN record ' : WMInKey : ' while attempting to set void status.' + end + end else + ErrorMessage = 'Failed to read WM_IN record ' : WMInKey : ' while attempting to set void status.' + end + end else + ErrorMessage = 'Invalid WM_IN Key ' : WMInKey : ' passed to SetVoidFlag routine.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end +end service + + + diff --git a/LSL2/STPROC/WM_OUT_SERVICES.txt b/LSL2/STPROC/WM_OUT_SERVICES.txt index f57e13a..66ff570 100644 --- a/LSL2/STPROC/WM_OUT_SERVICES.txt +++ b/LSL2/STPROC/WM_OUT_SERVICES.txt @@ -60,7 +60,7 @@ $Insert RETURN_TO_FAB_LOTS_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 -Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys +Declare subroutine Database_Services, SRP_JSON, Error_Services, Extract_Si_Keys, Set_Status, obj_wo_mat_log GoToService @@ -397,4 +397,47 @@ Service GetWaferMap(WMOKey) end service +Service SetVoidFlag(WMOutKey, Username) + ErrorMessage = '' + If RowExists('WM_OUT', WMOutKey) then + WMOutRec = Database_Services('ReadDataRow', 'WM_OUT', WMOutKey, True$, 0, False$) + If Error_Services('NoError') then + WMOutRec = True$ + Database_Services('WriteDataRow', 'WM_OUT', WMOutKey, WMOutRec, True$, False, False$) + If Error_Services('NoError') then + Set_Status(0) + WONo = Field(WMOutKey, '*', 1) + CassNo = Field(WMOutKey, '*', 3) + WOMLParms = '' + LogFile = 'WO_MAT' ; WOMLParms = LogFile:@RM + LogDTM = OConv(Datetime(), 'DT') ; WOMLParms := LogDTM:@RM + Action = 'WM_OUT_VOID' ; WOMLParms := Action:@RM + WhCd = 'CR' ; WOMLParms := WhCd:@RM + LocCd = 'VOID' ; WOMLParms := LocCd:@RM + WONos = WONo ; WOMLParms := WONos:@RM + CassNos = CassNo ; WOMLParms := CassNos:@RM + UserID = Username ; WOMLParms := UserID:@RM + Tags = '' ; WOMLParms := Tags:@RM + ToolID = '' ; WOMLParms := ToolID:@RM + WOMLParms := '' + obj_WO_Mat_Log('Create',WOMLParms) + IF Get_Status(errCode) THEN + ErrorMessage = 'Error writing inventory transactions' + end + end else + ErrorMessage = 'Failed to write to the WM_OUT record ' : WMOutKey : ' while attempting to set void status.' + end + end else + ErrorMessage = 'Failed to read WM_OUT record ' : WMOutKey : ' while attempting to set void status.' + end + end else + ErrorMessage = 'Invalid WM_OUT Key ' : WMOutKey : ' passed to SetVoidFlag routine.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end +end service + + + diff --git a/LSL2/STPROC/WORK_ORDER_SERVICES.txt b/LSL2/STPROC/WORK_ORDER_SERVICES.txt index 648f514..ded8c8f 100644 --- a/LSL2/STPROC/WORK_ORDER_SERVICES.txt +++ b/LSL2/STPROC/WORK_ORDER_SERVICES.txt @@ -45,13 +45,16 @@ $insert LOGICAL $insert RLIST_EQUATES $insert COMPANY_EQUATES $Insert NOTIFICATION_EQUATES +$Insert WM_IN_EQUATES +$Insert WM_OUT_EQUATES 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 +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 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, Datetime, obj_WO_Log, obj_WO_Step, Memberof -Declare function Environment_Services, Logging_Services +Declare function Environment_Services, Logging_Services, Hold_Services LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG' LogDate = Oconv(Date(), 'D4/') @@ -60,6 +63,13 @@ LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Re Headers = 'Logging DTM' : @FM : 'User' : @FM : 'Notes' objReleaseLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$) +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] : ' Void Log.csv' +Headers = 'Logging DTM' : @FM : 'User' : @FM : 'CassetteId' : @FM : 'Notes' +objVoidLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$,',', Headers, '', False$, False$) + LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM GoToService else @@ -1044,6 +1054,263 @@ Service ConvertRecordToJSON(WONo, Record, ItemURL) Response = jsonRecord end service +Service RemoveWoMatCassetteFromWO(WoMatKey, Username) + ErrorMessage = '' + If RowExists('WO_MAT', WoMatKey) then + WoNo = Field(WoMatKey, '*', 1) + WOLogRecord = Database_Services('ReadDataRow', 'WO_LOG', WoNo, True$, 0, False$) + If Error_Services('NoError') then + WoMatKeys = WOLogRecord + Locate WoMatKey in WoMatKeys using @VM setting CassPos then + WoLogRecord = Delete(WOLogRecord, 1, CassPos, 0) + Database_Services('WriteDataRow', 'WO_LOG', WoNo, WoLogRecord) + If Error_Services('NoError') then + Work_Order_Services('UpdateReceivedQty', WONo) + Work_Order_Services('UpdateReleasedQty', WONo) + Work_Order_Services('UpdateUnscheduledQuantities') + end else + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = "Unable to locate cass no " : WoMatKey : ' in the WO_LOG ' : WoNo : ' Record.' + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = 'Invalid WoMat Key ' : WoMatKey : ' passed to RemoveWoMatCassetteFromWO routine.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end +end service + +Service SignVoidNonEpp(WOMatKey, Username) + ErrorMessage = '' + WONo = Field(WOMatKey, '*', 1) + CassNo = Field(WoMatKey, '*', 2) + ReactType = XLATE('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X') + If ReactType EQ 'ASM' OR ReactType EQ 'ASM+' OR ReactType EQ 'HTR' then + RDSNo = Database_Services('ReadDataColumn', 'WO_MAT', WoMatKey, WO_MAT_RDS_NO$, True$, 0, False$) + If Error_Services('NoError') then + WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$) + IsVoided = WoMatRec + If Not(IsVoided) then + IsOnHold = Hold_Services('CheckForHold', WoMatKey) + If Not(IsOnHold) then + Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'RemoveWoMatCassetteFromWO':@vm:WOMatKey:@vm:Username) + If Error_Services('NoError') then + Service_Services('PostProcedure', 'WO_MAT_SERVICES', 'SetWoMatVoidFlag':@vm:WOMatKey:@VM:Username) + if Error_Services('NoError') then + Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo) + If Error_Services('NoError') then + LotEventParams = '' + LotEventParams<1,1> = 'CreateLotEvent' + LotEventParams<1,4> = DateTime() + LotEventParams<1,5> = 'VOID' + LotEventParams<1,6> = 'Lot voided by ' : Username + LotEventParams<1,11> = Username + If RDSNo NE '' then + LotEventParams<1,2> = RDSNo + LotEventParams<1,3> = 'RDS' + Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) + end else + LotEventParams<1,2> = WoMatKey + LotEventParams<1,3> = 'WO_MAT' + Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) + end + If Error_Services('NoError') then + //Add inventory transaction + + end else + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = Error_Services('GetMessage') + end + + end else + ErrorMessage = Error_Services('GetMessage') + end + end + end else + ErrorMessage = 'Unable to void lot as it is already voided.' + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = 'Cannot use this routine to void EpiPro lots.' + end + + If ErrorMessage NE '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = Username + LogData<3> = WOMatKey + LogData<4> = ErrorMessage + Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end else + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = Username + LogData<3> = WOMatKey + LogData<4> = 'Void queued successfully.' + Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end + +end service + +Service SignVoidWMI(WMInKey, Username) + ErrorMessage = '' + WONo = Field(WMInKey, '*', 1) + CassNo = Field(WMInKey, '*', 3) + WoStepKey = Xlate('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X') + WoMatKey = WONo : '*' : CassNo + ReactType = XLATE('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X') + If ReactType EQ 'EPP' then + WMInRec = Database_Services('ReadDataRow', 'WM_IN', WMInKey, True$, 0, False$) + IsVoided = WMInRec + If Not(IsVoided) then + IsOnHold = Hold_Services('CheckForHold', WoMatKey) + If Not(IsOnHold) then + Service_Services('PostProcedure', 'WM_IN_SERVICES', 'SetVoidFlag':@vm:WMInKey:@VM:Username) + If Error_Services('NoError') then + LotEventParams = '' + LotEventParams<1,1> = 'CreateLotEvent' + LotEventParams<1,4> = DateTime() + LotEventParams<1,5> = 'VOID' + LotEventParams<1,6> = 'Lot voided by ' : Username + LotEventParams<1,11> = Username + LotEventParams<1,2> = WMInKey + LotEventParams<1,3> = 'WM_IN' + Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) + If Error_Services('NoError') then + //Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record + WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey + IsWMOVoided = Database_Services('ReadDataColumn', 'WM_OUT', WMOKey, WM_OUT_VOID$) + If IsWMOVoided then + Service_Services('PostProcedure', 'WO_MAT_SERVICES', 'SetWoMatVoidFlag':@VM:WoMatKey:@VM:Username) + If Error_Services('NoError') then + Service_Services('PostProcedure', 'WORK_ORDER_SERVICES','RemoveWoMatCassetteFromWO':@VM:WoMatKey:@VM:Username) + If Error_Services('HasError') then + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end + end else + ErrorMessage = 'Unable to void lot as it is already voided.' + end + end else + ErrorMessage = 'Cannot use this routine to void EpiPro lots.' + end + + If ErrorMessage NE '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = Username + LogData<3> = WMInKey + LogData<4> = ErrorMessage + Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end else + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = Username + LogData<3> = WMInKey + LogData<4> = 'Void queued successfully.' + Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end + +end service + +Service SignVoidWMO(WMOutKey, Username) + ErrorMessage = '' + WONo = Field(WMOutKey, '*', 1) + CassNo = Field(WMOutKey, '*', 3) + WoStepKey = Xlate('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X') + WoMatKey = WONo : '*' : CassNo + ReactType = XLATE('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X') + If ReactType EQ 'EPP' then + WMOutRec = Database_Services('ReadDataRow', 'WM_OUT', WMOutKey, True$, 0, False$) + IsVoided = WMOutRec + If Not(IsVoided) then + IsOnHold = Hold_Services('CheckForHold', WoMatKey) + If Not(IsOnHold) then + Service_Services('PostProcedure', 'WM_OUT_SERVICES', 'SetVoidFlag':@vm:WMOutKey:@VM:Username) + If Error_Services('NoError') then + LotEventParams = '' + LotEventParams<1,1> = 'CreateLotEvent' + LotEventParams<1,4> = DateTime() + LotEventParams<1,5> = 'VOID' + LotEventParams<1,6> = 'Lot voided by ' : Username + LotEventParams<1,11> = Username + LotEventParams<1,2> = WMOutKey + LotEventParams<1,3> = 'WM_OUT' + Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) + If Error_Services('NoError') then + //Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record + WMIKey = WMOutKey; //the paired WMO key is the same as the WMIKey + IsWMIVoided = Database_Services('ReadDataColumn', 'WM_IN', WMIKey, WM_IN_VOID$) + If IsWMIVoided then + Service_Services('PostProcedure', 'WO_MAT_SERVICES', 'SetWoMatVoidFlag':@VM:WoMatKey:@VM:Username) + If Error_Services('NoError') then + Service_Services('PostProcedure', 'WORK_ORDER_SERVICES','RemoveWoMatCassetteFromWO':@VM:WoMatKey:@VM:Username) + If Error_Services('HasError') then + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end else + ErrorMessage = Error_Services('GetMessage') + end + end + end else + ErrorMessage = 'Unable to void lot as it is already voided.' + end + end else + ErrorMessage = 'Cannot use this routine to void EpiPro lots.' + end + + If ErrorMessage NE '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = Username + LogData<3> = WMOutKey + LogData<4> = ErrorMessage + Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end else + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = Username + LogData<3> = WMOutKey + LogData<4> = 'Void queued successfully.' + Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end + +end service //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs @@ -1055,3 +1322,5 @@ ClearCursors: Next counter return + + diff --git a/LSL2/STPROC/WO_MAT_SERVICES.txt b/LSL2/STPROC/WO_MAT_SERVICES.txt index 241ce5a..395755f 100644 --- a/LSL2/STPROC/WO_MAT_SERVICES.txt +++ b/LSL2/STPROC/WO_MAT_SERVICES.txt @@ -2,7 +2,9 @@ Compile function WO_MAT_Services(@Service, @Params) #pragma precomp SRP_PreCompiler Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services +Declare function Datetime Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services +Declare subroutine obj_wo_mat_log, Set_Status $insert LOGICAL $Insert APP_INSERTS @@ -424,3 +426,50 @@ Service CassetteIsLastInWo(WoMatKey) Response = IsLastInWo end service +Service SetWoMatVoidFlag(WoMatKey, Username) + ErrorMessage = '' + If RowExists('WO_MAT', WoMatKey) then + WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey, True$, 0, False$) + If Error_Services('NoError') then + WoMatRec = True$ + HaveLock = Database_Services('GetKeyIDLock', 'WO_MAT', WoMatKey, True$) + If HaveLock then + Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False, False$) + If Error_Services('NoError') then + Set_Status(0) + WONo = Field(WoMatKey, '*', 1) + CassNo = Field(WoMatKey, '*', 2) + WOMLParms = '' + LogFile = 'WO_MAT' ; WOMLParms = LogFile:@RM + LogDTM = OConv(Datetime(), 'DT') ; WOMLParms := LogDTM:@RM + Action = 'VOID' ; WOMLParms := Action:@RM + WhCd = 'CR' ; WOMLParms := WhCd:@RM + LocCd = 'VOID' ; WOMLParms := LocCd:@RM + WONos = WONo ; WOMLParms := WONos:@RM + CassNos = CassNo ; WOMLParms := CassNos:@RM + UserID = Username ; WOMLParms := UserID:@RM + Tags = '' ; WOMLParms := Tags:@RM + ToolID = '' ; WOMLParms := ToolID:@RM + WOMLParms := '' + obj_WO_Mat_Log('Create',WOMLParms) + IF Get_Status(errCode) THEN + ErrorMessage = 'Error writing inventory transactions' + end + end else + ErrorMessage = 'Failed to write to the WO_MAT record ' : WoMatKey : ' while attempting to set void status.' + end + end else + ErrorMessage = 'Failed to get lock on WO_MAT record ' : WoMatKey : ' while attempting to set void status.' + end + end else + ErrorMessage = 'Failed to read WO_MAT record ' : WoMatKey : ' while attempting to set void status.' + end + end else + ErrorMessage = 'Invalid WoMat Key ' : WoMatKey : ' passed to SetWoMatVoidFlag routine.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end +end service + + diff --git a/LSL2/STPROCINS/LOT_EQUATES.txt b/LSL2/STPROCINS/LOT_EQUATES.txt index c582e35..c32d5c1 100644 --- a/LSL2/STPROCINS/LOT_EQUATES.txt +++ b/LSL2/STPROCINS/LOT_EQUATES.txt @@ -1,7 +1,7 @@ compile insert LOT_EQUATES /*---------------------------------------- Author : Table Create Insert Routine - Written : 28/10/2024 + Written : 26/03/2025 Description : Insert for Table LOT ----------------------------------------*/ #ifndef __LOT_EQUATES__ @@ -20,5 +20,7 @@ compile insert LOT_EQUATES equ LOT_OPEN$ to 11 equ LOT_HOLD$ to 12 equ LOT_HOT$ to 13 + equ LOT_LEGACY_LOT_ID$ to 14 + equ LOT_VOIDED_LOT_RECORDS$ to 15 #endif diff --git a/LSL2/STPROCINS/PROC_QUEUE_EQUATES.txt b/LSL2/STPROCINS/PROC_QUEUE_EQUATES.txt index 725f52a..2971ecd 100644 --- a/LSL2/STPROCINS/PROC_QUEUE_EQUATES.txt +++ b/LSL2/STPROCINS/PROC_QUEUE_EQUATES.txt @@ -11,5 +11,7 @@ compile insert PROC_QUEUE_EQUATES equ PROC_QUEUE.PARAMS$ to 2 equ PROC_QUEUE.LAST_ATTEMPT_DTM$ to 3 equ PROC_QUEUE.ERROR$ to 4 + equ PROC_QUEUE.ENTRY_DTM$ to 5 #endif + diff --git a/LSL2/STPROCINS/VOIDED_LOT_EQUATES.txt b/LSL2/STPROCINS/VOIDED_LOT_EQUATES.txt new file mode 100644 index 0000000..cd346f9 --- /dev/null +++ b/LSL2/STPROCINS/VOIDED_LOT_EQUATES.txt @@ -0,0 +1,17 @@ +compile insert VOIDED_LOT_EQUATES +/*---------------------------------------- + Author : Table Create Insert Routine + Written : 26/03/2025 + Description : Insert for Table VOIDED_LOT +----------------------------------------*/ +#ifndef __VOIDED_LOT_EQUATES__ +#define __VOIDED_LOT_EQUATES__ + + equ VOIDED_LOT_WORK_ORDER_LOG_ID$ to 1 + equ VOIDED_LOT_VOID_BY$ to 2 + equ VOIDED_LOT_VOID_DTM$ to 3 + equ VOIDED_LOT_ENTITY_TYPE$ to 4 + equ VOIDED_LOT_LOT_ID$ to 5 + equ VOIDED_LOT_LEGACY_LOT_ID$ to 6 + +#endif