Files
open-insight/LSL2/STPROC/OBJ_WO_MAT.txt
Mitchem Dakota (CSC FI SPS MESLEO External) 273b7f67a6 Merged PR 19143: Require 100 percent centerpoint on MU conversion.
Initial commit.

Create FQASignatureReady service in QA_SERVICES.

Create SignFQA service in SIGNATURE_SERVICES.

Commit remaining portion of project.

Implement changes requested in review meeting.

Fix typo. Add new MU logic to final entry point.

Restrict logic to only apply to 'THICK'
inspections.

Bypass new logic if Biorad 4 and 5 are down.
2025-06-18 22:23:57 +02:00

5586 lines
167 KiB
Plaintext

Compile Function obj_WO_Mat(Method,Parms)
/*
Methods for the Work Order Material (WO_MAT) table
10/17/2006 JCH - Initial Coding
11/12/2018 DJS - Updated SignNCR routine to not prematurely auto-FQA when all wafers currently in the cassette
have been NCR'd. (e.g. 7 of 7 wafers NCR'd, but cassette not yet complete (full).)
01/14/2019 DJS - Updated the SetSignature routine to write regardless if the record is locked. This is to help
keep the signatures in WO_MAT and RDS records in sync.
10/29/2019 DJS - Updated material log entry method to be more reliable. Material log entries in quick succession
were failing to be recorded.
11/06/2019 DJS - Updated test wafer quantity calculation within GetGRProps for GaN to use the IN_WFR_ID column
instead of the CHAR_WFR_ID column, which is no longer used by the GaN system.
Properties:
Methods:
Create(WONo,CassNo,......) ;* Create new WO Material entry
Delete(WONo,CassNo) ;* Delete only if certain conditions are met
CurrStatus(WONo,CassNo) ;* Curr status of this cassette
AddInvTrans(LogTable,WONo,CassNo,InvLocation,InvAction,Tag) ;* Adds Inventory transactions at current DTM and with Current User (@USER4)
CassInvHistory(WONo,CassNo,InvField) ;* Returns Inventory history for this box
*/
#pragma precomp SRP_PreCompiler
Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack
Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services
Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup
Declare Function Error_Services, Memberof, Datetime, GetTickCount
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event
Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services
Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr
Declare Subroutine Logging_Services, Set_Property, Delete, Database_Services, SRP_Stopwatch, Material_Services
Declare subroutine Mona_Services
$Insert MSG_EQUATES
$Insert WO_MAT_EQUATES
$Insert WM_OUT_EQUATES
$Insert WM_IN_EQUATES
$Insert WO_STEP_EQU
$Insert WO_LOG_EQUATES
$Insert NOTIFICATION_EQU
$Insert RDS_MAKEUP_EQU
$Insert DICT_EQUATES
$Insert REACT_RUN_EQUATES
$Insert ORDER_EQU
$Insert ORDER_DET_EQU
$Insert RDS_EQU
$Insert PROD_SPEC_EQUATES
$Insert PRS_STAGE_EQUATES
$Insert QUOTE_SPEC_EQU
$Insert SAP_LOG_EQUATES
$Insert CUST_EPI_PART_EQUATES
$Insert EPI_PART_EQUATES
$Insert PROD_VER_EQUATES
$Insert COMPANY_EQUATES
$Insert SEMI_VEND_CODE_EQUATES
$Insert WO_MAT_QA_EQUATES
$Insert QA_MET_EQUATES ;* Used for GetQAMet return data structure
$Insert LOGICAL
$Insert WO_MAT_WFR_EQUATES
$Insert RUN_STAGE_EQUATES
Equ TARGET_ACTIVELIST$ TO 5
Equ CRLF$ TO \0D0A\
Equ TAB$ TO \09\
Equ Comma$ TO ','
errCode = ''
ErrTitle = 'Error in Stored Procedure "obj_WO_Mat"'
ErrorMsg = ''
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] : ' Dual Status Log.csv'
Headers = 'Logging DTM' : @FM : 'Source' : @FM : 'ProdOrdNo' : @FM : 'WO#' : @FM : 'InCassNo' : @FM : 'GRWfrQty' : @FM : 'ScrapQty' : @FM : 'ProdTWQty' : @FM : 'CassID' : @FM : 'LotNo' : @FM : 'SubSuppCd' : @FM : 'CustPartRev' : @FM : 'MakeupFlag' : @FM : 'MUBatchNo' : @FM : 'MUCassQty'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
WOMatLogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat'
WOMatLogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' NCR_FQA.csv'
WOMatHeaders = 'Logging DTM' : @FM : 'WONo' : @FM : 'CassNo' : @FM : 'NCRNo' : @FM : 'CurrWfrCnt'
WOMatObjLog = Logging_Services('NewLog', WOMatLogPath, WOMatLogFileName, CRLF$, Comma$, WOMatHeaders, '', False$, False$)
WOMatLogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat'
WOMatLogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' WO_MAT_LOG.csv'
WOMatHeaders = 'Logging DTM' : @FM : 'WONo' : @FM : 'CassNo' : @FM : 'User' : @FM : 'Log Pos' : @FM : 'Tag' : @FM : 'Warehouse' : @FM : 'Loc' : @FM : 'InvAction' : @FM : 'ToolID'
WOMatObjLog2 = Logging_Services('NewLog', WOMatLogPath, WOMatLogFileName, CRLF$, Comma$, WOMatHeaders, '', False$, False$)
WOMatLogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat'
WOMatLogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' WO_MAT_LOG - Log Attempts.csv'
WOMatHeaders = 'Logging DTM' : @FM : 'WONo' : @FM : 'CassNo' : @FM : 'User' : @FM : 'Log Pos' : @FM : 'Tag' : @FM : 'Warehouse' : @FM : 'Loc' : @FM : 'InvAction' : @FM : 'ToolID'
WOMatObjLog3 = Logging_Services('NewLog', WOMatLogPath, WOMatLogFileName, CRLF$, Comma$, WOMatHeaders, '', False$, False$)
WOMatLogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat'
WOMatLogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' WO_MAT_LOG - PTI.csv'
WOMatHeaders = 'Logging DTM' : @FM : 'WONo' : @FM : 'CassNo' : @FM : 'User' : @FM : 'Log Pos' : @FM : 'Tag' : @FM : 'Warehouse' : @FM : 'Loc' : @FM : 'InvAction' : @FM : 'ToolID'
WOMatObjLog4 = Logging_Services('NewLog', WOMatLogPath, WOMatLogFileName, CRLF$, Comma$, WOMatHeaders, '', False$, False$)
SignNCRLogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\NCR'
SignNCRLogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SIGN_NCR.csv'
SignNCRHeaders = 'Logging DTM':@FM:'WONo':@FM:'CassNo':@FM:'NCRNo':@FM:'SignBy':@FM:'SignByDTM':@FM:'Notes'
SignNCRObjLog = Logging_Services('NewLog', SignNCRLogPath, SignNCRLogFileName, CRLF$, Comma$, SignNCRHeaders, '', False$, False$)
RemNCRLogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\NCR'
RemNCRLogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' REM_NCR.csv'
RemNCRHeaders = 'Logging DTM':@FM:'WONo':@FM:'CassNo':@FM:'NCRNo':@FM:'SlotNos':@FM:'RejWaferIDs':@FM:'PrevNCRNos':@FM:'Notes':@FM:'User'
RemNCRObjLog = Logging_Services('NewLog', RemNCRLogPath, RemNCRLogFileName, CRLF$, Comma$, RemNCRHeaders, '', False$, False$)
WOMatLogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat'
WOMatLogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' CurrStatus Log.csv'
WOMatHeaders = 'Logging DTM' : @FM : 'User' : @FM : 'WOMatKey' : @FM : 'Calculated Value' : @FM : 'Physical Value'
objCurrStatusLog = Logging_Services('NewLog', WOMatLogPath, WOMatLogFileName, CRLF$, Comma$, WOMatHeaders, '', False$, False$)
SAPLogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\SAP'
SAPFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SetSAPBatch Log.csv'
SAPHeaders = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'SAPBatchNo'
objSAPLog = Logging_Services('NewLog', SAPLogPath, SAPFileName, CRLF$, Comma$, SAPHeaders, '', False$, False$)
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJWOMAT'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJWOMAT'
end
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 = 'CreateWMO' ; GOSUB CreateWMO
CASE Method = 'Delete' ; GOSUB Delete
CASE Method = 'LockSet' ; GOSUB LockSet
CASE Method = 'UnlockSet' ; GOSUB UnlockSet
CASE Method = 'CurrStatus' ; GOSUB CurrStatus
Case Method = 'OutofPTO' ; Gosub OutofPTO
CASE Method = 'CRComp' ; GOSUB CRComp ;* Cleanroom Complete flag
CASE Method = 'PartNo' ; GOSUB PartNo ;* Added 9/22/2010 jch
CASE Method = 'AddInvTrans' ; GOSUB AddInvTrans
CASE Method = 'InvDelta' ; GOSUB InvDelta
CASE Method = 'TimeInFab' ; GOSUB TimeInFab
CASE Method = 'ProcessTime' ; GOSUB ProcessTime
CASE Method = 'EpiCassInvHistory' ; GOSUB EpiCassInvHistory
CASE Method = 'ToggleHold' ; GOSUB ToggleHold
CASE Method = 'EditHoldReason' ; GOSUB EditHoldReason
CASE Method = 'ChangeFlag' ; GOSUB ChangeFlag
CASE Method = 'AddNCR' ; GOSUB AddNCR
CASE Method = 'RemNCR' ; GOSUB RemNCR
CASE Method = 'SignNCR' ; GOSUB SignNCR
CASE Method = 'AddMakeupWafers' ; GOSUB AddMakeupWafers
CASE Method = 'RemMakeupWafers' ; GOSUB RemMakeupWafers
CASE Method = 'SubMakeupWafers' ; GOSUB SubMakeupWafers
CASE Method = 'RepMakeupWafers' ; GOSUB RepMakeupWafers
CASE Method = 'BackfillNCR' ; GOSUB BackfillNCR
CASE Method = 'ChangeCassProps' ; GOSUB ChangeCassProps
CASE Method = 'SlotWaferIDs' ; GOSUB SlotWaferIDs
CASE Method = 'CurrWaferCnt' ; GOSUB CurrWaferCnt
CASE Method = 'GetGRProps' ; GOSUB GetGRProps
CASE Method = 'ConvertMakeup' ; GOSUB ConvertMakeup
CASE Method = 'RemProdTW' ; GOSUB RemProdTW
CASE Method = 'RepProdTW' ; GOSUB RepProdTW
CASE Method = 'SetWMStatus' ; GOSUB SetWMStatus
CASE Method = 'ReportStatus' ; GOSUB ReportStatus
CASE Method = 'CassRDSNos' ; GOSUB CassRDSNos
CASE Method = 'CassRDSWfrCnts' ; GOSUB CassRDSWfrCnts
CASE Method = 'CassSigProfile' ; GOSUB CassSigProfile
CASE Method = 'CassMetProfile' ; GOSUB CassMetProfile
CASE Method = 'SetSignature' ; GOSUB SetSignature
CASE Method = 'ClearSignature' ; GOSUB ClearSignature
CASE Method = 'TestStatus' ; GOSUB TestStatus
CASE Method = 'SigDt' ; GOSUB SigDt
CASE Method = 'AddShip' ; GOSUB AddShip
CASE Method = 'RemShip' ; GOSUB RemShip
CASE Method = 'AddReship' ; GOSUB AddReship
CASE Method = 'SetPartNo' ; GOSUB SetPartNo
CASE Method = 'RefreshSigProfile' ; GOSUB RefreshSigProfile
CASE Method = 'SetWfrQty' ; GOSUB SetWfrQty
CASE Method = 'UpdateSpec' ; GOSUB UpdateSpec
CASE Method = 'FinalSigComp' ; GOSUB FinalSigComp
CASE Method = 'SetSAPBatch' ; GOSUB SetSAPBatch
CASE Method = 'GetCycleTime' ; GOSUB GetCycleTime
CASE Method = 'GetQAMet' ; GOSUB GetQAMet
CASE Method = 'GetMUCassIDs' ; GOSUB GetMUCassIDs
CASE Method = 'GetEventLog' ; GOSUB GetEventLog
CASE Method = 'GetADERead' ; GOSUB GetADERead
CASE Method = 'CheckSigOrder' ; GOSUB CheckSigOrder
CASE Method = 'MQAComp' ; GOSUB MQAComp
CASE Method = 'EpiReactNo' ; GOSUB EpiReactNo
CASE Method = 'GetSigProfile' ; GOSUB GetSigProfile
CASE Method = 'GetQAMetKeys' ; GOSUB GetQAMetKeys
CASE Method = 'AddQAMet' ; GOSUB AddQAMet
CASE Method = 'RemQAMet' ; GOSUB RemQAMet
Case Method = 'GetWfrKeys' ; Gosub GetWfrKeys
CASE Method = 'GetBinLocID' ; GOSUB GetBinLocID
CASE Method = 'GetMUAddedDTMS' ; GOSUB GetMUAddedDTMS
CASE Method = 'GetMURemovedDTMS' ; GOSUB GetMURemovedDTMS
CASE Method = 'ExpCOA' ; GOSUB ExpCOA
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
* * * * * * *
GetWfrKeys:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
If WOMatKey = '' Then Return
If WOMatRec = '' Then
WOMatRec = Xlate('WO_MAT',WOMatKey,'','X')
End
WOWfrIDs = ''
Extract_SI_Keys('WO_WFR', 'CURR_CASS_ID', WOMatKey, WOWfrIDs)
CurrLocs = Xlate('WO_WFR',WOWfrIDs,'CURR_LOC','X')
Result = CurrLocs
RETURN
* * * * * * *
Create:
* * * * * * *
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
ProdVerNo = Parms[COL2()+1,@RM]
LotNo = Parms[COL2()+1,@RM]
WaferQty = Parms[COL2()+1,@RM]
CustPartNo = Parms[COL2()+1,@RM]
OrderItem = Parms[COL2()+1,@RM]
ReactType = Parms[COL2()+1,@RM]
SubPartNo = Parms[COL2()+1,@RM]
RxWH = Parms[COL2()+1,@RM]
RxLocation = Parms[COL2()+1,@RM]
RxDTM = Parms[COL2()+1,@RM]
RxBy = Parms[COL2()+1,@RM]
SubSupplyBy = Parms[COL2()+1,@RM]
MUWaferFlag = Parms[COL2()+1,@RM]
RetRejects = Parms[COL2()+1,@RM]
Reprocessed = Parms[COL2()+1,@RM]
CassShipQty = Parms[COL2()+1,@RM]
ShipShort = Parms[COL2()+1,@RM]
SubVendCd = Parms[COL2()+1,@RM]
MinCassShipQty = Parms[Col2() + 1, @RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null parameter "CassNo" passed to routine. (':Method:')'
IF LotNo = '' THEN ErrorMsg = 'Null parameter "LotNo" passed to routine. (':Method:')'
IF WaferQty = '' THEN ErrorMsg = 'Null parameter "Wafer Qty" passed to routine. (':Method:')'
IF CustPartNo = '' THEN ErrorMsg = 'Null parameter "Cust PartNo" passed to routine. (':Method:')'
IF OrderItem = '' THEN ErrorMsg = 'Null parameter "OrderItem" passed to routine. (':Method:')'
IF ReactType = '' THEN ErrorMsg = 'Null parameter "ReactType" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF RxWH = '' THEN RxWH = 'SR' ;* Shipping/Receiving area
IF RxLocation = '' THEN RxLocation = 'RB' ;* Receiving Bench
IF RxBy = '' THEN RxBy = @USER4 ;* Current LSL user
IF RxDTM = '' THEN
CurrDate = OCONV(Date(),'D4/')
CurrTime = OCONV(Time(),'MTS')
thisRxDTM = ICONV(CurrDate:' ':CurrTime,'DT') ;* Use Current Date-Time for default
END ELSE
thisRxDTM = ICONV(RxDTM,'DT')
END
IF ReactType = 'P' THEN ReactType = 'EPP' ;* Reactor Type code cleanups
WOMatKey = WONo:'*':CassNo
WOMatRec = ''
WOMatRec<WO_MAT_LOT_NO$> = LotNo
WOMatRec<WO_MAT_WAFER_QTY$> = WaferQty
WOMatRec<WO_MAT_CUST_PART_NO$> = CustPartNo
WOMatRec<WO_MAT_SUB_PART_NO$> = SubPartNo
WOMatRec<WO_MAT_ORDER_ITEM$> = OrderItem
WOMatRec<WO_MAT_PROD_VER_NO$> = ProdVerNo
WOMatRec<WO_MAT_INV_WH$> = RxWH
WOMatRec<WO_MAT_INV_LOCATION$> = RxLocation
WOMatRec<WO_MAT_INV_ACTION$> = 'RCVD'
WOMatRec<WO_MAT_INV_DTM$> = thisRxDTM
WOMatRec<WO_MAT_INV_TAG$> = '' ;* No tag actually scanned -> so no tag value
WOMatRec<WO_MAT_INV_USER$> = RxBy
WOMatRec<WO_MAT_RX_DTM$> = thisRxDTM
WOMatRec<WO_MAT_RX_BY$> = RxBy
WOMatRec<WO_MAT_SUB_SUPPL_BY$> = SubSupplyby
WOMatRec<WO_MAT_MU_WAFER_FLAG$> = MUWaferFlag
WOMatRec<WO_MAT_RET_REJECTS$> = RetRejects
WOMatRec<WO_MAT_REPROCESSED_MAT$> = Reprocessed
WOMatRec<WO_MAT_CASS_SHIP_QTY$> = CassShipQty
WOMatRec<WO_MAT_SHIP_SHORT$> = ShipShort
WOMatRec<WO_MAT_SUB_VEND_CD$> = SubVendCd
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = False$
WaferCnt = WOMatRec<WO_MAT_WAFER_QTY$> ;* Changed to add slots for both EpiPRO and standard reactor types 8/13/2010 JCH
ShipCnt = WOMatRec<WO_MAT_CASS_SHIP_QTY$>
BEGIN CASE
CASE ShipCnt = '' ; SlotCnt = WaferCnt
CASE WaferCnt > ShipCnt ; SlotCnt = WaferCnt
CASE WaferCnt < ShipCnt ; SlotCnt = ShipCnt
CASE WaferCnt = ShipCnt ; SlotCnt = ShipCnt
END CASE
FOR I = 1 TO SlotCnt
WOMatRec<WO_MAT_SLOT_NO$,I> = I
IF (ShipCnt NE '') AND (WaferCnt < ShipCnt) AND (I > WaferCnt) THEN
WOMatRec<WO_MAT_SLOT_MET_NO$,I> = 'x' ;* Box is received less than ShipQty -> add slot but place 'x' in Met column to 'indicate' empty slot
END
NEXT I
* * * * * * * * Build QA_MET profile * * * * * * * *
obj_WO_Mat_QA('Create',WONo:@RM:CassNo) ;* Added 5/28/2015 JCH
IF ReactType = 'P' OR ReactType = 'EPP' THEN
*Inbound EpiPRO material
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
EpiProPSNo = XLATE('WO_STEP',WOStepKeys<1,1>,WO_STEP_PROD_SPEC_ID$,'X')
EpiProPSRec = XLATE('PROD_SPEC',EpiProPSNo,'','X')
WOMatRec<WO_MAT_EPI_PRO$> = 1 ;* Added 7/29/2010 JCH
IF RowExists('PRS_STAGE',EpiProPSNo:'*PRE') THEN
ociParms = WONo:@RM ;* WONo
ociParms := 1:@RM ;* WOStep
ociParms := CassNo:@RM ;* CassNo
ociParms := 'PRE':@RM ;* Stage ;* Pre Epi Cleaning on inbound material
ociParms := '':@RM ;* RDSNo ;* No specific RDS on Epi Pro inbound material
ociParms := EpiProPSNo:@RM ;* PSNo
ociParms := EpiProPSRec ;* PSRec
WOMatRec<WO_MAT_EPI_CI_NO$> = obj_Clean_Insp('Create',ociParms) ;* Added 8/13/2010
IF Get_Status(errCode) THEN ErrMsg(errCode)
END ;* End of check for PRS_Stage record
* Outbound EpiPRO empty cassette creation - This section setup 11/14/2011 JCH
IF RowExists('PRS_STAGE',EpiProPSNo:'*POST') THEN
ociParms = WONo:@RM ;* WONo
ociParms := 1:@RM ;* WOStep
ociParms := CassNo:@RM ;* CassNo
ociParms := 'POST':@RM ;* Stage
ociParms := '':@RM ;* RDSNo
ociParms := EpiProPSNo:@RM ;* PSNo
ociParms := EpiProPSRec ;* PSRec
PostCINo = obj_Clean_Insp('Create',ociParms)
WOMatRec<WO_MAT_EPO_CI_NO$> = PostCINo
END
END
IF Reprocessed THEN
Result = '1PSTC':@VM:'1PSTS':@VM:'1PSTI':@VM:'1QA'
END ELSE
GOSUB CassSigProfile ;* 8/22/2009 JCH Added signature profile
END
WOMatRec<WO_MAT_SIG_PROFILE$> = Result ;* 8/22/2009 JCH
Result = ''
OtParms = 'WO_MAT':@RM:WOMatKey:@RM:@RM:WOMatRec
obj_Tables('WriteRec',OtParms)
RETURN
* * * * * * *
CreateWMO:
* * * * * * *
* Creates basic WO_MAT record for EpiPRO Outbound cassette w/o corresponding WM_IN cassette
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null parameter "CassNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WORec = XLATE('WO_LOG',WONo,'','X')
CustPartNo = WOrec<WO_LOG_CUST_PART_NO$>
SubPartNo = WORec<WO_LOG_ORD_SUB_PART_NO$>
EpiProFlag = 1
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
LastWOStepKey = WOStepKeys[-1,'B':@VM]
EPIPartNo = WORec<WO_LOG_EPI_PART_NO$>
EPIPartRec = XLATE('EPI_PART',EpiPartNo,'','X')
SubSuppBy = EPIPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
ProdVerNo = WORec<WO_LOG_PROD_VER_NO$>
CustNo = WORec<WO_LOG_CUST_NO$>
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X') ;* Added 7/31/2012 JCH
MUWaferFlag = CustEpiPartRec<CUST_EPI_PART_MAKEUP_WAFERS$> ;* Added 7/31/2012 JCH
RetRejects = CustEpiPartRec<CUST_EPI_PART_RET_REJECTS$> ;* Added 7/31/2012 JCH
CassShipQty = CustEpiPartRec<CUST_EPI_PART_CASS_SHIP_QTY$> ;* Added 7/31/2012 JCH
ShipShort = CustEpiPartRec<CUST_EPI_PART_EPI_PRO_SHIP_SHORT$> ;* Added 7/31/2012 JCH
Reprocessed = '' ;* Added 12/16/2009 JCH to match parms passed to obj_WO_Mat('Create
MinCassShipQty = CustEpiPartRec<CUST_EPI_PART_MIN_CASS_SHIP_QTY$> ; // Added 02/01/2018 dmb
WOMatKey = WONo:'*':CassNo
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X') ;* Added 8/21/2013 JCH - WO_MAT record may exist only because a WM_OUT is in place.
WOMatRec<WO_MAT_LOT_NO$> = ''
WOMatRec<WO_MAT_WAFER_QTY$> = ''
WOMatRec<WO_MAT_CUST_PART_NO$> = CustPartNo
WOMatRec<WO_MAT_SUB_PART_NO$> = SubPartNo
WOMatRec<WO_MAT_ORDER_ITEM$> = '' ;* OrderItem
WOMatRec<WO_MAT_INV_WH$> = ''
WOMatRec<WO_MAT_INV_LOCATION$> = ''
WOMatRec<WO_MAT_INV_ACTION$> = ''
WOMatRec<WO_MAT_INV_DTM$> = ''
WOMatRec<WO_MAT_INV_TAG$> = '' ;* No tag actually scanned -> so no tag value
WOMatRec<WO_MAT_INV_USER$> = ''
WOMatRec<WO_MAT_RX_DTM$> = ''
WOMatRec<WO_MAT_RX_BY$> = ''
WOMatRec<WO_MAT_SUB_SUPPL_BY$> = SubSuppBy
WOMatRec<WO_MAT_MU_WAFER_FLAG$> = MUWaferFlag
WOMatRec<WO_MAT_RET_REJECTS$> = ''
WOMatRec<WO_MAT_REPROCESSED_MAT$> = ''
WOMatRec<WO_MAT_CASS_SHIP_QTY$> = CassShipQty ;* Added 6/14/2016 JCH *********
WOMatRec<WO_MAT_SHIP_SHORT$> = ShipShort
WOMatRec<WO_MAT_EPI_PRO$> = EpiProFlag ;* Added EpiProFlag variable 6/14/2016 JCH
WOMatRec<WO_MAT_MIN_CASS_SHIP_QTY$> = MinCassShipQty ; // Added 02/01/2018 dmb
GOSUB CassSigProfile ;* 8/22/2009 JCH Added signature profile
WOMatRec<WO_MAT_SIG_PROFILE$> = Result ;* 8/22/2009 JCH
Result = ''
OtParms = 'WO_MAT':@RM:WOMatKey:@RM:@RM:WOMatRec
obj_Tables('WriteRec',OtParms)
RETURN
* * * * * * *
Delete:
* * * * * * *
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
WOMatKey = WONo:'*':CassNo
ReactType = XLATE('WO_LOG',WONo,'PS_REACTOR_TYPE','X')<1,1>
IF ReactType = 'P' THEN ReactType = 'EPP' ;* React Type code cleanup JCH 9/2/2014
TableVar = ''
OtParms = 'WO_MAT':@RM:WOMatKey:@RM:TableVar
WOMatRec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update
EmptyWOMatRec = WOMatRec
ProdVerNo = WOMatRec<WO_MAT_PROD_VER_NO$>
CIKeys = WOMatRec<WO_MAT_CLEAN_INSP_KEY$>
CONVERT @FM TO '' IN EmptyWOMatRec
DeleteFlag = 0
IF (WOMatRec<WO_MAT_SIG_PROFILE$,1> NE '' AND WOMatRec<WO_MAT_SIGNATURE$,1> = '') THEN DeleteFlag = 1
IF EmptyWOMatRec = '' THEN DeleteFlag = 1
IF EmptyWOMatRec = ProdVerNo THEN DeleteFlag = 1
IF EmptyWOMatRec = ProdVerNo:CIKeys THEN DeleteFlag = 1
IF WOMatRec<WO_MAT_SIG_PROFILE$> = '' THEN DeleteFlag = 1
IF DeleteFlag = 1 THEN
IF WOMatRec<WO_MAT_RDS_NO$> NE '' THEN
RDSCnt = COUNT(WOMatRec<WO_MAT_RDS_NO$>,@VM) + (WOMatRec<WO_MAT_RDS_NO$> NE '')
FOR I = 1 TO RDSCnt
Set_Status(0)
obj_RDS('Delete',WOMatRec<WO_MAT_RDS_NO$,1>)
NEXT I
END
END ELSE
ErrorMsg = "Unable to delete WO_Mat Record ":QUOTE(WOMatKey):' has started processing'
END
IF WOMatRec<WO_MAT_RDS_NO$> NE '' THEN
Set_Status(0)
BadRDSNo = obj_RDS('Delete',WOMatRec<WO_MAT_RDS_NO$,1>)
IF Get_Status(errCode) THEN
ErrorMsg = "Unable to delete WO_Mat ID ":QUOTE(WOMatKey):' - RDS ':QUOTE(BadRDSNo):' has started processing'
END
END
WOStepKeys = XLATE('WO_LOG',WONo,'WO_STEP_KEYS','X')
IF ReactType = 'P' OR ReactType = 'EPP' THEN
Tmp = ''
StepCnt = COUNT(WOStepKeys,@VM) + (WOStepKeys NE '')
FOR I = 1 TO StepCnt
WMKey = WOStepKeys<1,I>:'*':CassNo
WMInRec = XLATE('WM_IN',WMKey,'','X')
WMOutRec = XLATE('WM_OUT',WMKey,'','X')
IF WMInRec NE '' THEN
ErrorMsg = 'Work Order Material record currently has WM_IN records attached and may not be deleted.'
END
IF WMOutRec NE '' THEN
ErrorMsg = 'Work Order Material record currently has WM_OUT records attached and may not be deleted.'
END
NEXT I
END
IF WOMatRec<WO_MAT_CLEAN_INSP_KEY$> NE '' THEN
obj_Clean_Insp('Delete',WOMatRec<WO_MAT_CLEAN_INSP_KEY$>)
END
InWfrIDs = XLATE('WO_MAT_WFR' , @ID , 'IN_WFR_ID' , 'X' )
IF ErrorMsg = '' THEN
obj_Tables('DeleteRec',OtParms)
END ELSE
obj_Tables('UnlockRec',OtParms)
END
RETURN
* * * * * * *
LockSet:
* * * * * * *
WOMKeys = Parms[1,@RM]
IF WOMKeys = '' THEN RETURN
Set_Status(0)
WOMParms = 'WO_MAT'
LockedWOMKeys = ''
WOMKeyCnt = COUNT(WOMKeys,@VM) + (WOMKeys NE '')
FOR I = 1 TO WOMKeyCnt
WOMKey = WOMKeys<1,I>
WOMParms = FieldStore(WOMParms, @RM, 2, 1, WOMKey)
obj_Tables('LockRec',WOMParms)
IF Get_Status(errCode) THEN
LockedWOMKeyCnt = COUNT(LockedWOMKeys,@VM) + (LockedWOMKeys NE '')
FOR N = 1 TO LockedWOMKeyCnt
WOMParms = FieldStore(WOMParms, @RM, 2, 1, LockedWOMKeys<1,N>)
obj_Tables('UnlockRec',WOMParms) ;* Unlock everything locked up to here
NEXT N
ErrorMsg = 'Unable to lock WO_MAT ':QUOTE(WOMKey):'.'
RETURN
END ELSE
LockedWOMKeys<1,I> = WOMKey
END
NEXT I
TableVar = FIELD(WOMParms,@RM,3,1)
Result = TableVar
RETURN
* * * * * * *
UnlockSet:
* * * * * * *
WOMKeys = Parms[1,@RM]
TableVar = Parms[COL2()+1,@RM]
IF WOMKeys = '' THEN RETURN
IF TableVar = '' THEN RETURN
Set_Status(0)
WOMParms = 'WO_MAT':@RM:@RM:TableVar
LockedWOMKeys = ''
WOMKeyCnt = COUNT(WOMKeys,@VM) + (WOMKeys NE '')
FOR I = 1 TO WOMKeyCnt
WOMKey = WOMKeys<1,I>
WOMParms = FieldStore(WOMParms, @RM, 2, 1, WOMKey)
obj_Tables('UnlockRec',WOMParms)
NEXT I
RETURN
* * * * * * *
CurrStatus:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrStatus'
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
WONo = WOMatKey[1,'*']
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec<WO_MAT_VOID$> THEN
Result = 'VOID'
RETURN
END
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
Result = 'SHIP'
RETURN
END
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
LocCnt = COUNT(WOMatRec<WO_MAT_INV_LOCATION$>,@VM) + (WOMatRec<WO_MAT_INV_LOCATION$> NE '')
LastIn = ''
LastOut = ''
FOR I = LocCnt TO 1 STEP -1
IF WOMatRec<WO_MAT_INV_LOCATION$,I> = 'PTI' AND LastIn = '' THEN
LastIn = WOMatRec<WO_MAT_INV_DTM$,I>
END
IF WOMatRec<WO_MAT_INV_LOCATION$,I> = 'PTO' AND LastOut = '' THEN
LastOut = WOMatRec<WO_MAT_INV_DTM$,I>
END
UNTIL LastIn NE '' AND LastOut NE ''
NEXT I
LastWH = WOMatRec<WO_MAT_INV_WH$>[-1,'B':@VM]
LastLoc = WOMatRec<WO_MAT_INV_LOCATION$>[-1,'B':@VM]
CurrLoc = ''
IF LastWH NE '' AND LastLoc NE '' THEN
CurrLoc = LastWH:'*':LastLoc
IF CurrLoc = 'SR*SB' THEN CurrLoc = ''
END
BEGIN CASE
CASE LastIn = '' AND LastOut = '' ; InCleanRoom = 0
CASE LastIn = '' ; InCleanRoom = 0
CASE LastOut = '' ; InCleanRoom = 1
CASE LastOut > LastIn ; InCleanRoom = 0
CASE LastIn > LastOut ; InCleanRoom = 1
END CASE
IF WMIKey NE '' THEN
WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
END ELSE
WMIStatus = ''
END
IF WMOKey NE '' THEN
WMOStatus = WOMatRec<WO_MAT_WMO_CURR_STATUS$>
IF WMOStatus = 'COMP' AND NOT(InCleanRoom) THEN
WMOStatus = 'RTS'
END
WMOMakeup = XLATE('WM_OUT',WMOKey,'MAKEUP_BOX','X')
END ELSE
WMOStatus = ''
END
IF WMIKey NE '' OR WMOKey NE '' THEN
InboundStat = ''
OutboundStat = ''
IF WOMatRec<WO_MAT_HOLD$> = 1 THEN
IF WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_IN' THEN
InboundStat = 'HOLD'
END
IF WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
OutBoundStat = 'HOLD'
END
BEGIN CASE
CASE InboundStat EQ 'HOLD' AND OutboundStat EQ 'HOLD'
Result = 'HOLD'
CASE InboundStat = '' AND OutboundStat = ''
Result = ''
CASE InboundStat = '' AND OutboundStat NE ''
Result = WMOStatus
CASE InboundStat NE '' AND OutboundStat = ''
Result = InboundStat
CASE InboundStat NE '' AND OutboundStat NE ''
Result = InboundStat:@VM:WMOStatus
Result = Result:WMOStatus
END CASE
RETURN
END
IF WMIKey NE '' THEN
IF WMIStatus = 'MT' OR WMIStatus = 'VOID' THEN
NULL
END ELSE
InboundStat = WMIStatus
END
END
IF WMOKey NE '' THEN
IF WMOStatus = 'RTB' OR WMOStatus = 'VOID' THEN
NULL
END ELSE
OutboundStat = WMOStatus
END
END
UnhandledCase = False$
BEGIN CASE
Case WMIStatus EQ 'RFW' and WMOStatus EQ 'QA'
Result = 'QA'
Case WMIStatus EQ 'NCR' and WMOStatus EQ 'SHIP'
Result = 'SHIP'
Case WMIStatus EQ 'NCR' and WMOStatus EQ 'MT'
Result = 'MT'
Case WMIStatus EQ 'NCR' and WMOStatus EQ 'RTS'
Result = 'RTS'
Case WMIStatus EQ 'NCR' and WMOStatus EQ 'RTU'
Result = 'RTU'
CASE WMIStatus EQ 'RFW' and WMOStatus EQ 'BLD'
Result = 'RFW'
CASE WMIStatus EQ 'MT' and WMOStatus EQ 'RTB'
Result = 'RTB'
Case WMIStatus EQ 'HOLD' and WMOStatus NE ''
Result = WMOStatus
Case WMIStatus EQ 'VOID' and WMOStatus EQ 'VOID'
Result = 'VOID'
Case WMIStatus EQ 'VOID' and WMOStatus NE 'VOID'
Result = WMOStatus
Case WMIStatus NE 'VOID' and WMOStatus EQ 'VOID'
Result = WMIStatus
CASE InboundStat = '' AND OutboundStat = ''
Result = ''
CASE InboundStat = '' AND OutboundStat NE ''
Result = WMOStatus
CASE InboundStat NE '' AND OutboundStat = ''
Result = InboundStat
CASE InboundStat NE '' AND OutboundStat NE ''
Result = InboundStat:@VM
Result = Result:WMOStatus
UnhandledCase = True$
END CASE
If UnhandledCase then
// Log it in case we need to address an unhandled inbound / outbound status combination.
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = WOMatKey
LogData<3> = 'Inbound Status: ':InboundStat
LogData<4> = 'Outbound Status: ':OutboundStat
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$, '', '')
end
RETURN
END
SigArray = Signature_Services('GetSigProfile', WOMatKey)
SigProfs = SigArray<1>
Signatures = SigArray<2>
LastSigPos = DCount(SigProfs, @VM) + 1
LastStepSig = Signatures<0, LastSigPos>
Canceled = WOMatRec<WO_MAT_CANCELLED$>
SubSupplyBy = WOMatRec<WO_MAT_SUB_SUPPL_BY$>
RetRejects = WOMatRec<WO_MAT_RET_REJECTS$>
MakeupBox = WOMatRec<WO_MAT_MAKEUP_BOX$>
CurrWfrCnt = XLATE('WO_MAT',WOMatKey,'CURR_WFR_CNT','X')
NCRNos = WOMatRec<WO_MAT_NCR_KEYS$>
NCRFinalSigs = WOMatRec<WO_MAT_NCR_FINAL_SIG$>
NCRNoCnt = COUNT(NCRNos,@VM) + (NCRNos NE '')
NCRSigCnt = COUNT(NCRFinalSigs,@VM) + (NCRFinalSigs NE '')
IF RetRejects = '' AND SubSupplyBy = 'C' THEN RetRejects = 1 ;* Fix up for RetRejects flag left null
ProcessStart = 0
ProcessComp = 0
LOOP
Signature = Signatures<1,1>
SigProf = SigProfs<1,1>
UNTIL Signature = ''
ProcessStart = 1
Signatures = DELETE(Signatures,1,1,0)
SigProfs = DELETE(SigProfs,1,1,0)
REPEAT
IF SigProf[1,4] = 'PSTI' AND SigProfs<1,2>[1,4] = 'PSTS' THEN
SigProf = SigProfs<1,2> ;* Added 1/5/2011 JCH
END
IF Signature = '' AND SigProf = '' AND ProcessStart = 1 THEN ProcessComp = 1
IF NUM(SigProf[1,1]) THEN SigProf[1,1] = ''
BEGIN CASE
CASE WOMatRec<WO_MAT_HOLD$> = 1 ; Result = 'HOLD'
CASE WOMatRec<WO_MAT_SHIP_NO$> NE '' ; Result = 'SHIP'
CASE Canceled = 1 AND SubSupplyBy NE 'C' ; Result = 'CANC'
CASE Canceled = 1 AND SubSupplyBy = 'C' AND InCleanRoom ; Result = 'COMP'
CASE Canceled = 1 AND SubSupplyBy = 'C' AND NOT(InCleanRoom) ; Result = 'RTS'
CASE NCRNoCnt > 0 AND NCRNoCnt NE NCRSigCnt ; Result = 'NCR'
CASE MakeupBox AND ProcessComp AND CurrWfrCnt > 0 ; Result = 'RTU'
CASE MakeupBox AND ProcessComp AND CurrWfrCnt = 0 ; Result = 'MT'
CASE NCRNoCnt > 0 AND CurrWfrCnt = 0 AND NOT(RetRejects) ; Result = 'REJ'
CASE NCRNoCnt > 0 AND CurrWfrCnt = 0 AND RetRejects ; Result = 'RTS'
CASE CurrWfrCnt = 0 ; Result = 'MT' ;* Added 8/14/2008 JCH - Used for Prod Test Wafers
CASE ProcessComp AND NOT(InCleanRoom) ; Result = 'RTS'
CASE ProcessComp AND CurrLoc = 'CR*PKO' ; Result = 'PKO'
CASE ProcessComp AND CurrLoc = 'CR*PACK' ; Result = 'PACK'
CASE ProcessComp AND InCleanroom ; Result = 'COMP'
CASE WOMatRec<WO_MAT_REL_DTM$> NE '' AND InCleanRoom ; Result = SigProf
CASE ProcessStart AND NOT(InCleanRoom) ; Result = SigProf
CASE WOMatRec<WO_MAT_REL_DTM$> NE '' AND NOT(InCleanRoom) ; Result = 'REL'
CASE WOMatRec<WO_MAT_RX_DTM$> NE '' ; Result = 'RX'
CASE SubSupplyBy = 'L' ; Result = 'RTP'
CASE 1 ; Result = 'AWM'
END CASE
IF Result = 'RTS' AND WOMatRec<WO_MAT_SHIP_HOLD$> = 1 THEN Result = 'SHOLD'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
* * * * * * *
OutofPTO:
* * * * * * *
* Checks for INV movement through the PTO. If found it returns data for a user message.
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
WONo = WOMatKey[1,'*']
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
InvLocations = WOMatRec<WO_MAT_INV_LOCATION$>
ICnt = COUNT(InvLocations,@VM) + (InvLocations NE '')
FOR I = ICnt TO 1 STEP -1
IF InvLocations<1,I> = 'PTO' THEN
IF WOMatRec<WO_MAT_INV_WH$,I> = '1K' AND WOMatRec<WO_MAT_INV_ACTION$,I> = 'PLACE' THEN
InvDtm = WOMatRec<WO_MAT_INV_DTM$,I>
InvUser = WOMatRec<WO_MAT_INV_USER$,I>
Result = XLATE( 'LSL_USERS', InvUser , 'FIRST_LAST', 'X' ):@FM:OCONV(InvDtm,'DT4/^S')
RETURN
END
END ;* End of check for PTO locaton
NEXT I
RETURN
* * * * * * *
CRComp:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
WONo = WOMatKey[1,'*']
IF WONo < 128680 THEN RETURN ;* This is the first WO No on 7/29/2005 - The day we cut over to the new system.
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec<WO_MAT_VOID$> THEN
Result = 'VOID'
END
Canceled = WOMatRec<WO_MAT_CANCELLED$>
CurrWfrCnt = XLATE('WO_MAT',WOMatKey,'CURR_WFR_CNT','X')
NCRNos = WOMatRec<WO_MAT_NCR_KEYS$>
NCRFinalSigs = WOMatRec<WO_MAT_NCR_FINAL_SIG$>
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
IF WMOKey NE '' THEN
Result = obj_WM_Out('CRComp',WMOKey:@RM:@RM:WOMatRec)
RETURN
END
NCRNoCnt = COUNT(NCRNos,@VM) + (NCRNos NE '')
NCRSigCnt = COUNT(NCRFinalSigs,@VM) + (NCRFinalSigs NE '')
SigArray = Signature_Services('GetSigProfile', WOMatKey)
SigProfs = SigArray<1>
Signatures = SigArray<2>
ProcessStart = 0
ProcessComp = 0
LOOP
Signature = Signatures<1,1>
SigProf = SigProfs<1,1>
UNTIL Signature = ''
ProcessStart = 1
Signatures = DELETE(Signatures,1,1,0)
SigProfs = DELETE(SigProfs,1,1,0)
REPEAT
IF Signature = '' AND SigProf = '' THEN ProcessComp = 1
IF NUM(SigProf[1,1]) THEN SigProf[1,1] = ''
CRComplete = 1
IF CurrWfrCnt > 0 THEN
IF NCRNoCnt > 0 AND NCRNoCnt NE NCRSigCnt THEN CRComplete = 0
IF NOT(ProcessStart) THEN CRComplete = 0
IF ProcessStart AND NOT(ProcessComp) THEN CRComplete = 0
END
Result = CRComplete
RETURN
* * * * * * *
AddInvTrans:
* * * * * * *
LogFile = Parms[1,@RM] ;* This is always set to 'WO_MAT' now. Was changeable during development JCH
WONo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
InvLocation = Parms[COL2()+1,@RM]
InvAction = Parms[COL2()+1,@RM]
InvDTM = Parms[COL2()+1,@RM]
ScanUserID = Parms[COL2()+1,@RM]
Tag = Parms[COL2()+1,@RM]
ToolID = Parms[COL2()+1,@RM]
ScanEntry = Parms[COL2()+1,@RM]
IF LogFile = '' THEN ErrorMsg = 'Null parameter "LogFile" passed to routine. (':Method:')'
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null parameter "CassNo" passed to routine. (':Method:')'
IF InvLocation = '' THEN ErrorMsg = 'Null parameter "InvLocation" passed to routine. (':Method:')'
IF InvAction = '' THEN ErrorMsg = 'Null parameter "InvAction" passed to routine. (':Method:')'
IF InvDTM = '' THEN ErrorMsg = 'Null parameter "InvDTM" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN
ErrorMsg := CRLF$:Parms
SWAP @RM WITH CRLF$ IN ErrorMsg
RETURN
END
IF ScanUserID = '' THEN ScanUserID = @USER4
thisInvDTM = ICONV(InvDTM,'DT')
IF thisInvDTM = '' THEN
ErrorMsg = 'Invalid InvDTM ':InvDTM:' passed to routine.'
RETURN
END
BEGIN CASE
CASE LogFile = 'WO_MAT'
WOMatKey = WONo:'*':CassNo
WHCd = InvLocation[1,'*']
LocCd = InvLocation[COL2()+1,'*']
TableVar = ''
OtParms = 'WO_MAT':@RM:WOMatKey:@RM:TableVar
WOMatRec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',OtParms)
RETURN
END
IF WHCd = '1K' AND WOMatRec<WO_MAT_WMO_KEY$> NE '' THEN
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
IF LocCd = 'PTO' OR LocCd = 'PKO' THEN
WTableVar = ''
WOtParms = 'WM_OUT':@RM:WMOKey:@RM:WTableVar
WMOutRec = obj_Tables('ReadRec',WOtParms)
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',WOtParms)
obj_Tables('UnlockRec',OtParms)
RETURN
END
IF LocCd = 'PTO' THEN
WMOutRec<WM_OUT_IN_CLEANROOM$> = 0 ;* Clear the InCleanRoom flag
WMOutRec<WM_OUT_IN_PTO$> = 0 ;* Clear In Passtrough flag
END ELSE
WMOutRec<WM_OUT_IN_PTO$> = 1 ;* Set the In PTO flag
END
WOtParms = FieldStore(WOtParms,@RM,4,0,WMOutRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteRec',WOtParms)
IF Get_Status(errCode) THEN
NULL
END
END ;* End of check for PTO or PKO location
IF LocCd = 'PTI' THEN
WTableVar = ''
WOtParms = 'WM_OUT':@RM:WMOKey:@RM:WTableVar
WMOutRec = obj_Tables('ReadRec',WOtParms)
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',WOtParms)
obj_Tables('UnlockRec',OtParms)
RETURN
END
WMOutRec<WM_OUT_IN_CLEANROOM$> = 1 ;* Set the InCleanRoom flag
WOtParms = FieldStore(WOtParms,@RM,4,0,WMOutRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteRec',WOtParms)
END ;* End of check for PTI location
END ;* End of check for Class 1000 location and EpiPRO box
* Following check added 8/23/2013 by JCH - problems trying to get a 'DELETE' inventory transaction on the WO_MAT record -> passes on to FabTime to close out bogus transactions.
IF @WINDOW NE 'WO_MAT_INV' THEN
IF WOMatRec<WO_MAT_LOT_NO$> = '' OR WOMatRec<WO_MAT_CUST_PART_NO$> = '' THEN
obj_Tables('UnlockRec',OtParms)
RETURN
END
END
InvDTMs = WOMatRec<WO_MAT_INV_DTM$>
LOCATE thisInvDTM IN InvDTMS BY 'AL' USING @VM SETTING Pos ELSE
Pos = -1
END
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_WH$,Pos,0,WHCd)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_LOCATION$,Pos,0,LocCd)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_ACTION$,Pos,0,InvAction)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_DTM$,Pos,0,thisInvDTM)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_USER$,Pos,0,ScanUserID)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TAG$,Pos,0,Tag)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TOOL_ID$,Pos,0,ToolID)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_SCAN_ENTRY$,Pos,0,ScanEntry)
IF InvAction[-3,3] = 'VER' THEN
IF WOMatRec<WO_MAT_WIP_START_DTM$> = '' THEN
WOMatRec<WO_MAT_WIP_START_DTM$> = thisInvDTM
END
END
IF LocCd = 'PTO' THEN
IF WOMatRec<WO_MAT_WIP_STOP_DTM$> = '' THEN
WOMatRec<WO_MAT_WIP_STOP_DTM$> = thisInvDTM
END
END
OtParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
Done = False$
NumAttempts = 0
Loop
NumAttempts += 1
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
WOMatRecVerify = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
LastEntryIndex = DCount(WOMatRecVerify<WO_MAT_INV_WH$>, @VM)
LastEntryAction = WOMatRecVerify<WO_MAT_INV_ACTION$, LastEntryIndex>
LastEntryLocCd = WOMatRecVerify<WO_MAT_INV_LOCATION$, LastEntryIndex>
If LastEntryAction EQ InvAction AND LastEntryLocCd = LocCd then
Done = True$
end
Until ( (Done EQ True$) or (NumAttempts EQ 10) )
Repeat
LogData = ''
LogData<1> = WOMatRecVerify<WO_MAT_INV_DTM$, LastEntryIndex>
LogData<2> = WONo
LogData<3> = CassNo
LogData<4> = WOMatRecVerify<WO_MAT_INV_USER$, LastEntryIndex>
LogData<5> = LastEntryIndex
LogData<6> = WOMatRecVerify<WO_MAT_INV_TAG$, LastEntryIndex>
LogData<7> = WOMatRecVerify<WO_MAT_INV_WH$, LastEntryIndex>
LogData<8> = WOMatRecVerify<WO_MAT_INV_LOCATION$, LastEntryIndex>
LogData<9> = LastEntryAction
LogData<10> = WOMatRecVerify<WO_MAT_INV_TOOL_ID$, LastEntryIndex>
LogData<11> = WOMatRecVerify<WO_MAT_INV_SCAN_ENTRY$, LastEntryIndex>
LogData<12> = NumAttempts
Logging_Services('AppendLog', WOMatObjLog3, LogData, @RM, @FM)
LogData = ''
LogData<1> = thisInvDTM
LogData<2> = WONo
LogData<3> = CassNo
LogData<4> = ScanUserID
LogData<5> = Pos
LogData<6> = Tag
LogData<7> = WHCd
LogData<8> = LocCd
LogData<9> = InvAction
LogData<10> = ToolID
LogData<11> = ScanEntry
Logging_Services('AppendLog', WOMatObjLog2, LogData, @RM, @FM)
IF Get_Status(errCode) THEN
errCode = errCode:'User = ':ScanUserID
Gosub SendErrorNotification
END ELSE
END ;* End of check for Write error
obj_Tables('UnlockRec',OtParms)
CASE 1
ErrorMsg = 'Unknown Log File ':QUOTE(LogFile):' passed to routine. (':Method:')'
END CASE
RETURN
* * * * * * *
InvDelta:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
DTMs = WOMatRec<WO_MAT_INV_DTM$>
IF INDEX(DTMs,@VM,1) THEN
TransCnt = COUNT(DTMs,@VM) + (DTMs NE '')
Result = ''
FOR I = 1 TO TransCnt - 1
Result<1,I> = ICONV((DTMs<1,I+1> - DTMs<1,I>) * 24,'MD1')
NEXT I
END ;* End of check for more than a single date-time
RETURN
* * * * * * *
TimeInFab:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
LOCATE 'PTI' IN WOMatRec<WO_MAT_INV_LOCATION$> USING @VM SETTING IPos THEN
StartDTM = WOMatRec<WO_MAT_INV_DTM$,IPos>
LOCATE 'PTO' IN WOMatRec<WO_MAT_INV_LOCATION$> USING @VM SETTING OPos THEN
Result = ICONV((WOMatRec<WO_MAT_INV_DTM$,OPos> - WOMatRec<WO_MAT_INV_DTM$,IPos>) * 24,'MD1')
END ELSE
CurrDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS'),'DT')
Result = ICONV((CurrDTM - WOMatRec<WO_MAT_INV_DTM$,IPos>) * 24,'MD1')
END
END
RETURN
* * * * * * *
ProcessTime:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
FirstRDS = WOMatRec<WO_MAT_RDS_NO$,1> ;* Start with first or only run
VerSigDTM = XLATE('REACT_RUN',FirstRDS,REACT_RUN_VER_SIG_DTM$,'X')
IF VerSigDTM = '' THEN
RDSRec = XLATE('RDS',FirstRDS,'','X')
PreEpiDt = RDSRec<RDS_PRE_EPI_SIG_DATE$>
PreEpiTm = RDSRec<RDS_PRE_EPI_SIG_TIME$>
IF PreEpiDt NE '' AND PreEpiTm NE '' THEN
VerSigDTM = ICONV(OCONV(PreEpiDt,'D4/'):' ':OCONV(PreEpiTm,'MTS'),'DT')
END
END
IF VerSigDTM = '' THEN
Result = ''
RETURN
END
LOCATE 'PTO' IN WOMatRec<WO_MAT_INV_LOCATION$> USING @VM SETTING OPos THEN
Result = ICONV((WOMatRec<WO_MAT_INV_DTM$,OPos> - VerSigDTM) * 24,'MD1')
END ELSE
CurrDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS'),'DT')
Result = ICONV((CurrDTM - VerSigDTM) * 24,'MD1')
END
RETURN
* * * * * * *
EpiCassInvHistory:
* * * * * * *
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
InvField = Parms[COL2()+1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WONo = '' OR CassNo = '' THEN RETURN ;* Called from dictionary items so no errors returned
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
IF WOMatRec<WO_MAT_INV_WH$> NE '' THEN Result<1> = WOMatRec<WO_MAT_INV_WH$>
IF WOMatRec<WO_MAT_INV_LOCATION$> NE '' THEN Result<2> = WOMatRec<WO_MAT_INV_LOCATION$>
IF WOMatRec<WO_MAT_INV_ACTION$> NE '' THEN Result<3> = WOMatRec<WO_MAT_INV_ACTION$>
IF WOMatRec<WO_MAT_INV_DTM$> NE '' THEN Result<4> = WOMatRec<WO_MAT_INV_DTM$>
IF WOMatRec<WO_MAT_INV_USER$> NE '' THEN Result<5> = WOMatRec<WO_MAT_INV_USER$>
WOSteps = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
BEGIN CASE
CASE InvField = 'INV_WH' ; Result = Result<1>
CASE InvField = 'INV_LOCATION' ; Result = Result<2>
CASE InvField = 'INV_ACTION' ; Result = Result<3>
CASE InvField = 'INV_DTM' ; Result = Result<4>
CASE InvField = 'INV_USER' ; Result = Result<5>
END CASE
RETURN
* * * * * * *
ToggleHold:
* * * * * * *
* This is called from Comm_WM_In, Comm_WM_Out, Comm_WO_Mat and Comm_RDS. IT toggles the hold on the WO_MAT record
WOMatKey = Parms[1,@RM]
HoldEntity = Parms[COL2()+1,@RM] ;* Table Name i.e. RDS, REACT_RUN, WM_IN, WM_OUT or WO_MAT
HoldEntityID = Parms[COL2()+1,@RM] ;* Key value for associated Table Name (null for WO_MAT records)
CtrlEntID = Parms[COL2()+1,@RM] ;* Control checked/unchecked
OriginFlag = Parms[COL2()+1,@RM] ;* OriginFlag, i.e., which form/process called this
OperatorID = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null parameter "WOMatKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms)
IF Get_Status(errCode) THEN RETURN ;* Probably locked -> return
BEGIN CASE
CASE INDEX(CtrlEntID,'SHIP_HOLD',1) ; HoldType = 'SHOLD' ; * Ship Hold
CASE 1 ; HoldType = 'HOLD' ; * Production or Engineering Hold
END CASE
WONo = WOMatKey[1,'*']
IF HoldType = 'SHOLD' THEN
HoldCheck = WOMatRec<WO_MAT_SHIP_HOLD$>
END ELSE
HoldCheck = WOMatRec<WO_MAT_HOLD$>
END
CustInfo = XLATE('WO_MAT',WOMatKey,'CUST_NAME','X')
IF HoldCheck = 1 THEN Transition = 'OFF' ELSE Transition = 'ON'
//9/16/21 DPC - added permissions check
IF Transition EQ 'OFF' then
if MemberOf(@USER4, 'ENG_TECH') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') else
obj_Tables('UnlockRec',otParms)
Errmsg('Current user does not have permission to remove hold.')
return
end
end
HoldData = ''
Begin Case
Case OriginFlag EQ 'P' ;*Packaging form
HoldData<1> = OperatorID
HoldData<2> = 'Packaging scanned data mismatch.'
HoldData<3> = False$
Case OriginFlag EQ 'PTO' ;*PTO/PSVER form
HoldData<1> = OperatorID
HoldData<2> = 'PTO/PSVER scanned data mismatch.'
HoldData<3> = False$
Case OriginFlag EQ 'H' ;*Auto-hold service
HoldData<1> = OperatorID
HoldData<2> = 'Makeup box is older than three years.'
HoldData<3> = False$
Case Otherwise$
// Collect hold data from user
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType)
End Case
IF HoldData = 'Cancel' THEN
obj_Tables('UnlockRec',otParms)
RETURN
END
UserID = HoldData<1>
Reason = HoldData<2>
Extended = HoldData<3>
CurrDate = OCONV(Date(),'D4/')
CurrTime = OCONV(Time(),'MTS')
CurrDTM = ICONV(CurrDate:' ':CurrTime,'DT')
IF Transition = 'ON' THEN
IF HoldType = 'HOLD' THEN
WOMatRec<WO_MAT_HOLD$> = 1
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_START_DTM$,1,0,CurrDTM)
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_START_USER$,1,0,UserID)
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_START_REASON$,1,0,Reason)
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_EXTENDED$,1,0,Extended)
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_STOP_DTM$,1,0,'')
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_STOP_USER$,1,0,'')
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_STOP_REASON$,1,0,'')
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_ENTITY$,1,0,HoldEntity)
WOMatRec = INSERT(WOMatRec,WO_MAT_HOLD_ENTITY_ID$,1,0,HoldEntityID)
***********************************************************
// - djs - 10/29/2019
// Updated material log entry method to be more reliable.
// Material log entries in quick succession were failing to be recorded.
NumTimestamps = Dcount(WOMatRec<WO_MAT_INV_WH$>, @VM)
NewEntryPos = NumTimestamps + 1
CurrWH = WOMatRec<WO_MAT_INV_WH$, NewEntryPos - 1> ;* WH before hold
CurrLoc = WOMatRec<WO_MAT_INV_LOCATION$, NewEntryPos - 1> ;* LOC before hold
CurrTool = WOMatRec<WO_MAT_INV_TOOL_ID$, NewEntryPos - 1> ;* ToolID before hold
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_WH$, NewEntryPos, 0, CurrWH)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_LOCATION$, NewEntryPos, 0, CurrLoc)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_ACTION$, NewEntryPos, 0, 'HOLD_ON')
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_DTM$, NewEntryPos, 0, CurrDTM)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_USER$, NewEntryPos, 0, UserID)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TAG$, NewEntryPos, 0, '')
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TOOL_ID$, NewEntryPos, 0, CurrTool)
END ELSE
WOMatRec<WO_MAT_SHIP_HOLD$> = 1
WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_START_DTM$,1,0,CurrDTM)
WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_START_USER$,1,0,UserID)
WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_START_REASON$,1,0,Reason)
WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_EXTENDED$,1,0,Extended)
WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_STOP_DTM$,1,0,'')
WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_STOP_USER$,1,0,'')
WOMatRec = INSERT(WOMatRec,WO_MAT_SHIP_HOLD_STOP_REASON$,1,0,'')
END
IF HoldEntity = 'WM_OUT' THEN
WOMatRec<WO_MAT_WMO_CURR_STATUS$> = 'HOLD' ;* JCH 7/14/2009
END
IF HoldEntity = 'WM_IN' THEN
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = 'HOLD' ;* JCH 7/14/2009
END
END
IF Transition = 'OFF' THEN
IF HoldType = 'HOLD' THEN
WOMatRec<WO_MAT_HOLD$> = 0
WOMatRec<WO_MAT_HOLD_STOP_DTM$,1> = CurrDTM
WOMatRec<WO_MAT_HOLD_STOP_USER$,1> = UserID
WOMatRec<WO_MAT_HOLD_STOP_REASON$,1> = Reason
WOMatRec<WO_MAT_HOLD_EXTENDED$,1> = 0
***********************************************************
LOCATE CurrDTM IN WOMatRec<WO_MAT_INV_DTM$> BY 'AR' USING @VM SETTING Pos ELSE
IF Pos > 1 THEN
CurrWH = WOMatRec<WO_MAT_INV_WH$,Pos-1> ;* WH before hold
CurrLoc = WOMatRec<WO_MAT_INV_LOCATION$,Pos-1> ;* LOC before hold
CurrTool = WOMatRec<WO_MAT_INV_TOOL_ID$,Pos-1> ;* ToolID before hold
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_WH$,Pos,0,CurrWH)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_LOCATION$,Pos,0,CurrLoc)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_ACTION$,Pos,0,'HOLD_OFF')
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_DTM$,Pos,0,CurrDTM)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_USER$,Pos,0,UserID)
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TAG$,Pos,0,'')
WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TOOL_ID$,Pos,0,CurrTool)
END ;* End of check for Pos > 1 Rcvd is always the first transaction
END ;* End of DTM locate
**************************************************************
END ELSE
WOMatRec<WO_MAT_SHIP_HOLD$> = 0
WOMatRec<WO_MAT_SHIP_HOLD_STOP_DTM$,1> = CurrDTM
WOMatRec<WO_MAT_SHIP_HOLD_STOP_USER$,1> = UserID
WOMatRec<WO_MAT_SHIP_HOLD_STOP_REASON$,1> = Reason
WOMatRec<WO_MAT_SHIP_HOLD_EXTENDED$,1> = 0
END
IF HoldEntity = 'WM_OUT' THEN
WOMatRec<WO_MAT_WMO_CURR_STATUS$> = obj_WM_Out('CurrStatus',HoldEntityID:@RM:@RM:WOMatRec)
END
IF HoldEntity = 'WM_IN' THEN
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = obj_WM_In('CurrStatus',HoldEntityID:@RM:@RM:WOMatRec)
END
END
BEGIN CASE
CASE HoldEntity = 'RDS'
IF Transition = 'ON' THEN
Subject = 'Material Placed on Hold ':HoldEntityID
Message = 'Material Placed on Hold'
END ELSE
Subject = 'Material Taken off Hold ':HoldEntityID
Message = 'Material Taken off Hold'
END
AttachWindow = 'RDS_PRE_EPI'
AttachKey = HoldEntityID
CASE HoldEntity = 'WO_MAT'
IF Transition = 'ON' THEN
IF HoldType = 'HOLD' THEN
Subject = 'Material Placed on Hold ':HoldEntityID
Message = 'Material Placed on Hold'
END ELSE
Subject = 'Material Placed on Ship Hold ':HoldEntityID
Message = 'Material Placed on Ship Hold'
END
END ELSE
IF HoldType = 'HOLD' THEN
Subject = 'Material Taken off Hold ':HoldEntityID
Message = 'Material Taken off Hold'
END ELSE
Subject = 'Material Taken off Ship Hold ':HoldEntityID
Message = 'Material Taken off Ship Hold'
END
END
AttachWindow = HoldEntity
AttachKey = HoldEntityID
CASE HoldEntity = 'REACT_RUN'
IF Transition = 'ON' THEN
Subject = 'Material Placed on Hold ':HoldEntityID
Message = 'Material Placed on Hold'
END ELSE
Subject = 'Material Taken off Hold ':HoldEntityID
Message = 'Material Taken off Hold'
END
AttachWindow = 'REACT_RUN'
AttachKey = HoldEntityID
CASE HoldEntity = 'WM_IN'
IF Transition = 'ON' THEN
Subject = 'Material Placed on Hold ':HoldEntityID
Message = 'Material Placed on Hold'
END ELSE
Subject = 'Material Taken off Hold ':HoldEntityID
Message = 'Material Taken off Hold'
END
AttachWindow = HoldEntity
AttachKey = HoldEntityID
CASE HoldEntity = 'WM_OUT'
WMOKey = HoldEntity[2,99]
IF Transition = 'ON' THEN
IF HoldType = 'HOLD' THEN
Subject = 'Material Placed on Hold ':HoldEntityID
Message = 'Material Placed on Hold'
END ELSE
Subject = 'Material Placed on Ship Hold ':HoldEntityID
Message = 'Material Placed on Ship Hold'
END
END ELSE
IF HoldType = 'HOLD' THEN
Subject = 'Material Taken off Hold ':HoldEntityID
Message = 'Material Taken off Hold'
END ELSE
Subject = 'Material Taken off Ship Hold ':HoldEntityID
Message = 'Material Taken off Ship Hold'
END
END
AttachWindow = HoldEntity
AttachKey = HoldEntityID
END CASE
Message := ' - ':Reason
IF HoldType = 'SHOLD' THEN
Recipients = XLATE('NOTIFICATION','SHIP_HOLD',NOTIFICATION_USER_ID$,'X')
SentFrom = @USER4
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
END
Recipients = XLATE('NOTIFICATION','RDS_HOLD',NOTIFICATION_USER_ID$,'X')
SentFrom = @USER4
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
otParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteRec',otParms)
RETURN
* * * * * * * *
EditHoldReason:
* * * * * * * *
WOMatKey = Parms[1,@RM]
ColName = Parms[COL2()+1,@RM]
ColValNo = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null parameter "WOMatKey" passed to routine. (':Method:')'
IF ColName = '' THEN ErrorMsg = 'Null parameter "ColName" passed to routine. (':Method:')'
IF ColValNo = '' THEN ErrorMsg = 'Null parameter "ColValNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms)
IF Get_Status(errCode) THEN RETURN
IF INDEX(ColName,'START',1) THEN
HoldStartReason = WOMatRec<WO_MAT_HOLD_START_REASON$,ColValNo>
UpdatedText = Dialog_Box('DIALOG_TEXT',@WINDOW,'Hold Start Reason':@FM:HoldStartReason)
IF UpdatedText NE 'Cancel' THEN
WOMatRec<WO_MAT_HOLD_START_REASON$,ColValNo> = UpdatedText
END
END
IF INDEX(ColName,'STOP',1) THEN
HoldStopReason = WOMatRec<WO_MAT_HOLD_STOP_REASON$,ColValNo>
UpdatedText = Dialog_Box('DIALOG_TEXT',@WINDOW,'Hold Stop Reason':@FM:HoldStopReason)
IF UpdatedText NE 'Cancel' THEN
WOMatRec<WO_MAT_HOLD_STOP_REASON$,ColValNo> = UpdatedText
END
END
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
RETURN
* * * * * * *
ChangeFlag:
* * * * * * *
WOMatKey = Parms[1,@RM]
FieldNo = Parms[COL2()+1,@RM]
Value = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null parameter "WOMatKey" passed to routine. (':Method:')'
IF FieldNo = '' THEN ErrorMsg = 'Null parameter "Property" passed to routine. (':Method:')'
IF Value = '' OR Value = '0' OR Value = '1' THEN
* Good values passed
END ELSE
ErrorMsg = 'Invalid Flag ':QUOTE(Value):' passed to routine. (':Method:')'
END
IF ErrorMsg NE '' THEN RETURN
InvTransFlag = ''
WMTableParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',WMTableParms)
BEGIN CASE
CASE FieldNo = 23 ; FieldName = "WO_MAT_MAKEUP_BOX$"
CASE FieldNo = 52 ; FieldName = "WO_MAT_EPO_MAKEUP_BOX$"
CASE 1 ; FieldName = 'Field No: ':QUOTE(FieldNo)
END CASE
IF Get_Status(errCode) THEN
RETURN ;* Probably locked -> return
END
IF FieldNo = WO_MAT_CANCELLED$ THEN
RDSNos = WOMatRec<WO_MAT_RDS_NO$>
IF RDSNos NE '' THEN
ReactRunTableVar = obj_Tables('LockSet','REACT_RUN':@RM:RDSNos)
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',WMTableParms) ;* Unlock WO_LOG record
RETURN
END
RunCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
FOR I = 1 TO RunCnt
RDSNo = RDSNos<1,I>
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
ReactRunRec<REACT_RUN_CANCELLED$> = Value
RRParms = 'REACT_RUN':@RM:RDSNo:@RM:ReactRunTableVar:@RM:ReactRunRec
obj_Tables('WriteRec',RRParms) ;* Writes and unlocks React Run Record
NEXT I
END
IF Value = 1 AND WOMatRec<WO_MAT_WIP_STOP_DTM$> = '' THEN
WOMatRec<WO_MAT_WIP_STOP_DTM$> = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ,'DT') ;* Added 11/8/2012 JCH *
END
END
IF FieldNo = WO_MAT_VOID$ THEN
RDSNos = WOMatRec<WO_MAT_RDS_NO$>
IF RDSNos NE '' THEN
ReactRunTableVar = obj_Tables('LockSet','REACT_RUN':@RM:RDSNos)
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',WMTableParms) ;* Unlock WO_LOG record
RETURN
END
RunCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
FOR I = 1 TO RunCnt
RDSNo = RDSNos<1,I>
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
ReactRunRec<REACT_RUN_VOID$> = Value
RRParms = 'REACT_RUN':@RM:RDSNo:@RM:ReactRunTableVar:@RM:ReactRunRec
obj_Tables('WriteRec',RRParms) ;* Writes and unlocks React Run Record
NEXT I
IF Value = 1 AND WOMatRec<WO_MAT_WIP_STOP_DTM$> = '' THEN
WOMatRec<WO_MAT_WIP_STOP_DTM$> = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ,'DT') ;* Added 11/8/2012 JCH *
END
InvTransFlag = Value ;* Added 1/14/2015 DKK & JCH
END
END
IF FieldNo = WO_MAT_EPO_MAKEUP_BOX$ THEN
* Superfluous when called from COMM_WM_OUT
IF @WINDOW = 'WO_MAT' THEN
WMOutKey = WOMatRec<WO_MAT_WMO_KEY$>
IF WMOutKey NE '' THEN
WMOParms = 'WM_OUT':@RM:WMOutKey
WMORec = Database_Services('ReadDataRow', 'WM_OUT', WMOutKey)
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',WMOParms) ;* Unlock WM_Out record
RETURN
END
WMORec<WM_OUT_MAKEUP_BOX$> = Value
Database_Services('WriteDataRow', 'WM_OUT', WMOutKey, WMORec, True$, False$, True$)
END
END
END
WOMatRec<FieldNo> = Value ;* Set Flag field here
WMTableParms = FieldStore(WMTableParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteRec',WMTableParms)
IF Get_Status(errCode) THEN
* Logging
If FieldNo EQ WO_MAT_MAKEUP_BOX$ then
IF Get_Status(errCode) THEN
ErrorMsg = 'Makeup flag cannot be set until Unload is signed.'
END
end
LogRec = 'obj_WO_Mat':TAB$:'Change Flag: Error':TAB$:WOMatKey:TAB$:FieldName:TAB$:Value:TAB$:'Unable to WRITE WO_MAT record. ':errCode
LogRec := TAB$:@STATION:TAB$:@USER4:TAB$:OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
SWAP @RM WITH TAB$ IN LogRec
OPEN 'JCH_LOG' TO JCHLogFile THEN
LogKey = NextKey('JCH_LOG')
WRITE LogRec ON JCHLogFile,LogKey ELSE NULL
END
END ELSE
* Logging
LogRec = 'obj_WO_Mat':TAB$:'Change Flag':TAB$:WOMatKey:TAB$:FieldName:TAB$:Value:TAB$:'WO_MAT updated OK'
LogRec := TAB$:@STATION:TAB$:@USER4:TAB$:OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
SWAP @RM WITH TAB$ IN LogRec
OPEN 'JCH_LOG' TO JCHLogFile THEN
LogKey = NextKey('JCH_LOG')
WRITE LogRec ON JCHLogFile,LogKey ELSE NULL
END
END
* * * * Added 1/14/2015 * * * *
IF InvTransFlag = 1 THEN
WONo = WOMatKey[1,'*']
CassNo = WOMatKey[COL2()+1,'*']
WhCd = 'CR'
LocCd = 'QA'
Action = 'DELETE'
InvDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
Tag = ''
ScanToolID = ''
UserID = @USER4
Set_Status(0)
aiParms = 'WO_MAT':@RM:WONo:@RM:CassNo:@RM:WhCd:'*':LocCd:@RM:Action:@RM:InvDTM:@RM:UserID:@RM:Tag:@RM:ScanToolID
obj_WO_Mat('AddInvTrans',aiParms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
END
RETURN
* * * * * * *
AddNCR:
* * * * * * *
RETURN
* * * * * * *
RemNCR:
* * * * * * *
* Called by COMM_NCR('Delete') as a pre-event to clear NCR information from WO_MAT Record
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
NCRNo = Parms[COL2()+1,@RM]
SlotNos = Parms[COL2()+1,@RM]
RejWaferIDs = Parms[COL2()+1,@RM]
PrevNCRNos = Parms[COL2()+1,@RM]
RemNCRHeaders = 'Logging DTM':@FM:'WONo':@FM:'CassNo':@FM:'NCRNo':@FM:'SlotNos':@FM:'RejWaferIDs':@FM:'PrevNCRNos':@FM:'Notes'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = WONo
LogData<3> = CassNo
LogData<4> = NCRNo
LogData<5> = SlotNos
LogData<6> = RejWaferIDs
LogData<7> = PrevNCRNos
LogData<8> = 'Begin obj_WO_MAT("RemNCR")'
LogData<9> = @User4
Logging_Services('AppendLog', RemNCRObjLog, LogData, @RM, @FM)
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null parameter "CassNo" passed to routine. (':Method:')'
IF NCRNo = '' THEN ErrorMsg = 'Null parameter "NCRNo" passed to routine. (':Method:')'
IF SlotNos = '' THEN ErrorMsg = 'Null parameter "SlotNos" passed to routine. (':Method:')'
IF RejWaferIDs = '' THEN ErrorMsg = 'Null parameter "RejWaferNos" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WOMatKey = WONo:'*':CassNo
otParms = 'WO_MAT':@RM:WOMatKey
* WOMatRec = obj_Tables('ReadRec',otParms)
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
IF Get_Status(errCode) THEN RETURN
SlotCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
FOR I = 1 TO SlotCnt
SlotNo = SlotNos<1,I>
DefWaferID = WONo:'.':CassNo:'.':SlotNo
RejWfrID = RejWaferIDs<1,I>
WOMatRec<WO_MAT_SLOT_NCR$,SlotNo> = PrevNCRNos<1,I>
IF RejWfrID NE DefWaferID THEN
WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,SlotNo> = RejWfrID
EventWfrID = RejWfrID
End Else
EventWfrID = DefWaferID
END
* * * * Added 3/24/2016 JCH - wafer history * * * *
Convert '.' To '*' In EventWfrID
Parms = EventWfrID:@RM ;* WfrID
Parms := 'NCR':@RM ;* Event
Parms := NCRNo ;* EventID
obj_WO_Wfr('RemEvent',Parms)
NEXT I
otParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
LogData<8> = 'End obj_WO_MAT("RemNCR"'
Logging_Services('AppendLog', RemNCRObjLog, LogData, @RM, @FM)
RETURN
* * * * * * *
SignNCR:
* * * * * * *
* Used to Sign NCR line item as complete.
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
NCRNo = Parms[COL2()+1,@RM]
SignBy = Parms[COL2()+1,@RM]
SignByDTM = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null parameter "CassNo" passed to routine. (':Method:')'
IF NCRNo = '' THEN ErrorMsg = 'Null parameter "NCRNo" passed to routine. (':Method:')'
IF SignBy = '' THEN ErrorMsg = 'Null parameter "SignBy" passed to routine. (':Method:')'
IF SignByDTM = '' THEN ErrorMsg = 'Null parameter "SignByDTM" passed to routine. (':Method:')'
LogData = ''
LogData<1> = WONo
LogData<2> = CassNo
LogData<3> = NCRNo
LogData<4> = SignBy
LogData<5> = SignByDTM
LogData<6> = 'Beginning SignNCR subroutine.'
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
IF ErrorMsg EQ '' then
WOMatKey = WONo:'*':CassNo
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
If Error_Services('NoError') then
LOCATE NCRNo IN WOMatRec<WO_MAT_NCR_KEYS$> USING @VM SETTING Pos THEN
CurrSig = Trim(WOMatRec<WO_MAT_NCR_FINAL_SIG$,Pos>)
IF CurrSig = '' THEN
WOMatRec<WO_MAT_NCR_FINAL_SIG$,Pos> = SignBy
WOMatRec<WO_MAT_NCR_FINAL_SIG_DTM$,Pos> = SignByDTM
LogData<6> = 'NCRNo located and signature set within WOMatRec.'
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
END ELSE
// NCR_KEYS relational index may not have added the NCR key yet.
// Just append the signature and signature DTM to the end of the list.
WOMatRec<WO_MAT_NCR_FINAL_SIG$,-1> = SignBy
WOMatRec<WO_MAT_NCR_FINAL_SIG_DTM$,-1> = SignByDTM
LogData<6> = 'NCR final signature already in place. Current final signature value = "':CurrSig:'"'
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
END
END ELSE
LogData<6> = 'SignNCR routine failed. Failed to locate NCRNo in WOMatRec.'
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
END
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
If Error_Services('NoError') then
LogData<6> = 'WO_MAT record successfully written.'
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
end else
LogData<6> = 'WO_MAT record failed to write.'
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
end
end else
LogData<6> = 'SignNCR routine failed. Error message: ':Error_Services('GetMessage')
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
end
end else
LogData<6> = 'SignNCR routine failed. Error message: ':ErrorMsg
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
end
LogData<6> = 'Ending SignNCR subroutine.'
Logging_Services('AppendLog', SignNCRObjLog, LogData, @RM, @FM)
RETURN
* * * * * * *
AddMakeupWafers:
* * * * * * *
* Places makeup wafers into a production cassette
WOMatKey = Parms[1,@RM]
EmptySlots = Parms[COL2()+1,@RM]
MakeupBox = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(WOMatKey)) THEN ErrorMsg = 'Unassigned Parm "WOMatKey" passed to routine. (':Method:')'
IF NOT(ASSIGNED(EmptySlots)) THEN ErrorMsg = 'Unassigned Parm "EmptySlots" passed to routine. (':Method:')'
IF NOT(ASSIGNED(MakeupBox)) THEN ErrorMsg = 'Unassigned Parm "MakeupBox" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF EmptySlots = '' THEN ErrorMsg = 'Null Parm "EmptySlots" passed to routine. (':Method:')'
IF MakeupBox = '' THEN ErrorMsg = 'Null Parm "MakeupBox" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock
MakeupWaferData = obj_WO_Mat('RemMakeupWafers',MakeUpBox:@RM:EmptySlots:@RM:WOMatKey) ;* Extracts and returns slot data from Makeup Box
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',otParms)
RETURN
END
IF MakeupWaferData = '' THEN
obj_Tables('UnlockRec',otParms)
RETURN
END
MakeupWONo = MakeupBox[1,'*']
MakeupCassNo = MakeupBox[COL2()+1,'*']
ReplacedBy = @USER4
MWDCnt = COUNT(MakeupWaferData,@FM) + (MakeupWaferData NE '')
FOR I = 1 TO MWDCnt
SlotNo = MakeupWaferData<I,1>
WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,SlotNo> = MakeupWaferData<I,2>
WOMatRec<WO_MAT_SLOT_MOVED_FROM$,SlotNo> = MakeupWaferData<I,3> ;* Added 8/12/2014 JCH Added Moved from slot ID
WOMatRec<WO_MAT_SLOT_REP_BY$,SlotNo> = ReplacedBy ;* Added 10/6/2010 JCH *
// Timestamp MU Wafer KLUSA project
WOMatRec<WO_MAT_MU_WAFER_ADDED_DTM$, SlotNo> = MakeupWaferData<I,4>
NEXT I
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
RETURN
* * * * * * *
SubMakeupWafers:
* * * * * * *
* Subtracts makeup wafers from a production box for return to the makeup box
WOMatKey = Parms[1,@RM]
MadeupSlots = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(WOMatKey)) THEN ErrorMsg = 'Unassigned Parm "WOMatKey" passed to routine. (':Method:')'
IF NOT(ASSIGNED(MadeupSlots)) THEN ErrorMsg = 'Unassigned Parm "MadeupSlots" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF MadeupSlots = '' THEN ErrorMsg = 'Null Parm "MadeupSlots" passed to routine. (':Method:')'
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock
SlotID = WOMatKey
CONVERT '*' TO '.' IN SlotID
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
WfrIDs = '' ;* JCH 9/7/23016
NewSlotIDs = '' ;* JCH 9/7/23016
CurrSlotIDs = '' ;* JCH 9/7/23016
RepWaferIDs = ''
MadeupCnt = COUNT(MadeupSlots,@VM) + (MadeupSlots NE '')
FOR I = 1 TO MadeupCnt
MadeupSlot = MadeupSlots<1,I>
RepWaferIDs<I,1> = SlotID:'.':MadeupSlot
RepWaferIDs<I,2> = WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,MadeupSlot>
// Timestamp MU Wafer Project
// Makeup wafer is being 'put back' into makeup cassette.
// Remove most recent 'added' DTM from WOMatRec.
AddedDTMS = WOMatRec<WO_MAT_MU_WAFER_ADDED_DTM$, MadeupSlot>
AddedDTMS = Delete(AddedDTMS, 1, 1, 1)
WOMatRec<WO_MAT_MU_WAFER_ADDED_DTM$, MadeupSlot> = AddedDTMS
* * * * Added 5/12/2016 JCH - wafer history * * * *
WfrID = WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,MadeupSlot>
NewSlotID = WOMatRec<WO_MAT_SLOT_MOVED_FROM$,MadeupSlot>
IF NewSlotID = '' THEN
NewSlotID = WfrID
END
CurrSlotID = WOMatKey:'*':MadeupSlot
CONVERT '.' TO '*' IN WfrID
CONVERT '.' TO '*' IN NewSlotID
WfrIDs<1,-1> = WfrID ;* JCH 9/7/23016
NewSlotIDs<1,-1> = NewSlotID ;* JCH 9/7/23016
CurrSlotIDs<1,-1> = CurrSlotID ;* JCH 9/7/23016
Parms = WfrID:@RM ;* WfrID
Parms := CurrDTM:@RM ;* EventDtm
Parms := @USER4:@RM ;* EventBy
Parms := 'RMKUP':@RM ;* Event
Parms := NewSlotID:@RM ;* NewSlotID
Parms := '':@RM ;* RunLoc
Parms := '':@RM ;* NCRNo
Parms := '':@RM ;* TWUse
Parms := CurrSlotID:@RM ;* CurrSlotID
Parms := '':@RM ;* NewToolID
Parms := '':@RM ;* CurrToolID
Parms := '':@RM ;* NewInvLoc
Parms := '':@RM ;* CurrInvLoc
Parms := 'O' ;* Wfr Side
obj_WO_Wfr('AddEvent',Parms)
* * * * End of wafer history update * * * *
WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,MadeupSlot> = ''
WOMatRec<WO_MAT_SLOT_MOVED_FROM$,MadeupSlot> = '' ;* Added 08/12/2014 JCH Moved From Slot IDs
WOMatRec<WO_MAT_SLOT_REP_BY$,MadeupSlot> = '' ;* Added 10/06/2010 JCH *
WOMatRec<WO_MAT_MU_WAFER_THK_RESULT$,MadeupSlot> = '' ;* Added 03/14/2017 FDR *
NEXT I
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
Result = RepWaferIDs
RETURN
* * * * * * *
RemMakeupWafers:
* * * * * * *
* Removes wafers from a makeup box for use as makeups in a production box
MUBoxKey = Parms[1,@RM]
EmptySlots = Parms[COL2()+1,@RM]
TargetBoxKey = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(MUBoxKey)) THEN ErrorMsg = 'Unassigned Parm "MUBoxKey" passed to routine. (':Method:')'
IF NOT(ASSIGNED(EmptySlots)) THEN ErrorMsg = 'Unassigned Parm "EmptySlots" passed to routine. (':Method:')'
IF NOT(ASSIGNED(TargetBoxKey)) THEN ErrorMsg = 'Unassigned Parm "TargetBoxKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF MUBoxKey = '' THEN ErrorMsg = 'Null Parm "MUBoxKey" passed to routine. (':Method:')'
IF EmptySlots = '' THEN ErrorMsg = 'Null Parm "EmptySlot" passed to routine. (':Method:')'
IF TargetBoxKey = '' THEN ErrorMsg = 'Null Parm "TargetBoxKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:MUBoxKey
MU_WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock
CONVERT '*' TO '.' IN TargetBoxKey
SlotWaferIDs = obj_WO_Mat('SlotWaferIDs',MUBoxKey:@RM:MU_WOMatRec) ;* MV'd list of available wafers in MU Box (All slots)
AvailWafers = ''
AvailWaferCnt = 0
SWIDCnt = COUNT(SlotWaferIDs,@VM) + (SlotWaferIDs NE '')
FOR I = 1 TO SWIDCnt
IF SlotWaferIDs<1,I> NE '' THEN
AvailWaferCnt += 1
AvailWafers = INSERT(AvailWafers,AvailWaferCnt,1,0,I)
AvailWafers = INSERT(AvailWafers,AvailWaferCnt,2,0,SlotWaferIDs<1,I>)
MovedFromCode = MUBoxKey:'.':I ;* 8/12/2014 JCH Add Source slot ID to Return data
CONVERT '*' TO '.' IN MovedFromCode ;* 8/12/2014 JCH
AvailWafers = INSERT(AvailWafers,AvailWaferCnt,3,0,MovedFromCode) ;* 8/12/2014 JCH
END
NEXT I
EmptySlotCnt = COUNT(EmptySlots,@VM) + (EmptySlots NE '')
IF EmptySlotCnt > AvailWaferCnt THEN
FillCnt = AvailWaferCnt
END ELSE
FillCnt = EmptySlotCnt
END
IF FillCnt > 0 AND MU_WOMatRec<WO_MAT_MAKEUP_BOX$> NE 1 THEN
MU_WOMatRec<WO_MAT_MAKEUP_BOX$> = 1 ;* Flag Box as a makeup box
End
CurrDate = OCONV(Date(),'D4/')
CurrTime = OCONV(Time(),'MTHS')
CurrDTM = CurrDate:' ':CurrTime
WfrIDs = '' ;* JCH 9/7/2016
NewSlotIDs = '' ;* JCH 9/7/2016
CurrSlotIDs = '' ;* JCH 9/7/2016
FOR I = 1 TO FillCnt
AvailSlotNo = AvailWafers<I,1>
MU_WOMatRec<WO_MAT_SLOT_MOVED_TO$,AvailSlotNo> = TargetBoxKey:'.':EmptySlots<1,I>
Result<I,1> = EmptySlots<1,I>:@VM:AvailWafers<I,2>:@VM:AvailWafers<I,3> ;* 8/12/2014 JCH
// Timestamp MU Wafer Project
// Get Makeup wafer added DTM history. Insert current DTM into first @SVM of the result record.
// Only the first (newest) DTM is displayed on the WO_MAT_WFR form.
DateTime = Datetime() ; // Date() : '.' : Time()
AddedDTMS = MU_WOMatRec<WO_MAT_MU_WAFER_ADDED_DTM$, AvailSlotNo>
Result<I,4> = Insert(AddedDTMS, 0, 0, 1, DateTime)
// Get Makeup wafer removed DTM history. Insert current DTM into first @SVM of the makeup wafer record.
// Only the first (newest) DTM is displayed on the WO_MAT_WFR form.
RemovedDTMS = MU_WOMatRec<WO_MAT_MU_WAFER_REMOVED_DTM$, AvailSlotNo>
MU_WOMatRec<WO_MAT_MU_WAFER_REMOVED_DTM$, AvailSlotNo> = Insert(RemovedDTMS, 0, 0, 1, DateTime)
* * * * Added 3/28/2016 JCH - wafer history * * * *
WfrID = AvailWafers<I,2>
NewSlotID = TargetBoxKey:'.':EmptySlots<1,I>
CurrSlotID = AvailWafers<I,3>
Convert '.' To '*' In WfrID
Convert '.' To '*' In NewSlotID
Convert '.' To '*' In CurrSlotID
WfrIDs<1,-1> = WfrID ;* JCH 9/7/2016
NewSlotIDs<1,-1> = NewSlotID ;* JCH 9/7/2016
CurrSlotIDs<1,-1> = CurrSlotID ;* JCH 9/7/2016
Parms = WfrID:@RM ;* WfrID
Parms := CurrDTM:@RM ;* EventDtm
Parms := @USER4:@RM ;* EventBy
Parms := 'MKUP':@RM ;* Event
Parms := NewSlotID:@RM ;* NewSlotID
Parms := '':@RM ;* RunLoc
Parms := '':@RM ;* NCRNo
Parms := '':@RM ;* TWUse
Parms := CurrSlotID :@RM ;* CurrSlotID
Parms := '':@RM ;* NewToolID
Parms := '':@RM ;* CurrToolID
Parms := '':@RM ;* NewInvLoc
Parms := '':@RM ;* CurrInvLoc
Parms := 'O' ;* Wfr Side
obj_WO_Wfr('AddEvent',Parms)
* * * * End of wafer history update * * * *
NEXT I
otParms = FIELDSTORE(otParms,@RM,4,0,MU_WOMatRec)
obj_Tables('WriteRec',otParms)
* Send 'RTU' WO_Mat_Log Entry to update qty in FabTime
SigAction = 'RTU'
WHCd = 'CR'
LocCd = 'MU'
WONo = MUBoxKey[1,'*']
CassNo = MUBoxKey[COL2()+1,'*']
UserID = @USER4
Tag = ''
ToolID = ''
WOMLParms = 'WO_MAT':@RM
WOMLParms := CurrDTM:@RM
WOMLParms := SigAction:@RM
WOMLParms := WhCd:@RM
WOMLParms := LocCd:@RM
WOMLParms := WONo:@RM
WOMLParms := CassNo:@RM
WOMLParms := UserID:@RM
WOMLParms := Tag:@RM
WOMLParms := ToolID
obj_WO_Mat_Log('Create',WOMLParms) ;* Stage PSTC log entry
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
RETURN
* * * * * * *
RepMakeupWafers:
* * * * * * *
* Replaces makeup wafers into a makeup box. Used when returning makeups from a production box.
WOMatKey = Parms[1,@RM]
RepWaferIDs = Parms[COL2()+1,@RM] ;* Data structure for wafers subtracted from production box
IF NOT(ASSIGNED(WOMatKey)) THEN ErrorMsg = 'Unassigned Parm "WOMatKey" passed to routine. (':Method:')'
IF NOT(ASSIGNED(RepWaferIDs)) THEN ErrorMsg = 'Unassigned Parm "RepWaferIDs" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF RepWaferIDs = '' THEN ErrorMsg = 'Null Parm "RepWaferIDs" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WONo = WOMatKey[1,'*'] ;* Added 12/20/2010 JCH * SAP project
WipProdOrdNo = XLATE('WO_LOG',WONo,WO_LOG_PROD_ORD_NO$,'X') ;* Added 12/20/2010 JCH * SAP project
IF WIPProdOrdNo = '' THEN WIPProdOrdNo = 'M':FMT(WONo, "R(0)#6"):'.1' ;* Added 12/20/2010 JCH * SAP project
RepWfrCnt = COUNT(RepWaferIDs,@FM) + (RepWaferIDs NE '')
FOR I = 1 TO RepWfrCnt
MovedToSlot = RepWaferIDs<I,1>
WaferID = RepWaferIDs<I,2>
MU_BoxKey = FIELD(WaferID,'.',1,2)
CONVERT '.' TO '*' IN MU_BoxKey
MUWONo = MU_BoxKey[1,'*'] ;* Added 12/20/2010 JCH * SAP project
MUProdOrdNo = XLATE('WO_LOG',MUWONo,WO_LOG_PROD_ORD_NO$,'X') ;* Added 12/20/2010 JCH * SAP project
IF MUProdOrdNo = '' THEN MUProdOrdNo = 'M':FMT(MUWONo, "R(0)#6"):'.1' ;* Added 12/20/2010 JCH * SAP project
otParms = 'WO_MAT':@RM:MU_BoxKey
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) ELSE
LOCATE MovedToSlot IN WOMatRec<WO_MAT_SLOT_MOVED_TO$> USING @VM SETTING Pos THEN
WOMatRec<WO_MAT_SLOT_MOVED_TO$,Pos> = ''
// Timestamp MU Wafer Project
// Remove the most recent 'removed' DTM from WOMatRec.
RemovedDTMS = WOMatRec<WO_MAT_MU_WAFER_REMOVED_DTM$, Pos>
RemovedDTMS = Delete(RemovedDTMS, 1, 1, 1)
WOMatRec<WO_MAT_MU_WAFER_REMOVED_DTM$, Pos> = RemovedDTMS
TranQty = '-1' ;* Material being moved from WIP back to makeup
*obj_SAP('AddTransaction','MU_WFR':@RM:WIPProdOrdNo:@RM:MUProdOrdNo:@RM:TranQty) ;* End of SAP project new code
END
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
END
NEXT I
RETURN
* * * * * * *
ChangeCassProps:
* * * * * * *
WOMatKeys = Parms[1,@RM]
HotLots = Parms[COL2()+1,@RM]
MUBoxes = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(WOMatKeys)) THEN ErrorMsg = 'Unassigned Parm "WOMatKEys" passed to routine. (':Method:')'
IF NOT(ASSIGNED(HotLots)) THEN HotLots = ''
IF NOT(ASSIGNED(MUBoxes)) THEN MUBoxes = ''
IF ErrorMsg NE '' THEN RETURN
IF WOMatKeys = '' THEN RETURN
Set_Status(0)
WMParms = 'WO_MAT'
LockedWOMatKeys = ''
WOMatKeyCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
FOR I = 1 TO WOMatKeyCnt
WOMatKey = WOMatKeys<1,I>
WMParms = FieldStore(WMParms, @RM, 2, 1, WOMatKey)
obj_Tables('LockRec',WMParms)
IF Get_Status(errCode) THEN
LockedWOMatKeyCnt = COUNT(LockedWOMatKeys,@VM) + (LockedWOMatKeys NE '')
FOR N = 1 TO LockedWOMatKeyCnt
WMParms = FieldStore(WMParms, @RM, 2, 1, LockedWOMatKeys<1,N>)
obj_Tables('UnlockRec',WMParms) ;* Unlock everything locked up to here
NEXT N
ErrorMsg = 'Unable to lock WO_MAT ':QUOTE(WOMatKey):' for update.'
RETURN
END ELSE
LockedWOMatKeys<1,I> = WOMatKey
END
NEXT I
HotLots = ICONV(HotLots,'B')
MUBoxes = ICONV(MUBoxes,'B')
WOMatTableVar = FIELD(WMParms,@RM,3)
LockedWOMatKeyCnt = COUNT(LockedWOMatKeys,@VM) + (LockedWOMatKeys NE '')
FOR I = 1 TO LockedWOMatKeyCnt
LockedWOMatKey = LockedWOMatKeys<1,I>
READ WOMatRec FROM WOMatTableVar,LockedWOMatKey THEN
HotLot = HotLots<1,I>
MUBox = MUBoxes<1,I>
IF HotLot NE WOMatRec<WO_MAT_HOT_LOT$> THEN WOMatRec<WO_MAT_HOT_LOT$> = HotLot
IF MUBox NE WOMatRec<WO_MAT_MAKEUP_BOX$> THEN WOMatRec<WO_MAT_MAKEUP_BOX$> = MUBox
WMParms = FieldStore(WMParms, @RM, 2, 1, LockedWOMatKey)
WMParms = FieldStore(WMParms, @RM, 4, 1, WOMatRec)
obj_Tables('WriteRec',WMParms) ;* Write and unlock WOMat records
END
NEXT I
RETURN
* * * * * * *
SlotWaferIDs:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
END
SlotNos = WOMatRec<WO_MAT_SLOT_NO$>
SlotNCRs = WOMatRec<WO_MAT_SLOT_NCR$>
SlotMetNos = WOMatRec<WO_MAT_SLOT_MET_NO$>
SlotMovedTos = WOMatRec<WO_MAT_SLOT_MOVED_TO$>
SlotRepWaferIDs = WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$>
IF SlotNos[-1,1] = @VM THEN SlotNos[-1,1] = ''
SlotNoCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
FOR I = 1 TO SlotNoCnt
DefWaferID = WOMatKey:'*':SlotNos<1,I>
CONVERT '*' TO '.' IN DefWaferID
WafersPulled = (SlotNCRs<1,I> NE '' OR SlotMetNos<1,I> NE '')
BEGIN CASE
CASE SlotNos<1,I> EQ ''
Result<1,I> = ''
CASE WafersPulled AND SlotMovedTos<1,I> NE '' AND SlotRepWaferIDs<1,I> NE ''
Result<1,I> = ''
CASE WafersPulled AND SlotMovedTos<1,I> NE '' AND SlotRepWaferIDs<1,I> = ''
Result<1,I> = ''
CASE WafersPulled AND SlotMovedTos<1,I> = '' AND SlotRepWaferIDs<1,I> NE ''
Result<1,I> = SlotRepWaferIDs<1,I>
CASE WafersPulled AND SlotMovedTos<1,I> = '' AND SlotRepWaferIDs<1,I> = ''
Result<1,I> = ''
CASE NOT(WafersPulled) AND SlotMovedTos<1,I> NE '' AND SlotRepWaferIDs<1,I> NE ''
Result<1,I> = SlotRepWaferIDs<1,I>
CASE NOT(WafersPulled) AND SlotMovedTos<1,I> NE '' AND SlotRepWaferIDs<1,I> = ''
Result<1,I> = ''
CASE NOT(WafersPulled) AND SlotMovedTos<1,I> = '' AND SlotRepWaferIDs<1,I> NE ''
Result<1,I> = '** Error **'
CASE NOT(WafersPulled) AND SlotMovedTos<1,I> = '' AND SlotRepWaferIDs<1,I> = ''
Result<1,I> = DefWaferID
END CASE
NEXT I
RETURN
* * * * * * *
TestSlotWaferIDs:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
END
SlotNos = WOMatRec<WO_MAT_SLOT_NO$>
SlotNCRs = WOMatRec<WO_MAT_SLOT_NCR$>
SlotMetNos = WOMatRec<WO_MAT_SLOT_MET_NO$>
SlotMovedTos = WOMatRec<WO_MAT_SLOT_MOVED_TO$>
SlotRepWaferIDs = WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$>
IF SlotNos[-1,1] = @VM THEN SlotNos[-1,1] = ''
SlotNoCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
FOR I = 1 TO SlotNoCnt
DefWaferID = WOMatKey:'*':SlotNos<1,I>
CONVERT '*' TO '.' IN DefWaferID
WafersPulled = (SlotNCRs<1,I> NE '' OR SlotMetNos<1,I> NE '' OR SlotMovedTos<1,I> NE '')
BEGIN CASE
CASE WafersPulled AND SlotRepWaferIDs<1,I> = ''
Result<1,I> = ''
CASE NOT(WafersPulled) AND SlotRepWaferIDs<1,I> NE ''
Result<1,I> = SlotRepWaferIDs<1,I>
CASE NOT(WafersPulled) AND SlotRepWaferIDS<1,I> = ''
Result<1,I> = DefWaferID
END CASE
NEXT I
* * * * * * *
BackfillNCR:
* * * * * * *
* This is temporary until we start using the WO_MAT_WFR window for everything
RETURN ;* Dead 9/8/2008 JCH
WONo = Parms[1,@RM]
WOCassNo = Parms[COL2()+1,@RM]
NCRId = Parms[COL2()+1,@RM]
SlotNos = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(WONo)) THEN ErrorMsg = 'Unassigned Parm "WONo" passed to routine. (':Method:')'
IF NOT(ASSIGNED(WOCassNo)) THEN ErrorMsg = 'Unassigned Parm "WOCassNo" passed to routine. (':Method:')'
IF NOT(ASSIGNED(NCRId)) THEN ErrorMsg = 'Unassigned Parm "NCRId" passed to routine. (':Method:')'
IF NOT(ASSIGNED(SlotNos)) THEN ErrorMsg = 'Unassigned Parm "SlotNos" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WONo:'*':WOCassNo
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) ELSE
AllSlotCnt = COUNT(WOMatRec<WO_MAT_SLOT_NCR$>,@VM) + (WOMatRec<WO_MAT_SLOT_NCR$> NE '')
FOR I = 1 TO AllSlotCnt
IF WOMatRec<WO_MAT_SLOT_NCR$,I> = NCRId THEN
WOMatRec<WO_MAT_SLOT_NCR$,I> = '' ;* Added 8/12/2008 to clear before setting -> junk left from conversion cleanup
END
NEXT I
SlotCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
FOR I = 1 TO SlotCnt
SlotNo = SlotNos<1,I>
WOMatRec<WO_MAT_SLOT_NCR$,SlotNo> = NCRId
NEXT I
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
END
RETURN
*************
CurrWaferCnt:
*************
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
OutOnly = Parms[COL2()+1,@RM] ;* Added 1/25/2010 JCH
IF WOMatKey = '' THEN RETURN
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
END
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
ReactorType = Xlate('WO_MAT', WOMatKey, 'REACTOR_TYPE', 'X')
If ReactorType EQ 'GAN' then
Result = XLATE('WO_MAT_WFR', WOMatKey, 'OUT_WFR_QTY', 'X')
end else
IF WMOKey NE '' THEN
Result = XLATE('WM_OUT',WMOKey,'WAFER_CNT','X')
IF NOT(OutOnly) THEN
IF WMIKey NE '' THEN
Result += XLATE('WM_IN',WMIKey,'REM_WFRS','X') ;* Combination of WM_IN + WM_OUT
END
END
END ELSE
GOSUB SlotWaferIDs
SlotWaferIDs = Result
Result = ''
Tmp = 0
WaferIDCnt = COUNT(SlotWaferIDs,@VM) + (SlotWaferIDs NE '')
FOR I = 1 TO WaferIDCnt
IF SlotWaferIDs<1,I> NE '' THEN Tmp += 1
NEXT I
Result = Tmp
END
end
IF Result NE '' THEN
IF WOMatRec<WO_MAT_WIP_STOP_DTM$> = '' AND Result = 0 THEN
oPLParms = 'WO_MAT':@RM
oPLParms := WOMatKey:@RM
oPLParms := WO_MAT_WIP_STOP_DTM$:@RM
oPLParms := ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ,'DT'):@RM
obj_Post_Log('Create',oPLParms)
END
END
RETURN
***********
GetGRProps:
***********
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
If WOMatRec = '' Then
WOMatRec = XLATE('WO_MAT', WOMatKey, '', 'X')
End
WOMatWfrRec = XLATE('WO_MAT_WFR', WOMatKey, '', 'X')
WONo = WOMatKey[1,'*']
ReactorType = XLATE('WO_LOG', WONo, 'REACT_TYPE', 'X')
WOStepKey = WONo : '*1'
WOStepRec = XLATE('WO_STEP', WOStepKey, '', 'X')
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
IF WMIKey NE '' AND WMOKey = '' THEN
NULL ;* Skip the final sig check on the WMIn box if no corresponding WMOut box
END ELSE
// Check for full box reject. If so, then skip signature check.
RejectedWafers = 0
RejectedMUWafers = 0
ProdTestWafers = 0
Set_Status(0)
ReactorType = XLATE('WO_LOG', WONo, 'REACT_TYPE', 'X')
CassetteQty = XLATE('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
RejectedWafers = XLATE('WO_MAT', WOMatKey, 'TOT_REJ_WFRS', 'X')
RejectedMUWafers = XLATE('WO_MAT', WOMatKey, 'TOT_REJ_MU_WFRS', 'X')
ProdTestWafers = XLATE('WO_MAT', WOMatKey, 'TW_PROD','X')
IF (RejectedWafers = '') then
RejectedWafers = 0
END
IF (RejectedMUWafers = '') then
RejectedMUWafers = 0
END
IF (ProdTestWafers = '') then
ProdTestWafers = 0
END
IF ((ReactorType = 'EPP') OR (ReactorType = 'EpiPro')) THEN
RejectedQty = RejectedWafers + RejectedMUWafers
END ELSE
RejectedQty = RejectedWafers + RejectedMUWafers + ProdTestWafers
END
end
GRWfrQty = 0
ScrapQty = 0
ProdTWQty = 0
AvailMUWfrQty = 0
MUCassIDs = ''
MUCassQtys = ''
IF WMOKey NE '' OR WMIKey NE '' THEN
IF WMIKey NE '' THEN
ProdTWQty = XLATE('WM_IN',WMIKey,'TW_PROD','X') ;* Changes on 4/21/2014 JCH - operators are forgetting to do some of the metrology and TW use records.
ScrapQty = Sum(XLATE('WM_IN',WMIKey,'NCR_REJ_CNT','X')) ;* 6/4/2014 JCH
END ;* End of check for WMIKey
IF WMOKey NE '' THEN
WMORec = XLATE('WM_OUT',WMOKey,'','X')
SlotNos = WMORec<WM_OUT_SLOT_NO$>
SlotCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
FOR I = 1 TO SlotCnt
IF WMORec<WM_OUT_MAKEUP_BOX$> = 1 THEN
IF WMORec<WM_OUT_SLOT_NCR$,I> NE '' THEN ScrapQty += 1
IF WMORec<WM_OUT_MU_WO_NO$,I> = '' AND WMORec<WM_OUT_RDS$,I> NE '' THEN AvailMUWfrQty += 1
IF WMORec<WM_OUT_MU_WO_NO$,I> = '' AND WMORec<WM_OUT_UMW_CASS_ID$,I> NE '' THEN AvailMUWfrQty += 1
END ELSE
IF WMORec<WM_OUT_SLOT_NCR$,I> NE '' THEN ScrapQty += 1
IF WMORec<WM_OUT_MU_WO_NO$,I> = '' AND WMORec<WM_OUT_RDS$,I> NE '' THEN GRWfrQty += 1
IF WMORec<WM_OUT_MU_WO_NO$,I> = '' AND WMORec<WM_OUT_UMW_CASS_ID$,I> NE '' THEN GRWfrQty += 1
END
IF WMORec<WM_OUT_MU_WO_NO$,I> NE '' THEN
MUCassID = WMORec<WM_OUT_MU_WO_NO$,I>:'*':WMORec<WM_OUT_MU_CASS_NO$,I>
LOCATE MUCassID IN MUCassIDs USING @VM SETTING Pos THEN
MUCassQtys<1,Pos> = MUCassQtys<1,Pos> + 1
END ELSE
MUCassIDs = INSERT(MUCassIDs,1,Pos,0,MUCassID) ;* @MV'd list of CassIDs used for makeup
MUCassQtys = INSERT(MUCassQtys,1,Pos,0,1) ;* @MV'd list of Wfr Qtys for each CassID
END
END
NEXT I
END;* End of check for WMOKey
END ELSE
SlotIDs = WOMatRec<WO_MAT_SLOT_NO$>
SlotCnt = COUNT(SlotIDs,@VM) + (SlotIDs NE '')
SlotWfrIDs = Xlate('WO_MAT', WOMatKey, 'SLOT_WAFER_ID', 'X')
FOR I = 1 TO SlotCnt
IF WOMatRec<WO_MAT_MAKEUP_BOX$> = 1 THEN
SlotWfrID = SlotWfrIDs<0, I>
BEGIN CASE
CASE WOMatRec<WO_MAT_SLOT_NCR$,I> EQ '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> EQ ''
AvailMUWfrQty += 1
CASE WOMatRec<WO_MAT_SLOT_NCR$,I> EQ '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> NE '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> _NEC 'x'
ProdTWQty += 1
CASE WOMatRec<WO_MAT_SLOT_NCR$,I> NE '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> EQ ''
ScrapQty += 1
END CASE
END ELSE
BEGIN CASE
CASE WOMatRec<WO_MAT_SLOT_NCR$,I> EQ '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> EQ '' AND WOMatRec<WO_MAT_SLOT_NO$, I> EQ ''
Null
CASE WOMatRec<WO_MAT_SLOT_NCR$,I> EQ '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> EQ ''
GRWfrQty += 1
CASE WOMatRec<WO_MAT_SLOT_NCR$,I> EQ '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> NE '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> _NEC 'x'
ProdTWQty += 1
CASE WOMatRec<WO_MAT_SLOT_NCR$,I> NE '' AND WOMatRec<WO_MAT_SLOT_MET_NO$,I> EQ ''
ScrapQty += 1
END CASE
END
IF WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I> NE '' THEN
RepMUCassID = FIELD(WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I>,'.',1,2) ;* Replacement Wafer CassID
FromMUCassID = FIELD(WOMatRec<WO_MAT_SLOT_MOVED_FROM$,I>,'.',1,2) ;* MU Cassette ID
ToMUCassID = FIELD(WOMatRec<WO_MAT_SLOT_MOVED_TO$,I>,'.',1,2)
IF ( (FromMUCassID NE '') and (ToMUCassID EQ '') ) THEN
MUCassID = FromMUCassID
END ELSE
MUCassID = RepMUCassID
END
CONVERT '.' TO '*' IN MUCassID
LOCATE MUCassID IN MUCassIDs USING @VM SETTING Pos THEN
MUCassQtys<1,Pos> = MUCassQtys<1,Pos> + 1
END ELSE
MUCassIDs = INSERT(MUCassIDs,1,Pos,0,MUCassID) ;* @MV'd list of CassIDs used for makeup
MUCassQtys = INSERT(MUCassQtys,1,Pos,0,1) ;* @MV'd list of Wfr Qtys for each CassID
END
END
NEXT I
END
MUCassCnt = COUNT(MUCassIDs,@VM) + (MUCassIDs NE '')
IF MUCassCnt > 0 THEN
SortMUCassIDs = ''
SortMUCassQtys = ''
FOR I = 1 TO MUCassCnt
MUCassQty = MUCassQtys<1,I>
LOCATE MUCassQty IN SortMUCassQtys BY 'DR' USING @VM SETTING Pos THEN
SortMUCassQtys = INSERT(SortMUCassQtys,1,Pos,0,MUCassQty)
SortMUCassIDs = INSERT(SortMUCassIDs,1,Pos,0,MUCassIds<1,I>)
END ELSE
SortMUCassQtys = INSERT(SortMUCassQtys,1,Pos,0,MUCassQty)
SortMUCassIDs = INSERT(SortMUCassIDs,1,Pos,0,MUCassIds<1,I>)
END
NEXT I
MUCassIDs = SortMUCassIDs
MUCassQtys = SortMUCassQtys
END
Result = GRWfrQty:@FM:ScrapQty:@FM:ProdTWQty:@FM:AvailMUWfrQty:@FM:MUCassIDs:@FM:MUCassQtys
If ReactorType EQ 'GAN' then Result = ''
RETURN
* * * * * * *
ConvertMakeup:
* * * * * * *
WOMatKey = Parms[1,@RM]
IF WOMatKey = '' THEN RETURN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec<WO_MAT_MU_WAFER_FLAG$> AND NOT(WOMatRec<WO_MAT_MAKEUP_BOX$>) THEN
SlotNCRs = WOMatRec<WO_MAT_SLOT_NCR$>
SlotRepBys = WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$>
EmptySlots = ''
MakeupCassIDs = ''
MakeupCassWfrQtys = ''
SlotCnt = COUNT(SlotNCRs,@VM) + (SlotNCRs NE '')
FOR I= 1 TO SlotCnt
SlotRepBy = SlotRepBys<1,I>
IF SlotNCRs<1,I> NE '' AND SlotRepBy = '' THEN
EmptySlots<1,-1> = I
END
IF SlotRepBy NE '' THEN
MakeupCassID = FIELD(SlotRepBy,'.',1,2)
LOCATE MakeupCassID IN MakeupCassIDs USING @VM SETTING Pos THEN
MakeupCassWfrQtys<1,Pos> = MakeupCassWfrQtys<1,Pos> + 1
END ELSE
MakeupCassIDs = INSERT(MakeupCassIDs,1,Pos,0,MakeupCassID)
MakeupCassWfrQtys = INSERT(MakeupCassWfrQtys,1,Pos,0,1)
END
END ;* End of check for SlotRepBy data
NEXT I
CONVERT '.' TO '*' IN MakeupCassIDs
RDSNo = WOMatRec<WO_MAT_RDS_NO$>
IF NOT(INDEX(RDSNo,@VM,1)) THEN
RDSMakeupBox = XLATE('RDS_MAKEUP',RDSNo,'','X')
MUSrcRDSs = RDSMakeupBox<RDS_MAKEUP_SRC_RDS$>
MUSrcSlots = RDSMakeupBox<RDS_MAKEUP_SRC_SLOT$>
SourceCassettes = ''
SourceCassCnts = ''
MUCnt = COUNT(MUSrcRDSs,@VM) + (MUSrcRDSs NE '')
FOR I = 1 TO MUCnt
MuRDSNo = MUSrcRDSs<1,I>
MUSlotNo = MUSrcSlots<1,I>
IF MuRDSNo NE '' AND MUSlotNo NE '' THEN
MURdsRec = XLATE('RDS',MuRDSNo,'','X')
MUWoNo = MURdsRec<RDS_WO$>
MUCassNo = MURdsRec<RDS_CASS_NO$>
SourceCassette = MUWoNo:'*':MUCassNo
LOCATE SourceCassette IN MakeupCassIDs USING @VM SETTING Pos1 THEN
MakeupCassWfrQtys<1,Pos1> = MakeupCassWfrQtys<1,Pos1> - 1
IF MakeupCassWfrQtys<1,Pos1> = 0 THEN
MakeupCassIDs = DELETE(MakeupCassIDs,1,Pos1,0)
MakeupCassWfrQtys= DELETE(MakeupCassWfrQtys,1,Pos1,0)
END
END ELSE
LOCATE SourceCassette IN SourceCassettes USING @VM SETTING Pos THEN
SourceCassCnts<1,Pos> = SourceCassCnts<1,Pos> + 1
END ELSE
SourceCassettes = INSERT(SourceCassettes,1,Pos,0,SourceCassette)
SourceCassCnts = INSERT(SourceCassCnts,1,Pos,0,1)
END
END
END
NEXT I
SCCnt = COUNT(SourceCassettes,@VM) + (SourceCassettes NE '')
FOR N = 1 TO SCCnt
SourceCassette = SourceCassettes<1,N>
SourceCassCnt = SourceCassCnts<1,N>
CassEmptySlots = FIELD(EmptySlots,@VM,1,SourceCassCnt)
EmptySlots[1,COL2()] = ''
CALL obj_WO_Mat('AddMakeupWafers',WOMatKey:@RM:CassEmptySlots:@RM:SourceCassette) ;* This fills first batch of empty slots
IF Get_Status(errCode) THEN ErrMsg(errCode)
NEXT N
END ;* End of check single RDSNo for cassette
END
RETURN
* * * * * * *
RemProdTW:
* * * * * * *
WONo = Parms[1,@RM]
WOCassNo = Parms[COL2()+1,@RM]
MetNo = Parms[COL2()+1,@RM]
SlotNos = Parms[COL2()+1,@RM]
PTW_Flag = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null Parm "WONo" passed to routine. (':Method:')'
IF WOCassNo = '' THEN ErrorMsg = 'Null Parm "WOCassNo" passed to routine. (':Method:')'
IF MetNo = '' THEN ErrorMsg = 'Null Parm "MetNo" passed to routine. (':Method:')'
IF SlotNos = '' THEN ErrorMsg = 'Null Parm "SlotNos" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WONo:'*':WOCassNo
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN
NULL
END ELSE
SlotCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
PulledWaferIDs = ''
FOR I = 1 TO SlotCnt
SlotNo = SlotNos<1,I>
IF PTW_Flag = 1 THEN
PulledWaferIDs<1,-1> = WONo:'.':WOCassNo:'.':SlotNo
END ELSE
PulledWaferIDs := WONo:'.':WOCassNo:'.':SlotNo:','
END
WOMatRec<WO_MAT_SLOT_MET_NO$,SlotNo> = MetNo
NEXT I
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
END
IF PulledWaferIDs[-1,1] = ',' THEN PulledWaferIDs[-1,1] = ''
Result = PulledWaferIDs
RETURN
* * * * * * *
RepProdTW:
* * * * * * *
WONo = Parms[1,@RM]
WOCassNo = Parms[COL2()+1,@RM]
MetNo = Parms[COL2()+1,@RM]
WaferIDs = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(WONo)) THEN ErrorMsg = 'Unassigned Parm "WONo" passed to routine. (':Method:')'
IF NOT(ASSIGNED(WOCassNo)) THEN ErrorMsg = 'Unassigned Parm "WOCassNo" passed to routine. (':Method:')'
IF NOT(ASSIGNED(MetNo)) THEN ErrorMsg = 'Unassigned Parm "MetNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WONo:'*':WOCassNo
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF WaferIDs = '' THEN
MetNos = WOMatRec<WO_MAT_SLOT_MET_NO$>
WaferIDCnt = COUNT(MetNos,@VM) + (MetNos NE '')
FOR I = 1 TO WaferIDCnt
IF WOMatRec<WO_MAT_SLOT_MET_NO$,I> = MetNo THEN
WOMatRec<WO_MAT_SLOT_MET_NO$,I> = ''
END
NEXT I
END ELSE
WaferIDCnt = COUNT(WaferIDs,',') + (WaferIDs NE '')
FOR I = 1 TO WaferIDCnt
WaferID = FIELD(WaferIDs,',',I)
SlotNo = WaferID[-1,'B.']
WOMatRec<WO_MAT_SLOT_MET_NO$,SlotNo> = ''
NEXT I
END
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
RETURN
* * * * * * *
SetWMStatus:
* * * * * * *
RETURN
* Replaced with WM_MFS
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
FieldNo = Parms[COL2()+1,@RM]
NewStatus = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null parameter "CassNo" passed to routine. (':Method:')'
IF FieldNo = '' THEN ErrorMsg = 'Null parameter "FieldNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WOMatKey = WONo:'*':CassNo
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms)
IF Get_Status(errCode) THEN RETURN
IF FieldNo = WO_MAT_WMI_CURR_STATUS$ THEN
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = NewStatus
END
IF FieldNo = WO_MAT_WMO_CURR_STATUS$ THEN
WOMatRec<WO_MAT_WMO_CURR_STATUS$> = NewStatus
END
otParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteRec',otParms)
RETURN
* * * * * * *
ReportStatus:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null parameter "WOMatKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WONo = WOMatKey[1,'*']
IF WONo < 128680 THEN RETURN ;* This is the first WO No on 7/29/2005 - The day we cut over to the new system.
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec<WO_MAT_VOID$> THEN
Result = 'VOID'
RETURN
END
ReactType = XLATE('WO_MAT',WOMatKey,'PS_REACTOR_TYPE','X')
RDSNo = WOMatRec<WO_MAT_RDS_NO$>[-1,'B':@VM]
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
WMOStatus = WOMatRec<WO_MAT_WMO_CURR_STATUS$>
IF WMOStatus = 'COMP' THEN
WMOStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
END
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
IF WMOKey NE '' THEN
Result = 'WMO - Shipped'
END ELSE
Result = 'ASM - Shipped'
END
RETURN
END
IF WMOKey NE '' THEN
WMOMakeup = XLATE('WM_OUT',WMOKey,'MAKEUP_BOX','X')
END ELSE
WMOMakeup = ''
END
TypeDesc = ''
IF WMIKey = '' AND WMOKey = '' AND ( ReactType = 'P' OR ReactType = 'EPP' ) THEN
TypeDesc<1,-1> = 'WMI'
TypeDesc := ' * Error * '
Result = TypeDesc
RETURN
END
IF WMIKey NE '' OR WMOKey NE '' THEN
InboundStat = ''
OutboundStat = ''
IF WOMatRec<WO_MAT_HOLD$> = 1 THEN
IF WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_IN' THEN
InboundStat = 'HOLD'
END
IF WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
OutBoundStat = 'HOLD'
END
BEGIN CASE
CASE InboundStat = '' AND OutboundStat = ''
Result = ''
CASE InboundStat = '' AND OutboundStat NE ''
Result = 'WMO':' - ':OCONV(OutboundStat,'[WM_OUT_CURR_STATUS_CONV]')
CASE InboundStat NE '' AND OutboundStat = ''
Result = 'WMI':' - ':OCONV(InboundStat,'[WM_IN_CURR_STATUS_CONV]')
CASE InboundStat NE '' AND OutboundStat NE ''
Result = 'WMI':' - ':OCONV(InboundStat,'[WM_IN_CURR_STATUS_CONV]'):@VM
Result := 'WMO':' - ':OCONV(OutboundStat,'[WM_OUT_CURR_STATUS_CONV]')
END CASE
RETURN
END
IF WMIKey NE '' THEN
IF WMIStatus = 'MT' THEN
NULL
END ELSE
InboundStat = WMIStatus
END
END
IF WMOKey NE '' THEN
* Removed "( WMOMakeup = 1 AND WMOStatus = 'MT' ) from the OR conditions * 5/1/2014 JCH
IF WMOStatus = 'RTB' THEN
NULL
END ELSE
OutboundStat = WMOStatus
END
END
BEGIN CASE
CASE InboundStat = '' AND OutboundStat = ''
Result = ''
CASE InboundStat = '' AND OutboundStat NE ''
IF WMOMakeup = 1 THEN
OutboundStat = 'WMO':' - M/U - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]')
END ELSE
OutboundStat = 'WMO':' - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]')
END
Result = OutboundStat
CASE InboundStat NE '' AND OutboundStat = ''
Result = 'WMI':' - ':OCONV(WMIStatus,'[WM_IN_CURR_STATUS_CONV]')
CASE InboundStat NE '' AND OutboundStat NE ''
Result = 'WMI':' - ':OCONV(WMIStatus,'[WM_IN_CURR_STATUS_CONV]'):@VM
IF WMOMakeup = 1 THEN
OutboundStat = 'WMO':' - M/U - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]')
END ELSE
OutboundStat = 'WMO':' - ':OCONV(WMOStatus,'[WM_OUT_CURR_STATUS_CONV]')
END
Result = Result:OutboundStat
END CASE
Begin Case
Case InboundStat NE 'VOID' AND OutboundStat NE 'VOID'
Result = Result
Case InboundStat EQ 'VOID' AND OutboundStat NE 'VOID'
Result = OutboundStat
Case InboundStat NE 'VOID' AND OutboundStat EQ 'VOID'
Result = InboundStat
Case InboundStat EQ 'VOID' AND OutboundStat EQ 'VOID'
Result = 'VOID'
End Case
RETURN
END ELSE
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
IF WOMatRec<WO_MAT_MAKEUP_BOX$> = 1 THEN
TypeDesc<1,-1> = 'ASM - M/U':' - ':OCONV(WOMatCurrStatus,'[WO_MAT_CURR_STATUS_CONV]')
END ELSE
TypeDesc<1,-1> = 'ASM'
TypeDesc := ' - ':OCONV(WOMatCurrStatus,'[WO_MAT_CURR_STATUS_CONV]') ;* Last
End
END
Result = TypeDesc
RETURN
* * * * * * *
CassRDSNos:
* * * * * * *
WOMatKeys = Parms[1,@RM]
IF WOMatKeys = '' THEN RETURN
ReactType = XLATE('WO_MAT',WOMatKeys<1,1>,'PS_REACTOR_TYPE','X')
IF ReactType = 'P' OR ReactType = 'EPP' THEN RETURN ;* This isn't valid for EpiPro reactors
GOSUB SlotWaferIDs
SlotWaferIDs = Result
Result = ''
CassWOMatKeys = ''
CONVERT '.' TO '*' IN SlotWaferIDs
SlotCnt = COUNT(SlotWaferIDs,@VM) + (SlotWaferIDs NE '')
FOR I = 1 TO SlotCnt
SlotWOMatKey = FIELD(SlotWaferIDs<1,I>,'*',1,2)
LOCATE SlotWOMatKey IN CassWOMatKeys BY 'AR' USING @VM SETTING Pos ELSE
CassWOMatKeys = INSERT(CassWOMatKeys,1,Pos,0,SlotWOMatKey)
END
NEXT I
RDSNos = XLATE('WO_MAT',CassWOMatKeys,'SHIP_RDS','X')
Result = ''
RDSNoCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
FOR I = 1 TO RDSNoCnt
LOCATE RDSNos<1,I> IN Result BY 'AR' USING @VM SETTING Pos ELSE
Result = INSERT(Result,1,Pos,0,RDSNos<1,I>)
END
NEXT I
RETURN
* * * * * * *
CassRDSWfrCnts:
* * * * * * *
WOMatKeys = Parms[1,@RM]
IF WOMatKeys = '' THEN RETURN
ReactType = XLATE('WO_MAT',WOMatKeys<1,1>,'PS_REACTOR_TYPE','X')
IF ReactType = 'P' OR ReactType = 'EPP' THEN RETURN ;* This isn't valid for EpiPro reactors
GOSUB SlotWaferIDs
SlotWaferIDs = Result
Result = ''
CassWOMatKeys = ''
CONVERT '.' TO '*' IN SlotWaferIDs
SlotCnt = COUNT(SlotWaferIDs,@VM) + (SlotWaferIDs NE '')
CassWOMatCnts = ''
FOR I = 1 TO SlotCnt
SlotWOMatKey = FIELD(SlotWaferIDs<1,I>,'*',1,2)
IF SlotWOMatKey NE '' THEN
LOCATE SlotWOMatKey IN CassWOMatKeys BY 'AR' USING @VM SETTING Pos THEN
CassWOMatCnts<1,Pos> = CassWOMatCnts<1,Pos> + 1
END ELSE
CassWOMatKeys = INSERT(CassWOMatKeys,1,Pos,0,SlotWOMatKey)
CassWOMatCnts = INSERT(CassWOMatCnts,1,Pos,0,1)
END
END
NEXT I
Result = CassWOMatCnts
RETURN
*********
GetFQADtm:
*********
WOMatKey = Parms[1,@RM]
rec = Signature_Services('GetSigInfo', WOMatKey, 'QA')
Result = rec<2>
RETURN
* * * * * * *
GetSigProfile:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOStep = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec = '' THEN RETURN
IF WOStep NE '' THEN
SigProfile = ''
Signatures = ''
SigDTMs = ''
SigVers = ''
ProfCnt = COUNT(WOMatRec<WO_MAT_SIG_PROFILE$>,@VM) + (WOMatRec<WO_MAT_SIG_PROFILE$> NE '')
LineNo = 0
FOR I = 1 TO ProfCnt
IF WOMatRec<WO_MAT_SIG_PROFILE$,I>[1,1] = WOStep THEN
LineNo += 1
SigProfile<1,LineNo> = WOMatRec<WO_MAT_SIG_PROFILE$,I>
Signatures<1,LineNo> = WOMatRec<WO_MAT_SIGNATURE$,I>
SigDTMs<1,LineNo> = WOMatRec<WO_MAT_SIG_DTM$,I>
SigVers<1,LineNo> = WOMatRec<WO_MAT_SIG_VER$,I>
END
NEXT I
END ELSE
SigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
Signatures = WOMatRec<WO_MAT_SIGNATURE$>
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
SigVers = WOMatRec<WO_MAT_SIG_VER$>
END
SigDTMs = OCONV(SigDTMs,'DT4/^S')
Result = SigProfile:@FM:Signatures:@FM:SigDTMs:@FM:SigVers
RETURN
* * * * * * *
CassSigProfile:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN
WOMatKey = Parms[1,@RM]
END
IF WOMatKey = '' THEN ErrorMsg = 'Null parameter "WOMatKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WONo = WOMatKey[1,'*']
IF WONo < 128680 THEN RETURN ;* This is the first WO No on 7/29/2005 - The day we cut over to the new system.
WOStepKeys = XLATE('WO_LOG',WONo,'WO_STEP_KEY','X') ;***********************************************
SigProfile = ''
StepCnt = COUNT(WOStepKeys,@VM) + (WOStepKeys NE '')
FOR I = 1 TO StepCnt
PSNo = XLATE('WO_STEP',WOStepKeys<1,I>,WO_STEP_PROD_SPEC_ID$,'X')
StepProfile = obj_Prod_Spec('GetSigProfile',PSNo)
SigCnt = COUNT(StepProfile,@VM) + (StepProfile NE '')
FOR N = 1 TO SigCnt
StepSig = StepProfile<1,N>
IF StepSig[1,2] NE 'RN' THEN
SigProfile := I:StepProfile<1,N>:@VM
END
NEXT N
NEXT I
IF SigProfile[-1,1] = @VM THEN SigProfile[-1,1] = ''
Result = SigProfile
RETURN
* * * * * * *
CassMetProfile:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN
WOMatKey = Parms[1,@RM]
END
* * * * * * * These doesn't appear to be used anywhere * * * * * * * * JCH 3/9/2015
IF WOMatKey = '' THEN ErrorMsg = 'Null parameter "WOMatKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF NOT(ASSIGNED(WOMatRec)) THEN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
END
WONo = WOMatKey[1,'*']
IF WONo < 128680 THEN RETURN ;* This is the first WO No on 7/29/2005 - The day we cut over to the new system.
WOStepKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X')
MetProfile = ''
StepCnt = COUNT(WOStepKeys,@VM) + (WOStepKeys NE '')
MetLine = 1
FOR I = 1 TO StepCnt
PSNo = XLATE('WO_STEP',WOStepKeys<1,I>,WO_STEP_PROD_SPEC_ID$,'X')
PSRec = XLATE('PROD_SPEC',PSNo,'','X')
MetCnt = COUNT(PSRec<PROD_SPEC_MET_TEST$>,@VM) + (PSRec<PROD_SPEC_MET_TEST$> NE '')
FOR N = 1 TO MetCnt
Interval = PSRec<PROD_SPEC_MET_INTERVAL$,N>
Start = PSRec<PROD_SPEC_MET_START$,N>
TestFlag = 0
IF Interval NE '' AND Start NE '' THEN
IF Interval = Start THEN
IF REM(I,Interval) = 0 THEN TestFlag = 1
END ELSE
IF ABS((Start + INT(I/Interval)*Interval) - I) = 0 THEN TestFlag = 1
END
IF TestFlag THEN
WOMatRec<WO_MAT_MET_PROFILE$,MetLine> = I:PSRec<PROD_SPEC_MET_TEST$,N>
WOMatRec<WO_MAT_MET_RUN_STEP$,MetLine> = PSRec<PROD_SPEC_MET_RUN_STEP$,N>
WOMatRec<WO_MAT_MET_MIN$,MetLine> = PSRec<PROD_SPEC_MET_MIN$
WOMatRec<WO_MAT_MET_MAX$,MetLine> = PSRec<PROD_SPEC_MET_MAX$
WOMatRec<WO_MAT_MET_SLOT$,MetLine> = PSRec<PROD_SPEC_MET_SLOT$,N>
WOMatRec<WO_MAT_MET_SIG$,MetLine> = ''
WOMatRec<WO_MAT_MET_SIG_DTM$,MetLine> = ''
MetLine += 1
END
END
NEXT N
NEXT I
RETURN
* * * * * * *
SetSignature:
* * * * * * *
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
WOStepNo = Parms[COL2()+1,@RM]
SigProfKeys = Parms[COL2()+1,@RM]
Signatures = Parms[COL2()+1,@RM]
SigDTMs = Parms[COL2()+1,@RM]
MetResults = Parms[COL2()+1,@RM]
RunSteps = Parms[COL2()+1,@RM]
StdMaxs = Parms[COL2()+1,@RM]
StdResults = Parms[COL2()+1,@RM] ;* Added 8/5/2013 JCH
IgnoreLock = Parms[COL2()+1,@RM] ;* Self-Lock only
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null parameter "CassNo" passed to routine. (':Method:')'
IF WOStepNo = '' THEN Errormsg = 'Null parameter "WOStepNo" passed to routine. (':Method:')'
IF SigProfKeys = '' THEN ErrorMsg = 'Null parameter "SigProfKeys" passed to routine. (':Method:')'
IF Signatures = '' THEN ErrorMsg = 'Null parameter "Signatures" passed to routine. (':Method:')'
IF SigDTMs = '' THEN ErrorMsg = 'Null parameter "SigDTMs" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
SigCnt = COUNT(SigProfKeys,@VM) + (SigProfKeys NE '')
FOR I = 1 TO SigCnt
IF SigProfKeys<1,I> = '' THEN ErrorMsg = 'Null parameter "SigProfKey" passed to routine. (':Method:')'
thisSigDTM = ICONV(SigDTMs<1,I>,'DT')
IF thisSigDTM = '' THEN
NULL
END
IF ErrorMsg NE '' THEN RETURN
NEXT I
otParms = 'WO_MAT':@RM:WONo:'*':CassNo
WOMatRec = obj_Tables('ReadOnlyRec',otParms)
IF Get_Status(errCode) THEN
RETURN
END
ProfileCnt = COUNT(WOMatRec<WO_MAT_SIG_PROFILE$>,@VM) + (WOMatRec<WO_MAT_SIG_PROFILE$> NE '')
LastProfSig = WOMatRec<WO_MAT_SIG_PROFILE$,ProfileCnt>
LastBoxSigned = 0
WriteFlag = 0
FOR I = 1 TO SigCnt
SigProfKey = SigProfKeys<1,I>
RunStep = RunSteps<1,I>
IF NUM(SigProfKey[1,1]) ELSE
SigProfKey = WOStepNo:SigProfKey
END
LOCATE SigProfKey IN WOMatRec<WO_MAT_SIG_PROFILE$> USING @VM SETTING Pos THEN
WOMatRec<WO_MAT_SIGNATURE$,Pos> = Signatures<1,I>
WOMatRec<WO_MAT_SIG_DTM$,Pos> = ICONV(SigDTMs<1,I>,'DT')
WriteFlag = 1
IF WOMatRec<WO_MAT_WMO_KEY$> = '' THEN
IF SigProfKey = LastProfSig THEN
WOLogRec = XLATE('WO_LOG',WONo,'','X')
LastWOMatKey = WOLogRec<WO_LOG_WO_MAT_KEY$>[-1,@VM]
WOMatKey = WONo:'*':CassNo
IF WOMatKey = LastWOMatKey THEN
* Last box in the Work Order *** 4/1/2014 JCH this doesn't appear to be working.
* See method 'SetSAPBatch' which should be working. jch
CurrDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTH') ,'DT')
obj_Post_Log('Create','WO_LOG':@RM:WONo:@RM:WO_LOG_WO_STOP_DTM$:@RM:CurrDTM)
END ;* End of check for Last Box on the Work Order
END ;* End of check for Last Signature on this cassette
END ;* End of check for Non EpiPRO material
END
NEXT I
IF WriteFlag = 1 THEN
otParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteOnlyRec',otParms)
END
RETURN
* * * * * * *
ClearSignature:
* * * * * * *
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
WOStepNo = Parms[COL2()+1,@RM]
SigProfKey = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null parameter "CassNo" passed to routine. (':Method:')'
IF WOStepNo = '' THEN Errormsg = 'Null parameter "WOStepNo" passed to routine. (':Method:')'
IF SigProfKey = '' THEN ErrorMsg = 'Null parameter "SigProfKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WONo:'*':CassNo
WOMatRec = obj_Tables('ReadRec',otParms)
IF Get_Status(errCode) THEN
RETURN
END
SigProfKey = WOStepNo:SigProfKey
LOCATE SigProfKey IN WOMatRec<WO_MAT_SIG_PROFILE$> USING @VM SETTING Pos THEN
WOMatRec<WO_MAT_SIGNATURE$,Pos> = ''
WOMatRec<WO_MAT_SIG_DTM$,Pos> = ''
otParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteRec',otParms)
END ELSE
LOCATE SigProfKey IN WOMatRec<WO_MAT_MET_PROFILE$> USING @VM SETTING Pos THEN
WOMatRec<WO_MAT_MET_RESULT$,Pos> = ''
WOMatRec<WO_MAT_MET_SIG$,Pos> = ''
WOMatRec<WO_MAT_MET_SIG_DTM$,Pos> = ''
otParms = FieldStore(OtParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteRec',otParms)
END ELSE
obj_Tables('UnlockRec',otParms)
END
END
RETURN
* * * * * * *
SigDt:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
SigProfID = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null parameter "WOMatKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WONo = WOMatKey[1,'*']
IF WONo < 128680 THEN RETURN ;* This is the first WO No on 7/29/2005 - The day we cut over to the new system.
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
SigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
LastSig = SigProfile[-1,'B':@VM]
StepCnt = LastSig[1,1] ;* Sig Profiles all start with the step no.
FOR I = 1 TO StepCnt
LOCATE I:SigProfID IN WOMatRec<WO_MAT_SIG_PROFILE$> USING @VM SETTING Pos THEN
SigDTM = WOMatRec<WO_MAT_SIG_DTM$,Pos>
Result<1,-1> = SigDTM[1,'.']
END
NEXT I
RETURN
* * * * * * *
TestStatus:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
WONo = WOMatKey[1,'*']
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec<WO_MAT_VOID$> THEN
Result = 'VOID'
RETURN
END
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
Result = 'SHIP'
RETURN
END
LocCnt = COUNT(WOMatRec<WO_MAT_INV_LOCATION$>,@VM) + (WOMatRec<WO_MAT_INV_LOCATION$> NE '')
LastIn = ''
LastOut = ''
FOR I = LocCnt TO 1 STEP -1
IF WOMatRec<WO_MAT_INV_LOCATION$,I> = 'PTI' AND LastIn = '' THEN
LastIn = WOMatRec<WO_MAT_INV_DTM$,I>
END
IF WOMatRec<WO_MAT_INV_LOCATION$,I> = 'PTO' AND LastOut = '' THEN
LastOut = WOMatRec<WO_MAT_INV_DTM$,I>
END
UNTIL LastIn NE '' AND LastOut NE ''
NEXT I
LastWH = WOMatRec<WO_MAT_INV_WH$>[-1,'B':@VM]
LastLoc = WOMatRec<WO_MAT_INV_LOCATION$>[-1,'B':@VM]
CurrLoc = ''
IF LastWH NE '' AND LastLoc NE '' THEN
CurrLoc = LastWH:'*':LastLoc
IF CurrLoc = 'SR*SB' THEN CurrLoc = ''
END
BEGIN CASE
CASE LastIn = '' AND LastOut = '' ; InCleanRoom = 0
CASE LastIn = '' ; InCleanRoom = 0
CASE LastOut = '' ; InCleanRoom = 1
CASE LastOut > LastIn ; InCleanRoom = 0
CASE LastIn > LastOut ; InCleanRoom = 1
END CASE
IF WMIKey NE '' THEN
WMIStatus = WOMatRec<WO_MAT_WMI_CURR_STATUS$>
END ELSE
WMIStatus = ''
END
IF WMOKey NE '' THEN
WMOStatus = WOMatRec<WO_MAT_WMO_CURR_STATUS$>
IF WMOStatus = 'COMP' AND NOT(InCleanRoom) THEN
WMOStatus = 'RTS'
END
IF CurrLoc = 'CR*PKO' THEN
WMOStatus = 'PKO'
END
WMOMakeup = XLATE('WM_OUT',WMOKey,'MAKEUP_BOX','X')
END ELSE
WMOStatus = ''
END
IF WMIKey NE '' OR WMOKey NE '' THEN
InboundStat = ''
OutboundStat = ''
IF WOMatRec<WO_MAT_HOLD$> = 1 THEN
IF WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_IN' THEN
InboundStat = 'HOLD'
END
IF WOMatRec<WO_MAT_HOLD_ENTITY$,1> = 'WM_OUT' THEN
OutBoundStat = 'HOLD'
END
BEGIN CASE
CASE InboundStat = '' AND OutboundStat = ''
Result = ''
CASE InboundStat = '' AND OutboundStat NE ''
Result = WMOStatus
CASE InboundStat NE '' AND OutboundStat = ''
Result = InboundStat
CASE InboundStat NE '' AND OutboundStat NE ''
Result = InboundStat:@VM:WMOStatus
Result = Result:WMOStatus
END CASE
RETURN
END
IF WMIKey NE '' THEN
IF WMIStatus = 'MT' OR WMIStatus = 'VOID' THEN
NULL
END ELSE
InboundStat = WMIStatus
END
END
IF WMOKey NE '' THEN
IF WMOStatus = 'RTB' OR ( WMOMakeup = 1 AND WMOStatus = 'MT' ) OR WMOStatus = 'VOID' THEN
NULL
END ELSE
OutboundStat = WMOStatus
END
END
BEGIN CASE
CASE InboundStat = '' AND OutboundStat = ''
Result = ''
CASE InboundStat = '' AND OutboundStat NE ''
Result = WMOStatus
CASE InboundStat NE '' AND OutboundStat = ''
Result = InboundStat
CASE InboundStat NE '' AND OutboundStat NE ''
Result = InboundStat:@VM
Result = Result:WMOStatus
END CASE
RETURN
END
LastStepSig = WOMatRec<WO_MAT_SIGNATURE$>[-1,'B':@VM]
Canceled = WOMatRec<WO_MAT_CANCELLED$>
SubSupplyBy = WOMatRec<WO_MAT_SUB_SUPPL_BY$>
RetRejects = WOMatRec<WO_MAT_RET_REJECTS$>
MakeupBox = WOMatRec<WO_MAT_MAKEUP_BOX$>
CurrWfrCnt = XLATE('WO_MAT',WOMatKey,'CURR_WFR_CNT','X')
NCRNos = WOMatRec<WO_MAT_NCR_KEYS$>
NCRFinalSigs = WOMatRec<WO_MAT_NCR_FINAL_SIG$>
NCRNoCnt = COUNT(NCRNos,@VM) + (NCRNos NE '')
NCRSigCnt = COUNT(NCRFinalSigs,@VM) + (NCRFinalSigs NE '')
SigProfs = WOMatRec<WO_MAT_SIG_PROFILE$>
Signatures = WOMatRec<WO_MAT_SIGNATURE$>
ProcessStart = 0
ProcessComp = 0
LOOP
Signature = Signatures<1,1>
SigProf = SigProfs<1,1>
UNTIL Signature = ''
ProcessStart = 1
Signatures = DELETE(Signatures,1,1,0)
SigProfs = DELETE(SigProfs,1,1,0)
REPEAT
IF Signature = '' AND SigProf = '' THEN ProcessComp = 1
IF NUM(SigProf[1,1]) THEN SigProf[1,1] = ''
BEGIN CASE
CASE WOMatRec<WO_MAT_SHIP_NO$> NE '' ; Result = 'SHIP'
CASE Canceled = 1 AND SubSupplyBy NE 'C' ; Result = 'CANC'
CASE Canceled = 1 AND SubSupplyBy = 'C' AND InCleanRoom ; Result = 'COMP'
CASE Canceled = 1 AND SubSupplyBy = 'C' AND NOT(InCleanRoom) ; Result = 'RTS'
CASE WOMatRec<WO_MAT_HOLD$> = 1 ; Result = 'HOLD'
CASE NCRNoCnt > 0 AND NCRNoCnt NE NCRSigCnt ; Result = 'NCR'
CASE MakeupBox AND ProcessComp AND CurrWfrCnt > 0 ; Result = 'RTU'
CASE MakeupBox AND ProcessComp AND CurrWfrCnt = 0 ; Result = 'MT'
CASE NCRNoCnt > 0 AND CurrWfrCnt = 0 AND NOT(RetRejects) ; Result = 'REJ'
CASE NCRNoCnt > 0 AND CurrWfrCnt = 0 AND RetRejects ; Result = 'RTS'
CASE CurrWfrCnt = 0 ; Result = 'MT' ;* Added 8/14/2008 JCH - Used for Prod Test Wafers
CASE ProcessComp AND NOT(InCleanRoom) ; Result = 'RTS'
CASE ProcessComp AND CurrLoc = 'CR*PKO' ; Result = 'PKO'
CASE ProcessComp AND InCleanroom ; Result = 'COMP'
CASE WOMatRec<WO_MAT_REL_DTM$> NE '' AND SigProf NE '' ; Result = SigProf
CASE WOMatRec<WO_MAT_REL_DTM$> NE '' AND NOT(InCleanRoom) ; Result = 'REL'
CASE WOMatRec<WO_MAT_RX_DTM$> NE '' ; Result = 'RX'
CASE SubSupplyBy = 'L' ; Result = 'RTP'
CASE 1 ; Result = 'AWM'
END CASE
RETURN
* * * * * * *
AddShip:
* * * * * * *
WOMatKey = Parms[1,@RM]
ShipNo = Parms[COL2()+1,@RM]
Reship = Parms[COL2()+1,@RM]
If Reship EQ '' then
Reship = False$
end
IF NOT(ASSIGNED(WOMatKey)) THEN ErrorMsg = 'Unassigned Parm "WOMatKey" passed to routine. (':Method:')'
IF NOT(ASSIGNED(ShipNo)) THEN ErrorMsg = 'Unassigned Parm "ShipNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF ShipNo = '' THEN ErrorMsg = 'Null Parm "ShipNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock
IF WOMatRec<WO_MAT_SHIP_NO$> = '' or Reship EQ True$ THEN
WOMatRec<WO_MAT_SHIP_NO$> = ShipNo
END ELSE
END
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
// Update work order SHIP_QTY_STATIC
WONo = Field(WOMatKey, '*', 1)
Work_Order_Services('UpdateShippedQty', WONo)
RETURN
* * * * * * *
RemShip:
* * * * * * *
WOMatKey = Parms[1,@RM]
ShipNo = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(WOMatKey)) THEN ErrorMsg = 'Unassigned Parm "WOMatKey" passed to routine. (':Method:')'
IF NOT(ASSIGNED(ShipNo)) THEN ErrorMsg = 'Unassigned Parm "ShipNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF ShipNo = '' THEN ErrorMsg = 'Null Parm "ShipNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock
IF WOMatRec<WO_MAT_SHIP_NO$> = ShipNo OR WOMatRec<WO_MAT_SHIP_NO$> = '' THEN
WOMatRec<WO_MAT_SHIP_NO$> = ''
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
END ELSE
obj_Tables('UnlockRec',otParms)
ErrorMsg = "Passed Ship No " :QUOTE(ShipNo): " doesn't match Ship No on WO_MAT record " :QUOTE(WOMatKey): ". (" :Method: ")"
END
RETURN
* * * * * * *
AddReship:
* * * * * * *
* Adds data entered in the WO_MAT_RESHIP window to WO_MAT record. Data entered allows new shipping labels to be printed prior to
* setting up a new delivery in SAP. The RESHIP_NO is added in the AddShip method when the delivery data is received from SAP.
WOMatKey = Parms[1,@RM]
ReshipDt = Parms[COL2()+1,@RM]
ReshipReason = Parms[COL2()+1,@RM]
ReshipCustNo = Parms[COL2()+1,@RM]
ReshipCustPartNo = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF ReshipDt = '' THEN ErrorMsg = 'Null Parm "ReshipDt" passed to routine. (':Method:')'
IF ReshipReason = '' THEN ErrorMsg = 'Null Parm "ReshipReason" passed to routine. (':Method:')'
IF ReshipCustNo = '' THEN ErrorMsg = 'Null Parm "ReshipCustNo" passed to routine. (':Method:')'
IF ReshipCustPartNo = '' THEN ErrorMsg = 'Null Parm "ReshipCustPartNo" passed to routine. (':Method:')'
IF ErrorMsg = '' THEN RETURN
thisReshipDt = ICONV(ReshipDt,'D')
IF thisReshipDt = '' THEN
ErrorMsg = 'Invalid Data ':QUOTE(ReshipDt):' for Parm "ReshipDt" passed to routine. (':Method:')'
RETURN
END
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock
WOMatRec<WO_MAT_RESHIP_DT$> = thisReshipDt
WOMatRec<WO_MAT_RESHIP_REASON$> = ReshipReason
WOMatRec<WO_MAT_RESHIP_CUST_NO$> = ReshipCustNo
WOMatRec<WO_MAT_RESHIP_CUST_PART_NO$> = ReshipCustPartNo
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
RETURN
* * * * * *
SetPartNo:
* * * * * *
WOMatKeys = Parms[1,@RM]
NewPartNo = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(WOMatKeys)) THEN ErrorMsg = 'Unassigned Parm "WOMatKeys" passed to routine. (':Method:')'
IF NOT(ASSIGNED(NewPartNo)) THEN ErrorMsg = 'Unassigned Parm "NewPartNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF WOMatKeys = '' THEN ErrorMsg = 'Null Parm "WOMatKeys" passed to routine. (':Method:')'
IF NewPartNo = '' THEN ErrorMsg = 'Null Parm "NewPartNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WOMatKeys
WOMatTableVar = obj_Tables('LockSet',otParms) ;* Locks all WO_Mat records to be updated
IF Get_Status(errCode) THEN RETURN ;* Problems getting the locks
WOMatCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
AllRDSNos = ''
FOR I = 1 TO WOMatCnt
WOMatKey = WOMatKeys<1,I>
READV RDSNos FROM WOMatTableVar,WOMatKey,WO_MAT_RDS_NO$ THEN
AllRDSNos := RDSNos:@VM
END
NEXT I
AllCnt = COUNT(AllRDSNos,@VM) + (AllRDSNos NE '')
ActiveRDSNos = ''
FOR I = 1 TO AllCnt
IF AllRDSNos<1,I> NE '' THEN
ActiveRDSNos<1,-1> = AllRDSNos <1,I>
END
NEXT I
IF ActiveRDSNos NE '' THEN
rtParms = 'RDS':@RM:ActiveRdsNos
RDSTableVar = obj_Tables('LockSet',rtParms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
obj_Tables('UnlockSet','WO_MAT':@RM:WOMatKeys:@RM:WOMatTableVar) ;* Unlock WO_MAT records
RETURN
END
obj_RDS('SetPartNo',AllRDSNos:@RM:NewPartNo:@RM:RDSTableVar) ;* Updates & unlocks RDS records
END ;* End of check for RDSNos
FOR I = 1 TO WOMatCnt
WOMatKey = WOMatKeys<1,I>
READ WOMatRec FROM WOMatTableVar,WOMatKey THEN
WOMatRec<WO_MAT_CUST_PART_NO$> = NewPartNo
otParms = 'WO_MAT':@RM:WOMatKey:@RM:WOMatTableVar:@RM:WOMatRec
obj_Tables('WriteRec',otParms) ;* Writes and unlocks WOMat record
Send_Info('WO_MAT record: ':WOMatKey:' updated. ':I:'/':WOMatCnt)
END
NEXT I
Send_Info(' ')
RETURN
* * * * * * *
RefreshSigProfile:
* * * * * * *
WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatKey)) THEN ErrorMsg = 'Unassigned Parm "WOMatKey" passed to routine. (':Method:')'
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadOnlyRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock
GOSUB CassSigProfile ;* Local method returns CassSigProfile from Spec
SpecSigProfile = Result
SpecSignatures = ''
SpecDTMs = ''
SpecVers = ''
Result = '' ;* Clear result variable
NewSignatures = ''
NewSigDTMs = ''
SigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
Signatures = WOMatRec<WO_MAT_SIGNATURE$>
SigDTMS = WOMatRec<WO_MAT_SIG_DTM$>
SigVers = WOMatRec<WO_MAT_SIG_VER$>
IF SigProfile = SpecSigProfile THEN
obj_Tables('UnlockRec',otParms)
RETURN ;* Nothing to do here
END
SpecCnt = COUNT(SpecSigProfile,@VM) + (SpecSigProfile NE '')
FOR I = 1 TO SpecCnt
SpecProfItem = SpecSigProfile<1,I>
* Look for new PItem in Existing Profile
LOCATE SpecProfItem IN SigProfile USING @VM SETTING Pos THEN
SpecSignatures<1,I> = Signatures<1,Pos>
SpecDTMs<1,I> = SigDTMs<1,Pos>
SpecVers<1,I> = SigVers<1,Pos>
SigProfile = DELETE(SigProfile,1,Pos,0) ;* Pulls lines from existing -> deleted sigs left
Signatures = DELETE(Signatures,1,Pos,0) ;* at end of loop - SAVE for possible reporting JCH 1/31/2013
SigDTMs = DELETE(SigDTMs,1,Pos,0) ;*
SigVers = DELETE(SigVers,1,Pos,0) ;*
END ELSE
* Check for FWI or LWI newer profile being stored as old 'WFR'
IF SpecProfItem[2,3] = 'FWI' OR SpecProfItem[2,3] = 'LWI' THEN
WfrString = SpecProfItem[2,3] ;* LWI or FWI
SWAP WfrString WITH 'WFR' IN SpecProfItem ;* Update WfrString
LOCATE SpecProfItem IN SigProfile USING @VM SETTING Pos THEN
SpecSignatures<1,I> = Signatures<1,Pos>
SpecDTMs<1,I> = SigDTMs<1,Pos>
SpecVers<1,I> = SigVers<1,Pos>
END
END ELSE
* New item in Spec Sig -> won't be signed
END
END
NEXT I
WOMatRec<WO_MAT_SIG_PROFILE$> = SpecSigProfile
WOMatRec<WO_MAT_SIGNATURE$> = SpecSignatures
WOMatRec<WO_MAT_SIG_DTM$> = SpecDTMs
WOMatRec<WO_MAT_SIG_VER$> = SpecVers
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteOnlyRec',otParms)
RETURN
* * * * * * *
SetWfrQty:
* * * * * * *
WOMatKey = Parms[1,@RM]
WfrQty = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(WOMatKey)) THEN ErrorMsg = 'Unassigned Parm "WOMatKey" passed to routine. (':Method:')'
IF NOT(ASSIGNED(WfrQty)) THEN ErrorMsg = 'Unassigned Parm "WfrQty" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF WfrQty = '' THEN ErrorMsg = 'Null Parm "WfrQty" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock
CurrWfrQty = WOMatRec<WO_MAT_WAFER_QTY$>
CurrSlots = WOMatRec<WO_MAT_SLOT_NO$>
ReactorType = Xlate('WO_MAT', WOMatKey, 'REACTOR_TYPE', 'X')
EpiPro = ( (ReactorType EQ 'EPP') or (ReactorType EQ 'EpiPro') )
BEGIN CASE
CASE WfrQty > CurrWfrQty
// Adding wafers
WOMatRec<WO_MAT_WAFER_QTY$> = WfrQty ;* Update Wafer Qty
FOR I = 1 TO WfrQty
WOMatRec<WO_MAT_SLOT_NO$,I> = I ;* Add new slots
NEXT I
CASE WfrQty = CurrWfrQty
// No quantity change
FOR I = 1 TO WfrQty
WOMatRec<WO_MAT_SLOT_NO$,I> = I ;* Refresh slot numbers in slot values
NEXT I
CASE WfrQty < CurrWfrQty
// Removing wafers
EligibleWfrList = ''
FOR I = 1 TO CurrWfrQty
NCRNo = WOMatRec<WO_MAT_SLOT_NCR$,I>
MetNo = WOMatRec<WO_MAT_SLOT_MET_NO$,I>
MovedTo = WOMatRec<WO_MAT_SLOT_MOVED_TO$,I>
ReplacedBy = WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I>
IF NCRNo = '' AND MetNo = '' AND MovedTo = '' AND ReplacedBy = '' then EligibleWfrList<-1> = I
NEXT I
NumEligibleWfrs = DCount(EligibleWfrList, @FM)
DiffQty = CurrWfrQty - WfrQty
If NumEligibleWfrs GE DiffQty then
// We have enough wafers, so remove enough to make cassette quantity equal the desired quantity
Loop
Until CurrWfrQty EQ WfrQty
BottomIndex = EligibleWfrList<NumEligibleWfrs>
WfrToRemove = BottomIndex
WOMatRec<WO_MAT_SLOT_NO$, WfrToRemove> = ''
CurrWfrQty -= 1
NumEligibleWfrs -= 1
Repeat
WOMatRec<WO_MAT_WAFER_QTY$> = WfrQty ;* Update Wafer Qty
end else
ErrorMsg = 'This cassette cannot be reduced to ':WfrQty:' wafers because only ':NumEligibleWfrs:' are eligible to be removed. '
end
END CASE
If ErrorMsg EQ '' then
If EpiPro then
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
If WMIKey NE '' then
WMIRec = Database_Services('ReadDataRow', 'WM_IN', WMIKey)
If Error_Services('NoError') then
WMIRec<WM_IN_SLOT_NO$> = WOMatRec<WO_MAT_SLOT_NO$>
Database_Services('WriteDataRow', 'WM_IN', WMIKey, WMIRec, True$, False$, True$)
end
end
end
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms) ; // This will release the lock
Result = CurrWfrQty
end else
RecordLocked = Database_Services('IsKeyIDLocked', 'WO_MAT', WOMatKey, False$)
If RecordLocked then Database_Services('ReleaseKeyIDLock', 'WO_MAT', WOMatKey)
end
RETURN
* * * * * * *
UpdateSpec:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
WONo = WOMatKey[1,'*']
IF WONo < 128680 THEN RETURN ;* This is the first WO No on 7/29/2005 - The day we cut over to the new system.
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
GOSUB CurrStatus
CurrStatus = Result[-1,'B':@VM]
Result = ''
IF CurrStatus = 'PKO' THEN RETURN
IF CurrStatus = 'BLD' THEN RETURN
IF CurrStatus = '' THEN RETURN
IF CurrStatus = 'MT' THEN RETURN
IF CurrStatus = 'RTU' THEN RETURN
IF CurrStatus = 'REJ' THEN RETURN
IF WOMatRec<WO_MAT_VOID$> NE '' THEN RETURN
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN RETURN
IF WOMatRec<WO_MAT_CANCELLED$> NE '' THEN RETURN
IF WOMatRec<WO_MAT_SIG_PROFILE$> = '' THEN RETURN
LastSigPos = COUNT(WOMatRec<WO_MAT_SIG_PROFILE$>,@VM) + (WOMatRec<WO_MAT_SIG_PROFILE$> NE '')
IF WOMatRec<WO_MAT_SIGNATURE$,LastSigPos> = '' THEN
Result = 1
END ELSE
Result = ''
END
RETURN
* * * * * * *
PartNo:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
WONo = WOMatKey[1,'*']
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
OrdNo = XLATE('WO_LOG',WONo,WO_LOG_ORDER_NO$,'X')
OrdDetKey = OrdNo:'*':WOMatRec<WO_MAT_ORDER_ITEM$>
OrdDetRec = XLATE('ORDER_DET',OrdDetKey,'','X')
CustPN = OrdDetRec<ORDER_DET_CUST_PN$>
SubPN = OrdDetRec<ORDER_DET_SUB_PART_NO$>
Supplier = SubPN[-1,'B-']
IF Supplier[1,1] = 'I' AND LEN(Supplier) = 2 ELSE Supplier = ''
ProcStepPSNs = XLATE('ORDER_DET',OrdDetKey,'QUOTE_PROC_STEP_PSN','X')
PsnID = ProcStepPSNs
CONVERT @VM TO '.' IN PsnID
PartWorkKey = CustPN:'*':SubPN:'*':PsnID:'*':Supplier ;* Determines a unique part number
IF PartWorkKey NE '****' THEN
Result = XLATE('PART_WORK',PartWorkKey,1,'X') ;* Finally, get the new part number
END
RETURN
* * * * * * *
FinalSigComp:
* * * * * * *
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
WONo = WOMatKey[1,'*']
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
SigProfCnt = COUNT(WOMatRec<WO_MAT_SIG_PROFILE$>,@VM) + (WOMatRec<WO_MAT_SIG_PROFILE$> NE '')
IF WOMatRec<WO_MAT_SIGNATURE$,SigProfCnt> = '' THEN
Result = 0
END ELSE
Result = 1
END
RETURN
* * * * * * *
SetSAPBatch:
* * * * * * *
FileIn = Parms[1,@RM]
CassID = FileIn<1,1>
SAPBatchNo = FileIn<1,2>
ErrFields = ''
ErrValues = ''
ErrDescs = ''
ErrCnt = 0
IF CassID = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'CASS_ID'
ErrDescs<1,ErrCnt> = 'Null Value'
ErrValues<1,ErrCnt> = '<null>'
END
IF SAPBatchNo = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'SAP_BATCH_NO'
ErrDescs<1,ErrCnt> = 'Null Value'
ErrValues<1,ErrCnt> = '<null>'
END
CONVERT '.' TO '*' IN CassID
IF NUM(CassID) THEN
* RDS
IF RowExists('REACT_RUN',CassID) THEN
ReactRunRec = XLATE('REACT_RUN',CassID,'','X')
WONo = ReactRunRec<REACT_RUN_WO_NO$>
CassNo = ReactRunRec<REACT_RUN_CASS_NO$>
END ELSE
ErrCnt += 1
ErrFields<1,ErrCnt> = 'RDS No'
ErrDescs<1,ErrCnt> = 'React Run record not on file.'
ErrValues<1,ErrCnt> = CassID
WONo = ''
CassNo = ''
END
END ELSE
* WM_OUT
WONo = CassID[1,'*']
CassNo = CassID[-1,'B*']
END
OPEN 'DICT.WO_MAT' TO SAPDictVar ELSE
RETURN
END
SearchString = 'SAP_BATCH_NO':@VM:SAPBatchNo:@FM
ExistingWOMatKey = ''
Option = ''
Flag = ''
Btree.Extract(SearchString,'WO_MAT',SAPDictVar,ExistingWOMatKey,Option,Flag)
IF Get_Status(errCode) THEN RETURN
IF ExistingWOMatKey NE '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'SAP_BATCH_NO'
ErrDescs<1,ErrCnt> = QUOTE(SAPBatchNo):' already exists in WOMat record ':QUOTE(ExistingWOMatKey)
ErrValues<1,ErrCnt> = SAPBatchNo
END
IF WONo = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'WO_MAT'
ErrDescs<1,ErrCnt> = 'Null WONo'
ErrValues<1,ErrCnt> = ''
END
IF CassNo = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'WO_MAT'
ErrDescs<1,ErrCnt> = 'Null CassNo'
ErrValues<1,ErrCnt> = ''
END
IF WONo NE '' AND CassNo NE '' THEN
IF RowExists('WO_LOG',WONo) THEN
IF RowExists('WO_MAT',WONo:'*':CassNo) Then
CurrBatchNo = Xlate('WO_MAT',WONo:'*':CassNo,WO_MAT_SAP_BATCH_NO$,'X')
If CurrBatchNo NE '' And CurrBatchNo NE SAPBatchNo Then
If CurrBatchNo NE 0 then
ErrCnt += 1
ErrFields<1,ErrCnt> = 'SAP_BATCH_NO'
ErrDescs<1,ErrCnt> = QUOTE(WONo:'*':CassNo):' already has SAP Batch No ':QUOTE(CurrBatchNo)
ErrValues<1,ErrCnt> = SAPBatchNo
END
end
End ELSE
ErrCnt += 1
ErrFields<1,ErrCnt> = 'WO_MAT_KEY'
ErrDescs<1,ErrCnt> = 'WOMat record not on file.'
ErrValues<1,ErrCnt> = WONo:'*':CassNo
END
END ELSE
ErrCnt += 1
ErrFields<1,ErrCnt> = 'WO_NO'
ErrDescs<1,ErrCnt> = 'WO Log record not on file.'
ErrValues<1,ErrCnt> = WONo
END
END
IF ErrFields NE '' THEN
LogNo = NextKey('SAP_LOG')
LogRec = ''
LogRec<SAP_LOG_TIMESTAMP$> = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT')
LogRec<SAP_LOG_LOG_DESC$> = 'Batch ID error from SAP'
LogRec<SAP_LOG_PROD_ORD_NO$> = WONo:'*':CassNo
LogRec<SAP_LOG_FIELD_NAME$> = ErrFields
LogRec<SAP_LOG_ERR_DESC$> = ErrDescs
LogRec<SAP_LOG_SAP_VALUE$> = ErrValues
logParms = 'SAP_LOG':@RM:LogNo:@RM:@RM:LogRec
obj_Tables('WriteRec',logParms)
Message = 'Batch ID error from SAP':CRLF$:CRLF$
fCnt = Count(ErrFields,@VM) + (ErrFields NE '')
For N = 1 To fCnt
Message := FMT(ErrFields<1,N>, "L#20")' ':FMT(ErrValues<1,N>, "L#20"):' ':ErrDescs<1,N>:CRLF$
Next I
Recipients = Xlate('SEC_GROUPS', 'SAP_ADMIN', 'USER', 'X')
SentFrom = "SAP Posting Process"
Subject = 'SAP Error Logged ':LogNo
AttachWindow = 'SAP_LOG'
AttachKey = LogNo
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
Result = 1
RETURN
END ELSE
oblParms = 'WO_MAT':@RM
oblParms := WONo:'*':CassNo:@RM
oblParms := WO_MAT_SAP_BATCH_NO$:@RM
oblParms := SAPBatchNo
// Log this event
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = WONo:'*':CassNo
LogData<3> = SAPBatchNo
Logging_Services('AppendLog', objSAPLog, LogData, @RM, @FM)
obj_Post_Log('Create',oblParms)
UnReleasedQty = Xlate('WO_LOG',WONo,'UNREL_QTY','X') ;* 10/8/2014 DKK & JCH
IF UnReleasedQty = 0 THEN
AllCassIDs = XLATE('WO_LOG',WONo,WO_LOG_WO_MAT_KEY$,'X')
AllCassBatchNos = XLATE('WO_MAT',AllCassIDs,WO_MAT_SAP_BATCH_NO$,'X')
AllCassCnt = COUNT(AllCassIDs,@VM) + (AllCassIDs NE '')
OpenCassIDs = ''
FOR N = 1 TO AllCassCnt
IF AllCassBatchNos<1,N> = '' THEN
OpenCassIDs<-1> = AllCassIDs<1,N>
END
UNTIL INDEX(OpenCassIDs,@FM,1)
NEXT N
IF INDEX(OpenCassIDs,@FM,1) THEN
* More than 1 box still open
NULL
END ELSE
IF OpenCassIDs = WONo:'*':CassNo OR OpenCassIDs<1,1> = WONo:'*':(CassNo + 1) OR OpenCassIds = '' THEN
* All Done with work order
CurrDTM = ICONV(obj_Calendar('CurrDTM'),'DT')
CurrDt = Date()
WOLogFields = WO_LOG_WO_STOP_DTM$:@VM:WO_LOG_CLOSE_DATE$ ;* Stop data added
WOLogVals = CurrDTM:@VM:CurrDt
WOQty = XLATE('WO_LOG',WONo,'WO_QTY','X')
SAPConfirmScrapQty = XLATE('WO_LOG',WONo,'SAP_CONFIRM_SCRAP_QTY','X')
SAPYieldQty = XLATE('WO_LOG',WONo,'SAP_YIELD_QTY','X')
IF (SAPConfirmScrapQty + SAPYieldQty) = WOQty THEN
WOLogFields = WO_LOG_WO_STOP_DTM$:@VM:WO_LOG_CLOSE_DATE$ ;* Stop data added
WOLogVals = CurrDTM:@VM:CurrDt
obj_Post_Log('Create','WO_LOG':@RM:WONo:@RM:WOLogFields:@RM:WOLogVals) ;* Add values to WO_LOG record
* * * * * * Added check for EpiPRO Last inbound box w/o and outbound box and then check for PROD_TEST_WAFERS **** * * * * * * * * * * * * * * * * * * *
WORec = XLATE('WO_LOG',WONo,'','X')
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
WMIKeys = XLATE('WO_MAT',WOMatKeys,WO_MAT_WMI_KEY$,'X')
WMOKeys = XLATE('WO_MAT',WOMatKeys,WO_MAT_WMO_KEY$,'X')
LOOP
WMOKey = WMOKeys[-1,'B':@VM]
UNTIL WMOKey NE '' OR WMOKeys = ''
WMOKeys[COL1(),99] = ''
REPEAT
InCnt = COUNT(WMIKeys,@VM) + (WMIKeys NE '')
OutCnt = COUNT(WMOKeys,@VM) + (WMOKeys NE '')
IF InCnt > OutCnt THEN
InOnlyKeys = FIELD(WMIKeys,@VM,OutCnt+1,4)
InProdTest = SUM(XLATE('WM_IN',InOnlyKeys,'TW_PROD','X'))
IF InProdTest > 0 THEN
InWMIKey = InOnlyKeys<1,1>
InCassNo = FIELD(InWMIKey,'*',3,1) ;* Cassette is the last part of the key
WOMatRec = XLATE('WO_MAT',WONo:'*':InCassNo,'','X')
SupplierLotNo = WOMatRec<WO_MAT_LOT_NO$>
ProdOrdNo = WORec<WO_LOG_PROD_ORD_NO$>
ProdVerRec = XLATE('PROD_VER',WOMatRec<WO_MAT_PROD_VER_NO$>,'','X')
CustNo = ProdVerRec<PROD_VER_CUST_NO$>
VendCd = XLATE('COMPANY',CustNo,COMPANY_VEND_CD$,'X')
SubPartNo = ProdVerRec<PROD_VER_SUB_PART_NO$>
CustPartRev = ProdVerRec<PROD_VER_CUST_PART_REV$>
CassID = WONo:'.':InCassNo
IF VendCd NE '' THEN
SubSuppCd = VendCd
END ELSE
IF SubPartNo MATCHES "6N'-'1A'-'2A" THEN
SubSuppCd = FIELD(SubPartNo,'-',3)
END ELSE
SubSuppCd = WOMatRec<WO_MAT_SUB_VEND_CD$>
SubSuppCd = XLATE('SEMI_VEND_CODE',SubSuppCd,SEMI_VEND_CODE_EPI_VEND_CD$,'X')
END
END
If ReactorType NE 'GAN' then
GRProps = obj_WO_Mat('GetGRProps',WONo:'*':InCassNo:@RM)
end else
GRProps = GaN_Services('GetGaNGRProps', WONo:'*':InCassNo)
end
GRWfrQty = GRProps[1,@FM]
ScrapQty = GRProps[COL2()+1,@FM]
ProdTWQty = GRProps[COL2()+1,@FM]
AvailMUWfrQty = GRProps[COL2()+1,@FM]
MUCassIDs = GRProps[COL2()+1,@FM]
MUCassQtys = GRProps[COL2()+1,@FM]
MakeupFlag = 0
MUCassID = FIELD(MUCassIDs,@VM,1)
MUCassQty = FIELD(MUCassQtys,@VM,1)
MUBatchNo = XLATE('WO_MAT',MUCassID,WO_MAT_SAP_BATCH_NO$,'X')
* Have all of the parameters need to send this to SAP to balance the Work Order
atParms = 'CASS_COMP':@RM
atParms := WORec<WO_LOG_PROD_ORD_NO$>:@RM
atParms := WONo:@RM
atParms := InCassNo:@RM
atParms := GRWfrQty:@RM
atParms := ScrapQty:@RM
atParms := ProdTWQty:@RM
atParms := CassID:@RM
atParms := WOMatRec<WO_MAT_LOT_NO$>:@RM
atParms := SubSuppCd:@RM
atParms := CustPartRev:@RM
atParms := MakeupFlag:@RM
atParms := MUBatchNo:@RM
atParms := MUCassQty
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = RetStack()<1>
LogData<3> = WORec<WO_LOG_PROD_ORD_NO$>
LogData<4> = WONo
LogData<5> = InCassNo
LogData<6> = GRWfrQty
LogData<7> = ScrapQty
LogData<8> = ProdTWQty
LogData<9> = CassID
LogData<10> = WOMatRec<WO_MAT_LOT_NO$>
LogData<11> = SubSuppCd
LogData<12> = CustPartRev
LogData<13> = MakeupFlag
LogData<14> = MUBatchNo
LogData<15> = MUCassQty
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
obj_SAP('AddTransaction',atParms)
END ;* End of check for Inbound Product Test wafers
END ;* End of check for more WM_In records than WM_Out records
END ELSE
Recipients = Xlate('SEC_GROUPS', 'SAP_ADMIN', 'USER', 'X')
SentFrom = "obj_WO_Mat -> SetSAPBatch"
Subject = 'Unable to auto Close Work Order ':WONo:' ':CassNo:' ':SAPBatchNo
Message = 'Stopped at ':TimeDate()
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then
AttachWindow = 'NDW_WO_LOG'
end else
AttachWindow = 'WO_LOG2'
end
AttachKey = WONo
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
END ;* End of check for WO quantities balanced
END ;* End of check for this being the only box
END ;* End of check for Multiple Open Cass ID's
END ;* End of check for fully released Work Order ;* 10/8/2014 DKK & JCH
Result = 1
END
RETURN
* * * * * * *
GetCycleTime:
* * * * * * *
CassID = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
StartEvent = Parms[COL2()+1,@RM]
StopEvent = Parms[COL2()+1,@RM]
IF CassID = '' THEN RETURN
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',CassID,'','X')
IF WOMatRec = '' THEN RETURN
END
IF StartEvent = '' THEN RETURN
IF StopEvent = '' THEN RETURN
StartDTM = ''
StopDTM = ''
WONo = CassID[1,'*']
ReactType = XLATE('WO_LOG',WONo,'REACTOR_TYPE','X') ;* Variable not used in method JCH 8/28/2014
BEGIN CASE
CASE StartEvent = 'PTI'
LOCATE 'PTI' IN WOMatRec<WO_MAT_INV_LOCATION$> USING @VM SETTING StartPos THEN
StartDTM = WOMatRec<WO_MAT_INV_DTM$,StartPos>
END
CASE StartEvent = 'VER'
LastRDSNo = WOMatRec<WO_MAT_RDS_NO$>[-1,'B':@VM]
StartDTM = XLATE('REACT_RUN',LastRDSNo,REACT_RUN_VER_SIG_DTM$,'X')
CASE StartEvent = 'REL'
StartDTM = WOMatRec<WO_MAT_REL_DTM$>
CASE StartEvent = 'QA'
SigCnt = COUNT(WOMatRec<WO_MAT_SIGNATURE$>,@VM) + (WOMatRec<WO_MAT_SIGNATURE$> NE '')
StartDTM = WOMatRec<WO_MAT_SIG_DTM$,SigCnt>
CASE StartEvent = 'RB'
LOCATE 'RB' IN WOMatRec<WO_MAT_INV_LOCATION$> USING @VM SETTING StartPos THEN
StartDTM = WOMatRec<WO_MAT_INV_DTM$,StartPos>
END
END CASE
BEGIN CASE
CASE StopEvent = 'QA'
SigCnt = COUNT(WOMatRec<WO_MAT_SIGNATURE$>,@VM) + (WOMatRec<WO_MAT_SIGNATURE$> NE '')
StopDTM = WOMatRec<WO_MAT_SIG_DTM$,SigCnt>
CASE StopEvent = 'PTO'
InvLocations = WOMatRec<WO_MAT_INV_LOCATION$>
LOOP
Loc = InvLocations[-1,'B':@VM]
UNTIL Loc = 'PTO' OR InvLocations = ''
InvLocations[COL1(),99] = ''
REPEAT
Pointer = COUNT(InvLocations,@VM) + (InvLocations NE '')
IF Pointer > 0 THEN
StopDTM = WOMatRec<WO_MAT_INV_DTM$,Pointer>
END
CASE StopEvent = 'SB'
LOCATE 'SB' IN WOMatRec<WO_MAT_INV_LOCATION$> USING @VM SETTING StopPos THEN
StopDTM = WOMatRec<WO_MAT_INV_DTM$,StopPos>
END
CASE StopEvent = 'VER'
LastRDSNo = WOMatRec<WO_MAT_RDS_NO$>[-1,'B':@VM]
StopDTM = XLATE('REACT_RUN',LastRDSNo,REACT_RUN_VER_SIG_DTM$,'X')
END CASE
IF StartDTM NE '' AND StopDTM NE '' AND StopDTM NE '0' THEN
Result = ICONV((StopDTM - StartDTM)*24,'MD1')
END
RETURN
* * * * * * *
GetQAMet:
* * * * * * *
CassID = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
WOStep = Parms[COL2()+1,@RM]
RunStep = Parms[COL2()+1,@RM]
MetFields = Parms[COL2()+1,@RM]
IF CassID = '' THEN RETURN
IF WOStep = '' THEN RETURN
IF RunStep = '' THEN RETURN
IF MetFields = '' THEN
MetFields = WO_MAT_MET_PROFILE$:@VM
MetFields := WO_MAT_MET_RUN_STEP$:@VM
MetFields := WO_MAT_MET_MIN$:@VM
MetFields := WO_MAT_MET_MAX$:@VM
MetFields := WO_MAT_MET_RESULT$:@VM
MetFields := WO_MAT_MET_SLOT$:@VM
MetFields := WO_MAT_MET_SIG$:@VM
MetFields := WO_MAT_MET_SIG_DTM$:@VM
MetFields := WO_MAT_MET_SLOT_TEST$:@VM
MetFields := WO_MAT_MET_STD_MAX$:@VM
MetFields := WO_MAT_MET_STD_RESULT$:@VM
MetFields := WO_MAT_MET_RECIPE$:@VM
MetFields := WO_MAT_MET_RECIPE_PATTERN$:@VM
MetFields := WO_MAT_MET_PROP$:@VM
MetFields := WO_MAT_MET_TOOL_CLASS$:@VM
MetFields := WO_MAT_MET_WFR_QTY$:@VM
MetFields := WO_MAT_MET_WFR_TYPE$
END
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',CassID,'','X')
IF WOMatRec = '' THEN RETURN
END
MetTests = WOMatRec<WO_MAT_MET_PROFILE$>
MetRunSteps = WOMatRec<WO_MAT_MET_RUN_STEP$>
FieldCnt = COUNT(MetFields,@VM) + (MetFields NE '')
MetCnt = COUNT(MetTests,@VM) + (MetTests NE '')
LineCnt = 1
Ans = ''
FOR I = 1 TO MetCnt
MetWOStep = MetTests<1,I>[1,1]
IF MetWOStep = WOStep AND WOMatRec<WO_MAT_MET_RUN_STEP$,I> = RunStep THEN
FOR N = 1 TO FieldCnt
MetField = MetFields<1,N>
IF MetField = WO_MAT_MET_PROFILE$ THEN
Ans<N,LineCnt> = WOMatRec<MetField,I>[2,99] ;* Profile (test) field has stage embedded in the 1st character
END ELSE
Ans<N,LineCnt> = WOMatRec<MetField,I>
END
NEXT N
LineCnt += 1
END
NEXT I
Result = Ans
RETURN
* * * * * * *
GetMUCassIDs:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
END
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
MUCassIDs = ''
MUCassQtys = ''
IF WMOKey NE '' THEN
WMORec = XLATE('WM_OUT',WMOKey,'','X')
SlotNos = WMORec<WM_OUT_SLOT_NO$>
SlotCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
FOR I = 1 TO SlotCnt
IF WMORec<WM_OUT_MU_WO_NO$,I> NE '' THEN
MUCassID = WMORec<WM_OUT_MU_WO_NO$,I>:'*':WMORec<WM_OUT_MU_CASS_NO$,I>
LOCATE MUCassID IN MUCassIDs USING @VM SETTING Pos ELSE
MUCassIDs = INSERT(MUCassIDs,1,Pos,0,MUCassID) ;* @MV'd list of CassIDs used for makeup
END
END
NEXT I
END ELSE
SlotIDs = WOMatRec<WO_MAT_SLOT_NO$>
SlotCnt = COUNT(SlotIDs,@VM) + (SlotIDs NE '')
FOR I = 1 TO SlotCnt
IF WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I> NE '' THEN
MUCassID = FIELD(WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I>,'.',1,2)
CONVERT '.' TO '*' IN MUCassID
LOCATE MUCassID IN MUCassIDs USING @VM SETTING Pos ELSE
MUCassIDs = INSERT(MUCassIDs,1,Pos,0,MUCassID) ;* @MV'd list of CassIDs used for makeup
END
END
NEXT I
END
Result = MUCassIDs
RETURN
* * * * * * * *
GetMUAddedDTMS:
* * * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
END
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
MUCassIDs = ''
MUCassQtys = ''
IF WMOKey NE '' THEN
WMORec = XLATE('WM_OUT',WMOKey,'','X')
SlotNos = WMORec<WM_OUT_SLOT_NO$>
SlotCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
AddedDTMS = WMORec<WM_OUT_MU_WAFER_ADDED_DTM$>
MUAddedDTMS = ''
FOR I = 1 TO SlotCnt
IF WMORec<WM_OUT_MU_WO_NO$,I> NE '' THEN
MUCassID = WMORec<WM_OUT_MU_WO_NO$,I>:'*':WMORec<WM_OUT_MU_CASS_NO$,I>
LOCATE MUCassID IN MUCassIDs USING @VM SETTING Pos ELSE
ThisDTM = AddedDTMS<1, Pos>
MostRecentDTM = ThisDTM[1, @SVM]
MUAddedDTMS = Insert(MUAddedDTMS, 1, Pos, 0, MostRecentDTM)
END
END
NEXT I
END ELSE
SlotIDs = WOMatRec<WO_MAT_SLOT_NO$>
SlotCnt = COUNT(SlotIDs,@VM) + (SlotIDs NE '')
AddedDTMS = WOMatRec<WO_MAT_MU_WAFER_ADDED_DTM$>
MUAddedDTMS = ''
FOR I = 1 TO SlotCnt
IF WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I> NE '' THEN
MUCassID = FIELD(WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I>,'.',1,2)
CONVERT '.' TO '*' IN MUCassID
LOCATE MUCassID IN MUCassIDs USING @VM SETTING Pos ELSE
ThisDTM = AddedDTMS<1, Pos>
MostRecentDTM = ThisDTM[1, @SVM]
MUAddedDTMS = Insert(MUAddedDTMS, 1, Pos, 0, MostRecentDTM)
END
END
NEXT I
END
Result = MUAddedDTMS
RETURN
* * * * * * * * *
GetMURemovedDTMS:
* * * * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
END
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
MUCassIDs = ''
MUCassQtys = ''
IF WMOKey NE '' THEN
WMORec = XLATE('WM_OUT',WMOKey,'','X')
SlotNos = WMORec<WM_OUT_SLOT_NO$>
SlotCnt = COUNT(SlotNos,@VM) + (SlotNos NE '')
RemovedDTMS = WMORec<WM_OUT_MU_WAFER_REMOVED_DTM$>
MURemovedDTMS = ''
FOR I = 1 TO SlotCnt
IF WMORec<WM_OUT_MU_WO_NO$,I> NE '' THEN
MUCassID = WMORec<WM_OUT_MU_WO_NO$,I>:'*':WMORec<WM_OUT_MU_CASS_NO$,I>
LOCATE MUCassID IN MUCassIDs USING @VM SETTING Pos ELSE
ThisDTM = RemovedDTMS<1, Pos>
MostRecentDTM = ThisDTM[1, @SVM]
MURemovedDTMS = Insert(MURemovedDTMS, 1, Pos, 0, MostRecentDTM)
END
END
NEXT I
END ELSE
SlotIDs = WOMatRec<WO_MAT_SLOT_NO$>
SlotCnt = COUNT(SlotIDs,@VM) + (SlotIDs NE '')
RemovedDTMS = WOMatRec<WO_MAT_MU_WAFER_REMOVED_DTM$>
MURemovedDTMS = ''
FOR I = 1 TO SlotCnt
IF WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I> NE '' THEN
MUCassID = FIELD(WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I>,'.',1,2)
CONVERT '.' TO '*' IN MUCassID
LOCATE MUCassID IN MUCassIDs USING @VM SETTING Pos ELSE
ThisDTM = RemovedDTMS<1, Pos>
MostRecentDTM = ThisDTM[1, @SVM]
MURemovedDTMS = Insert(MURemovedDTMS, 1, Pos, 0, MostRecentDTM)
END
END
NEXT I
END
Result = MURemovedDTMS
RETURN
* * * * * * *
GetEventLog:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
*Result<1,-1> = 'SAP Transmit':@SVM:OCONV(WOMatRec<WO_MAT_SAP_TX_DTM$>,'DT4/^S'):@SVM
Result<1,-1> = 'Received':@SVM:OCONV(WOMatRec<WO_MAT_RX_DTM$>,'DT4/^S'):@SVM:WOMatRec<WO_MAT_RX_BY$>
Result<1,-1> = 'Released':@SVM:OCONV(WOMatRec<WO_MAT_REL_DTM$>,'DT4/^S'):@SVM:WOMatRec<WO_MAT_REL_BY$>
RETURN
* * * * * * *
GetADERead:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKEy,'','X')
StepCnt = COUNT(WOMatRec<WO_MAT_RDS_NO$>,@VM) + (WOMatRec<WO_MAT_RDS_NO$> NE '')
ADEProfile = StepCnt:'ADE'
LOCATE ADEProfile IN WOMatRec<WO_MAT_MET_PROFILE$> USING @VM SETTING Pos THEN
Result = WOMatRec<WO_MAT_MET_RESULT$,Pos>
END ELSE
Result = ''
END
RETURN
* * * * * * *
CheckSigOrder:
* * * * * * *
WOMatKey = Parms[1,@RM]
SigProfItem = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF SigProfItem = '' THEN ErrorMsg = 'Null Parm "SigProfItem" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
LOCATE SigProfItem IN WOMatRec<WO_MAT_SIG_PROFILE$> USING @VM SETTING Pos THEN
BEGIN CASE
Case SigProfItem EQ '1LOAD'
// Barcode Integration Project
// PRE stage (1VER) and LOAD stage can be signed simultaneously, so do not throw and error.
Null
CASE Pos > 1 AND WOMatRec<WO_MAT_SIGNATURE$,Pos - 1> = ''
ErrTitle = 'Process Error'
ErrorMsg = 'Previous step ':QUOTE(WOMatRec<WO_MAT_SIG_PROFILE$,Pos - 1>):' is not signed. ':WOMatKey:' (':Method:')'
CASE WOMatRec<WO_MAT_SIGNATURE$,Pos> NE ''
ErrTitle = 'Process Error'
ErrorMsg = 'This step is already signed. ':WOMatKey:'(':Method:')'
CASE 1
NULL
END CASE
END ELSE
ErrorMsg = 'SigProfItem ':QUOTE(SigProfItem):' not found in Signature Profile. ':WOMatKey:' (':Method:')'
END
RETURN
* * * * * * *
MQAComp:
* * * * * * *
* Checks for completion of Met QA step
WOMatKey = Parms[1,@RM]
WOStep = Parms[COL2()+1,@RM]
RunStep = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WOMatKey" passed to routine. (':Method:')'
IF WOStep = '' THEN ErrorMsg = 'Null Parm "WOStep" passed to routine. (':Method:')'
IF RunStep = '' THEN ErrorMsg = 'Null Parm "RunStep" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
If WOMatQARec NE '' Then
AllSteps = obj_Popup('AllCodes','RUN_STEPS') ;* All Run Steps in sequence
Locate RunStep In AllSteps USING @VM SETTING StepPos THEN
MPCnt = COUNT(WOMatQARec<WO_MAT_QA_PROFILE$>,@VM) + (WOMatQARec<WO_MAT_QA_PROFILE$> NE '')
FOR I = 1 TO MPCnt
LineStep = WOMatQARec<WO_MAT_QA_STAGE$,I>
LineResult = WOMatQARec<WO_MAT_QA_RESULT$,I>
Locate LineStep In AllSteps USING @VM SETTING LinePos THEN
IF LinePos <= StepPos And LineResult = '' THEN
ErrTitle = 'Process Error'
ErrorMsg = 'Met QA is incomplete in ':obj_Popup('CodeDesc','RUN_STEPS':@RM:WOMatQARec<WO_MAT_QA_STAGE$,I> ):' step'
End
End ;* End of LinePos locate
Until ErrorMsg NE ''
NEXT I
End;* End of StepPos Locate
End ;* End of check for null WOMatQA record
RETURN
* * * * * * *
EpiReactNo:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec = '' THEN RETURN
Result = ''
WMOutRec = XLATE('WM_OUT',WOMatRec<WO_MAT_WMO_KEY$>,'','X')
SlotCnt = COUNT(WMOutRec<WM_OUT_SLOT_NO$>,@VM) + (WMOutRec<WM_OUT_SLOT_NO$> NE '')
AllRDSNos = ''
AllRDSCnts = ''
FOR I = 1 TO SlotCnt
SlotRDS = WMOutRec<WM_OUT_RDS$,I>
IF SlotRDS NE '' AND WMOutRec<WM_OUT_SLOT_NCR$,I> = '' THEN
LOCATE SlotRDS IN AllRDSNos USING @VM SETTING Pos THEN
AllRdsCnts<1,Pos> = AllRdsCnts<1,Pos> + 1
END ELSE
AllRdsNos = Insert(AllRdsNos,1,Pos,0,SlotRds)
AllRdsCnts = Insert(AllRdsCnts,1,Pos,0,1)
END
END
NEXT I
AllCnt = COUNT(AllRdsCnts,@VM) + (AllRdsCnts NE '')
BigRDS = ''
BigCnt = ''
FOR I = 1 TO AllCnt
IF AllRdsCnts<1,I> > BigCnt THEN
BigCnt = AllRdsCnts<1,I>
BigRDS = AllRdsNos<1,I>
END
NEXT I
Result = XLATE('REACT_RUN',BigRDS,REACT_RUN_REACTOR$,'X')
RETURN Result
* * * * * * *
GetQAMetKeys:
* * * * * * *
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
IF WOMetRec = '' THEN
WOMetRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMetRec = '' THEN RETURN
END
ProdVerNo = WOMetRec<WO_MAT_PROD_VER_NO$>
StepPSNos = XLATE('PROD_VER',ProdVerNo,PROD_VER_PROC_STEP_PSN$,'X')
psCnt = COUNT(StepPSNos,@VM) + (StepPSNos NE '')
LineCnt = 1
FOR I = 1 TO psCNT
StepPSNo = StepPSNos<1,I>
QAMetStruct = obj_Prod_Spec('GetQAMet',StepPSNo:@RM:'')
msCnt = COUNT(QAMetStruct<COL$QA_MET_STAGE>,@VM) + (QAMetStruct<COL$QA_MET_STAGE> NE '')
FOR N = 1 TO msCnt
Result<1,LineCnt> = I:'*':QAMetStruct<COL$QA_MET_STAGE,N>:'*':QAMetStruct<COL$QA_MET_PROP,N>
Result<2,LineCnt> = LineCnt
LineCnt += 1
NEXT N
NEXT I
RETURN
* * * * * * *
AddQAMet:
* * * * * * *
* Dead 6/5/2015 JCH Remove after a few days (the entire method has moved
WONo = Parms[1,@RM]
WOStep = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
Stage = Parms[COL2()+1,@RM]
MetTest = Parms[COL2()+1,@RM]
MetProp = Parms[COL2()+1,@RM]
MetToolClass = Parms[COL2()+1,@RM]
MetMin = Parms[COL2()+1,@RM]
MetMax = Parms[COL2()+1,@RM]
MetSlot = Parms[COL2()+1,@RM]
MetRecipe = Parms[COL2()+1,@RM]
MetRecipePattern = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null Parm "WONo" passed to routine. (':Method:')'
IF WOStep = '' THEN ErrorMsg = 'Null Parm "WOStep" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null Parm "CassNo" passed to routine. (':Method:')'
IF Stage = '' THEN ErrorMsg = 'Null Parm "Stage" passed to routine. (':Method:')'
IF MetProp = '' THEN ErrorMsg = 'Null Parm "MetProp" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN
SWAP @RM WITH '","' IN Parms
ErrorMsg = ErrorMsg:' Parms = ':QUOTE(Parms)
RETURN
END
NewMetKey = WOStep:'*':Stage:'*':MetProp
WOMatKey = WONo:'*':CassNo
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms)
IF WOMatRec = '' THEN RETURN
AllQAMetKeysStruct = obj_WO_Mat('GetQAMetKeys',WOMatKey:@RM:WOMatRec) ;* All QAMetSort Keys Specified for this Work Order Returns Keys in <1> and Sequence numbers = <2>
AllMetKeys = AllQAMetKeysStruct<1> ;* Correctly sorted list of all possible QA Met keys built from the PRS_SPEC records for all WO Steps
AllLines = AllQAMetKeysStruct<2> ;* List of position numbers for each of the met keys
CurrMetKeys = ''
CurrLines = ''
cmqCnt = COUNT(WOMatRec<WO_MAT_MET_PROFILE$>,@VM) + (WOMatRec<WO_MAT_MET_PROFILE$> NE '')
FOR M = 1 to cmqCnt
CurrMetKey = WOMatRec<WO_MAT_MET_PROFILE$,M>[1,1]:'*':WOMatRec<WO_MAT_MET_RUN_STEP$,M>:'*':WOMatRec<WO_MAT_MET_PROP$,M>
CurrMetKeys<1,M> = CurrMetKey
LOCATE CurrMetKey IN AllMetKeys USING @VM SETTING AllPos THEN
CurrLines<1,M> = AllPos ;* Builds a list of CurrLines for the Met Keys on the existing WO_MAT records
END
NEXT M
LOCATE NewMetKey IN AllMetKeys USING @VM SETTING SpecLine THEN
LOCATE SpecLine IN CurrLines BY 'AR' USING @VM SETTING InsertPos THEN
obj_Tables('UnlockRec',otParms)
END ELSE
CurrLines = INSERT(CurrLines,1,InsertPos,0,SpecLine)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_PROFILE$, InsertPos, 0, WOStep:MetTest)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_PROP$,InsertPos,0,MetProp)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_TOOL_CLASS$, InsertPos, 0, MetToolClass)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_RUN_STEP$, InsertPos, 0, Stage)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_MIN$, InsertPos, 0, MetMin)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_MAX$, InsertPos, 0, MetMax)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_SLOT$, InsertPos, 0, MetSlot)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_RECIPE$, InsertPos, 0, MetRecipe)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_RECIPE_PATTERN$, InsertPos, 0, MetRecipePattern)
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_SIG$, InsertPos, 0, '')
WOMatRec = INSERT(WOMatRec, WO_MAT_MET_SIG_DTM$, InsertPos, 0, '')
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
END ;* End of SpecLine LOCATE
END ELSE
obj_Tables('UnlockRec',otParms)
END ;* End of NewMetKey LOCATE
RETURN
* * * * * * *
RemQAMet:
* * * * * * *
* Dead 6/5/2015 JCH Remove after a few days (the entire method has moved
WONo = Parms[1,@RM]
WOStep = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
Stage = Parms[COL2()+1,@RM]
PropCd = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null Parm "WONo" passed to routine. (':Method:')'
IF WOStep = '' THEN ErrorMsg = 'Null Parm "WOStep" passed to routine. (':Method:')'
IF CassNo = '' THEN ErrorMsg = 'Null Parm "CassNo" passed to routine. (':Method:')'
IF Stage = '' THEN ErrorMsg = 'Null Parm "Stage" passed to routine. (':Method:')'
IF PropCd = '' THEN ErrorMsg = 'Null Parm "PropCd" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WOMatKey = WONo:'*':CassNo
otParms = 'WO_MAT':@RM:WOMatKey
WOMatRec = obj_Tables('ReadRec',otParms)
CurrMetKeys = ''
cmqCnt = COUNT(WOMatRec<WO_MAT_MET_PROFILE$>,@VM) + (WOMatRec<WO_MAT_MET_PROFILE$> NE '')
FOR M = 1 to cmqCnt
CurrMetKey = WOMatRec<WO_MAT_MET_PROFILE$,M>[1,1]:'*':WOMatRec<WO_MAT_MET_RUN_STEP$,M>:'*':WOMatRec<WO_MAT_MET_PROP$,M>
CurrMetKeys<1,M> = CurrMetKey
NEXT M
DelMetKey = WOStep:'*':Stage:'*':PropCd
LOCATE DelMetKey IN CurrMetKeys USING @VM SETTING DelPos THEN
IF WOMatRec<WO_MAT_MET_SIG$,DelPos> = '' THEN
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_PROFILE$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_PROP$,DelPos,0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_TOOL_CLASS$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_RUN_STEP$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_MIN$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_MAX$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_SLOT$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_RECIPE$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_RECIPE_PATTERN$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_SIG$, DelPos, 0)
WOMatRec = DELETE(WOMatRec, WO_MAT_MET_SIG_DTM$, DelPos, 0)
otParms = FIELDSTORE(otParms,@RM,4,0,WOMatRec)
obj_Tables('WriteRec',otParms)
END ELSE
obj_Tables('UnlockRec',otParms)
END
END ELSE
obj_Tables('UnlockRec',otParms)
END
RETURN
* * * * * * *
GetBinLocID:
* * * * * * *
* Method finds Bin No in FGS warehouse (Finished Goods Storage)
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN ErrorMsg = 'Null Parm "WONo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF WOMatRec = '' THEN
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec = '' THEN
ErrorMsg = 'No WOMatRec FOR WOMatKey: ':WOMatKey:'.'
RETURN
END
END
WONo = WOMatKey[1,'*']
CustNo = XLATE('WO_LOG' , WONo , WO_LOG_CUST_NO$ , 'X')
OPEN 'DICT.LOCATION' TO DictVar THEN
SearchString = 'CUST_NO':@VM:CustNo:@FM
Option = 'E' ;* Suppress error message (method called from MFS)
Flag = ''
LocIDs = ''
Btree.Extract(SearchString,'LOCATION',DictVar,LocIDs,Option,Flag)
END
RETURN
* * * * * * * * * * *
SendErrorNotification:
* * * * * * * * * * *
swap @SVM with CRLF$ in errCode
ErrorMsg = 'Error code: ':errCode
Recipients = XLATE('SEC_GROUPS', 'OI_ADMIN', 'USER', 'X')
SentFrom = "OBJ_WO_MAT"
Subject = 'Error Writing to WO_MAT'
Message = 'Error occured while attempting to write WO_MAT':CRLF$:ErrorMsg
AttachKey = WoMatKey
AttachWindow = ''
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
return
* * * * * * *
ExpCOA:
* * * * * * *
Result = ''
WOMatKey = Parms[1,@RM]
WOMatRec = Parms[COL2()+1,@RM]
IF WOMatKey = '' THEN RETURN
IF WOMatRec = '' THEN WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
NoConversion = 1
Result = WOMatRec
RETURN