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

View File

@ -74,6 +74,7 @@ $Insert ORDER_DET_EQU
$Insert RLIST_EQUATES
$Insert WO_STEP_EQUATES
$Insert RDS_EQUATES
$Insert IFX_EQUATES
EQU COL$QUOTE_DESC TO 1
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 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 Service_Services
Declare function obj_WO_Log, Work_Order_Services, Environment_Services, Logging_Services, Memberof, NextKey
Declare function Database_Services, Unassigned, obj_WO_Mat, obj_RDS, Security_Check, obj_WM_Out, Error_Services
@ -1237,32 +1239,41 @@ Event PUB_REM_CASS.CLICK()
If WOReactType EQ 'EPP' then
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_IN')
If CassettesToVoid NE '' then
WmInKeys = ''
for each CassetteToVoid in CassettesToVoid using @FM
WMIToVoid = CassetteToVoid<1,4>
Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Until ErrorMessage NE ''
Next CassetteToVoid
WmInKeys<1, -1> = CassetteToVoid<1,4>
//Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
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
ErrorMessage = 'No cassettes were selected.'
end
end else
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_RDS')
WoMatKeyList = ''
for each CassetteToVoid in CassettesToVoid using @FM
RDSToVoid = CassetteToVoid<1,4>
WONo = XLATE('RDS', RDSToVoid, RDS_WO$, 'X')
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
WOMatKey = WONo : '*' : CassNo
Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
WoMatKeyList<1, -1> = WoMatKey
//Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Until ErrorMessage NE ''
end
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 else
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)
end
GoSub PopulateControls
end event
Event PUB_REM_WM_OUT.CLICK()
@ -1323,15 +1335,6 @@ Event PUB_REM_WM_OUT.CLICK()
CassId = Cass
UnConvCurrStatus = XLATE('WM_OUT',CassId,'CURR_STATUS','X')
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,2> = CassCurrStatus
@ -1343,14 +1346,15 @@ Event PUB_REM_WM_OUT.CLICK()
TypeOver<PDISPLAY$> = Display
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_OUT')
If CassettesToVoid NE '' then
WmOutKeys = ''
for each CassetteToVoid in CassettesToVoid using @FM
WMOToVoid = CassetteToVoid<1,3>
Work_Order_Services('SignVoidWMO', WMOToVoid, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
WmOutKeys<1, -1> = CassetteToVoid<1,3>
Until ErrorMessage NE ''
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
ErrorMessage = 'No lots were selected to void.'
end
@ -2170,3 +2174,4 @@ StartStopDate:
END
return

View File

@ -59,13 +59,14 @@ $Insert PRS_STAGE_EQUATES
$Insert WO_MAT_EQUATES
$Insert WO_MAT_QA_EQUATES
$Insert LOT_EVENT_EQUATES
$Insert IFX_EQUATES
Equ COMMA$ to ','
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 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
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
@ -868,7 +869,12 @@ WRITE_RECORD:
StartTick = GetTickCount()
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$>
OrigDateOut = OrigRecord<RDS_DATE_OUT$>
@ -883,18 +889,18 @@ WRITE_RECORD:
WMIKeys = {WM_IN_KEY}
For each WMIKey in WMIKeys using @VM setting vPos
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
end else
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
OrigPocketChar = OrigRecord<RDS_POCKET_CHAR$>
NewPocketChar = Record<RDS_POCKET_CHAR$>
If (OrigPocketChar NE NewPocketChar) then
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':@VM:WONo)
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateScrappedQty':SD$:WONo)
end
EndTick = GetTickCount()
@ -980,3 +986,4 @@ Restore_System_Variables:
return

View File

@ -34,6 +34,7 @@ $Insert RLIST_EQUATES
$Insert SQL_REQUESTS_EQUATES
$Insert PROC_QUEUE_EQUATES
$Insert PROC_QUEUE_FAILED_EQUATES
$Insert IFX_EQUATES
Equ Comma$ to ','
@ -210,7 +211,7 @@ end service
Service ProcessRequest(RequestKeyID)
If RequestKeyID NE '' then
Server = Environment_Services('GetServer')
InvalidRequest = False$
@ -227,10 +228,11 @@ Service ProcessRequest(RequestKeyID)
SysprogKey = '$':Procedure
If RowExists('SYSOBJ', LSL2Key) or RowExists('SYSOBJ', FrameworksKey) or RowExists('SYSOBJ', SysprogKey) then
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
Next Param
NumArguments = DCount(Params, @VM)
NumArguments = DCount(Params, @FM)
Begin Case
Case NumArguments EQ 0 ; Call @Procedure()
Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1))
@ -451,3 +453,4 @@ end service
/// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -54,6 +54,7 @@ $insert ACTION_SETUP
$insert WM_IN_EQUATES
$insert RLIST_EQUATES
$insert SCHED_DET_NG_EQUATES
$insert IFX_EQUATES
Equ Comma$ to ','
@ -164,7 +165,7 @@ WRITE_RECORD:
CassNo = Field(Name, '*', 3)
ProcessedDTM = Datetime()
// 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)
If WfrCount LT 25 then
@ -247,3 +248,4 @@ Restore_System_Variables:
return

View File

