From 7a633a6cb51df8e02edd23446ee0561dd5470265 Mon Sep 17 00:00:00 2001 From: "Ouellette Jonathan (CSC FI SPS MESLEO)" Date: Thu, 20 Mar 2025 22:09:00 +0100 Subject: [PATCH] Merged PR 13301: Added test wafer auto close routines upon zero wafer quantity. Added test wafer auto close routines upon zero wafer quantity. --- LSL2/STPROC/LOT_SERVICES.txt | 1943 ++++++++++++++++++---------------- 1 file changed, 1040 insertions(+), 903 deletions(-) diff --git a/LSL2/STPROC/LOT_SERVICES.txt b/LSL2/STPROC/LOT_SERVICES.txt index 86fdb7f..d275674 100644 --- a/LSL2/STPROC/LOT_SERVICES.txt +++ b/LSL2/STPROC/LOT_SERVICES.txt @@ -2,15 +2,16 @@ Compile function Lot_Services(@Service, @Params) #pragma precomp SRP_PreCompiler Declare function TEST_WAFER_PROD_SERVICES, SRP_Datetime, Datetime, Database_Services, Lot_Services, Error_Services, RTI_CREATEGUID -Declare function SRP_Array, SRP_Json, Environment_Services, Logging_Services +Declare function SRP_Array, SRP_Json, Environment_Services, Logging_Services, MemberOf Declare subroutine Database_Services, Btree.Extract, Lot_Services, Error_Services, Labeling_Services, SRP_Json, Logging_Services -Declare subroutine SRP_Run_Command +Declare subroutine SRP_Run_Command, Service_Services, obj_notes $insert APP_INSERTS $Insert LOT_EQUATES $Insert TEST_WAFER_PROD_EQUATES $Insert Lot_Operation_Equates $Insert PRODUCT_OPERATION_EQUATES $Insert LOT_EVENT_EQUATES +$Insert NOTIFICATION_EQUATES LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot' LogDate = Oconv(Date(), 'D4/') @@ -29,6 +30,10 @@ LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' L Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Event Type' : @FM : 'Operator' : @FM : 'Begin Wafer Qty' : @FM : 'End Wafer Qty' : @FM : 'Bonus Wafer Qty' : @FM : 'Reduce Wafer Qty' : @FM : 'Message' objLotEventLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) +LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' TWLotClosure.csv' +Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Operator' : @FM : 'Message' +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' @@ -41,49 +46,49 @@ 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 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 CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId) - CreatedLotNumber = '' - ErrorMessage = '' - Begin Case - Case LotType EQ 'RDS' + CreatedLotNumber = '' + ErrorMessage = '' + Begin Case + Case LotType EQ 'RDS' NewLotId = LotId If NewLotId NE '' then If RowExists('LOT', NewLotId) EQ False$ then @@ -105,7 +110,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 @@ -136,7 +141,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) @@ -163,19 +168,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 @@ -200,624 +205,644 @@ 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) + OperationCompleted = False$ + ErrorMessage = '' + If RowExists('LOT_OPERATION', LotOperationId) then + LotOperationDateTimeOut = Database_Services('ReadDataColumn', 'LOT_OPERATION', LotOperationId, LOT_OPERATION_DATETIME_OUT$, True$, 0, False$) + If LotOperationDateTimeOut NE '' then OperationCompleted = true$ + end else + ErrorMessage = 'Invalid lot operation id passed to routine.' + end + If ErrorMessage NE '' then + Error_Services('Add', 'Error in ' : service : ' with Lot OperationId ' : LotOperationId : ' : ' : ErrorMessage) + end + response = OperationCompleted 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) - ErrorMessage = '' - ThisLotCurrOperationID = '' - If LotId NE '' then - If RowExists('LOT', LotId) then - ThisLotRec = Database_Services('ReadDataRow', 'LOT', LotId) - WaferQty = ThisLotRec - 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 Out process for Lot id ' : LotId : '. Error writing to lot operation record. ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Error getting lots current operation.' - end - end else - ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') - end - end else - ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Lot ID not found in LOT table.' - end - end else - ErrorMessage = 'Error in Move Out 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 out of operation ' : ThisLotCurrOperationID : '.' - Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) - Error_Services('Add', ErrorMessage) - end else - LogData = '' - LogData<1> = LoggingDTM - LogData<2> = LotID - LogData<3> = Operator - LogData<4> = 'Error in Move Out process for Lot id ' : LotId : '. ' : ErrorMessage - 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 + If Error_Services('NoError') then + ThisLotCurrOperationID = Lot_Services('GetLotCurrOperationId', LotId) + If ThisLotCurrOperationID NE '' then + If Lot_Services('IsLotMovedIn', LotId) 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 Out process for Lot id ' : LotId : '. Error writing to lot operation record. ' : Error_Services('GetMessage') + end + end else + CurrOperationName = Field(ThisLotCurrOperationID, '*', 2) + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Cannot move out lot from ' :CurrOperationName: ' because it is not moved in.' + end + end else + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Error getting lots current operation.' + end + end else + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Lot ID not found in LOT table.' + end + end else + ErrorMessage = 'Error in Move Out 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 out of operation ' : ThisLotCurrOperationID : '.' + Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end else + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotID + LogData<3> = Operator + LogData<4> = 'Error in Move Out process for Lot id ' : LotId : '. ' : ErrorMessage + Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end end service Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_TYPES, EventNote, EventEquipmentId, ReduceWaferQty, BonusWaferQty, OperationId, OperatorId) - ErrorMessage = '' - BeginWaferQty = 0 - EndWaferQty = 0 - WaferQtyChange = 0 - If LotId NE '' then - Begin Case - Case LotType EQ 'TW' - If OperatorId NE '' then - 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') - 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) - If Error_Services('NoError') then - - end else - ErrorMessage = Error_Services('GetMessage') - end - Case EventType EQ 'MOVE_OUT' - Lot_Services('MoveOutLot', LotId, OperatorId) - If Error_Services('NoError') then - - end else - ErrorMessage = Error_Services('GetMessage') - end - Case EventType EQ 'HOLD_ON' - Lot_Services('HoldLot', LotId, OperatorId) - If Error_Services('NoError') then - - end else - ErrorMessage = Error_Services('GetMessage') - end - Case EventType EQ 'HOLD_OFF' - Lot_Services('UnholdLot', LotId, OperatorId) - If Error_Services('NoError') then - - end else - ErrorMessage = Error_Services('GetMessage') - end - Case EventType EQ 'REDUCE_WAFER_QTY' - Lot_Services('ReduceLotWaferCount', LotId, ReduceWaferQty) - If Error_Services('NoError') then - - end else - ErrorMessage = Error_Services('GetMessage') - end - Case EventType EQ 'BONUS_WAFER_QTY' - Lot_Services('IncreaseLotWaferCount', LotId, BonusWaferQty) - If Error_Services('NoError') then - - end else - ErrorMessage = Error_Services('GetMessage') - end - Case EventType EQ 'COMMENT' - //Do Nothing Extra - Case EventType EQ 'LOCATION' - //Do nothing for now. - Case EventType EQ 'CLOSE' - Lot_Services('CloseLot', LotId) - If Error_Services('HasError') then - ErrorMessage = 'Error in Create Lot Event routine, ' : Error_Services('GetMessage') - end - Case EventType EQ 'OPEN' - Lot_Services('OpenLot', LotId) - If Error_Services('HasError') then - ErrorMessage = 'Error in Create Lot Event routine, ' : Error_Services('GetMessage') - end - 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 - - 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('NoError') then - If BeginWaferQty NE EndWaferQty then - //Adjust LOT wafer qty - LotRecord = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) - If LotRecord NE '' then - LotRecord = EndWaferQty - Database_Services('WriteDataRow', 'LOT', LotId, LotRecord, True$, False$, False$) - If Error_Services('HasError') then - ErrorMessage = 'Error in CreateLotEvent routine, failed attempt to close lot ':LotId:'. Failed to write to LOT record.' - end - end - end - end else - ErrorMessage = 'Error in Create Lot Event routine, Error writing Lot Event record, ' : Error_Services('GetMessage') - end - end - end else - ErrorMessage = 'Error in Create Lot Event routine, Current Operation for lot id ' : LotId : ' could not be determined.' - 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, 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') + ErrorMessage = '' + BeginWaferQty = 0 + EndWaferQty = 0 + WaferQtyChange = 0 + If LotId NE '' then + Begin Case + Case LotType EQ 'TW' + If OperatorId NE '' then + 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') + 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) + If Error_Services('NoError') then + + end else + ErrorMessage = Error_Services('GetMessage') + end + Case EventType EQ 'MOVE_OUT' + Lot_Services('MoveOutLot', LotId, OperatorId) + If Error_Services('NoError') then + + end else + ErrorMessage = Error_Services('GetMessage') + end + Case EventType EQ 'HOLD_ON' + Lot_Services('HoldLot', LotId, OperatorId) + If Error_Services('NoError') then + + end else + ErrorMessage = Error_Services('GetMessage') + end + Case EventType EQ 'HOLD_OFF' + Lot_Services('UnholdLot', LotId, OperatorId) + If Error_Services('NoError') then + + end else + ErrorMessage = Error_Services('GetMessage') + end + Case EventType EQ 'REDUCE_WAFER_QTY' + Lot_Services('ReduceLotWaferCount', LotId, ReduceWaferQty, OperatorId) + If Error_Services('NoError') then + + end else + ErrorMessage = Error_Services('GetMessage') + end + Case EventType EQ 'BONUS_WAFER_QTY' + Lot_Services('IncreaseLotWaferCount', LotId, BonusWaferQty) + If Error_Services('NoError') then + + end else + ErrorMessage = Error_Services('GetMessage') + end + Case EventType EQ 'COMMENT' + //Do Nothing Extra + Case EventType EQ 'LOCATION' + //Do nothing for now. + Case EventType EQ 'CLOSE' + Lot_Services('CloseLot', LotId, OperatorId) + If Error_Services('HasError') then + ErrorMessage = 'Error in Create Lot Event routine, ' : Error_Services('GetMessage') + end + Case EventType EQ 'OPEN' + Lot_Services('OpenLot', LotId) + If Error_Services('HasError') then + ErrorMessage = 'Error in Create Lot Event routine, ' : Error_Services('GetMessage') + end + 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 + + 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('NoError') then + If BeginWaferQty NE EndWaferQty then + //Adjust LOT wafer qty + LotRecord = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) + If LotRecord NE '' then + LotRecord = EndWaferQty + Database_Services('WriteDataRow', 'LOT', LotId, LotRecord, True$, False$, False$) + If Error_Services('HasError') then + ErrorMessage = 'Error in CreateLotEvent routine, failed attempt to close lot ':LotId:'. Failed to write to LOT record.' + end + end + end + end else + ErrorMessage = 'Error in Create Lot Event routine, Error writing Lot Event record, ' : Error_Services('GetMessage') + end + end + end else + ErrorMessage = 'Error in Create Lot Event routine, Current Operation for lot id ' : LotId : ' could not be determined.' + 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, 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') If ReduceWaferQty NE '' then If Num(ReduceWaferQty) then EndWaferQty = BeginWaferQty - ReduceWaferQty @@ -843,316 +868,428 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_ 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 + 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 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) + AutoCloseTime = Datetime() + ErrorMessage = '' + If MemberOf(CloseUserId, 'LEAD') OR MemberOf(CloseUserId, 'SUPERVISOR') OR CloseUserId EQ 'SYSTEM' then + LotOperations = Lot_Services('GetLotOperationSequence', LotId) + for LotOperationIndex = 1 to DCount(LotOperations, @FM) + ThisLotOperationId = LotOperations + ThisOperationCompleted = Lot_Services('IsOperationCompleted', ThisLotOperationId) + If Error_Services('NoError') then + if Not(ThisOperationCompleted) then + ThisLotOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotOperationId) + if Error_Services('NoError') then + CurrLotQty = Database_Services('ReadDataColumn', 'LOT', LotId, LOT_WAFER_QTY$, True$, 0, False$) + If ThisLotOperationRec EQ '' then + ThisLotOperationRec = AutoCloseTime + end + If ThisLotOperationRec EQ '' then + ThisLotOperationRec = AutoCloseTime + end + if ThisLotOperationRec EQ '' then + ThisLotOperationRec = CloseUserId + end + if ThisLotOperationRec EQ '' then + ThisLotOperationRec = CloseUserId + end + if ThisLotOperationRec EQ '' then + ThisLotOperationRec = AutoCloseTime + end + if ThisLotOperationRec EQ '' then + ThisLotOperationRec = AutoCloseTime + end + If ThisLotOperationRec EQ '' then + ThisLotOperationRec = CurrLotQty + end + If ThisLotOperationRec EQ '' then + ThisLotOperationRec = CurrLotQty + end + Database_Services('WriteDataRow', 'LOT_OPERATION', ThisLotOperationId, ThisLotOperationRec, True$, False$, False$) + 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 + Next LotOperationIndex + end else + ErrorMessage = CloseUserId : ' does not have permission to close this lot.' + end + If ErrorMessage EQ '' then + Lot_Services('CreateLotEvent', LotId, 'TW', AutoCloseTime, 'CLOSE', 'Close action performed by ' : CloseUserId, '', '', '', ThisLotOperationId, CloseUserId) + If Error_Services('NoError') then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotId + LogData<3> = CloseUserId + LogData<4> = 'Successfully marked lot as closed.' + Logging_Services('AppendLog', objLotClosureLog, LogData, @RM, @FM, False$) + end else + ErrorMessage = Error_Services('GetMessage') + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotId + LogData<3> = CloseUserId + LogData<4> = 'Error marking lot as closed.' : ErrorMessage + Logging_Services('AppendLog', objLotClosureLog, LogData, @RM, @FM, False$) + //Send a message to FI + Recipients = Xlate('NOTIFICATION', 'FI_SUPPORT', NOTIFICATION_USER_ID$, 'X') + SentFrom = 'SYSTEM' + Subject = 'TEST WAFER LOT AUTO-CLOSURE FAILURE' + Message = 'Error in ' : service : ' with lot id ' : LotId : ' attempting to set CLOSE flag on lot. ' : ErrorMessage + Obj_Notes('Create',Recipients:@RM:SentFrom:@RM:Subject:@RM:Message) + Error_Services('Add', 'Error in ' : service : ' with lot ' : LotId : ':' : ErrorMessage) + end + end else + ErrorMessage = 'Error in ' : service : ' with lot ' : LotId : ':' : ErrorMessage + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotId + LogData<3> = CloseUserId + LogData<4> = 'Error marking lot as closed.' : ErrorMessage + Logging_Services('AppendLog', objLotClosureLog, LogData, @RM, @FM, False$) + //Send a message to FI + Recipients = Xlate('NOTIFICATION', 'FI_SUPPORT', NOTIFICATION_USER_ID$, 'X') + SentFrom = 'SYSTEM' + Subject = 'TEST WAFER LOT AUTO-CLOSURE FAILURE' + Message = 'Error in ' : service : ' with lot id ' : LotId : ' attempting to Auto Close Lot. ' : ErrorMessage + Obj_Notes('Create',Recipients:@RM:SentFrom:@RM:Subject:@RM:Message) + Error_Services('Add', 'Error in ' : service : ' with lot ' : LotId : ':' : ErrorMessage) + end end service Service HoldLot(LotId, OperatorId) - + end service Service UnholdLot(LotId, OperatorId) - + end service -Service ReduceLotWaferCount(LotId, ReductionQty) - ErrorMessage = '' - If RowExists('LOT', LotId) then - LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) - LotHold = LotRec - LotOpen = LotRec - LotCurrWfrQty = LotRec - LotNewWfrQty = LotCurrWfrQty - ReductionQty - If LotNewWfrQty LE 25 AND LotNewWfrQty GE 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 Reduce Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity great than 25.' - Case LotNewWfrQty LT 0 - ErrorMessage = 'Error in Reduce Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity less than 0.' - End Case - end - end else - ErrorMessage = 'Error in Reduce Lot Wafer Count service, Lot Id ' : LotId : ' not found in lot table.' - end - if ErrorMessage NE '' then - Error_Services('Add', ErrorMessage) - end +Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId) + ErrorMessage = '' + If RowExists('LOT', LotId) then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) + LotType = LotRec + LotHold = LotRec + LotOpen = LotRec + LotCurrWfrQty = LotRec + LotNewWfrQty = LotCurrWfrQty - ReductionQty + If LotNewWfrQty LE 25 AND LotNewWfrQty GE 0 then + LotRec = LotNewWfrQty + Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) + If Error_Services('NoError') then + if LotNewWfrQty EQ 0 AND LotType EQ 'TW' then + ServiceParms = 'AutoCloseTestWaferLot' : @VM : LotId : @VM : 'SYSTEM' + Service_Services('PostProcedure', 'LOT_SERVICES', ServiceParms) + If Error_Services('HasError') then + Recipients = Xlate('NOTIFICATION', 'FI_SUPPORT', NOTIFICATION_USER_ID$, 'X') + SentFrom = 'SYSTEM' + Subject = 'TEST WAFER LOT AUTO-CLOSURE FAILURE' + Message = 'Error in ' : service : ' attempting to add auto lot closure for lot id ' : LotId : ' to the service queue.' + AttachWindow = '' + AttachKeys = '' + SendToGroup = '' + Obj_Notes('Create',Recipients:@RM:SentFrom:@RM:Subject:@RM:Message) + end + end + end else + 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 Reduce Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity great than 25.' + Case LotNewWfrQty LT 0 + ErrorMessage = 'Error in Reduce Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity less than 0.' + End Case + end + end else + ErrorMessage = 'Error in Reduce 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 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 +