446 lines
13 KiB
Plaintext
446 lines
13 KiB
Plaintext
COMPILE FUNCTION obj_NCR(Method,Parms)
|
|
#pragma precomp SRP_PreCompiler
|
|
|
|
/*
|
|
Methods for the Non Conforming Report (NCR) table
|
|
|
|
03/29/2006 JCH - Initial Coding
|
|
|
|
Properties:
|
|
|
|
Methods:
|
|
|
|
Create(RDSNo,Reactor,LossStage,CassNos,SlotNos,PocketNos) ;* Create new NCR Record
|
|
GetProperty(NCRNos,PropName,LossStage,LossBy) ;
|
|
|
|
Notes:
|
|
12/03/2020 - DJS - Modified RejQty subroutine to count previously NCR'd wafers.
|
|
|
|
*/
|
|
|
|
|
|
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS
|
|
DECLARE FUNCTION obj_WO_Mat, obj_WO_Mat_Log, Database_Services, Datetime, Environment_Services, Logging_Services
|
|
|
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
|
|
DECLARE SUBROUTINE obj_WO_Mat, obj_WO_Mat_Log, Database_Services, Logging_Services
|
|
|
|
$INSERT MSG_EQUATES
|
|
$INSERT NCR_EQUATES
|
|
$INSERT RDS_EQUATES
|
|
$INSERT WO_MAT_EQUATES
|
|
$INSERT Popup_Equates
|
|
$INSERT DICT_EQUATES
|
|
$INSERT LOGICAL
|
|
$INSERT WO_WFR_EQUATES
|
|
|
|
EQU TARGET_ACTIVELIST$ TO 5
|
|
|
|
EQU MPRE$ TO 1 ;* Used to return Sorted StageBy from obj_NCR
|
|
EQU MPOST$ TO 2
|
|
EQU CPRE$ TO 3
|
|
EQU CPOST$ TO 4
|
|
|
|
EQU COL$LOG_FILE TO 1 ;* obj_WO_Mat_Log method parameter equates
|
|
EQU COL$LOG_DTM TO 2
|
|
EQU COL$WO_MAT_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
|
|
|
|
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat'
|
|
LogDate = Oconv(Date(), 'D4/')
|
|
LogTime = Oconv(Time(), 'MTS')
|
|
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' NCR Log.csv'
|
|
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'WOMatKeyID' : @FM : 'Notes'
|
|
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
|
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
|
|
|
ErrTitle = 'Error in Stored Procedure "obj_NCR"'
|
|
ErrorMsg = ''
|
|
|
|
IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine'
|
|
IF NOT(ASSIGNED(Parms)) THEN Parms = ''
|
|
|
|
IF ErrorMsg NE '' THEN
|
|
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
|
RETURN ''
|
|
END
|
|
|
|
Result = ''
|
|
|
|
BEGIN CASE
|
|
CASE Method = 'Create' ; GOSUB Create
|
|
CASE Method = 'CreateWfr' ; GOSUB CreateWfr
|
|
CASE Method = 'StageBy' ; GOSUB StageBy
|
|
CASE Method = 'RejQty' ; GOSUB RejQty
|
|
CASE Method = 'RDSRejQty' ; GOSUB RDSRejQty
|
|
CASE Method = 'TotRejCost' ; GOSUB TotRejCost
|
|
|
|
CASE 1
|
|
ErrorMsg = 'Unknown Method ':QUOTE(Method):' passed to routine.'
|
|
|
|
END CASE
|
|
|
|
IF ErrorMsg NE '' THEN
|
|
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
|
|
RETURN ''
|
|
END
|
|
|
|
RETURN Result
|
|
|
|
|
|
* * * * * * *
|
|
CreateWfr:
|
|
* * * * * * *
|
|
|
|
* Create method updated for wafer traceability modifications
|
|
|
|
WONo = Parms[1,@RM]
|
|
WOStep = Parms[COL2()+1,@RM]
|
|
WOMatCassNo = Parms[COL2()+1,@RM]
|
|
RDSNo = Parms[COL2()+1,@RM]
|
|
Reactor = Parms[COL2()+1,@RM]
|
|
LossStage = Parms[COL2()+1,@RM]
|
|
WfrIDs = Parms[COL2()+1,@RM]
|
|
CarrSlotIDs = Parms[COL2()+1,@RM]
|
|
CassSlotIDs = Parms[COL2()+1,@RM]
|
|
RPZs = Parms[COL2()+1,@RM]
|
|
|
|
NCRId = NextKey('NCR')
|
|
|
|
NCRRec = ''
|
|
NCRRec<NCR_WO_NO$> = WONo
|
|
NCRrec<NCR_WO_STEP$> = WOStep
|
|
NCRRec<NCR_WO_MAT_CASS_NO$> = WOMatCassNo
|
|
NCRRec<NCR_RDS_ID$> = RDSNo
|
|
NCRRec<NCR_REACTOR$> = Reactor
|
|
NCRRec<NCR_LOSS_STAGE$> = LossStage
|
|
NCRRec<NCR_ENTRY_ID$> = @USER4
|
|
NCRRec<NCR_ENTRY_DATE$> = DATE()
|
|
NCRRec<NCR_ENTRY_TIME$> = TIME()
|
|
NCRRec<NCR_WFR_ID$> = WfrIDs ;* Wafer IDs of reject material
|
|
NCRRec<NCR_CASS_SLOT_ID$> = CassSlotIDs ;* Reject from Cassette Slot ID
|
|
NCRRec<NCR_CARR_SLOT_ID$> = CarrSlotIDs ;* Reject from GaN Carrier
|
|
NCRRec<NCR_SUSC_RPZ$> = RPZs ;* Reject from Susceptor Pocket
|
|
NCRRec<NCR_STATUS$> = 'O' ;* Open
|
|
|
|
OtParms = 'NCR':@RM:NCRId:@RM:@RM:NCRRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
|
|
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
|
|
If ReactType EQ 'GAN' then
|
|
// Update wafer trace records so that reject quantities update
|
|
For each WfrID in WfrIDs using @VM
|
|
WOWfrRec = Database_Services('ReadDataRow', 'WO_WFR', WfrID)
|
|
WOWfrRec<WO_WFR_LOC_DTM$, -1> = Datetime()
|
|
WOWfrRec<WO_WFR_LOC_BY$, -1> = @User4
|
|
WOWfrRec<WO_WFR_LOC_EVENT$, -1> = 'NCR'
|
|
Database_Services('WriteDataRow', 'WO_WFR', WfrID, WOWfrRec, True$, False$, True$)
|
|
Next WfrID
|
|
end
|
|
|
|
Result = NCRId
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
Create:
|
|
* * * * * * *
|
|
|
|
WONo = Parms[1,@RM]
|
|
WOStep = Parms[COL2()+1,@RM]
|
|
WOMatCassNo = Parms[COL2()+1,@RM]
|
|
RDSNo = Parms[COL2()+1,@RM]
|
|
Reactor = Parms[COL2()+1,@RM]
|
|
LossStage = Parms[COL2()+1,@RM]
|
|
CassNos = Parms[COL2()+1,@RM]
|
|
SlotNos = Parms[COL2()+1,@RM]
|
|
PocketNos = Parms[COL2()+1,@RM]
|
|
Zones = Parms[COL2()+1,@RM]
|
|
OutCassNos = Parms[COL2()+1,@RM]
|
|
OutSlotNos = Parms[COL2()+1,@RM]
|
|
WMRdsNos = Parms[COL2()+1,@RM]
|
|
RejWaferIDs = Parms[COL2()+1,@RM]
|
|
PrevNCRNos = Parms[COL2()+1,@RM]
|
|
MUWONos = Parms[COL2()+1,@RM]
|
|
MUWOSteps = Parms[COL2()+1,@RM]
|
|
MUCassIDs = Parms[COL2()+1,@RM]
|
|
MUSlotNos = Parms[COL2()+1,@RM]
|
|
// New Code - djs 2/19/19 -----------
|
|
NCRStatus = ''
|
|
LossBy = Parms[COL2()+1,@RM]
|
|
ContainActions = Parms[COL2()+1,@RM]
|
|
LossComments = Parms[COL2()+1,@RM]
|
|
ACComments = Parms[COL2()+1,@RM]
|
|
DeptResp = Parms[COL2()+1,@RM]
|
|
ACCode = Parms[COL2()+1,@RM]
|
|
LossCode = Parms[COL2()+1,@RM]
|
|
NCRStatus = Parms[COL2()+1,@RM]
|
|
Shift = Parms[COL2()+1,@RM]
|
|
AuthShipSig = Parms[COL2()+1,@RM]
|
|
AuthRejSig = Parms[COL2()+1,@RM]
|
|
SPCDateTime = Parms[COL2()+1,@RM]
|
|
AuthShipSigDTM = Parms[COL2()+1,@RM]
|
|
DeptHandled = Parms[COL2()+1,@RM]
|
|
// ----------------------------------
|
|
|
|
IF (WONo = '') THEN
|
|
ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
|
|
END
|
|
|
|
NCRId = NextKey('NCR')
|
|
|
|
NCRRec = ''
|
|
NCRRec<NCR_WO_NO$> = WONo
|
|
NCRrec<NCR_WO_STEP$> = WOStep
|
|
NCRRec<NCR_WO_MAT_CASS_NO$> = WOMatCassNo
|
|
NCRRec<NCR_RDS_ID$> = RDSNo
|
|
NCRRec<NCR_REACTOR$> = Reactor
|
|
NCRRec<NCR_LOSS_STAGE$> = LossStage
|
|
NCRRec<NCR_ENTRY_ID$> = @USER4
|
|
NCRRec<NCR_ENTRY_DATE$> = DATE()
|
|
NCRRec<NCR_ENTRY_TIME$> = TIME()
|
|
If NCRStatus EQ '' then
|
|
NCRRec<NCR_STATUS$> = 'O' ;* Open
|
|
end else
|
|
NCRRec<NCR_STATUS$> = NCRStatus
|
|
end
|
|
NCRRec<NCR_CASS_NO$> = CassNos
|
|
NCRRec<NCR_SLOT_NO$> = SlotNos
|
|
NCRRec<NCR_POCKET_NO$> = PocketNos
|
|
NCRRec<NCR_ZONE$> = Zones
|
|
NCRRec<NCR_OUT_CASS_NO$> = OutCassNos
|
|
NCRRec<NCR_OUT_SLOT_NO$> = OutSlotNos
|
|
NCRRec<NCR_WM_RDS_NO$> = WMRdsNos
|
|
NCRRec<NCR_REJ_WAFER_ID$> = RejWaferIDs
|
|
NCRRec<NCR_PREV_NCR_NO$> = PrevNcrNos
|
|
NCRRec<NCR_MU_WO_NO$> = MUWONos
|
|
NCRRec<NCR_MU_STEP$> = MUWOSteps
|
|
NCRRec<NCR_MU_CASS$> = MUCassIDs
|
|
NCRRec<NCR_MU_SLOT$> = MUSlotNos
|
|
NCRRec<NCR_TREJ_CNT$> = COUNT(CassNos,@VM) + (CassNos NE '')
|
|
// New Code - djs 2/19/19 -----------
|
|
NCRRec<NCR_LOSS_BY$> = LossBy
|
|
NCRRec<NCR_CONTAIN_ACTIONS$> = ContainActions
|
|
NCRRec<NCR_LOSS_COMMENTS$> = LossComments
|
|
NCRRec<NCR_AC_COMMENTS$> = ACComments
|
|
NCRRec<NCR_DEPT_RESP$> = DeptResp
|
|
NCRRec<NCR_AC_CODE$> = ACCode
|
|
NCRRec<NCR_LOSS_CODE$> = LossCode
|
|
NCRRec<NCR_SHIFT$> = Shift
|
|
NCRRec<NCR_AUTH_SHIP_SIG$> = AuthShipSig
|
|
NCRRec<NCR_AUTH_REJ_SIG$> = AuthRejSig
|
|
NCRRec<NCR_SPC_DTM$> = SPCDateTime
|
|
NCRRec<NCR_AUTH_SHIP_SIG_DTM$> = AuthShipSigDTM
|
|
NCRRec<NCR_DEPT$> = DeptHandled
|
|
// ----------------------------------
|
|
|
|
IF RDSNo = '' AND WMRdsNos NE '' THEN
|
|
// EpiPro
|
|
RDSNos = ''
|
|
ReactorNos = ''
|
|
RejCnts = ''
|
|
|
|
FOR I = 1 TO COUNT(WMRDSNos,@VM) + (WMRdsNos NE '')
|
|
WMRdsNo = WMRdsNos<1,I>
|
|
LOCATE WMRdsNo IN RdsNos USING @VM SETTING Pos THEN
|
|
RejCnts<1,Pos> = RejCnts<1,Pos> + 1
|
|
END ELSE
|
|
RdsNos = INSERT(RdsNos,1,Pos,0,WMRdsNo)
|
|
ReactorNos = INSERT(ReactorNos,1,Pos,0,XLATE('RDS',WMRdsNo,RDS_REACTOR$,'X'))
|
|
RejCnts = INSERT(RejCnts,1,Pos,0,1)
|
|
END
|
|
RDSRec = Database_Services('ReadDataRow', 'RDS', WMRdsNo)
|
|
PocketNo = PocketNos<0, I>
|
|
RDSRec<RDS_OUT_NCR$, PocketNo> = NCRId
|
|
* RDSRec<RDS_OUT_CASS_NO$, PocketNo> = ''
|
|
* RDSRec<RDS_OUT_SLOT_NO$, PocketNo> = ''
|
|
Database_Services('WriteDataRow', 'RDS', WMRdsNo, RDSRec, True$, False$, True$)
|
|
NEXT I
|
|
|
|
NCRRec<NCR_RDS_ID$> = RdsNos
|
|
NCRRec<NCR_REACTOR$> = ReactorNos
|
|
NCRRec<NCR_TREJ_CNT$> = RejCnts
|
|
end else
|
|
// Non-EpiPro
|
|
WOMatKey = WONo:'*':WOMatCassNo
|
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
|
For each SlotNo in SlotNos using @VM
|
|
WOMatRec<WO_MAT_SLOT_NCR$, SlotNo> = NCRId
|
|
WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$, SlotNo> = ''
|
|
WOMatRec<WO_MAT_SLOT_REP_BY$, SlotNo> = ''
|
|
Next SlotNo
|
|
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
|
|
LogData = ''
|
|
LogData<1> = LoggingDTM
|
|
LogData<2> = WOMatKey
|
|
LogData<3> = WOMatRec<WO_MAT_SLOT_NCR$>
|
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
|
end
|
|
|
|
OtParms = 'NCR':@RM:NCRId:@RM:@RM:NCRRec
|
|
obj_Tables('WriteRec',OtParms)
|
|
Result = NCRId
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
StageBy:
|
|
* * * * * * *
|
|
|
|
* Returns passed in NCR NOs grouped by 'StageBy' (StageBy = LOSS_BY:LOSS_STAGE) OK, they're backwards - deal with it....
|
|
|
|
NCRNos = Parms[1,@RM]
|
|
|
|
IF NCRNos = '' THEN RETURN
|
|
|
|
FOR I = 1 TO COUNT(NCRNos,@VM) + (NCRNos NE '')
|
|
NCRNo = NCRNos<1,I>
|
|
NCRRec = XLATE('NCR',NCRNo,'','X')
|
|
StageBy = NCRRec<NCR_LOSS_BY$>:NCRRec<NCR_LOSS_STAGE$>
|
|
|
|
BEGIN CASE
|
|
CASE StageBy = 'MPRE' ; Result<MPRE$,-1> = NCRNo ;* These equates are in NCR_EQU
|
|
CASE StageBy = 'MPOST' ; Result<MPOST$,-1> = NCRNo
|
|
CASE StageBy = 'CPRE' ; Result<CPRE$,-1> = NCRNo
|
|
CASE StageBy = 'CPOST' ; Result<CPOST$,-1> = NCRNo
|
|
END CASE
|
|
|
|
NEXT I
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
RejQty:
|
|
* * * * * * *
|
|
|
|
IF NOT(ASSIGNED(NCRNo)) THEN
|
|
NCRNo = Parms[1,@RM]
|
|
NCRRec = Parms[COL2()+1,@RM]
|
|
END ELSE
|
|
NCRRec = ''
|
|
END
|
|
|
|
IF NCRNo = '' THEN RETURN
|
|
|
|
IF NCRRec = '' THEN NCRRec = XLATE('NCR',NCRNo,'','X')
|
|
|
|
IF NCRRec = '' THEN RETURN
|
|
|
|
WMRDSNos = NCRRec<NCR_WM_RDS_NO$>
|
|
SlotNos = NCRRec<NCR_SLOT_NO$>
|
|
RDSNos = NCRRec<NCR_RDS_ID$>
|
|
RejWaferIDs = NCRRec<NCR_REJ_WAFER_ID$>
|
|
PrevNCRNos = NCRRec<NCR_PREV_NCR_NO$>
|
|
|
|
RejQtys = ''
|
|
|
|
FOR I = 1 TO COUNT(SlotNos,@VM) + (SlotNos NE '')
|
|
|
|
IF WMRDSNos<1,I> = '' THEN
|
|
// Non-EpiPro
|
|
PrevNCRNo = PrevNCRNos<0, I>
|
|
* IF ( (SlotNos<1,I> > 0) and (PrevNCRNo EQ '') ) THEN RejQtys += 1
|
|
IF (SlotNos<1,I> > 0) THEN RejQtys += 1
|
|
END ELSE
|
|
// EpiPro
|
|
WMRdsNo = WMRDSNos<1,I>
|
|
LOCATE WMRdsNo IN RDSNos BY 'AR' USING @VM SETTING RPos THEN
|
|
RejQtys<1,RPos> = RejQtys<1,RPos> + 1
|
|
END
|
|
END
|
|
NEXT I
|
|
|
|
IF RejQtys = '' THEN
|
|
IF NCRRec<NCR_TREJ_CNT$> NE '' THEN
|
|
RejQtys = NCRRec<NCR_TREJ_CNT$>
|
|
END
|
|
END
|
|
|
|
* * * * * Added 7/7/2016 JCH * * * *
|
|
|
|
* Wafer Traceability Added *
|
|
|
|
IF RejQtys = '' THEN
|
|
RejQtys = COUNT(NCRRec<NCR_WFR_ID$>,@VM) + (NCRRec<NCR_WFR_ID$> NE '')
|
|
END
|
|
|
|
Result = RejQtys
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
RDSRejQty:
|
|
* * * * * * *
|
|
|
|
NCRNos = Parms[1,@RM]
|
|
RDSNo = Parms[COL2()+1,@RM]
|
|
|
|
IF NCRNos = '' THEN RETURN
|
|
IF RDSNo = '' THEN RETURN
|
|
|
|
|
|
RDSRejQtys = ''
|
|
FOR J = 1 TO COUNT(NCRNos,@VM) + (NCRNos NE '')
|
|
NCRNo = NCRNos<1,J>
|
|
GOSUB RejQty
|
|
|
|
RejQtys = Result
|
|
|
|
LOCATE RDSNo IN NCRRec<NCR_RDS_ID$> USING @VM SETTING Pos THEN
|
|
RDSRejQtys<1,J> = RejQtys<1,POS>
|
|
END
|
|
NEXT I
|
|
Result = RDSRejQtys
|
|
|
|
RETURN
|
|
|
|
|
|
|
|
* * * * * * *
|
|
TotRejCost:
|
|
* * * * * * *
|
|
|
|
NCRNo = Parms[1,@RM]
|
|
NCRRec = Parms[COL2()+1,@RM]
|
|
|
|
IF NCRNo = '' THEN RETURN
|
|
IF NCRRec = '' THEN NCRRec = XLATE('NCR',NCRNo,'','X')
|
|
IF NCRRec = '' THEN RETURN
|
|
|
|
WONo = NCRRec<NCR_WO_NO$>
|
|
WOMatCassNo = NCRRec<NCR_WO_MAT_CASS_NO$>
|
|
|
|
IF WOMatCassNo = '' THEN
|
|
CassNos = NCRRec<NCR_CASS_NO$>
|
|
CassCnt = COUNT(CassNos,@VM) + (CassNos NE '')
|
|
FOR I = 1 TO CassCnt
|
|
CassNo = CassNos<1,I>
|
|
IF CassNo NE '' THEN
|
|
Result += XLATE('WO_MAT',WONo:'*':CassNo,'UNIT_PRICE','X')
|
|
END
|
|
|
|
NEXT I
|
|
END ELSE
|
|
UnitCost = XLATE('WO_MAT',WONo:'*':WOMatCassNo,'UNIT_PRICE','X')
|
|
Slots = NCRRec<NCR_SLOT_NO$>
|
|
SlotCnt = COUNT(Slots,@VM) + (Slots NE '')
|
|
FOR I = 1 TO SlotCnt
|
|
Result += UnitCost
|
|
NEXT I
|
|
END
|
|
|
|
RETURN Result
|
|
|
|
|
|
|