Merged PR 20879: Initial commit.

Initial commit.
This commit is contained in:
Ouellette Jonathan (CSC FI SPS MESLEO)
2025-07-14 20:55:07 +02:00
parent 804b590773
commit b53e805929
9 changed files with 339 additions and 223 deletions

View File

@ -72,6 +72,7 @@ $insert WM_OUT_EQUATES
$insert WO_LOG_EQUATES $insert WO_LOG_EQUATES
$insert ROTR_EQUATES $insert ROTR_EQUATES
$insert WO_MAT_EQUATES $insert WO_MAT_EQUATES
$Insert IFX_EQUATES
Equ Comma$ to ',' Equ Comma$ to ','
@ -802,12 +803,12 @@ WRITE_RECORD:
NonEpiPro = ( (ReactType NE 'EPP') and (ReactType NE 'GAN') ) NonEpiPro = ( (ReactType NE 'EPP') and (ReactType NE 'GAN') )
Stage = Record<CLEAN_INSP_STAGE$> Stage = Record<CLEAN_INSP_STAGE$>
If Stage EQ 'LWI' then If Stage EQ 'LWI' then
Service_Services('PostProcedure', 'CLEAN_INSP_SERVICES', 'UpdatePostCISampleQty':@VM:Name) Service_Services('PostProcedure', 'CLEAN_INSP_SERVICES', 'UpdatePostCISampleQty':SD$:Name)
end end
If NonEpiPro then If NonEpiPro then
WOMatKey = {WO_MAT_KEY} WOMatKey = {WO_MAT_KEY}
Service_Services('PostProcedure', 'QA_SERVICES', 'UpdateFailedWafers':@VM:WOMatKey) Service_Services('PostProcedure', 'QA_SERVICES', 'UpdateFailedWafers':SD$:WOMatKey)
Service_Services('PostProcedure', 'CLEAN_INSP_SERVICES', 'PushSigProfileToWoMat':@VM:Name) Service_Services('PostProcedure', 'CLEAN_INSP_SERVICES', 'PushSigProfileToWoMat':SD$:Name)
end end
return return
@ -865,3 +866,4 @@ Restore_System_Variables:
return return

View File