@ -46,15 +46,16 @@ $insert COMPANY_EQUATES
$Insert NOTIFICATION_EQUATES
$Insert WM_IN_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 Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
Declare subroutine Mona_Services
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 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'
LogDate = Oconv(Date(), 'D4/')
@ -1296,78 +1297,222 @@ Service RemoveWoMatCassetteFromWO(WoMatKey, Username)
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 = ''
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)
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
LotEventParams<1,2> = WoMatKey
LotEventParams<1,9> = 'WO_MAT'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
ErrorMessage = Error_Services('GetMessage')
end
If Error_Services('NoError') then
//Add inventory transaction
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
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end
end else
ErrorMessage = 'Unable to void lot as it is already voided.'
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end
end
end else
ErrorMessage = 'Unable to void lot as it is already voided.'
end
end else
ErrorMessage = 'Cannot use this routine to void non EpiPro lots.'
end
end
Next WoMatKey
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
If ErrorMessage NE '' then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = Username
LogData<3> = WOMatKey
LogData<3> = WoNo
LogData<4> = ErrorMessage
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage)
@ -1375,84 +1520,7 @@ Service SignVoidNonEpp(WOMatKey, Username)
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = Username
LogData<3> = WOMatKey
LogData<4> = 'Void queued successfully.'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage)
end
end service
Service SignVoidWMI(WMInKey, Username)
ErrorMessage = ''
WONo = Field(WMInKey, '*', 1)
CassNo = Field(WMInKey, '*', 3)
WoStepKey = Xlate('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
WoMatKey = WONo : '*' : CassNo
ReactType = XLATE('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X')
If ReactType EQ 'EPP' then
WMInRec = Database_Services('ReadDataRow', 'WM_IN', WMInKey, True$, 0, False$)
IsVoided = WMInRec<WM_IN_VOID$>
If Not(IsVoided) then
IsOnHold = Hold_Services('CheckForHold', WoMatKey)
If Not(IsOnHold) then
Service_Services('PostProcedure', 'WM_IN_SERVICES', 'SetVoidFlag':@vm:WMInKey:@VM:Username)
If Error_Services('NoError') then
LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent'
LotEventParams<1,2> = WMInKey
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_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
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES','RemoveWoMatCassetteFromWO':@VM:WoMatKey:@VM:Username)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end
end else
ErrorMessage = 'Unable to void lot as it is already voided.'
end
end else
ErrorMessage = 'Cannot use this routine to void EpiPro lots.'
end
If ErrorMessage NE '' then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = Username
LogData<3> = WMInKey
LogData<4> = ErrorMessage
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage)
end else
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = Username
LogData<3> = WMInKey
LogData<3> = WoNo
LogData<4> = 'Void queued successfully.'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage)
@ -1461,67 +1529,89 @@ Service SignVoidWMI(WMInKey, Username)
end service
Service SignVoidWMO(WMOutKey, Username)
Service SignVoidWMO(WMOutKeys, WONo, 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)
WOLogRecord = Database_Services('ReadDataRow', 'WO_LOG', WONo, True$, 0, False$)
if Error_Services('NoError') then
for each WmOutKey in WMOutKeys using @VM
if WmOutKey NE '' then
WONo = Field(WmOutKey, '*', 1)
CassNo = Field(WmOutKey, '*', 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
WMOutRec = Database_Services('ReadDataRow', 'WM_OUT', WmOutKey, True$, 0, False$)
IsVoided = WMInRec<WM_OUT_VOID$>
If Not(IsVoided) then
IsOnHold = Hold_Services('CheckForHold', WoMatKey)
If Not(IsOnHold) then
WM_Out_Services('SetVoidFlag', WmOutKey, 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('HasError') then
If Error_Services('NoError') 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')
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 = 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 non EpiPro lots.'
end
end
Next WoMatKey
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
If ErrorMessage NE '' then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = Username
LogData<3> = WMOutKey
LogData<3> = WONo
LogData<4> = ErrorMessage
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage)
@ -1529,8 +1619,8 @@ Service SignVoidWMO(WMOutKey, Username)
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = Username
LogData<3> = WMOutKey
LogData<4> = 'Void queued successfully.'
LogData<3> = ''
LogData<4> = 'Void processed successfully.'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage)
end
@ -1836,3 +1926,4 @@ ClearCursors:
return

View File

@ -53,6 +53,7 @@ $insert WO_LOG_EQUATES
$insert WO_STEP_EQUATES
$insert MAKEUP_WAFERS_EQUATES
$insert RLIST_EQUATES
$insert IFX_EQUATES
Equ Comma$ to ','
@ -865,7 +866,7 @@ WRITE_RECORD:
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
If CurrWaferCount EQ 0 then
// 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
return
@ -929,3 +930,4 @@ Restore_System_Variables:
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
/*----------------------------------------
Author : Table Create Insert Routine
Written : 26/03/2025
Written : 11/07/2025
Description : Insert for Table VOIDED_LOT
----------------------------------------*/
#ifndef __VOIDED_LOT_EQUATES__
@ -13,5 +13,6 @@ compile insert VOIDED_LOT_EQUATES
equ VOIDED_LOT_ENTITY_TYPE$ to 4
equ VOIDED_LOT_LOT_ID$ to 5
equ VOIDED_LOT_LEGACY_LOT_ID$ to 6
equ VOIDED_LOT_WO_MAT_KEY$ to 7
#endif