added LSL2 stored procedures
This commit is contained in:
725
LSL2/STPROC/RDS_POST_EPI_EVENTS.txt
Normal file
725
LSL2/STPROC/RDS_POST_EPI_EVENTS.txt
Normal file
@ -0,0 +1,725 @@
|
||||
Function RDS_Post_Epi_Events(CtrlEntId, Event, @PARAMS)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from Infineon.
|
||||
|
||||
Name : RDS_Post_Epi_Events
|
||||
|
||||
Description : This function acts as a commuter module for all events related to this window.
|
||||
|
||||
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
|
||||
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
|
||||
execute Basic+ logic without having use the Form Designer to make the association, although this is
|
||||
limited to the events which are currently promoted.
|
||||
|
||||
If the form needs to call the commuter module directly then the QuickEvent parameters should be
|
||||
formatted like this:
|
||||
|
||||
'@SELF','@EVENT',['@PARAM1','@PARAMx']
|
||||
|
||||
Parameters :
|
||||
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
|
||||
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
|
||||
Param1-15 [in] -- Additional event parameter holders
|
||||
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
|
||||
EVENT_SETUP insert
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
04/11/18 dmb Created initial commuter module.
|
||||
06/13/18 djs Added Verify Wafer Quantity section within Sign Button click event. This section of code
|
||||
checks to see if the quantities of Wafers Out and Scheduled Wafers are equal. If not,
|
||||
then a member of the group 'LEAD' or group 'SUPERVISOR' must override the discrepancy.
|
||||
Updated Sign Button click event to use the current user verification form, NDW_VERIFY_USER,
|
||||
instead of QUOTE_SIG_PWD_ENTRY which has been deprecated.
|
||||
09/19/18 djs Added an ROTR check to verify that the total quantity of NCR wafers is greater than or equal
|
||||
to the quantity of wafers above the USL threshold. (In development wrapper)
|
||||
01/22/19 djs Added a simple check to verify that metrology data exists in order to allow FQA signature.
|
||||
See "Verify RDS_TEST record has measurement data" section.
|
||||
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
#Window RDS_POST_EPI
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert EVENT_SETUP
|
||||
$insert MSG_EQUATES
|
||||
$insert RDS_EQUATES
|
||||
$insert LSL_USERS_EQUATES
|
||||
$insert PROD_SPEC_EQUATES
|
||||
$insert WO_MAT_EQUATES
|
||||
$insert SURFACE_SCAN_EQUATES
|
||||
$insert REACTOR_EQUATES
|
||||
$insert PRS_STAGE_EQUATES
|
||||
$insert COMPANY_EQUATES
|
||||
$insert WO_MAT_QA_EQUATES
|
||||
|
||||
|
||||
Equ COL$LOG_FILE to 1
|
||||
Equ COL$LOG_DTM to 2
|
||||
Equ COL$ACTION to 3
|
||||
Equ COL$WH_CD to 4
|
||||
Equ COL$LOC_CD to 5
|
||||
Equ COL$WO_NOS to 6
|
||||
Equ COL$CASS_NOS to 7
|
||||
Equ COL$USER_ID to 8
|
||||
Equ COL$TAGS to 9
|
||||
Equ COL$TOOL_ID to 10
|
||||
|
||||
Equ COL$MET_TEST to 1 ; // QA Metrology control on RDS_UNLOAD & RDS_POST_EPI windows
|
||||
Equ COL$MET_TEST_DESC to 2
|
||||
Equ COL$MET_SLOT to 3
|
||||
Equ COL$MET_SLOT_DESC to 4
|
||||
Equ COL$MET_WFR_QTY to 5
|
||||
Equ COL$MET_MIN to 6
|
||||
Equ COL$MET_MAX to 7
|
||||
Equ COL$MET_RESULT to 8
|
||||
Equ COL$MET_STD_MAX to 9
|
||||
Equ COL$MET_STD_RESULT to 10
|
||||
Equ COL$MET_SIG to 11
|
||||
Equ COL$MET_SIG_DTM to 12
|
||||
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, RDS_Services, Signature_Services, obj_Notes
|
||||
Declare subroutine Comm_RDS
|
||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, QA_Services, Signature_Services
|
||||
Declare function RDS_Services
|
||||
|
||||
SubclassInfo = Form_Services('FindSubclassControl')
|
||||
Subclass = SubclassInfo<1>
|
||||
|
||||
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
|
||||
If Event EQ 'OLE' then
|
||||
Transfer Event to OIEvent
|
||||
Transfer Param1 to Event
|
||||
Transfer Param2 to Param1
|
||||
Transfer Param3 to Param2
|
||||
* Transfer Param4 to Param3
|
||||
* Transfer Param5 to Param4
|
||||
* Transfer Param6 to Param5
|
||||
* Transfer Param7 to Param6
|
||||
* Transfer Param8 to Param7
|
||||
end
|
||||
|
||||
GoToEvent Event for CtrlEntID
|
||||
|
||||
Return EventFlow else EVENT_CONTINUE$
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Events
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
GoSub Setup_OLE_Controls
|
||||
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.READ()
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.CLOSE(CancelFlag)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event WINDOW.CLEAR(bSaveKey, bSuppressWarning, bMaintainFocus, CtrlIDFocus)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event SIGN_BUTTON.CLICK()
|
||||
|
||||
Valid = ''
|
||||
CurRdsNo = Get_Property(@WINDOW:'.RDS_NO', 'DEFPROP')
|
||||
WONo = Get_Property(@WINDOW:'.WO', 'DEFPROP')
|
||||
CassNo = Get_Property(@WINDOW:'.CASS_NO', 'DEFPROP')
|
||||
WOStep = Get_Property(@WINDOW:'.WO_STEP', 'DEFPROP')
|
||||
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','DEFPROP')
|
||||
|
||||
******************************************
|
||||
* Update the form with signature, if any *
|
||||
******************************************
|
||||
CurrSig = ''
|
||||
CurrDTM = ''
|
||||
CurrDate = ''
|
||||
CurrTime = ''
|
||||
|
||||
|
||||
*********************************************
|
||||
* Verify if the FQA has already been signed *
|
||||
*********************************************
|
||||
IF Not(MemberOf(@USER4,'BYPASS')) THEN
|
||||
IF (CurrSig NE '') THEN
|
||||
ErrMsg('Supervisor Verification for this material has already been signed.')
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
******************************************
|
||||
* Verify if the Post-EPI has been signed *
|
||||
******************************************
|
||||
PostEpiSig = Get_Property(@WINDOW:'.POST_EPI_SIG','TEXT')
|
||||
IF (PostEpiSig = '') THEN
|
||||
ErrorMesg = 'Process Error':@SVM:'Technician Signature Required before Final QA Verification.'
|
||||
ErrMsg(ErrorMesg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
**************************************************************************
|
||||
|
||||
**************************************************************************
|
||||
IF Not(MemberOf(@USER4,'BYPASS')) THEN ;* Bypass requirement for a different signer for post-epi and FQA -dkk 10/9/14
|
||||
IF (PostEpiSig = @USER4) THEN
|
||||
ErrorMesg = 'Process Error':@SVM:'User ':QUOTE(PostEpiSig):' has signed this RDS for Post-Epi.':CRLF$:CRLF$
|
||||
ErrorMesg := 'Another qualified user must sign FQA verification'
|
||||
ErrMsg(ErrorMesg)
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
***************************************
|
||||
* Verify Metrology has been completed *
|
||||
***************************************
|
||||
Set_Status(0)
|
||||
obj_WO_Mat('MQAComp',WONo:'*':CassNo:@RM:WOStep:@RM:'QA')
|
||||
errCode = ''
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
RETURN
|
||||
END
|
||||
|
||||
***********************************************
|
||||
* Verify RDS_TEST record has measurement data *
|
||||
***********************************************
|
||||
ThickAvg = Xlate('RDS', CurRdsNo, 'TTHICK_AVG_ALL', 'X')
|
||||
If ThickAvg EQ '' then
|
||||
ErrMsg('RDS metrology measurement data is missing. FQA cannot be signed.')
|
||||
Return
|
||||
end
|
||||
ResAvg = Xlate('RDS', CurRdsNo, 'TRES_AVG_ALL', 'X')
|
||||
If ResAvg EQ '' then
|
||||
ErrMsg('RDS Resistivity measurement data is missing. FQA cannot be signed.')
|
||||
Recipients = XLATE('SEC_GROUPS', 'OI_ADMIN', 'USER', 'X')
|
||||
SentFrom = 'OI Admin'
|
||||
Subject = 'Missing Resistivity Avg data'
|
||||
Message = CurRdsNo: ' failed FQA due to missing resistivity average data.'
|
||||
AttachWindow = ''
|
||||
AttachKey = ''
|
||||
SendToGroup = ''
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
Return
|
||||
end
|
||||
|
||||
************************************************
|
||||
* Verify Signatures Profile has been fulfilled *
|
||||
************************************************
|
||||
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
Signature_Services('CheckSigOrder', WOMatKey, 'QA')
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
return 0
|
||||
end
|
||||
|
||||
|
||||
Signature_Services('FQAReady', WOMatKey)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
Return 0
|
||||
end
|
||||
|
||||
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
|
||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
||||
If WCCheckEnabled then
|
||||
****************************************
|
||||
* Verify the Wafer Counter information *
|
||||
****************************************
|
||||
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
||||
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
||||
|
||||
*************************************
|
||||
* Wafer Counter - Quantity Section *
|
||||
*************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersOut) then
|
||||
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
|
||||
RETURN 0
|
||||
end
|
||||
end else
|
||||
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
||||
RETURN 0
|
||||
end
|
||||
end
|
||||
|
||||
*************************
|
||||
* Verify Wafer Quantity *
|
||||
*************************
|
||||
|
||||
CassSchedWafers = Get_Property(@Window : '.WAFERS_SCHEDULED', 'TEXT')
|
||||
WafersOut = Get_Property(@Window : '.WAFERS_OUT', 'TEXT')
|
||||
|
||||
MakeupBox = Xlate('RDS', RDSNo, 'MAKEUP_BOX', 'X')
|
||||
SpecType = Xlate('RDS', RDSNo, 'SPEC_TYPE', 'X')
|
||||
OverrideAllowed = ( (SpecType EQ 'Q') or MakeupBox )
|
||||
|
||||
|
||||
If ( (CassSchedWafers NE WafersOut) and (OverrideAllowed EQ True$) ) then
|
||||
|
||||
Message = 'Unable to sign FQA because the Scheduled' : CRLF$ : 'Qty does not equal the '
|
||||
Message := 'Wafers Out Qty.' : CRLF$ : 'Lead or supervisor must override.'
|
||||
LeadMessage = 'Scheduled Wafers Quantity does not equal the Wafers Out Quantity.'
|
||||
|
||||
If NOT( MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') ) then
|
||||
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', Message)
|
||||
end else
|
||||
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', LeadMessage)
|
||||
end
|
||||
|
||||
Begin Case
|
||||
Case Response EQ 1
|
||||
Response = True$ ; // User Clicked Override
|
||||
Case Response EQ 2
|
||||
Response = False$ ; // User Clicked Cancel
|
||||
Case Response EQ char(27)
|
||||
Response = False$ ; // User Pressed Escape Key
|
||||
End Case
|
||||
|
||||
If Response EQ True$ then
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR')
|
||||
Valid = Response<1>
|
||||
Username = Response<2>
|
||||
If NOT(Valid) then
|
||||
Return
|
||||
end else
|
||||
Set_Property(@Window : '.FINAL_QA_WAFER_OUT_SIG', 'DEFPROP', Username)
|
||||
Set_Property(@Window : '.FINAL_QA_WAFER_OUT_NAME', 'TEXT', OConv(Username, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||
Set_Property(@Window : '.FINAL_QA_WAFER_OUT_DATE', 'DEFPROP', Oconv(Date(), 'D2/'))
|
||||
Set_Property(@Window : '.FINAL_QA_WAFER_OUT_TIME', 'DEFPROP', Oconv(Time(), 'MTS'))
|
||||
end
|
||||
end else
|
||||
Return
|
||||
end
|
||||
end else if (CassSchedWafers NE WafersOut) then
|
||||
// Inform user
|
||||
Title = 'Process Error'
|
||||
ErrorMsg = 'Scheduled Wafers Quantity does not equal the Wafers Out Quantity.':CRLF$
|
||||
ErrorMsg := 'Override not allowed due to spec type.'
|
||||
Response = Msg(@Window, '', 'OK', '', Title:@FM:ErrorMsg)
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
*********************************
|
||||
* Verify NCR total >= USL Fails *
|
||||
*********************************
|
||||
ReactorNo = Get_Property(@Window : '.REACTOR', 'TEXT')
|
||||
ROTREnabled = Xlate('REACTOR', ReactorNo, 'ENABLE_ROTR', 'X')
|
||||
If (ROTREnabled EQ True$) then
|
||||
RDSKey = Get_Property(@Window : '.RDS_NO', 'TEXT')
|
||||
// Backlog Req 731 - ROTR POST Stage Supercede
|
||||
// If POST surfscan ROTR is passing, then use the number of failed wafers from that result
|
||||
// as the min number of NCRd wafers required to FQA the cassette.
|
||||
LWICIKey = Xlate('RDS', RDSKey, 'LWI_CI_NO', 'X')
|
||||
PostSupercede = Xlate('RDS', RDSKey, 'POST_SUPERCEDE', 'X')
|
||||
CIKey = LWICIKey
|
||||
If PostSupercede then
|
||||
PostCIKey = Xlate('RDS', RDSKey, 'POST_CI_NO', 'X')
|
||||
If PostCIKey NE '' then
|
||||
CIKey = PostCIKey
|
||||
end
|
||||
end else
|
||||
CIKey = LWICIKey
|
||||
end
|
||||
|
||||
NumUSLFailValues = Xlate('CLEAN_INSP', CIKey, 'NUM_FAILED_WAFERS', 'X')
|
||||
NumUSLFailCount = COUNT(NumUSLFailValues,@VM) + (NumUSLFailValues NE '')
|
||||
NumUSLFail = NumUSLFailValues<1,NumUSLFailCount>
|
||||
If NumUSLFail EQ '' then NumUSLFail = 0
|
||||
TotalNCR = Xlate('RDS', RDSKey, 'TOT_REJ', 'X')
|
||||
If TotalNCR EQ '' then TotalNCR = 0
|
||||
|
||||
If NumUSLFail GT TotalNCR then
|
||||
Message = 'Unable to sign FQA because the total quantity of NCR wafers':CRLF$:'is less than the '|
|
||||
: 'number of wafers above the USL threshold.' : CRLF$ : 'A lead or supervisor must override.'
|
||||
LeadMessage = 'Total quantity of NCR wafers is less than the number of wafers above the USL threshold.'
|
||||
|
||||
If NOT( MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') ) then
|
||||
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', Message)
|
||||
end else
|
||||
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', LeadMessage)
|
||||
end
|
||||
|
||||
Begin Case
|
||||
Case Response EQ 1
|
||||
Response = True$ ; // User Clicked Override
|
||||
Case Response EQ 2
|
||||
Response = False$ ; // User Clicked Cancel
|
||||
Case Response EQ char(27)
|
||||
Response = False$ ; // User Pressed Escape Key
|
||||
End Case
|
||||
|
||||
If Response EQ True$ then
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEER')
|
||||
Valid = Response<1>
|
||||
If NOT(Valid) then Return
|
||||
end else
|
||||
Return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
********************************************
|
||||
* Verify NCR wafer qty >= Failed wafer qty *
|
||||
********************************************
|
||||
|
||||
NCRReq = QA_Services('GetNCRRequired', WOMatKey)
|
||||
If NCRReq then
|
||||
Message = 'Unable to sign FQA because the total quantity of NCR wafers':CRLF$:'is less than the '|
|
||||
: 'number of wafers that failed surfscan.' : CRLF$ : 'A lead or supervisor must override.'
|
||||
LeadMessage = 'Total quantity of NCR wafers is less than the number of wafers that failed surfscan.'
|
||||
|
||||
If NOT( MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') ) then
|
||||
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', Message)
|
||||
end else
|
||||
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', LeadMessage)
|
||||
end
|
||||
|
||||
Begin Case
|
||||
Case Response EQ 1
|
||||
Response = True$ ; // User Clicked Override
|
||||
Case Response EQ 2
|
||||
Response = False$ ; // User Clicked Cancel
|
||||
Case Response EQ char(27)
|
||||
Response = False$ ; // User Pressed Escape Key
|
||||
End Case
|
||||
|
||||
If Response EQ True$ then
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEER')
|
||||
Valid = Response<1>
|
||||
If NOT(Valid) then Return 0
|
||||
end else
|
||||
Return
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
*************************
|
||||
* Verify if Shift exist *
|
||||
*************************
|
||||
IF (Get_Property(@WINDOW:'.SHIFT','DEFPROP') = '') THEN
|
||||
ErrMsg('Process Error':@SVM:'Shift is required before signing.')
|
||||
RETURN
|
||||
END
|
||||
|
||||
****************************
|
||||
* Verify if lot is on Hold *
|
||||
****************************
|
||||
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WONo:'*':CassNo)
|
||||
IF WOMatCurrStatus = 'HOLD' THEN
|
||||
ErrMsg('Process Error':@SVM:'Cassette is on Hold and may not be signed off.':CRLF$:CRLF$)
|
||||
RETURN
|
||||
END
|
||||
|
||||
**********************
|
||||
* Check ROTR Failure *
|
||||
**********************
|
||||
ROTRAction = Get_Property(@Window : '.ROTR_ACTION', 'INVALUE')
|
||||
If (ROTRAction NE 'Passed') AND (ROTRAction NE 'Accepted') AND (ROTRAction NE '') then
|
||||
ErrMsg('Process Error':@SVM:'ROTR does not meet all requirements.':CRLF$:CRLF$)
|
||||
return
|
||||
end
|
||||
|
||||
***************************************
|
||||
* Verify Metrology has been completed *
|
||||
***************************************
|
||||
CtrlName = @WINDOW:'.MET_TEST'
|
||||
MetList = Get_Property(CtrlName,'LIST')
|
||||
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
|
||||
FOR Line = 1 TO MLCnt
|
||||
IF MetList<Line,COL$MET_TEST> NE '' THEN
|
||||
BEGIN CASE
|
||||
CASE ((MetList<Line,COL$MET_MIN> = '') AND (MetList<Line,COL$MET_MAX> = ''))
|
||||
NULL
|
||||
CASE (MetList<Line,COL$MET_RESULT> = '')
|
||||
ErrMsg('Process Error':@SVM:'Required QA Metrology results have not been entered.')
|
||||
RETURN
|
||||
CASE ((MetList<Line,COL$MET_RESULT> < MetList<Line,COL$MET_MIN>) OR (MetList<Line,COL$MET_RESULT> > MetList<Line,COL$MET_MAX>))
|
||||
ErrMsg('Process Error':@SVM:'One or more QA Metrology results is out of specification.')
|
||||
RETURN
|
||||
CASE ((MetList<Line,COL$MET_RESULT> NE '') AND (MetList<Line,COL$MET_SIG> = ''))
|
||||
ErrMsg('Process Error':@SVM:'One or more QA Metrology results are not signed off.')
|
||||
RETURN
|
||||
END CASE
|
||||
END ;* End of check for a test requirement on the line
|
||||
NEXT Line
|
||||
|
||||
******************************************
|
||||
* Verify Unload Stage QA Metrology Tests *
|
||||
******************************************
|
||||
|
||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
||||
|
||||
If (DevelopmentFlag EQ True$) then
|
||||
WONo = Get_Property(@WINDOW:'.WO','DEFPROP')
|
||||
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
|
||||
WOMatQAKey = WONo : '*' : CassNo
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
ErrorMsg = 'Process Error':@SVM
|
||||
For each FailReason in FailReasons using @VM
|
||||
ErrorMsg := FailReason:CRLF$
|
||||
Next FailReason
|
||||
ErrMsg(ErrorMsg)
|
||||
Return
|
||||
end
|
||||
end
|
||||
|
||||
*******************************************
|
||||
* Verify if all steps have been completed *
|
||||
*******************************************
|
||||
PsnNo = Get_Property(@WINDOW:'.PSN','TEXT')
|
||||
CurRdsNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
|
||||
WONo = Get_Property(@WINDOW:'.WO','TEXT')
|
||||
WOStep = Get_Property(@WINDOW:'.WO_STEP','TEXT')
|
||||
CassNo = Get_Property(@WINDOW:'.CASS_NO','TEXT')
|
||||
Reactor = Get_Property(@WINDOW:'.REACTOR','DEFPROP')
|
||||
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
|
||||
RDSNos = WOMatRec<WO_MAT_RDS_NO$>
|
||||
MakeupBox = WOMatRec<WO_MAT_MAKEUP_BOX$>
|
||||
|
||||
LOCATE CurRdsNo IN RDSNos USING @VM SETTING Pos THEN
|
||||
NextRDS = RDSNos<1,Pos+1>
|
||||
END ELSE
|
||||
NextRDS = ''
|
||||
END
|
||||
|
||||
IF (WOMatCurrStatus NE 'QA' AND WOMatCurrStatus NE 'PSTI' AND WOMatCurrStatus NE 'COMP') AND (NextRDS NE '' AND WOMatCurrStatus NE 'VER') THEN
|
||||
ErrorMessage = 'Process Error':@SVM:'Run is not ready for final QA.':CRLF$:CRLF$
|
||||
ErrorMessage := 'The ':OCONV(WOMatCurrStatus,'[WO_MAT_CURR_STATUS_CONV]'):' step is not complete.'
|
||||
ErrMsg(ErrorMessage)
|
||||
RETURN
|
||||
END
|
||||
|
||||
IF NOT(MemberOF( @USER4, 'SUPERVISOR' ) OR MemberOf( @user4, 'LEAD' ) OR MemberOf( @USER4, 'FINAL_QA' ) ) THEN
|
||||
ErrMsg('Process Error':@SVM:'You must be a supervisor to verify this RDS.')
|
||||
RETURN
|
||||
END
|
||||
|
||||
************************************************************************
|
||||
* Prompt user to validate the Process Specification Stage Instructions *
|
||||
************************************************************************
|
||||
PSNo = Get_Property(@WINDOW:'.PSN','TEXT')
|
||||
VerInst = XLATE('PRS_STAGE',PSNo:'*QA',PRS_STAGE_INST$,'X')
|
||||
VerInst = TRIM(VerInst)
|
||||
IF LEN(VerInst) > 5 THEN
|
||||
Yes = Dialog_Box( 'RDS_VER', @WINDOW, VerInst )
|
||||
IF NOT(Yes) THEN
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
**************************
|
||||
* Verify user's password *
|
||||
**************************
|
||||
|
||||
// Check if user has already been verified above to avoid prompting for password twice
|
||||
|
||||
If Valid EQ '' Then
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW)
|
||||
Valid = Response<1>
|
||||
end
|
||||
|
||||
IF (Valid) THEN
|
||||
|
||||
SigDt = OCONV( Date(), 'D2/' )
|
||||
SigTm = Time()
|
||||
SigTmPlusOne = OCONV(SigTm + 1, 'MTS' )
|
||||
SigTmPlusTwo = OCONV(SigTm + 2, 'MTS' )
|
||||
SigTmPlusFive = OCONV(SigTm + 5, 'MTS' )
|
||||
SigTmPlusTen = OCONV(SigTm + 10, 'MTS' )
|
||||
SigTm = OCONV(SigTm,'MTS')
|
||||
SigBy = @USER4
|
||||
WOStep = Get_Property(@WINDOW:'.WO_STEP','DEFPROP')
|
||||
PostLPDs = Get_Property(@WINDOW:'.LPD_POSTCLEAN','DEFPROP')
|
||||
Brightlight = Get_Property(@WINDOW:'.BRIGHTLIGHT','CHECK')
|
||||
Microscope = Get_Property(@WINDOW:'.MICROSCOPE','CHECK')
|
||||
EventParms = ''
|
||||
EventCnt = 1
|
||||
|
||||
IF ReactorType NE 'EPP' THEN
|
||||
|
||||
ToolID = ''
|
||||
WHCd = 'CR'
|
||||
LocCD = 'QA'
|
||||
Tag = ''
|
||||
|
||||
EventParms<COL$LOG_FILE> = 'WO_MAT'
|
||||
EventParms<COL$LOG_DTM> = SigDt:' ':SigTm
|
||||
EventParms<COL$ACTION> = WOStep:'QA'
|
||||
EventParms<COL$WH_CD> = 'CR'
|
||||
EventParms<COL$LOC_CD> = 'QA'
|
||||
EventParms<COL$WO_NOS> = WONo
|
||||
EventParms<COL$CASS_NOS> = CassNo
|
||||
EventParms<COL$USER_ID> = @USER4
|
||||
EventParms<COL$TAGS> = ''
|
||||
EventParms<COL$TOOL_ID> = ''
|
||||
|
||||
CONVERT @FM TO @RM IN EventParms
|
||||
|
||||
obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * *
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
CALL ErrMsg(ErrCode)
|
||||
RETURN
|
||||
END
|
||||
|
||||
IF MakeupBox = 1 THEN
|
||||
|
||||
EventParms<COL$LOG_FILE> = 'WO_MAT'
|
||||
EventParms<COL$LOG_DTM> = SigDt:' ':SigTmPlusTwo
|
||||
EventParms<COL$ACTION> = 'RTU'
|
||||
EventParms<COL$WH_CD> = 'CR'
|
||||
EventParms<COL$LOC_CD> = 'MU'
|
||||
EventParms<COL$WO_NOS> = WONo
|
||||
EventParms<COL$CASS_NOS> = CassNo
|
||||
EventParms<COL$USER_ID> = @USER4
|
||||
EventParms<COL$TAGS> = ''
|
||||
EventParms<COL$TOOL_ID> = ''
|
||||
|
||||
CONVERT @FM TO @RM IN EventParms
|
||||
|
||||
obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * *
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
CALL ErrMsg(ErrCode)
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
END ;* End of check for non EpiPRO reactor
|
||||
|
||||
Set_Property(@Window : '.POST_EPI_SUP_SIG', 'TEXT', @User4)
|
||||
Set_Property(@Window : '.POST_EPI_SUP_SIG_NAME', 'TEXT', OConv(@User4, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
|
||||
Set_Property(@Window : '.POST_EPI_SUP_SIG_DATE', 'TEXT', SigDt)
|
||||
Set_Property(@Window : '.POST_EPI_SUP_SIG_TIME', 'TEXT', SigTmPlusOne)
|
||||
|
||||
/* Sync up the RDS record with WO_MAT */
|
||||
IOOptions = Get_Property(@Window, 'IOOPTIONS')
|
||||
IOOptions<6> = True$
|
||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||
Send_Event(@Window, 'WRITE')
|
||||
IOOptions<6> = False$
|
||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
|
||||
WMRDSNos = WOMatRec<WO_MAT_RDS_NO$>
|
||||
|
||||
LOCATE CurRdsNo IN WMRDSNos USING @VM SETTING Pos THEN
|
||||
NextRDSNo = WMRDSNos<1,Pos+1>
|
||||
|
||||
IF NextRDSNo NE '' THEN
|
||||
CurrWfrQty = obj_WO_Mat('CurrWaferCnt',WOMatKey:@RM:WOMatRec)
|
||||
Set_Status(0)
|
||||
obj_RDS('SetSchedWfrQty',NextRDSNo:@RM:CurrWfrQty)
|
||||
IF Get_Status(errCode) THEN ErrMsg(errCode)
|
||||
END
|
||||
END
|
||||
|
||||
* Added 08/05/2013 JCH
|
||||
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
OrgMUPart = XLATE('WO_MAT',WOMatKey,'MU_PART_NO','X')
|
||||
|
||||
NewMUPart = XLATE('WO_MAT',WOMatKey,'MU_PART_NO','X')
|
||||
|
||||
IF NewMUPart NE OrgMUPart THEN
|
||||
|
||||
IndexTransactionRow = 'MU_PART_NO':@FM:WOMatKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
|
||||
|
||||
OPEN "!WO_MAT" TO BangTable THEN
|
||||
|
||||
LOCK BangTable, 0 THEN
|
||||
|
||||
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
|
||||
|
||||
PendingTrans := IndexTransactionRow
|
||||
|
||||
WRITE PendingTrans ON BangTable, 0 ELSE
|
||||
ErrMsg('Unable to write index transaction to !WO_MAT. ':WOMatKey)
|
||||
END
|
||||
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Open !WO_MAT to add index transaction. ':WOMatKey)
|
||||
END ELSE
|
||||
ErrMsg('Unable to Lock !WO_MAT to add index transaction. ':WOMatKey)
|
||||
END
|
||||
END ELSE
|
||||
ErrMsg('Unable to Open !WO_MAT to add index transaction. ':WOMatKey)
|
||||
END
|
||||
END ;* End of check for changed index value
|
||||
|
||||
END ;* End of check for valid signature
|
||||
|
||||
* RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT', 'X')
|
||||
* CombStatus = Xlate('RDS', RDSNo, 'COMB_STATUS_STATIC', 'X')
|
||||
* Set_Property(@Window:'.COMB_STATUS', 'TEXT', CombStatus)
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_SIGN_POST_STAGE.CLICK()
|
||||
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
If RDSNo NE '' then
|
||||
PostInstAckReq = Xlate('RDS', RDSNo, 'POST_INST_ACK_REQ', 'X')
|
||||
If PostInstAckReq EQ True$ then
|
||||
Response = RDS_Services('RDSVerifyInst', RDSNo, 'POST')
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
SigReady = QA_Services('PostEpiSignatureReady', RDSNo, @User4)
|
||||
If SigReady then
|
||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'':@FM:'':@FM:'Sign POST stage.')
|
||||
Valid = Response<1>
|
||||
If Valid then
|
||||
Signature_Services('SignPostEpiStage', RDSNo, @User4)
|
||||
If Error_Services('NoError') then
|
||||
Post_Event(@Window, 'READ')
|
||||
end else
|
||||
Error_Services('DisplayError')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Error_Services('DisplayError')
|
||||
end
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Setup_OLE_Controls:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user