@ -74,6 +74,7 @@ $Insert ORDER_DET_EQU
$Insert RLIST_EQUATES $Insert RLIST_EQUATES
$Insert WO_STEP_EQUATES $Insert WO_STEP_EQUATES
$Insert RDS_EQUATES $Insert RDS_EQUATES
$Insert IFX_EQUATES
EQU COL$QUOTE_DESC TO 1 EQU COL$QUOTE_DESC TO 1
EQU COL$SETUP_CHG TO 4 EQU COL$SETUP_CHG TO 4
@ -119,6 +120,7 @@ EQU COMMA$ to ','
Declare subroutine Errmsg, Btree.Extract, Set_Status, Logging_Services, Work_Order_Services, Start_Window, obj_WO_Log 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, Msg 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 subroutine Security_Err_Msg, obj_WM_Out, Database_Services, End_Window, Print_Shelf_Label, Signature_Services
Declare Subroutine Service_Services
Declare function obj_WO_Log, Work_Order_Services, Environment_Services, Logging_Services, Memberof, NextKey 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, Error_Services Declare function Database_Services, Unassigned, obj_WO_Mat, obj_RDS, Security_Check, obj_WM_Out, Error_Services
@ -1237,32 +1239,41 @@ Event PUB_REM_CASS.CLICK()
If WOReactType EQ 'EPP' then If WOReactType EQ 'EPP' then
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_IN') CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_IN')
If CassettesToVoid NE '' then If CassettesToVoid NE '' then
WmInKeys = ''
for each CassetteToVoid in CassettesToVoid using @FM for each CassetteToVoid in CassettesToVoid using @FM
WMIToVoid = CassetteToVoid<1,4> WmInKeys<1, -1> = CassetteToVoid<1,4>
Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4) //Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Until ErrorMessage NE ''
Next CassetteToVoid Next CassetteToVoid
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMI':SD$:WmInKeys:SD$:WoNo:SD$:@USER4, True$)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end else end else
ErrorMessage = 'No cassettes were selected.' ErrorMessage = 'No cassettes were selected.'
end end
end else end else
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_RDS') CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_RDS')
WoMatKeyList = ''
for each CassetteToVoid in CassettesToVoid using @FM for each CassetteToVoid in CassettesToVoid using @FM
RDSToVoid = CassetteToVoid<1,4> RDSToVoid = CassetteToVoid<1,4>
WONo = XLATE('RDS', RDSToVoid, RDS_WO$, 'X') WONo = XLATE('RDS', RDSToVoid, RDS_WO$, 'X')
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X') CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
WOMatKey = WONo : '*' : CassNo WOMatKey = WONo : '*' : CassNo
Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4) WoMatKeyList<1, -1> = WoMatKey
//Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
If Error_Services('HasError') then If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
end end
Until ErrorMessage NE ''
Next CassetteToVoid Next CassetteToVoid
If ErrorMessage EQ '' then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidNonEPP':SD$:WoMatKeyList:SD$:WoNo:SD$:@USER4, True$)
if Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end
end end
end else end else
ErrorMessage = 'No eligible lots from this work order found to void.' ErrorMessage = 'No eligible lots from this work order found to void.'
@ -1296,6 +1307,7 @@ Event PUB_REM_CASS.CLICK()
Msg('Error in voiding lots process : ' : ErrorMessage) Msg('Error in voiding lots process : ' : ErrorMessage)
end end
GoSub PopulateControls GoSub PopulateControls
end event end event
Event PUB_REM_WM_OUT.CLICK() Event PUB_REM_WM_OUT.CLICK()
@ -1324,15 +1336,6 @@ Event PUB_REM_WM_OUT.CLICK()
UnConvCurrStatus = XLATE('WM_OUT',CassId,'CURR_STATUS','X') UnConvCurrStatus = XLATE('WM_OUT',CassId,'CURR_STATUS','X')
CassCurrStatus = OCONV(UnConvCurrStatus,'[WM_OUT_CURR_STATUS_CONV]') CassCurrStatus = OCONV(UnConvCurrStatus,'[WM_OUT_CURR_STATUS_CONV]')
* Display<1,DispLine,1> = CassNo
* Display<1,DispLine,2> = WOMatRec<WO_MAT_LOT_NO$>
* Display<1,DispLine,3> = WOMatRec<WO_MAT_WAFER_QTY$>
* Display<1,DispLine,4> = CassId
* Display<1,DispLine,5> = CassCurrStatus
* Display<1,DispLine,1> = FIELD(WOMatKeys<1,I>,'*',2)
* Display<1,DispLine,2> = OCONV(obj_WM_Out('CurrStatus',WOMatKeys<1,I>:@RM:WMORec),'[WO_MAT_CURR_STATUS_CONV]')
* Display<1,DispLine,3> = WMOutKeys<1,I>
Display<1,DispLine,1> = CassNo Display<1,DispLine,1> = CassNo
Display<1,DispLine,2> = CassCurrStatus Display<1,DispLine,2> = CassCurrStatus
Display<1,DispLine,3> = CassId Display<1,DispLine,3> = CassId
@ -1343,14 +1346,15 @@ Event PUB_REM_WM_OUT.CLICK()
TypeOver<PDISPLAY$> = Display TypeOver<PDISPLAY$> = Display
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_OUT') CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_OUT')
If CassettesToVoid NE '' then If CassettesToVoid NE '' then
WmOutKeys = ''
for each CassetteToVoid in CassettesToVoid using @FM for each CassetteToVoid in CassettesToVoid using @FM
WMOToVoid = CassetteToVoid<1,3> WmOutKeys<1, -1> = CassetteToVoid<1,3>
Work_Order_Services('SignVoidWMO', WMOToVoid, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Until ErrorMessage NE '' Until ErrorMessage NE ''
Next CassetteToVoid Next CassetteToVoid
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmInKeys:SD$:WoNo:SD$:@USER4, True$)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end else end else
ErrorMessage = 'No lots were selected to void.' ErrorMessage = 'No lots were selected to void.'
end end
@ -2170,3 +2174,4 @@ StartStopDate:
END END
return return

View File

@ -59,13 +59,14 @@ $Insert PRS_STAGE_EQUATES
$Insert WO_MAT_EQUATES $Insert WO_MAT_EQUATES
$Insert WO_MAT_QA_EQUATES $Insert WO_MAT_QA_EQUATES
$Insert LOT_EVENT_EQUATES $Insert LOT_EVENT_EQUATES
$Insert IFX_EQUATES
Equ COMMA$ to ',' Equ COMMA$ to ','
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services
Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
Declare function Lot_Event_Services, GetTickCount Declare function Lot_Event_Services, GetTickCount, Work_Order_Services
Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, Mona_Services Declare subroutine Error_Services, Database_Services, Logging_Services, Service_Services, Mona_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
@ -868,7 +869,12 @@ WRITE_RECORD:
StartTick = GetTickCount() StartTick = GetTickCount()
MetricName = 'WriteRecord' MetricName = 'WriteRecord'
Service_Services('PostProcedure', 'RDS_SERVICES', 'PushSigProfileToWoMat':@VM:Name) LotVoided = Lot_Services('GetLotIdByLegacyLotIdAndType', {SEQ}, 'RDS')
IsLotVoided = Work_Order_Services('IsLotVoided', LotId)
If Not(IsLotVoided) then
Service_Services('PostProcedure', 'RDS_SERVICES', 'PushSigProfileToWoMat':SD$:Name)
end
WONo = Record<RDS_WO$> WONo = Record<RDS_WO$>
OrigDateOut = OrigRecord<RDS_DATE_OUT$> OrigDateOut = OrigRecord<RDS_DATE_OUT$>
@ -883,18 +889,18 @@ WRITE_RECORD:
WMIKeys = {WM_IN_KEY} WMIKeys = {WM_IN_KEY}
For each WMIKey in WMIKeys using @VM setting vPos For each WMIKey in WMIKeys using @VM setting vPos
CassNo = Field(WMIKey, '*', 3) CassNo = Field(WMIKey, '*', 3)
Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':@VM:WONo:@VM:CassNo:@VM:DatetimeOut) Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:DatetimeOut)
Next WMIKey Next WMIKey
end else end else
CassNo = Record<RDS_CASS_NO$> CassNo = Record<RDS_CASS_NO$>
Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':@VM:WONo:@VM:CassNo:@VM:DatetimeOut) Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:DatetimeOut)
end end
end end
OrigPocketChar = OrigRecord<RDS_POCKET_CHAR$> OrigPocketChar = OrigRecord<RDS_POCKET_CHAR$>
NewPocketChar = Record<RDS_POCKET_CHAR$> NewPocketChar = Record<RDS_POCKET_CHAR$>
If (OrigPocketChar NE NewPocketChar) then If (OrigPocketChar NE NewPocketChar) then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':@VM:WONo) Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':SD$:WONo)
end end
EndTick = GetTickCount() EndTick = GetTickCount()
@ -980,3 +986,4 @@ Restore_System_Variables:
return return

View File

@ -34,6 +34,7 @@ $Insert RLIST_EQUATES
$Insert SQL_REQUESTS_EQUATES $Insert SQL_REQUESTS_EQUATES
$Insert PROC_QUEUE_EQUATES $Insert PROC_QUEUE_EQUATES
$Insert PROC_QUEUE_FAILED_EQUATES $Insert PROC_QUEUE_FAILED_EQUATES
$Insert IFX_EQUATES
Equ Comma$ to ',' Equ Comma$ to ','
@ -227,10 +228,11 @@ Service ProcessRequest(RequestKeyID)
SysprogKey = '$':Procedure SysprogKey = '$':Procedure
If RowExists('SYSOBJ', LSL2Key) or RowExists('SYSOBJ', FrameworksKey) or RowExists('SYSOBJ', SysprogKey) then If RowExists('SYSOBJ', LSL2Key) or RowExists('SYSOBJ', FrameworksKey) or RowExists('SYSOBJ', SysprogKey) then
Dim ProcParams(11) Dim ProcParams(11)
For each Param in Params using @VM setting pPos swap SD$ with @FM in Params
For each Param in Params using @FM setting pPos
ProcParams(pPos) = Param ProcParams(pPos) = Param
Next Param Next Param
NumArguments = DCount(Params, @VM) NumArguments = DCount(Params, @FM)
Begin Case Begin Case
Case NumArguments EQ 0 ; Call @Procedure() Case NumArguments EQ 0 ; Call @Procedure()
Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1)) Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1))
@ -451,3 +453,4 @@ end service
/// Internal GoSubs /// Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -54,6 +54,7 @@ $insert ACTION_SETUP
$insert WM_IN_EQUATES $insert WM_IN_EQUATES
$insert RLIST_EQUATES $insert RLIST_EQUATES
$insert SCHED_DET_NG_EQUATES $insert SCHED_DET_NG_EQUATES
$insert IFX_EQUATES
Equ Comma$ to ',' Equ Comma$ to ','
@ -164,7 +165,7 @@ WRITE_RECORD:
CassNo = Field(Name, '*', 3) CassNo = Field(Name, '*', 3)
ProcessedDTM = Datetime() ProcessedDTM = Datetime()
// This service will determine if the cassette needs to be marked as complete. // This service will determine if the cassette needs to be marked as complete.
Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':@VM:WONo:@VM:CassNo:@VM:ProcessedDtm) Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:ProcessedDtm)
WfrCount = DCount(Record<WM_IN_SLOT_NO$>, @VM) WfrCount = DCount(Record<WM_IN_SLOT_NO$>, @VM)
If WfrCount LT 25 then If WfrCount LT 25 then
@ -247,3 +248,4 @@ Restore_System_Variables:
return return

View File

@ -46,15 +46,16 @@ $insert COMPANY_EQUATES
$Insert NOTIFICATION_EQUATES $Insert NOTIFICATION_EQUATES
$Insert WM_IN_EQUATES $Insert WM_IN_EQUATES
$Insert WM_OUT_EQUATES $Insert WM_OUT_EQUATES
$Insert VOIDED_LOT_EQUATES
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON 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 Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
Declare subroutine Mona_Services Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON 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 Company_Services, obj_Prod_Spec, Schedule_Services, Datetime, obj_WO_Log, obj_WO_Step, Memberof
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services, RTI_CreateGUID
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -1296,78 +1297,222 @@ Service RemoveWoMatCassetteFromWO(WoMatKey, Username)
end service end service
Service CreateVoidedLotRecord(LotId, LegacyLotId, LegacyLotType, WoMatKey, UserId)
//Todo: Move to Lot_Services
ErrorMessage = ''
Service SignVoidNonEpp(WOMatKey, Username) If LotId NE '' OR LegacyLotId NE '' then
If LotId EQ '' then
//Determine NG Lot id if none was passed to routine.
if LegacyLotType NE '' then
if LegacyLotType EQ 'RDS' OR LegacyLotType EQ 'WM_IN' OR LegacyLotType EQ 'WM_OUT' then
LotId = Lot_Services('GetLotIdByLegacyLotIdAndType', LegacyLotId, LegacyLotType)
If Error_Services('NoError') then
If LotID EQ '' then
//No Lot ID was found, lets create one.
LotId = Lot_Services('CreateNewLot', 'RDS', '', '', '', '', '', UserId, '', LegacyLotId)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Invalid Legacy Lot Type passed to routine.'
end
end else
ErrorMessage = 'A Legacy lot ID was passed to the routine, but the legacy lot type was null.'
end
end
If ErrorMessage NE '' then
If RowExists('LOT', LotId) then
NewVoidedLotId = RTI_CreateGUID()
NewVoidedLotRec = ''
NewVoidedLotRec<VOIDED_LOT_WORK_ORDER_LOG_ID$> = Field(WoMatKey, '*', 1)
NewVoidedLotRec<VOIDED_LOT_VOID_BY$> = UserId
NewVoidedLotRec<VOIDED_LOT_VOID_DTM$> = Datetime()
NewVoidedLotRec<VOIDED_LOT_ENTITY_TYPE$> = LegacyLotType
NewVoidedLotRec<VOIDED_LOT_LOT_ID$> = LotId
NewVoidedLotRec<VOIDED_LOT_LEGACY_LOT_ID$> = LegacyLotId
NewVoidedLotRec<VOIDED_LOT_WO_MAT_KEY$> = WoMatKey
Database_Services('WriteDataRow', 'VOIDED_LOT', NewVoidedLotId, NewVoidedLotRec)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Unable to find lot record.'
end
end
end else
ErrorMessage = 'Both the lot id and the legacy lot id were null.'
end
If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
end service
Service IsLotVoided(LotId)
//Todo: Move to Lot_Services
ErrorMessage = ''
VoidLotRecords = ''
Open 'DICT.VOIDED_LOT' to hVoidTable then
SearchString = 'LOT_ID':@VM:LotId:@FM
Btree.Extract(SearchString, 'VOIDED_LOTS', hVoidTable, VoidLotRecord)
end else
ErrorMessage = 'Unable to open VOIDED_LOT table.'
end
If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
Response = VoidLotRecords
end service
Service SignVoidNonEpp(WOMatKeys, WONo, Username)
ErrorMessage = '' 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<WO_MAT_VOID$>
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' ; //Service Module
LotEventParams<1,2> = ''; //Legacy Lot Id, set below
LotEventParams<1,3> = DateTime(); //Datetime
LotEventParams<1,4> = 'VOID'; //Event Type
LotEventParams<1,5> = 'Lot voided by ' : Username; //Event Note
LotEventParams<1,6> = ''; //Equipment id
LotEventParams<1,7> = Username ;//User Id
LotEventParams<1,8> = True$; //IsLegacyLotId
LotEventParams<1,9> = ''; //Legacy Lot Type, set below
If RDSNo NE '' then
LotEventParams<1,2> = RDSNo
LotEventParams<1,9> = 'RDS'; //Legacy Lot Type
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end else
LotEventParams<1,2> = WoMatKey
LotEventParams<1,9> = 'WO_MAT'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end
If Error_Services('NoError') then
//Add inventory transaction
WOLogRecord = Database_Services('ReadDataRow', 'WO_LOG', WONo, True$, 0, False$)
if Error_Services('NoError') then
for each WoMatKey in WOMatKeys using @VM
if WoMatKey NE '' then
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
If WoLogRecord<WO_LOG_WO_MAT_KEY$> NE '' then
Locate WoMatKey in WoLogRecord<WO_LOG_WO_MAT_KEY$> using @VM setting CassPos then
WoLogRecord<WO_LOG_WO_MAT_KEY$> = Delete(WOLogRecord<WO_LOG_WO_MAT_KEY$>, 1, CassPos, 0)
WO_Mat_Services('SetWoMatVoidFlag', WOMatKey, Username)
if Error_Services('NoError') then
RDS_Services('DetachRDSFromWO', RDSNo)
If Error_Services('NoError') then
//Create a voided LOT record then record an event.
Work_Order_Services('CreateVoidedLotRecord', '', RDSNo, 'RDS', WoMatKey, Username)
Lot_Event_Services('CreateLotEvent', RDSNo, DateTime, 'VOID', 'Lot voided by ' : Username, '', Username, True$, 'RDS')
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'WO_MAT key not found in WO_LOG record.'
end
end else
ErrorMessage = 'No WO_MAT keys exist in WO_LOG record.'
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Cannot use this routine to void EpiPro lots.'
end
end
Next WoMatKey
end else
ErrorMessage = Error_Services('GetMessage')
end
If ErrorMessage EQ '' then
//Commit work order changes all at once here.
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
Error_Services('Add', ErrorMessage)
end
end else
Error_Services('Add', ErrorMessage)
end
end service
Service SignVoidWMI(WMInKeys, WONo, Username)
ErrorMessage = ''
WOLogRecord = Database_Services('ReadDataRow', 'WO_LOG', WONo, True$, 0, False$)
if Error_Services('NoError') then
for each WmInKey in WMInKeys using @VM
if WmInKey NE '' then
WONo = Field(WMInKey, '*', 1)
CassNo = Field(WMInKey, '*', 3)
WoStepKey = Xlate('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
WoMatKey = WONo : '*' : CassNo
ReactType = WOLogRecord<WO_LOG_REACT_TYPE$>
If ReactType EQ 'EPP' then
WMInRec = Database_Services('ReadDataRow', 'WM_IN', WMInKey, True$, 0, False$)
IsVoided = WMInRec<WM_IN_VOID$>
If Not(IsVoided) then
IsOnHold = Hold_Services('CheckForHold', WoMatKey)
If Not(IsOnHold) then
WM_In_Services('SetVoidFlag', WmInKey, Username)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', WmInKey, DateTime(), 'VOID', 'Lot voided by ' : Username, '', Username, True$, 'WM_IN')
Work_Order_Services('CreateVoidedLotRecord', '', WmInKey, 'WM_IN', WoMatKey, Username)
if Error_Services('NoError') then
//Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey
IsWMOVoided = Database_Services('ReadDataColumn', 'WM_OUT', WMOKey, WM_OUT_VOID$)
If IsWMOVoided then
Locate WoMatKey in WoLogRecord<WO_LOG_WO_MAT_KEY$> using @VM setting CassPos then
WoLogRecord<WO_LOG_WO_MAT_KEY$> = Delete(WOLogRecord<WO_LOG_WO_MAT_KEY$>, 1, CassPos, 0)
WO_Mat_Services('SetWoMatVoidFlag', WoMatKey, Username)
end else
ErrorMessage = 'Unable to locate WO_MAT key in WO_LOG record.'
end
end
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
end end
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
end end
end else end
ErrorMessage = Error_Services('GetMessage') end else
end ErrorMessage = 'Unable to void lot as it is already voided.'
end
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = 'Cannot use this routine to void non EpiPro lots.'
end end
end end
end else Next WoMatKey
ErrorMessage = 'Unable to void lot as it is already voided.'
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else end else
ErrorMessage = 'Cannot use this routine to void EpiPro lots.' ErrorMessage = Error_Services('GetMessage')
end
If ErrorMessage EQ '' then
//Commit work order changes all at once here.
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
Error_Services('Add', ErrorMessage)
end
end else
Error_Services('Add', ErrorMessage)
end end
If ErrorMessage NE '' then If ErrorMessage NE '' then
LogData = '' LogData = ''
LogData<1> = LoggingDTM LogData<1> = LoggingDTM
LogData<2> = Username LogData<2> = Username
LogData<3> = WOMatKey LogData<3> = WoNo
LogData<4> = ErrorMessage LogData<4> = ErrorMessage
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
@ -1375,7 +1520,7 @@ Service SignVoidNonEpp(WOMatKey, Username)
LogData = '' LogData = ''
LogData<1> = LoggingDTM LogData<1> = LoggingDTM
LogData<2> = Username LogData<2> = Username
LogData<3> = WOMatKey LogData<3> = WoNo
LogData<4> = 'Void queued successfully.' LogData<4> = 'Void queued successfully.'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
@ -1384,67 +1529,89 @@ Service SignVoidNonEpp(WOMatKey, Username)
end service end service
Service SignVoidWMI(WMInKey, Username) Service SignVoidWMO(WMOutKeys, WONo, Username)
ErrorMessage = '' ErrorMessage = ''
WONo = Field(WMInKey, '*', 1)
CassNo = Field(WMInKey, '*', 3) WOLogRecord = Database_Services('ReadDataRow', 'WO_LOG', WONo, True$, 0, False$)
WoStepKey = Xlate('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X') if Error_Services('NoError') then
WoMatKey = WONo : '*' : CassNo for each WmOutKey in WMOutKeys using @VM
ReactType = XLATE('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X') if WmOutKey NE '' then
If ReactType EQ 'EPP' then WONo = Field(WmOutKey, '*', 1)
WMInRec = Database_Services('ReadDataRow', 'WM_IN', WMInKey, True$, 0, False$) CassNo = Field(WmOutKey, '*', 3)
IsVoided = WMInRec<WM_IN_VOID$> WoStepKey = Xlate('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
If Not(IsVoided) then WoMatKey = WONo : '*' : CassNo
IsOnHold = Hold_Services('CheckForHold', WoMatKey) ReactType = WOLogRecord<WO_LOG_REACT_TYPE$>
If Not(IsOnHold) then If ReactType EQ 'EPP' then
Service_Services('PostProcedure', 'WM_IN_SERVICES', 'SetVoidFlag':@vm:WMInKey:@VM:Username) WMOutRec = Database_Services('ReadDataRow', 'WM_OUT', WmOutKey, True$, 0, False$)
If Error_Services('NoError') then IsVoided = WMInRec<WM_OUT_VOID$>
LotEventParams = '' If Not(IsVoided) then
LotEventParams<1,1> = 'CreateLotEvent' IsOnHold = Hold_Services('CheckForHold', WoMatKey)
LotEventParams<1,2> = WMInKey If Not(IsOnHold) then
LotEventParams<1,3> = DateTime() WM_Out_Services('SetVoidFlag', WmOutKey, Username)
LotEventParams<1,4> = 'VOID'
LotEventParams<1,5> = 'Lot voided by ' : Username If Error_Services('NoError') then
LotEventParams<1,6> = ''
LotEventParams<1,7> = Username
LotEventParams<1,8> = True$
LotEventParams<1,9> = 'WM_IN'
Service_Services('PostProcedure', 'LOT_EVENT_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 If Error_Services('NoError') then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES','RemoveWoMatCassetteFromWO':@VM:WoMatKey:@VM:Username) If Error_Services('NoError') then
If Error_Services('HasError') then Lot_Event_Services('CreateLotEvent', WmOutKey, DateTime(), 'VOID', 'Lot voided by ' : Username, '', Username, True$, 'WM_OUT')
Work_Order_Services('CreateVoidedLotRecord', '', WmOutKey, 'WM_OUT', WoMatKey, Username)
if Error_Services('NoError') then
//Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
WMIKey = WmOutKey; //the paired WMO key is the same as the WMIKey
IsWMIVoided = Database_Services('ReadDataColumn', 'WM_IN', WMOKey, WM_IN_VOID$)
If IsWMIVoided then
Locate WoMatKey in WoLogRecord<WO_LOG_WO_MAT_KEY$> using @VM setting CassPos then
WoLogRecord<WO_LOG_WO_MAT_KEY$> = Delete(WOLogRecord<WO_LOG_WO_MAT_KEY$>, 1, CassPos, 0)
WO_Mat_Services('SetWoMatVoidFlag', WoMatKey, Username)
end else
ErrorMessage = 'Unable to locate WO_MAT key in WO_LOG record.'
end
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
end end
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
end end
end
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
end end
end else end
ErrorMessage = Error_Services('GetMessage') end else
end ErrorMessage = 'Unable to void lot as it is already voided.'
end end
end else end else
ErrorMessage = 'Unable to void lot as it is already voided.' ErrorMessage = 'Cannot use this routine to void non EpiPro lots.'
end end
end
Next WoMatKey
end else end else
ErrorMessage = 'Cannot use this routine to void EpiPro lots.' ErrorMessage = Error_Services('GetMessage')
end
If ErrorMessage EQ '' then
//Commit work order changes all at once here.
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
Error_Services('Add', ErrorMessage)
end
end else
Error_Services('Add', ErrorMessage)
end end
If ErrorMessage NE '' then If ErrorMessage NE '' then
LogData = '' LogData = ''
LogData<1> = LoggingDTM LogData<1> = LoggingDTM
LogData<2> = Username LogData<2> = Username
LogData<3> = WMInKey LogData<3> = WONo
LogData<4> = ErrorMessage LogData<4> = ErrorMessage
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
@ -1452,85 +1619,8 @@ Service SignVoidWMI(WMInKey, Username)
LogData = '' LogData = ''
LogData<1> = LoggingDTM LogData<1> = LoggingDTM
LogData<2> = Username LogData<2> = Username
LogData<3> = WMInKey LogData<3> = ''
LogData<4> = 'Void queued successfully.' LogData<4> = 'Void processed 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<WM_OUT_VOID$>
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,2> = WMOutKey
LotEventParams<1,3> = DateTime()
LotEventParams<1,4> = 'VOID'
LotEventParams<1,5> = 'Lot voided by ' : Username
LotEventParams<1,6> = ''
LotEventParams<1,7> = Username
LotEventParams<1,8> = True$
LotEventParams<1,9> = 'WM_OUT'
Service_Services('PostProcedure', 'LOT_EVENT_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$) Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
@ -1836,3 +1926,4 @@ ClearCursors:
return return

View File

@ -53,6 +53,7 @@ $insert WO_LOG_EQUATES
$insert WO_STEP_EQUATES $insert WO_STEP_EQUATES
$insert MAKEUP_WAFERS_EQUATES $insert MAKEUP_WAFERS_EQUATES
$insert RLIST_EQUATES $insert RLIST_EQUATES
$insert IFX_EQUATES
Equ Comma$ to ',' Equ Comma$ to ','
@ -865,7 +866,7 @@ WRITE_RECORD:
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID) CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
If CurrWaferCount EQ 0 then If CurrWaferCount EQ 0 then
// This should catch cases where the entire cassette is "peeled off", NCR'ed, or used for destructive testing. // This should catch cases where the entire cassette is "peeled off", NCR'ed, or used for destructive testing.
Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':@VM:WONo:@VM:CassNo:@VM:Datetime()) Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:Datetime())
end end
return return
@ -929,3 +930,4 @@ Restore_System_Variables:
return return

View File

@ -0,0 +1,3 @@
Compile insert IFX_EQUATES
EQU SD$ TO '%SERVICECALLDELIM%'

View File

@ -1,7 +1,7 @@
compile insert VOIDED_LOT_EQUATES compile insert VOIDED_LOT_EQUATES
/*---------------------------------------- /*----------------------------------------
Author : Table Create Insert Routine Author : Table Create Insert Routine
Written : 26/03/2025 Written : 11/07/2025
Description : Insert for Table VOIDED_LOT Description : Insert for Table VOIDED_LOT
----------------------------------------*/ ----------------------------------------*/
#ifndef __VOIDED_LOT_EQUATES__ #ifndef __VOIDED_LOT_EQUATES__
@ -13,5 +13,6 @@ compile insert VOIDED_LOT_EQUATES
equ VOIDED_LOT_ENTITY_TYPE$ to 4 equ VOIDED_LOT_ENTITY_TYPE$ to 4
equ VOIDED_LOT_LOT_ID$ to 5 equ VOIDED_LOT_LOT_ID$ to 5
equ VOIDED_LOT_LEGACY_LOT_ID$ to 6 equ VOIDED_LOT_LEGACY_LOT_ID$ to 6
equ VOIDED_LOT_WO_MAT_KEY$ to 7
#endif #endif