open-insight/LSL2/STPROC/OBJ_WO_LOG.txt
Mitchem Dakota (CSC FI SPS MESLEO External) 76915aff9a Merged PR 10636: Added logging to SAPCreate aid in resolving bug 217110.
Added logging to SAPCreate aid in resolving bug
 217110.
2025-02-11 21:28:52 +01:00

3111 lines
85 KiB
Plaintext

COMPILE FUNCTION obj_WO_Log(Method,Parms)
/*
Methods for the Work Order Log (WO_LOG) table
08/16/2004 JCH - Initial Coding
02/11/2025 DJM - Added logging to SAPCreate
Properties:
Methods:
Find() ;* Lookup Work Order Log number
Create(OrderNo) ;* Create new WO Log entry using sequential counter in DICT.WO_LOG*%SK%
OpenWONos() ;* List of Work Orders with open RDS's on them
*/
#pragma precomp SRP_PreCompiler
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, obj_RDS, obj_WO_Mat, obj_WM_Out
DECLARE FUNCTION Environment_Services, Logging_Services, Error_Services, Set_Property, obj_Sched, Database_Services
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_Order_Det
DECLARE SUBROUTINE obj_Order_Change, obj_Vision, obj_Notes, obj_WM_In, obj_WM_Out, Msg, obj_WO_Mat, obj_Reprocess
DECLARE SUBROUTINE obj_WO_Wfr, obj_WO_Step, Send_Info, obj_RDS2, obj_RDS, obj_Post_Log, obj_WO_Mat_Log, Sleepery
DECLARE SUBROUTINE Environment_Services, Logging_Services, Error_Services, Database_Services, Update_Index
DECLARE SUBROUTINE Work_Order_Services
$INSERT MSG_EQUATES
$INSERT ORDER_EQU
$INSERT ORDER_DET_EQUATES
$INSERT WO_LOG_EQUATES
$INSERT WO_MAT_EQUATES
$INSERT WO_STEP_EQU
$INSERT WM_OUT_EQUATES
$INSERT SCHEDULE_EQU
$INSERT QUOTE_EQU
$INSERT RDS_EQU
$INSERT QUOTE_SPEC_EQU
$INSERT PROD_SPEC_EQUATES
$INSERT Popup_Equates
$INSERT QUOTE_SIGS_EQU
$INSERT NOTIFICATION_EQU
$INSERT PROD_VER_EQUATES
$INSERT SAP_LOG_EQUATES
$INSERT EPI_PART_EQUATES
$INSERT COMPANY_EQUATES
$INSERT REACT_RUN_EQUATES
$INSERT DICT_EQUATES
$INSERT CUST_EPI_PART_EQUATES
$INSERT PRS_STAGE_EQUATES
$INSERT PRS_LAYER_EQUATES
$INSERT LOGICAL
$INSERT APPCOLORS
$INSERT WM_IN_EQUATES
EQU CRLF$ TO \0D0A\
EQU COMMA$ TO ','
EQU TARGET_ACTIVELIST$ TO 5
ErrTitle = 'Error in Stored Procedure "obj_WO_Log"'
ErrorMsg = ''
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Work Order Log.csv'
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'Work Order No' : @FM : 'Notes'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Release Log.csv'
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'Work Order No' : @FM : 'Notes'
objReleaseLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Ship Qty Log.csv'
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'Work Order No' : @FM : 'Calculated Ship Qty' : @FM : 'Stored Ship Qty'
objShipQtyLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Trace Log.csv'
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'ProdOrdNo' : @FM : 'Step' : @FM : 'Errors'
objTraceLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
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 = 'Find' ; GOSUB Find
CASE Method = 'Create' ; GOSUB Create
CASE Method = 'SAPCreate' ; GOSUB SAPCreate
CASE Method = 'Delete' ; GOSUB Delete
CASE Method = 'CurrStatus' ; GOSUB CurrStatus
CASE Method = 'OpenWONos' ; GOSUB OpenWONos
CASE Method = 'ShipWONos' ; GOSUB ShipWONos
CASE Method = 'WOStepStatus' ; GOSUB WOStepStatus
CASE Method = 'ReleaseCassettes' ; GOSUB ReleaseCassettes
CASE Method = 'RecallWO' ; GOSUB RecallWO
CASE Method = 'ChangeLotNo' ; GOSUB ChangeLotNo
CASE Method = 'ChangeCassQty' ; GOSUB ChangeCassQty
CASE Method = 'ChangePONo' ; GOSUB ChangePONo
CASE Method = 'AddOrderItem' ; GOSUB AddOrderItem
CASE Method = 'RemOrderItem' ; GOSUB RemOrderItem
CASE Method = 'SetPromiseDt' ; GOSUB SetPromiseDt
CASE Method = 'QuoteChange' ; GOSUB QuoteChange
CASE Method = 'SetWOSteps' ; GOSUB SetWOSteps
CASE Method = 'NextWORun' ; GOSUB NextWORun
CASE Method = 'AddCassNo' ; GOSUB AddCassNo
CASE Method = 'RemoveCassettes' ; GOSUB RemoveCassettes
CASE Method = 'SetPartNo' ; GOSUB SetPartNo
CASE Method = 'RefreshSigProfile' ; GOSUB RefreshSigProfile
CASE Method = 'RelQty' ; GOSUB RelQty
CASE Method = 'RelDTMs' ; GOSUB RelDTMS
CASE Method = 'RxQty' ; GOSUB RxQty
CASE Method = 'ShipQty' ; GOSUB ShipQty
CASE Method = 'ShipPropTarg' ; GOSUB ShipPropTarg
CASE Method = 'CloseComp' ; GOSUB CloseComp
CASE Method = 'Route' ; GOSUB Route
CASE Method = 'Unroute' ; GOSUB Unroute
CASE Method = 'GetAvgCycleTimes' ; GOSUB GetAvgCycleTimes
CASE Method = 'TimeTarget' ; GOSUB TimeTarget
CASE Method = 'PcntComp' ; GOSUB PcntComp
CASE Method = 'EstComp' ; GOSUB EstComp
CASE Method = 'SchedReacts' ; GOSUB SchedReacts
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
* * * * * * *
Find:
* * * * * * *
OrderKeys = Dialog_Box( 'DIALOG_WO_FIND', @WINDOW, '' )
Result = OrderKeys
RETURN
* * * * * * *
SAPCreate:
* * * * * * *
FileIn = Parms[1,@RM]
TimeStamp = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTH'),'DT')
* Create the WO_LOG Record
ProdOrdNo = FileIn<1,1>
CustPONo = FileIn<1,2>
PromiseShipDt = FileIn<1,3>
EpiPartNo = FileIn<1,4>
SubPartNo = FileIn<1,5>
SubRevNo = FileIn<1,6>
WOQty = FileIn<1,7>
VendCd = FileIn<1,8>
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'SAPCreate Start.'
LogData<5> = ''
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
* Add Parameter checking here -> problems then log errors and message Cust Service, no problems just the message
ErrFields = ''
ErrValues = ''
ErrDescs = ''
ErrCnt = 0
IF ProdOrdNo = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'PROD_ORD_NO'
ErrDescs<1,ErrCnt> = 'Null Value'
ErrValues<1,ErrCnt> = '<null>'
END
IF NOT( ProdOrdNo MATCHES "'M'6N'.1'" OR ProdOrdNo MATCHES "7X'.1'" ) THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'PROD_ORD_NO'
ErrDescs<1,ErrCnt> = 'Incorrect Format'
ErrValues<1,ErrCnt> = ProdOrdNo
END
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'First parameter check.'
If ErrDescs NE '' then
ParsedErrors = ErrDescs
Swap @VM with '|' in ParsedErrors
LogData<5> = ParsedErrors
end else
LogData<5> = ''
end
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
* * * * * * Section added 12/2/2011 JCH for duplicate Prod_Ord_No checking from SAP
OPEN 'DICT.WO_LOG' TO WOLogDictVar ELSE
RETURN
END
SearchString = 'PROD_ORD_NO':@VM:ProdOrdNO:@FM
ExistingWOMatKey = ''
Option = ''
Flag = ''
Btree.Extract(SearchString,'WO_LOG',WOLogDictVar,ExistingWOMatKey,Option,Flag)
IF Get_Status(errCode) THEN
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'WO_LOG BTree Extract'
LogData<5> = 'Error in BTree extract. ErrorCode: ' : errCode
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
RETURN
end else
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'WO_LOG BTree Extract'
LogData<5> = ''
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
end
IF ExistingWOMatKey NE '' THEN
Result = 1
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'Existing WO_MAT check.'
LogData<5> = 'WO_MAT does not exist.'
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
RETURN ;* 3/12/2013 JCH
END else
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'Existing WO_MAT check.'
LogData<5> = ''
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
end
* * * * * * *
IF CustPONo = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'CUST_PO_NO'
ErrDescs<1,ErrCnt> = 'Null Value'
ErrValues<1,ErrCnt> = '<null>'
END
IF PromiseShipDt = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'PROMISE_SHIP_DT'
ErrDescs<1,ErrCnt> = 'Null Value'
ErrValues<1,ErrCnt> = '<null>'
END
IF EpiPartNo = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'EPI_PART_NO'
ErrDescs<1,ErrCnt> = 'Null Value'
ErrValues<1,ErrCnt> = '<null>'
END
IF WOQty = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'QTY'
ErrDescs<1,ErrCnt> = 'Null Value'
ErrValues<1,ErrCnt> = '<null>'
END
thisPromiseShipDt = ICONV(PromiseShipDt,'D')
IF thisPromiseShipDt = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'PROMISE_SHIP_DT'
ErrDescs<1,ErrCnt> = 'Invalid Data'
ErrValues<1,ErrCnt> = PromiseShipDt
END
// Check for VRM SAP part number conversion record
* Open 'DICT.EPI_PART' to hDictEpiPart then
* IntEpiPartNo = ''
* Flag = ''
* Option = 'E' ; // Suppress error messages
* SearchString = 'VARM_PART_NO':@VM:EpiPartNo:@FM
* Btree.Extract(SearchString, 'EPI_PART', hDictEpiPart, IntEpiPartNo, '', Flag)
* If Flag EQ 0 then
* If IntEpiPartNo NE '' then
* // Transate Varm part no to IFX part no
* EpiPartNo = IntEpiPartNo
* end
* end else
* ErrCnt += 1
* ErrFields<1,ErrCnt> = 'Btree.Extract'
* ErrDescs<1,ErrCnt> = 'EPI_PART lookup failed.'
* ErrValues<1,ErrCnt> = IntEpiPartNo
* end
* end
EpiPartRec = XLATE('EPI_PART',EpiPartNo,'','X')
ProdVerNos = EpiPartRec<EPI_PART_PROD_VER_NO$>
IF EpiPartRec = '' THEN
ErrCnt += 1
ErrFields<1,ErrCnt> = 'EPI_PART_NO'
ErrDescs<1,ErrCnt> = 'Invalid EpiPart No'
ErrValues<1,ErrCnt> = EpiPartNo
END
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'Second Parameter check.'
If ErrDescs NE '' then
ParsedErrors = ErrDescs
Swap @VM with '|' in ParsedErrors
LogData<5> = ParsedErrors
end else
LogData<5> = ''
end
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
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$> = 'Missing or Invalid Order Release from SAP Received'
LogRec<SAP_LOG_PROD_ORD_NO$> = ProdOrdNo
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)
Recipients = Xlate('SEC_GROUPS', 'SAP_ADMIN', 'USER', 'X')
SentFrom = "SAP Posting Process"
Subject = 'SAP Error Logged ':LogNo
Message = 'Work Order Posting Error from SAP'
AttachWindow = 'SAP_LOG'
AttachKey = LogNo
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'ErrFields check failure.'
If ErrDescs NE '' then
ParsedErrors = ErrDescs
Swap @VM with '|' in ParsedErrors
LogData<5> = ParsedErrors
end else
LogData<5> = ''
end
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
RETURN
END ELSE
Result = 1 ;* Set to 1 if we were successful in creating the WO_LOG Record, 0 if we just logged the problems.
END
NextWOLogNo = NextKey('WO_LOG')
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'Next WO_LOG key.'
If ErrDescs NE '' then
ParsedErrors = ErrDescs
Swap @VM with '|' in ParsedErrors
LogData<5> = ParsedErrors
end else
LogData<5> = ''
end
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
WOLogRec = ''
IF WOQty > 2475 THEN
Recipients = Xlate('SEC_GROUPS', 'SAP_ADMIN', 'USER', 'X') ;
SentFrom = "SAP Posting Process"
Subject = 'SAP WO Qty > 2475 when received on ':LogNo
Message = 'WO Qty changed from ':WOQty:' to 2475 (SAP Maximum) prior to WO_LOG record creation'
AttachWindow = 'SAP_LOG'
AttachKey = LogNo
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
WOQty = 2475 ;* Don't throw an error for this just set the qty to 2475
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'Check for maximum SAP WO Qty.'
If ErrDescs NE '' then
ParsedErrors = ErrDescs
Swap @VM with '|' in ParsedErrors
LogData<5> = ParsedErrors
end else
LogData<5> = ''
end
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
END ;* End of check for maximum SAP WO Qty. This is 99 cassettes
WOLogRec<WO_LOG_ENTRY_ID$> = 'SAP'
WOLogRec<WO_LOG_ENTRY_DATE$> = Date()
WOLogRec<WO_LOG_WO_QTY$> = WOQty
WOLogRec<WO_LOG_SAP_ORD_QTY$> = WOQty
WOLogRec<WO_LOG_EPI_PART_NO$> = EpiPartNo
WOLogRec<WO_LOG_PROMISE_SHIP_DT$> = ICONV(PromiseShipDt,'D')
WOLogRec<WO_LOG_PROD_ORD_NO$> = ProdOrdNo
WOLogRec<WO_LOG_ORD_SUB_PART_NO$> = SubPartNo
WOLogRec<WO_LOG_ORD_SUB_PART_REV$> = SubRevNo
WOLogRec<WO_LOG_CUST_PO_NO$> = CustPONo
WOLogRec<WO_LOG_ORIGIN$> = 'S' ;* Originated from SAP System
WOLogRec<WO_LOG_PRIORITY$> = 'P3' ;*
WOLogRec<WO_LOG_EXP_VEND_CD$> = VendCd ;* Added 4/4/2014 JCH
obj_Tables('WriteRec','WO_LOG':@RM:NextWOLogNo:@RM:@RM:WOLogRec) ;* WO Record created
IF Get_Status(errCode) THEN
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'WO_LOG ' : NextWOLogNo ' Write'
LogData<5> = 'Error writing WO_LOG ' : NextWOLogNo '. ErrorCode: ' : errCode
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
end else
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'WO_LOG ' : NextWOLogNo ' Write'
LogData<5> = ''
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
end
CustType = XLATE('EPI_PART',EpiPartNo,'CUST_TYPE','X')<1,1>
Recipients = XLATE('NOTIFICATION','WO_ENTRY',NOTIFICATION_USER_ID$,'X')
SentFrom = @USER4
Message = CustType:' WO ':NextWOLogNo:' (ProdOrder ':ProdOrdNo:') Created'
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then
AttachWindow = 'NDW_WO_LOG'
end else
AttachWindow = 'WO_LOG2'
end
AttachKey = NextWOLogNo
SendToGroup = ''
Subject = CustType:' WO ':NextWOLogNo:' (ProdOrder ':ProdOrdNo:') Created'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
IF Get_Status(errCode) THEN
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'End SAPCreate'
LogData<5> = 'Error creating note. ErrorCode: ' : errCode
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
end else
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = ProdOrdNo
LogData<4> = 'End SAPCreate'
LogData<5> = ''
Logging_Services('AppendLog', objTraceLog, LogData, @RM, @FM)
end
RETURN
* * * * * * *
SetWOSteps:
* * * * * * *
* This has moved to the Route method for SAP
WONo = Parms[1,@RM]
IF WONo = '' THEN RETURN
otParms = 'WO_LOG':@RM:WONo
WOLogRec = obj_Tables('ReadRec',otParms)
IF Get_Status(errCode) THEN RETURN
ProdVerNo = WOLogRec<WO_LOG_PROD_VER_NO$>
ProdVerRec = XLATE('PROD_VER',ProdVerNo,'','X')
ProcSteps = ProdVerRec<PROD_VER_PROC_STEP_NO$>
ProcPSNs = ProdVerRec<PROD_VER_PROC_STEP_PSN$>
ProcDescs = ProdVerRec<PROD_VER_PROC_STEP_DESC$>
ProcPSNStatuses = XLATE('PROD_SPEC',ProcPSNs,PROD_SPEC_STATUS$,'X')
FOR P = 1 TO COUNT(ProcPSNStatuses,@VM) + (ProcPSNStatuses NE '')
IF ProcPSNStatuses<1,P> NE 'A' THEN
ErrorMsg = 'Inactive Product Spec on Prod Ver No.'
obj_Tables('UnlockRec',otParms)
RETURN
END
NEXT P
DefWMOCassQtys = XLATE('PROD_SPEC',ProcPSNs,PROD_SPEC_WMO_LOAD_CNT$,'X')
WOStepKeys = ''
DefWMOCassQty = ''
FOR N = 1 TO COUNT(ProcSteps,@VM) + (ProcSteps NE '')
ProcStep = ProcSteps<1,N>
ProcPSN = ProcPSNs<1,N>
ProcDesc = ProcDescs<1,N>
obj_WO_Step('Create',WONo:@RM:ProcStep:@RM:ProcPSN:@RM:ProcDesc)
IF DefWMOCassQtys<1,N> NE '' THEN DefWMOCassQty = DefWMOCassQtys<1,N>
WOStepKeys<1,N> = WONo:'*':ProcStep
NEXT N
WOLogRec<WO_LOG_OUT_CASS_LOAD_QTY$> = DefWMOCassQty
otParms = FieldStore(otParms,@RM,4,1,WOLogRec)
obj_Tables('WriteRec',otParms)
RETURN
* * * * * * *
Create:
* * * * * * *
OrderNo = Parms[1,@RM]
OrderItemNos = Parms[COL2()+1,@RM]
QuoteNo = Parms[COL2()+1,@RM]
IF OrderNo = '' OR OrderItemNos = '' OR QuoteNo = '' THEN RETURN
QuoteRec = XLATE('QUOTE',QuoteNo,'','X')
ProcSteps = QuoteRec<QUOTE_PROC_STEP$>
ProcPSNs = QuoteRec<QUOTE_PROC_STEP_PSN$>
ProcDescs = QuoteRec<QUOTE_PROC_STEP_DESC$>
ProcPSNStatuses = XLATE('PROD_SPEC',ProcPSNs,PROD_SPEC_STATUS$,'X')
FOR I = 1 TO COUNT(ProcPSNStatuses,@VM) + (ProcPSNStatuses NE '')
IF ProcPSNStatuses<1,I> NE 'A' THEN
ErrorMsg = "The Process Step PSN ":QUOTE(ProcPSNs<1,I>):" on this Quote is Inactive.":CRLF$:CRLF$:"Unable to Create a Work Order."
RETURN
END
NEXT I
NextWOLogNo = NextKey('WO_LOG')
UserName = @USER4
WOLogRec = ''
WOLogRec<WO_LOG_ORDER_NO$> = OrderNo
WOLogRec<WO_LOG_ORDER_ITEM$> = OrderItemNos
WOLogRec<WO_LOG_ENTRY_ID$> = UserName
WOLogRec<WO_LOG_ENTRY_DATE$> = Date()
WOLogRec<WO_LOG_QUOTE_NO$> = QuoteNo
WOLogRec<WO_LOG_ORIGIN$> = 'M' ;* Work Originated in Mesa MES system
* Following updated 9/1/2011 JCH *********************************
WOQty = ''
ProdVerNo = ''
FOR I = 1 TO COUNT(OrderItemNos,@VM) + (OrderItemNos NE '')
IF I = 1 THEN
OrderDetRec = XLATE('ORDER_DET',OrderNo:'*':OrderItemNos<1,I>,'','X')
WOLogRec<WO_LOG_PROD_VER_NO$> = OrderDetRec<ORDER_DET_PROD_VER_NO$>
WOLogRec<WO_LOG_EPI_PART_NO$> = OrderDetRec<ORDER_DET_EPI_PN$>
WOLogRec<WO_LOG_CUST_PART_NO$> = OrderDetRec<ORDER_DET_CUST_PN$>
WOLogRec<WO_LOG_CUST_PART_INBOUND$> = OrderDetRec<ORDER_DET_CUST_PART_NO_INBOUND$>
WOLogRec<WO_LOG_CUST_SUB_PART_NO$> = OrderDetRec<ORDER_DET_CUST_SUB_PART_NO$>
WOLogRec<WO_LOG_CUST_SUB_MFR$> = OrderDetRec<ORDER_DET_CUST_SUB_MFR$>
END
WOQty += XLATE('ORDER_DET',OrderNo:'*':OrderItemNos<1,I>,ORDER_DET_ITEM_QTY$,'X')
NEXT I
WOLogRec<WO_LOG_WO_QTY$> = WOQty
* end of new code **************************************************
WOLogRec<WO_LOG_CUST_NO$> = QuoteRec<QUOTE_CUST_NO$> ;* Changed from ORDER table 9/1/2005 JCH - J.C. Henry & Co., Inc.
DefWMOCassQtys = XLATE('PROD_SPEC',ProcPSNs,PROD_SPEC_WMO_LOAD_CNT$,'X')
DefWMOCassQty = ''
FOR I = 1 TO COUNT(ProcSteps,@VM) + (ProcSteps NE '')
ProcStep = ProcSteps<1,I>
ProcPSN = ProcPSNs<1,I>
ProcDesc = ProcDescs<1,I>
obj_WO_Step('Create',NextWOLogNo:@RM:ProcStep:@RM:ProcPSN:@RM:ProcDesc)
IF DefWMOCassQtys<1,I> NE '' THEN DefWMOCassQty = DefWMOCassQtys<1,I>
NEXT I
WOLogRec<WO_LOG_OUT_CASS_LOAD_QTY$> = DefWMOCassQty
obj_Tables('WriteRec','WO_LOG':@RM:NextWOLogNo:@RM:@RM:WOLogRec) ;* WO Record created
Recipients = XLATE('NOTIFICATION','WO_ENTRY',NOTIFICATION_USER_ID$,'X')
SentFrom = @USER4
Subject = 'New Work Order Created ':NextWOLogNo
Message = 'New Work Order Created.'
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then
AttachWindow = 'NDW_WO_LOG'
end else
AttachWindow = 'WO_LOG2'
end
AttachKey = NextWOLogNo
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
* 7/11/19 - TODO - create similar notification mechanism for Priscila's GaN team for GaN related work orders
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
IF Get_Status(errCode) ELSE Result = NextWOLogNo
RETURN
* * * * * * *
Delete:
* * * * * * *
WONo = Parms[1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter WONo passed to routine (':Method:').'
IF ErrorMsg NE '' THEN RETURN
WOLogRec = XLATE('WO_LOG',WONo,'','X')
WOStepKeys = WOLogRec<WO_LOG_WO_STEP_KEY$>
FOR I = 1 TO COUNT(WOStepKeys,@VM) + (WOStepKeys NE '')
WOStepRec = XLATE('WO_STEP',WOStepKeys<1,I>,'','X')
IF WOStepRec<WO_STEP_RDS_KEY$> NE '' THEN
ErrorMsg = 'Work Order Step currently has RDS records attached and may not be deleted.'
END
IF WOStepRec<WO_STEP_WM_IN_KEYS$> NE '' THEN
ErrorMsg = 'Work Order Step currently has WM_IN records attached and may not be deleted.'
END
IF WOStepRec<WO_STEP_WM_OUT_KEYS$> NE '' THEN
ErrorMsg = 'Work Order Step currently has WM_OUT records attached and may not be deleted.'
END
IF ErrorMsg NE '' THEN RETURN
NEXT I
FOR I = 1 TO COUNT(WOStepKeys,@VM) + (WOStepKeys NE '')
WOStepKey = WOStepKeys<1,I>
CONVERT '*' TO @RM IN WOStepKey
Set_Status(0)
obj_WO_Step('Delete',WOStepKey)
IF Get_Status(errCode) THEN RETURN
NEXT I
TableVar = ''
OtParms = 'WO_LOG':@RM:WONo:@RM:TableVar
WOLogRec = obj_Tables('DeleteRec',OtParms) ;* Locks and reads record for update
IF Get_Status(errCode) THEN ErrMsg(errCode)
RETURN
* * * * * * *
CurrStatus:
* * * * * * *
IF NOT(ASSIGNED(WONo)) THEN WONo = Parms[1,@RM]
IF NOT(ASSIGNED(WORec)) THEN WORec = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
IF WORec= '' THEN WORec = XLATE('WO_LOG',WONo,'','X')
IF WORec<WO_LOG_CLOSE_DATE$> NE '' THEN
Result = 'CL' ;* Manual Close
RETURN
END
IF WORec<WO_LOG_ORDER_NO$> = '' AND WORec<WO_LOG_PROD_ORD_NO$> = '' THEN
Result = 'NORD' ;* Junk from conversion
RETURN
END
IF WORec<WO_LOG_PROD_ORD_NO$> NE '' AND WORec<WO_LOG_PROD_VER_NO$> = '' THEN
Result = 'UNR'
RETURN
END
WOQty = WORec<WO_LOG_WO_QTY$>
GOSUB ShipQty
ShipQty = Result
StaticShipQty = WORec<WO_LOG_STATIC_SHIP_QTY$>
If ShipQty NE StaticShipQty then
// Log the discrepancy
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
LogData<3> = WONo
LogData<4> = ShipQty
LogData<5> = StaticShipQty
Logging_Services('AppendLog', objShipQtyLog, LogData, @RM, @FM)
end
IF ShipQty = '' THEN ShipQty = 0
Result = ''
StepKeys = WORec<WO_LOG_WO_STEP_KEY$>
FirstStepRDSKeys = XLATE('WO_STEP',StepKeys<1,1>,WO_STEP_RDS_KEY$,'X')
FirstWOMatKey = WORec<WO_LOG_WO_MAT_KEY$,1>
FirstWOMatRelDTM = XLATE('WO_MAT',FirstWOMatKey,WO_MAT_REL_DTM$,'X')
FirstWOMatRxDTM = XLATE('WO_MAT',FirstWOMatKey,WO_MAT_RX_DTM$,'X')
IF FirstWOMatRelDTM NE '' OR FirstStepRDSKeys NE '' THEN
IF 1=0 THEN
StepKeys = WORec<WO_LOG_WO_STEP_KEY$>
StepStatusCodes = XLATE('WO_STEP',StepKeys,'CURR_STATUS','X')
StepCnt = COUNT(StepKeys,@VM) + (StepKeys NE '')
IF StepCnt > 1 THEN
LastStatus = StepStatusCodes<1,StepCnt> ;* 8/10/2009
IF LastStatus = 'RX' THEN
Result = StepStatusCodes<1,(StepCnt - 1)>
END ELSE
Result = LastStatus
END
END ELSE
Result = StepStatusCodes
END
RETURN
END ELSE
BEGIN CASE
CASE ShipQty = 0 ; Result = 'INPR'
CASE ShipQty < WOQty ; Result = 'SHIP'
CASE ShipQty >= WOQty ; Result = 'COMP'
END CASE
IF Result NE '' THEN RETURN
IF FirstWOMatRelDTM NE '' THEN
Result = 'REL'
RETURN
END
IF FirstWOMatRxDTM NE '' THEN
Result = 'AWR'
RETURN
END
END
END
IF WORec<WO_LOG_WO_MAT_KEY$> = '' THEN
* Material not here yet
/*
OrderNo = WORec<WO_LOG_ORDER_NO$>
IF OrderNo = '' THEN
Result = 'NORD'
RETURN
END
FirstOrderItem = WORec<WO_LOG_ORDER_ITEM$><1,1>
IF FirstOrderItem = '' THEN
Result = 'INC'
RETURN
END
*/
EpiPN = WORec<WO_LOG_EPI_PART_NO$>
SubSuppliedby = XLATE('EPI_PART',EpiPN,EPI_PART_SUB_SUPP_BY$,'X')
CustLotNos = WORec<WO_LOG_CUST_LOT_NO$>
IF SubSuppliedBy = 'C' THEN
IF CustLotNos = '' THEN
Result = 'ASN'
END ELSE
Result = 'AWM'
END
END ELSE
Result = 'RTP'
END
END
IF Result NE '' THEN RETURN
IF FirstWOMatRelDTM NE '' THEN
Result = 'REL'
RETURN
END
IF FirstWOMatRxDTM NE '' THEN
Result = 'AWR'
RETURN
END
IF Result = '' THEN Result = 'INC'
RETURN
* * * * * * *
OpenWONos:
* * * * * * *
OPEN 'WO_LOG' TO WOLogTable ELSE
ErrorMsg = 'Unable to Open WO_LOG table in obj_WO_LOG for index lookup'
RETURN
END
OPEN 'DICT.WO_LOG' TO DictWOLogTable ELSE
RETURN
END
MsgUp = Msg(@WINDOW,'','SELECT_OPEN_WO')
WOKeys = ''
* SelectStatement = 'CURR_STATUS':@VM:'RX':@VM:'INPR':@VM:'RTS':@VM:'SHIP':@VM:'HOLD':@FM ;* Inactivated by dkk 4/3/14
SelectStatement = 'WO_STATUS':@VM:'OPEN':@FM ;* Added by dkk 4/3/14
Btree.Extract(SelectStatement,'WO_LOG',DictWOLogTable,WOKeys,'','')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
Msg(@WINDOW,MsgUp)
RETURN
END
Msg(@WINDOW,MsgUp)
TypeOver = ''
TypeOver<PDISPLAY$> = WOKeys
TypeOver<PMODE$> = 'K'
WONo = Popup(@WINDOW,TypeOver,'OPEN_WORK_ORDERS')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
Result = WONo
RETURN
* * * * * * *
ShipWONos:
* * * * * * *
OPEN 'WO_LOG' TO WOLogTable ELSE
RETURN
END
MsgUp = Msg(@WINDOW,'','SELECT_OPEN_WO')
IF Get_Status(errCode) THEN RETURN
SelectStatement = 'SELECT WO_LOG WITH CURR_STATUS = "INPR" '
SelectStatement := ' OR WITH CURR_STATUS = "RTS"'
SelectStatement := ' OR WITH CURR_STATUS = "SHIP"'
SelectStatement := ' OR WITH CURR_STATUS = "HOLD"'
SelectStatement := ' BY COMMIT_DATE'
RList(SelectStatement, TARGET_ACTIVELIST$, '','','')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
Msg(@WINDOW,MsgUp)
RETURN
END
Msg(@WINDOW,MsgUp)
WONo = Popup(@WINDOW,TypeOver,'OPEN_WORK_ORDERS')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
Result = WONo
RETURN
* * * * * * *
WOStepStatus:
* * * * * * *
* Method to maintain WO_STEP Status codes from the WO_Step table.
WONo = Parms[1,@RM]
WOStepKey = Parms[COL2()+1,@RM]
CurrStatus = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN ;* Called from dictionary so don't throw an error
IF WOStepKey = '' THEN RETURN
TableVar = ''
OtParms = 'WO_LOG':@RM:WONo:@RM:TableVar
WOLogRec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update
LOCATE WOStepKey IN WOLogRec<WO_LOG_WO_STEP_KEY$> USING @VM SETTING Pos THEN
WOLogRec<WO_LOG_WO_STEP_STATUS$,Pos> = CurrStatus
OtParms = FieldStore(OtParms,@RM,4,1,WOLogRec)
obj_Tables('WriteRec',OtParms)
END ELSE
obj_Tables('UnlockRec',OtParms)
END
RETURN
* * * * * * *
ReleaseCassettes:
* * * * * * *
WONo = Parms[1,@RM]
CassNos = Parms[COL2()+1,@RM]
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<2> = @User4
LogData<3> = WONo
LogData<4> = 'Beginning ReleaseCassettes routine.'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
IF WONo = '' THEN ErrorMsg = 'Null parameter WONo passed to routine (':Method:').'
IF ErrorMsg NE '' THEN RETURN
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then
Form = 'NDW_WO_LOG'
end else
Form = 'WO_LOG2'
end
OrgColor = Set_Property(Form:'.STATUSLINE_FIX','BACKCOLOR',YELLOW$) ;* //////// Messaging
TableVar = ''
OtParms = 'WO_LOG':@RM:WONo:@RM:TableVar
WORec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update
* Added 5/21/2015 JCH to check for previous releases on this work order
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
IF Get_Status(errCode) THEN Return
OrderNo = WORec<WO_LOG_ORDER_NO$>
OrderItems = WORec<WO_LOG_ORDER_ITEM$>
CustNo = WORec<WO_LOG_CUST_NO$>
PromiseDt = WORec<WO_LOG_PROMISE_SHIP_DT$>
WOStepKeys = WORec<WO_LOG_WO_STEP_KEY$
ProdVerNo = WORec<WO_LOG_PROD_VER_NO$>
EPIPartNo = WORec<WO_LOG_EPI_PART_NO$>
ReactType = WORec<WO_LOG_REACT_TYPE$> ;* Added 5/28/2016 JCH
IF OrderNo = '' AND ProdVerNo = '' THEN ErrorMsg = 'Both Order No and Prod Ver No blank on Work Order. WO Not Released. (':Method:')'
IF CustNo = '' THEN ErrorMsg = 'No Cust Number on Work Order. WO Not Released. (':Method:')'
IF WOStepKeys = '' THEN ErrorMsg = 'Missing WO Step Keys. WO Not Released. (':Method:')'
IF ErrorMsg NE '' THEN
obj_Tables('UnlockRec',OtParms)
RETURN
END
* * * * * * * * * * * * * * * * * * * * * * * * * *
IF ProdVerNo NE '' THEN
ReactorType = XLATE('PROD_VER',ProdVerNo,PROD_VER_REACT_TYPE$,'X')
IF ReactorType NE 'EPP' THEN
IF WORec<WO_LOG_WO_START_DTM$> = '' THEN
CurrDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS'),'DT')
WORec<WO_LOG_WO_START_DTM$> = CurrDTM
END
END
END
* * * * * * * * * * * * * * * * * * * * * * * * * * *
Send_Info("Collecting Data for release...") ;* //////// Messaging
IF OrderNo = '' THEN
OrderWaferQty = WORec<WO_LOG_WO_QTY$>
PONo = WORec<WO_LOG_CUST_PO_NO$>
VisionOrderNo = WORec<WO_LOG_PROD_ORD_NO$> ;* SAP Production Order Number
VisionLineNos = ''
WMOLoadQty = XLATE('CUST_EPI_PART',CustNo:'*':EPIPartNo,CUST_EPI_PART_WMO_LOAD_CNT$,'X')
END ELSE
OrderRec = XLATE('ORDER',OrderNo,'','X')
OrderWaferQty = 0
FOR I = 1 TO COUNT(OrderItems,@VM) + (OrderItems NE '')
OrderDetRec = XLATE('ORDER_DET',OrderNo:'*':OrderItems<1,I>,'','X')
IF NOT(INDEX(OrderDetRec<ORDER_DET_EPI_PN$>,'MISC',1)) THEN
OrderWaferQty = OrderWaferQty + OrderDetRec<ORDER_DET_ITEM_QTY$>
END
NEXT I
PONo = OrderRec<ORDER_PO_NO$>
VisionOrderNo = OrderRec<ORDER_VISION_ORDER_NO$>
VisionLineNos = XLATE('ORDER_DET',OrderItems,ORDER_DET_VISION_LINE_NO$,'X')
END
OrdSummary = '' ;* Holds Order Detail Lot Numbers and Associated Order Item Numbers
CassCnt = COUNT(CassNos,@VM) + (CassNos NE '')
WOMKeys = ''
FOR K = 1 TO CassCnt
WOMKeys<1,K> = WONo:'*':CassNos<1,K>
NEXT K
Send_Info('Locking WOMat records for update...')
* WOMTableVar = obj_WO_Mat('LockSet',WOMKeys)
WOMTableVar = Database_Services('GetTableHandle', 'WO_MAT')
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',OtParms) ;* Unlock WO_LOG record
Send_Info(STR(' ',60)) ;** - Messaging - **
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then
Form = 'NDW_WO_LOG'
end else
Form = 'WO_LOG2'
end
Dummy = Set_Property(Form:'.STATUSLINE_FIX','BACKCOLOR',OrgColor) ;** - Messaging - **
RETURN
END
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Trace 1'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
* At this point the WO_LOG is locked and the WO_MAT (cassettes) are all locked for update
EpiPN = WORec<WO_LOG_EPI_PART_NO$>
EpiPartRec = XLATE('EPI_PART',EpiPN,'','X')
SubSupplyBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$>
ProdVerRec = XLATE('PROD_VER',ProdVerNo,'','X')
ProcStepNos = ProdVerRec<PROD_VER_PROC_STEP_NO$>
ProcPSNs = ProdVerRec<PROD_VER_PROC_STEP_PSN$>
ReactorType = ProdVerRec<PROD_VER_REACT_TYPE$>
WOStepCnt = COUNT(ProcPSNs,@VM) + (ProcPSNs NE '')
TableVar = ''
LastStep = ''
FOR WOStep = 1 TO WOStepCnt
WOStepKey = WORec<WO_LOG_WO_STEP_KEY$,WOStep>
WOStepRec = XLATE('WO_STEP',WOStepKey,'','X')
IF WOStep = WOStepCnt THEN LastStep = 1 ELSE LastStep = 0
ProcPSN = ProcPSNs<1,WOStep>
SubPreClean = XLATE('PRS_STAGE',ProcPSN:'*PRE',PRS_STAGE_CLEAN_TOOL$,'X')
SubPostClean = XLATE('PRS_STAGE',ProcPSN:'*POST',PRS_STAGE_CLEAN_TOOL$,'X')
// Log variables before obj_WM_Out('Create')
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' WMOLoadQty:':WMOLoadQty
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
IF ReactorType = 'EPP' THEN
Send_Info('Creating WM_OUT records for WOStep ':WOStep:'...') ;** - Messaging - **
OutOnlyCassIDS = obj_WM_Out('Create',WONO:@RM:WOStep:@RM:CassNos:@RM:WMOLoadQty) ;* Changed WMOLoadQty 9/14/2012 JCH *********
END ELSE
OutOnlyCassIDs = ''
END
StepRDSNos = ''
CassCnt = COUNT(CassNos,@VM) + (CassNos NE '')
// Log variables after obj_WM_Out('Create')
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'WONo:':WONo:' WOStep:':WOStep:' CassNos:':CassNos:' CassCnt:':CassCnt:' WMOLoadQty:':WMOLoadQty
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
Def = ""
Def<MCAPTION$> = "Releasing Cassettes for WO Step ":WOStep:"..."
Def<MTYPE$> = "G"
Def<MEXTENT$> = CassCnt
Def<MTEXTWIDTH$> = 600
MsgUp = Msg(@WINDOW, Def)
ReprocessedRDSNos = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Trace 2'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
FOR N = 1 TO CassCnt
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Trace 2.':N
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
CassNo = CassNos<1,N>
Void = Msg(@WINDOW, MsgUp, N, MSGINSTUPDATE$)
IF ReactorType = 'EPP' THEN
CassWaferQty = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_WAFER_QTY$,'X')
WMIKey = WONo:'*':WOStep:'*':CassNo
Send_Info('Creating WM_IN record "':WMIKey:'"...') ;** - Messaging - **
obj_WM_IN('Create',WONo:@RM:WOStep:@RM:CassNo:@RM:CassWaferQty) ;* ******************************** EpiPro 5000 Reactor -> create WM_IN records
END ELSE
IF WOStepRec<WO_STEP_RDS_KEY$,CassNo> = '' THEN
WOMatRec = XLATE('WO_MAT',WoNo:'*':CassNo,'','X')
CassLotNo = WOMatRec<WO_MAT_LOT_NO$>
CassWaferQty = WOMatRec<WO_MAT_WAFER_QTY$>
CassCustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
CassSubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
CassSubInvID = ''
CassOrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
ReprocessedMat = WOMatRec<WO_MAT_REPROCESSED_MAT$>
CassSubVendCd = WOMatRec<WO_MAT_SUB_VEND_CD$>
IF OrderNo = '' THEN
QuoteNo = ''
END ELSE
QuoteNo = XLATE('ORDER_DET',OrderNo:'*':CassOrderItem,ORDER_DET_QUOTE_NO$,'X')
END
Parms = WONo:@RM
Parms := WOStep:@RM
Parms := LastStep:@RM
Parms := CassNo:@RM
Parms := QuoteNo:@RM
Parms := OrderNo:@RM
Parms := CassOrderItem:@RM
Parms := CustNo:@RM
Parms := PONo:@RM
Parms := ProcPSN:@RM
Parms := SubSupplyBy:@RM
Parms := SubPreClean:@RM
Parms := SubPostClean:@RM
Parms := PromiseDt:@RM
Parms := CassLotNo:@RM
Parms := CassCustPartNo:@RM
Parms := CassWaferQty:@RM
Parms := CassSubPartNo:@RM
Parms := '':@RM ;* QXJ Flag
Parms := CassSubVendCd
Send_Info('Creating RDS for Cass No: ':CassNo:'...') ;** - Messaging - **
IF ReactorType = 'GAN' THEN
NULL
END ELSE
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Trace 2.':N:'.1 - Start obj_RDS("Create")'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
NewRDSNo = obj_RDS('Create',Parms)
Loop
While (NewRDSNo EQ 0 or NewRDSNo EQ '')
MsgTxt = 'An error occured due to multiple users attempting to create an RDS simultaneously. ' |
: @SVM : 'Would you like to retry?'
Response = Msg(@Window, '', 'RETRY', '', MsgTxt)
Begin Case
Case Response EQ 1
Retry = False$ ; // User Clicked Abort
Case Response EQ 2
Retry = True$ ; // User Clicked Retry
Case Response EQ char(27)
Retry = False$ ; // User Pressed Escape Key
End Case
If Retry EQ True$ then
NewRDSNo = obj_RDS('Create', Parms)
end
Until Retry EQ False$
Repeat
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Trace 2.':N:'.2 - End obj_RDS("Create")'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
If (Get_Status(errCode)) or (Error_Services('HasError')) or (NewRDSNo EQ 0) or (NewRDSNo EQ '') then
ErrMsg(errCode)
ErrorMsg = "RDS '" : NewRDSNo : "' Create Failure - Check for missing data on Work Order"
If Error_Services('HasError') then
ErrMsg = Error_Services('GetMessage')
EmailAddr = 'dstieber@srpcs.com,Dan.Crisp@infineon.com,jonathan.ouellette@infineon.com'
LogData = LoggingDTM : ',' : @USER4 : ',' : WONo : ',' : ErrMsg
Logging_Services('AppendLog', objLog, LogData, CRLF$, COMMA$, False$, EmailAddr, LogData)
end
RTParms = 'RDS'
FOR I = 1 TO COUNT(StepRdsNos,@VM) + (StepRdsNos NE '')
RdsNo = StepRdsNos<1,I>
RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo)
obj_Tables('DeleteRec',RTParms)
NEXT I
Msg(@WINDOW, MsgUp) ;* take down the gauge
RETURN ;*************************** Check this for WO_LOG being cleared
END else
// No error creating RDS record -> add it to the batch list.
StepRDSNos<1,-1> = NewRDSNo
end
IF ReprocessedMat THEN
OrgRDSNo = CassLotNo
obj_Reprocess('FixUp',OrgRDSNo:@RM:NewRDSNo) ;****************************************************
END
END ;* End of check for GAN reactor
END ;* End of Check for existing RDS on this WO_Step*CassetteNo
END ;* End of check for EpiPRO reactor type
NEXT N
Msg(@WINDOW, MsgUp) ;* take down the gauge
NEXT WOStep
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Trace 3'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
Send_Info("Updating WO_Mat Records with release data...")
RelDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS') ;* 12/31/2014 JCH & DKK moved to prevent time incrementing time during release
PtiDTM = OCONV(Date(),'D4/'):' ':OCONV(Time()+5,'MTHS')
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
* AvailOutSlots = WOLogRec<WO_LOG_AVAIL_OUT_SLOTS$>
MaxShipQty = Xlate('WO_LOG', WONo, 'CUST_EPI_PART_SHIP_QTY', 'X')
IF WOLogRec<WO_LOG_NEXT_OUT_SLOT$> EQ '' then WOLogRec<WO_LOG_NEXT_OUT_SLOT$> = '1*1'
FOR N = 1 TO CassCnt
WOMKey = WOMKeys<1,N>
CassNo = FIELD(WOMKey,'*',2)
// Keep trying to get the lock. Another process may be updating this record at the same time.
For Attempt = 1 to 100
HaveLock = Database_Services('GetKeyIDLock', 'WO_MAT', WOMKey)
If HaveLock then
WOMatRec = XLATE('WO_MAT',WOMKey,'','X') ;* We have the lock, so just get the record this way
IF WOMatRec<WO_MAT_REL_DTM$> = '' THEN
WOMatRec<WO_MAT_REL_DTM$> = ICONV(RelDTM,'DT')
WOMatRec<WO_MAT_REL_BY$> = @USER4
WOMatRec<WO_MAT_ORG_COMMIT_DT$> = PromiseDt
IF SubPreClean = 'No' OR SubPreClean = '' THEN
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = 'RTU'
END ELSE
WOMatRec<WO_MAT_WMI_CURR_STATUS$> = 'PREC'
END
WOMatRec<WO_MAT_WMO_CURR_STATUS$> = 'RTB'
thisInvDTM = ICONV(RelDTM,'DT')
WHCd = 'SR'
LocCd = 'RB'
InvAction = 'REL'
ScanUserID = @USER4
Tag = ''
ToolID = ''
LOCATE thisInvDTM IN WOMatRec<WO_MAT_INV_DTM$> BY 'AR' USING @VM SETTING Pos ELSE
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,False$)
END
WOMatParms = 'WO_MAT':@RM:WOMKey:@RM:WOMTableVar:@RM:WOMatRec
obj_Tables('WriteRec',WOMatParms) ;* This writes and unlocks the WO_MAT records
IF ReactType = 'EPP' OR ReactType = 'GAN' THEN
obj_WO_Wfr('CassRel',WOMKey) ;* Added 3/17/2016 JCH for wafer history ***************************************
END
END
end else
Sleepery(1000)
end
Until HaveLock EQ True$
Next Attempt
NEXT N
Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, True$, False$, True$)
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Trace 4'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
Send_Info(STR(' ',60)) ;** - Messaging - **
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then
Form = 'NDW_WO_LOG'
end else
Form = 'WO_LOG2'
end
Dummy = Set_Property(Form:'.STATUS_LINE_FIX','BACKCOLOR',OrgColor) ;** - Messaging - **
* * * * * * WO_LOG record write was here
OutOnlyCnt = COUNT(OutOnlyCassIDs,@VM) + (OutOnlyCassIDs NE '')
ExistingWOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
FOR I = 1 TO OutOnlyCnt
OutOnlyCassID = OutOnlyCassIDs<1,I>
LOCATE OutOnlyCassID IN ExistingWOMatKeys BY 'AR' USING @VM SETTING Pos ELSE
ExistingWOMatKeys = INSERT(ExistingWOMatKeys,1,Pos,0,OutOnlyCassID)
END
NEXT I
WORec<WO_LOG_WO_MAT_KEY$> = ExistingWOMatKeys ;* Add OutOnly Cassettetes to list inWO_LOG record.
Send_Info('Saving WO_LOG record...')
OtParms = FieldStore(OtParms,@RM,4,1,WORec)
obj_Tables('WriteRec',OtParms) ;* Writes and unlocks the record It only has one value updated
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Trace 5'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
Send_Info(STR(' ',60)) ;** - Messaging - **
* * * * * * * * * *
ReactNos = obj_Sched('GetReactNos',WONo) ;************************ 5/26/2-15 JCH Added schedule ReactNos and check for WO_START_DTM$
rnCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
IF rnCnt GE 1 THEN
BEGIN CASE
CASE rnCnt = 1
Message = CassCnt:' Cassettes Released for Reactor No: ':ReactNos
CASE rnCnt = 2
SWAP @VM WITH ' and ' IN ReactNos
Message = CassCnt:' Cassettes Released for Reactor Nos: ':ReactNos
CASE 1
LastReact = ReactNos<1,rnCnt>
RestOfReacts = FIELD(ReactNos,@VM,1,rnCnt - 1)
SWAP @VM WITH ', ' IN RestOfReacts
Message = CassCnt:' Cassettes Release for Reactor Nos: ':RestOfReacts:', and ':LastReact
END CASE
IF WORec<WO_LOG_WO_START_DTM$> NE '' THEN
Recipients = XLATE('NOTIFICATION','WO_RELEASE',NOTIFICATION_USER_ID$,'X')
SentFrom = @USER4
Subject = 'Work Order Release on ':WONo
IF ReactorType = 'EPP' THEN
AttachWindow = 'WO_PROD_EPI'
END ELSE
AttachWindow = 'WO_PROD'
END
AttachKey = WONo:'*':1
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
END ;* WO is not on the schedule
* * * * * * * * * *
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS')
LogData<4> = 'Ending ReleaseCassettes routine'
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
RETURN
* * * * * * *
RecallWO:
* * * * * * *
WONo = Parms[1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter WONo passed to routine (':Method:').'
IF ErrorMsg NE '' THEN RETURN
WORec = XLATE('WO_LOG',WONo,'','X')
CassNos = XLATE('WO_LOG',WONo,'WO_MAT_CASS_NO','X')
CassCnt = COUNT(CassNos,@VM) + (CassNos NE '')
WOMKeys = ''
FOR K = 1 TO CassCnt
WOMKeys<1,K> = WONo:'*':CassNos<1,K>
NEXT K
WOMTableVar = obj_WO_Mat('LockSet',WOMKeys) ;* Locks all WO_MAT records on the Work Order
IF Get_Status(errCode) THEN RETURN ;* Couldn't lock all of the cassettes
WOMCnt = COUNT(WOMKeys,@VM) + (WOMKeys NE '')
FOR I = 1 TO WOMCnt
WOMKey = WOMKeys<1,I>
WOMatRec = XLATE('WO_MAT',WOMKey,'','X') ;* We have the lock, so just get the record this way
WMIKey = WOMatRec<WO_MAT_WMI_KEY$>
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
IF WMIKey NE '' THEN obj_WM_In('Delete',WMIKey)
IF WMOKey NE '' THEN obj_WM_Out('Delete',WMOKey)
IF WOMatRec<WO_MAT_REL_DTM$> NE '' THEN
IF WOMatRec<WO_MAT_RDS_NO$> NE '' THEN
RDSCnt = COUNT(WOMatRec<WO_MAT_RDS_NO$>,@VM) + (WOMatRec<WO_MAT_RDS_NO$> NE '')
FOR N = 1 TO RDSCnt
Set_Status(0)
obj_RDS('Delete',WOMatRec<WO_MAT_RDS_NO$,N>)
NEXT I
END
IF WMIKey NE '' THEN obj_WM_In('Delete',WMIKey)
IF WMOKey NE '' THEN obj_WM_Out('Delete',WMOKey)
obj_WO_Wfr('CassDel',WOMKey) ;* Added 3/17/2016 JCH for wafer tracking *********************************
WOMatRec<WO_MAT_REL_DTM$> = ''
WOMatRec<WO_MAT_REL_BY$> = ''
WOMatRec<WO_MAT_ORG_COMMIT_DT$> = ''
WOMatParms = 'WO_MAT':@RM:WOMKey:@RM:WOMTableVar:@RM:WOMatRec
obj_Tables('WriteRec',WOMatParms) ;* This writes and unlocks the WO_MAT records
END ELSE
obj_Tables('UnlockRec','WO_MAT':@RM:WOMKey)
ErrorMsg := " WO_Mat Record ":QUOTE(WOMKey):' has not been released':CRLF$
END
NEXT I
RETURN
* * * * * * *
ChangeLotNo:
* * * * * * *
WONo = Parms[1,@RM]
OrgLotNo = Parms[COL2()+1,@RM]
NewLotNo = Parms[COL2()+1,@RM]
Reason = Parms[COL2()+1,@RM]
CassNos = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF OrgLotNo = '' THEN ErrorMsg = 'Null parameter "Org Lot No" passed to routine. (':Method:')'
IF NewLotNo = '' THEN ErrorMsg = 'Null parameter "New Lot No" passed to routine. (':Method:')'
IF Reason = '' THEN ErrorMsg = 'Null parameter "Reason" passed to routine. (':Method:')'
IF CassNos = '' THEN ErrorMsg = 'Null parameter "CassNos" passed to routine. (':Method:')'
WOMatKeys = ''
cCnt = COUNT(CassNos,@VM) + (CassNos NE '')
FOR I = 1 TO cCnt
WOMatKeys<1,I> = WONo:'*':CassNos<1,I>
NEXT I
WOMCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
FOR I = 1 TO WOMCnt
WOMatKey = WOMatKeys<1,I>
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
IF WOMatRec<WO_MAT_LOT_NO$> = OrgLotNo THEN
RDSNos = WOMatRec<WO_MAT_RDS_NO$>
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
FOR N = 1 TO RDSCnt
oPLParms = 'RDS':@RM
oPLParms := RDSNos<1,N>:@RM
oPLParms := RDS_LOT_NUM$:@RM
oPLParms := NewLotNo
obj_Post_Log('Create',oPLParms)
NEXT N
oPLParms = 'WO_MAT':@RM
oPLParms := WOMatKey:@RM
oPLParms := WO_MAT_LOT_NO$:@RM
oPLParms := NewLotNo
obj_Post_Log('Create',oPLParms)
END
NEXT I
RETURN
* * * * * * *
ChangeCassQty:
* * * * * * *
WONo = Parms[1,@RM]
CassNo = Parms[COL2()+1,@RM]
NewCassQty = Parms[COL2()+1,@RM]
Reason = 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 NewCassQty = '' THEN ErrorMsg = 'Null parameter "NewCassQty" passed to routine. (':Method:')'
IF Reason = '' THEN ErrorMsg = 'Null parameter "Reason" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
FirstRDS = WOMatRec<WO_MAT_RDS_NO$,1>
If FirstRDS NE '' then
// There will only be an RDS if the cassette has been released already, otherwise this will fail.
obj_RDS('SetSchedWfrQty',FirstRDS:@RM:NewCassQty)
IF Get_Status(errCode) THEN RETURN
end
CurrWfrCnt = WOMatRec<WO_MAT_WAFER_QTY$>
PrevWfrCnt = obj_WO_Mat('SetWfrQty',WONo:'*':CassNo:@RM:NewCassQty)
IF Get_Status(errCode) THEN
obj_RDS('SetSchedWfrQty',FirstRDS:@RM:CurrWfrCnt) ;* Reset RDS Sched Qty to original
RETURN
END
WOQtyDelta = PrevWfrCnt - NewCassQty
IF WOQtyDelta NE 0 THEN
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
If Error_Services('HasError') then
Set_Status(Error_Services('GetMessage'))
return
end
WOLogRec<WO_LOG_WO_QTY$> = WOLogRec<WO_LOG_WO_QTY$> + WOQtyDelta
Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, True$, False$, False$)
END
RETURN
* * * * * * *
ChangePONo:
* * * * * * *
RETURN
* * * * * * *
AddOrderItem:
* * * * * * *
WONo = Parms[1,@RM]
OrderNo = Parms[COL2()+1,@RM]
ItemNo = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF OrderNo = '' THEN ErrorMsg = 'Null parameter "OrderNo" passed to routine. (':Method:')'
IF ItemNo = '' THEN ErrorMsg = 'Null parameter "ItemNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WTParms = 'WO_LOG':@RM:WONo
WORec = obj_Tables('ReadRec',WTParms)
IF WORec<WO_LOG_ORDER_NO$> = OrderNo THEN
LOCATE ItemNo IN WORec<WO_LOG_ORDER_ITEM$> BY 'AR' USING @VM SETTING Pos ELSE
WORec = INSERT(WORec,WO_LOG_ORDER_ITEM$,Pos,0,ItemNo)
END
WTParms = FieldStore(WTParms,@RM,4,1,WORec)
obj_Tables('WriteRec',WTParms)
END ELSE
obj_Tables('UnlockRec',WTParms)
END
RETURN
* * * * * * *
RemOrderItem:
* * * * * * *
WONo = Parms[1,@RM]
OrderNo = Parms[COL2()+1,@RM]
ItemNo = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF OrderNo = '' THEN ErrorMsg = 'Null parameter "OrderNo" passed to routine. (':Method:')'
IF ItemNo = '' THEN ErrorMsg = 'Null parameter "ItemNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WTParms = 'WO_LOG':@RM:WONo
WORec = obj_Tables('ReadRec',WTParms)
IF WORec<WO_LOG_ORDER_NO$> = OrderNo THEN
LOCATE ItemNo IN WORec<WO_LOG_ORDER_ITEM$> BY 'AR' USING @VM SETTING Pos THEN
WORec = DELETE(WORec,WO_LOG_ORDER_ITEM$,Pos,0)
END
WTParms = FieldStore(WTParms,@RM,4,1,WORec)
obj_Tables('WriteRec',WTParms)
END ELSE
obj_Tables('UnlockRec',WTParms)
END
RETURN
* * * * * * *
SetPromiseDt:
* * * * * * *
OrderNo = Parms[1,@RM]
OrderItems = Parms[COL2()+1,@RM]
WONo = Parms[COL2()+1,@RM]
PromiseDt = Parms[COL2()+1,@RM]
Reason = Parms[COL2()+1,@RM]
*IF OrderNo = '' THEN ErrorMsg = 'Null parameter "OrderNo" passed to routine. (':Method:')'
*IF OrderItems = '' THEN ErrorMsg = 'Null parameter "OrderItems" passed to routine. (':Method:')'
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF PromiseDt = '' THEN ErrorMsg = 'Null parameter "PromiseDt" passed to routine. (':Method:')'
IF Reason = '' THEN ErrorMsg = 'Null parameter "Reason" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
thisPromiseDt = ICONV(PromiseDt,'D')
IF thisPromiseDt = '' THEN ErrorMsg = 'Invalid PromiseDt ':QUOTE(PromiseDt):' passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
OPEN 'DICT.RDS' TO DictVar ELSE
ErrorMsg = 'Unable to Open DICT.RDS table'
RETURN
END
SearchString = 'WO':@VM:WONo:@FM
Flag = ''
Set_Status(0)
Btree.Extract(SearchString, 'RDS', DictVar, RDSNos, '', Flag) ; * Get RDS numbers for this Work Order
IF Get_Status(errCode) THEN
RETURN
END
OPEN 'DICT.WM_OUT' TO DictVar ELSE
ErrorMsg = 'Unable to Open DICT.WM_OUT table'
RETURN
END
SearchString = 'WO_NO':@VM:WONo:@FM
Flag = ''
Set_Status(0)
Btree.Extract(SearchString, 'WM_OUT', DictVar, WMOutKeys, '', Flag) ; * Get WM_OUT Keys for this Work Order
IF Get_Status(errCode) THEN
RETURN
END
/*
OrderDetKeys = ''
FOR I = 1 TO COUNT(OrderItems,@VM) + (OrderItems NE '')
OrderDetKeys<1,-1> = OrderNo:'*':OrderItems<1,I>
NEXT I
*/
*OTParms = 'ORDER_DET'
RTParms = 'RDS'
WMParms = 'WM_OUT'
*LockedODKeys = ''
LockedRDSNos = ''
LockedWMOutKeys = ''
/*
FOR M = 1 TO COUNT(OrderDetKeys,@VM) + (OrderDetKeys NE '')
OrderDetKey = OrderDetKeys<1,M>
OTParms = FieldStore(OTParms, @RM, 2, 1, OrderDetKey)
obj_Tables('LockRec',OTParms)
IF Get_Status(errCode) THEN
FOR L = 1 TO COUNT(LockedODKeys,@VM) + (LockedODKeys NE '')
OTParms = FieldStore(OTParms, @RM, 2, 1, LockedODKeys<1,L>)
obj_Tables('UnlockRec',OTParms) ;* Unlock everything locked up to here
NEXT L
ErrorMsg = 'Unable to lock ORDER_DET record ':QUOTE(OrderDetKey):' for Update.'
RETURN
END ELSE
LockedODKeys<1,-1> = OrderDetKey
END
NEXT M
*/
FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '')
RdsNo = RdsNos<1,I>
RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo)
obj_Tables('LockRec',RTParms)
IF Get_Status(errCode) THEN
FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>)
obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here
NEXT N
*FOR L = 1 TO COUNT(LockedODKeys,@VM) + (LockedODKeys NE '')
* OTParms = FieldStore(OTParms, @RM, 2, 1, LockedODKeys<1,L>)
* obj_Tables('UnlockRec',OTParms) ;* Unlock everything locked up to here
*NEXT L
ErrorMsg = 'Unable to lock RDS ':QUOTE(RdsNo):' for delete.'
*obj_Tables('UnlockRec',OTParms)
RETURN
END ELSE
LockedRDSNos<1,-1> = RdsNo
END
NEXT I
FOR I = 1 TO COUNT(WMOutKeys,@VM) + (WMOutKeys NE '')
WMOutKey = WMOutKeys<1,I>
WMParms = FieldStore(WMParms, @RM, 2, 1, WMOutKey)
obj_Tables('LockRec',WMParms)
IF Get_Status(errCode) THEN
FOR M = 1 TO COUNT(LockedWMOutKeys,@VM) + (LockedWMOutKeys NE '')
WMParms = FieldStore(WMParms, @RM, 2, 1, LockedWMOutKeys<1,M>)
obj_Tables('UnlockRec',WMParms) ;* Unlock everything locked up to here
NEXT M
FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>)
obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here
NEXT N
*FOR L = 1 TO COUNT(LockedODKeys,@VM) + (LockedODKeys NE '')
* OTParms = FieldStore(OTParms, @RM, 2, 1, LockedODKeys<1,L>)
* obj_Tables('UnlockRec',OTParms) ;* Unlock everything locked up to here
*NEXT L
ErrorMsg = 'Unable to lock RDS ':QUOTE(WMOutKey):' for delete.'
*obj_Tables('UnlockRec',OTParms)
RETURN
END ELSE
LockedWMOutKeys<1,-1> = WMOutKey
END
NEXT I
*OCTableNames = '' ;* Buckets for stuff to pass to obj_Order_Change
*OCRecordKeys = ''
*OCColumns = ''
*OCValues = ''
*OCOldValues = ''
*OCNewValues = ''
*OCCnt = 0
*OrderTableVar = FIELD(OTParms,@RM,3)
RDSTableVar = FIELD(RTParms,@RM,3)
WMOTableVar = FIELD(WMParms,@RM,3)
FOR I = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '')
LockedRDSNo = LockedRDSNos<1,I>
READ RDSRec FROM RDSTableVar,LockedRDSNo THEN
OldValue = RDSRec<RDS_COMMIT_DATE_FINAL$>
RDSRec<RDS_COMMIT_DATE_FINAL$> = thisPromiseDt
RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNo)
RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec)
obj_Tables('WriteRec',RTParms) ;* Write and unlock RDS records
END
*OCCnt += 1
*OCTableNames<1,OCCnt> = 'RDS'
*OCRecordKeys<1,OCCnt> = LockedRDSNo
*OCColumns<1,OCCnt> = 'COMMIT_DATE_FINAL'
*OCValues<1,OCCnt> = ''
*OCOldValues<1,OCCnt> = OldValue
*OCNewValues<1,OCCnt> = thisPromiseDt
NEXT I
**************************** This section added 6/29/2006 JCH J.C. Henry & Co.
FOR I = 1 TO COUNT(LockedWMOutKeys,@VM) + (LockedWMOutKeys NE '')
LockedWMOutKey = LockedWMOutKeys<1,I>
READ WMOutRec FROM WMOTableVar,LockedWMOutKey THEN
OldValue = WMOutRec<WM_OUT_PROMISE_SHIP_DT$>
WMOutRec<WM_OUT_PROMISE_SHIP_DT$> = thisPromiseDt
WMParms = FieldStore(WMParms, @RM, 2, 1, LockedWMOutKey)
WMParms = FieldStore(WMParms, @RM, 4, 1, WMOutRec)
obj_Tables('WriteRec',WMParms) ;* Write and unlock RDS records
END
*OCCnt += 1
*OCTableNames<1,OCCnt> = 'WM_OUT'
*OCRecordKeys<1,OCCnt> = LockedWMOutKey
*OCColumns<1,OCCnt> = 'COMMIT_DT'
*OCValues<1,OCCnt> = ''
*OCOldValues<1,OCCnt> = OldValue
*OCNewValues<1,OCCnt> = thisPromiseDt
NEXT I
*****************************
/*
FOR I = 1 TO COUNT(LockedODKeys,@VM) + (LockedODKeys NE '')
OrderDetKey = LockedODKEys<1,I>
READ OrderDetRec FROM OrderTableVar,OrderDetKey THEN
OldValue = OrderDetRec<ORDER_DET_PROMISE_DT$>
OrderDetRec<ORDER_DET_PROMISE_DT$> = thisPromiseDt
OTParms = FieldStore(OTParms,@RM,2,1,OrderDetKey)
OTParms = FieldStore(OTParms,@RM,4,1,OrderDetRec)
obj_Tables('WriteRec',OTParms) ;* Write and unlock ORDER_DET record
OCCnt += 1
OCTableNames<1,OCCnt> = 'ORDER_DET'
OCRecordKeys<1,OCCnt> = OrderDetKey
OCColumns<1,OCCnt> = 'PROMISE_DT'
OCValues<1,OCCnt> = ''
OCOldValues<1,OCCnt> = OldValue
OCNewValues<1,OCCnt> = thisPromiseDt
END ELSE
obj_Tables('UnlockRec',OTParms)
END
NEXT I
*/
*obj_Order_Change('Create',OrderNo:@RM:OCTableNames:@RM:OCRecordKeys:@RM:OCColumns:@RM:OCValues:@RM:OCOldValues:@RM:OCNewValues:@RM:Reason)
RETURN
* * * * * * *
QuoteChange:
* * * * * * *
QuoteNo = Parms[1,@RM]
WONo = Parms[COL2()+1,@RM]
IF QuoteNo = '' THEN ErrorMsg = 'Null parameter "QuoteNo" passed to routine. (':Method:')'
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
QuoteRec = XLATE('QUOTE',QuoteNo,'','X')
QuoteProcSteps = QuoteRec<QUOTE_PROC_STEP$>
QuoteProcStepPSNs = QuoteRec<QUOTE_PROC_STEP_PSN$>
WTParms = 'WO_LOG':@RM:WONo
WORec = obj_Tables('ReadRec',WTParms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
obj_Tables('UnlockRec',WTParms)
RETURN
END
WOStepKeys = WORec<WO_LOG_WO_STEP_KEY$>
LockedWOStepKeys = ''
wsParms = 'WO_STEP'
FOR I = 1 TO COUNT(WOStepKeys,@VM) + (WOStepKeys NE '')
WOStepKey = WOStepKeys<1,I>
wsParms = FieldStore(wsParms, @RM, 2, 1, WOStepKey)
obj_Tables('LockRec',wsParms)
IF Get_Status(errCode) THEN
FOR N = 1 TO COUNT(LockedWOStepKeys,@VM) + (LockedWOStepKeys NE '')
wsParms = FieldStore(wsParms, @RM, 2, 1, LockedWOStepKeys<1,N>)
obj_Tables('UnlockRec',wsParms) ;* Unlock everything locked up to here
NEXT N
ErrorMsg = 'Unable to lock WO_STEP ':QUOTE(WOStepKey):' for Update.'
obj_Tables('UnlockRec',WTParms)
RETURN
END ELSE
LockedWOStepKeys<1,-1> = WOStepKey
END
NEXT I
FOR I = 1 TO COUNT(LockedWOStepKeys,@VM) + (LockedWOStepKeys NE '')
LockedWOStepKey = LockedWOStepKeys<1,I>
WOStepRec = XLATE('WO_STEP',LockedWOStepKey,'','X')
ProcStep = FIELD(LockedWOStepKey,'*',2)
LOCATE ProcStep IN QuoteProcSteps USING @VM SETTING Pos THEN
StepPSN = QuoteProcStepPSNs<1,Pos>
WOStepRec<WO_STEP_PROD_SPEC_ID$> = StepPSN
END
wsParms = FieldStore(wsParms, @RM, 2, 1, LockedWOStepKey)
wsParms = FieldStore(wsParms, @RM, 4, 1, WOStepRec)
obj_Tables('WriteRec',wsParms)
NEXT I
WORec<WO_LOG_QUOTE_NO$> = QuoteNo
WTParms = FieldStore(WTParms,@RM,4,1,WORec)
obj_Tables('WriteRec',WTParms)
RETURN
* * * * * * *
NextWORun:
* * * * * * *
WONo = Parms[1,@RM]
WOStep = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WOStep = '' THEN WOStep = 1
errCode = 0
Cancelled = 0
LOOP
WTParms = 'WO_LOG':@RM:WONo
WORec = obj_Tables('ReadRec',WTParms)
dummy = Get_Status(errCode)
IF errCode THEN
Resp = Msg(@WINDOW,'','WO_NO_LOCKED')
IF Resp = CHAR(27) THEN Cancelled = 1
END
UNTIL errCode = '' OR Cancelled = 1
REPEAT
IF Cancelled THEN RETURN ;* Bailed out
StepRDSNos = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_RDS_KEY$,'X')
IF (WONo:'*':WOStep = '162988*1') THEN
CurrRuns = 3
END ELSE
CurrRuns = 0
END
FOR I = 1 TO COUNT(StepRDSNos,@VM) + (StepRDSNos NE '')
IF RowExists('RDS',StepRDSNos<1,I>) THEN
CurrRuns += 1
END
NEXT I
NextRunNo = CurrRuns + 1
Result = NextRunNo ;* Next Run No returned to calling program
*WORec<WO_LOG_NEXT_RUN_NO$> = NextRunNo + 1
WTParms = FieldStore(WTParms,@RM,4,1,WORec)
obj_Tables('WriteRec',WTParms) ;* Updates WO_LOG record and unlocks it.
RETURN
* * * * * * *
AddCassNo:
* * * * * * *
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
WTParms = 'WO_LOG':@RM:WONo
WORec = obj_Tables('ReadRec',WTParms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END ELSE
WOMatKey = WONo:'*':CassNo
LOCATE WOMatKey IN WORec<WO_LOG_WO_MAT_KEY$> BY 'AR' USING @VM SETTING CassPos THEN
obj_Tables('UnlockRec',WTParms)
END ELSE
WORec = INSERT(WORec,WO_LOG_WO_MAT_KEY$,CassPos,0,WOMatKey)
WTParms = FieldStore(WTParms,@RM,4,1,WORec)
obj_Tables('WriteRec',WTParms) ;* Updates WO_LOG record and unlocks it.
END
END
RETURN
* * * * * * *
RemoveCassettes:
* * * * * * *
ErrorMessage = ''
WONo = Parms[1,@RM]
CassNos = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF CassNos = '' THEN ErrorMsg = 'Null parameter "CassNos" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
AllCassIDs = ''
CassCnt = COUNT(CassNos,@VM) + (CassNos NE '')
FOR I = 1 TO CassCnt
AllCassIDs<1,I> = WONo:'*':CassNos<1,I>
NEXT I
AllRDSNos = XLATE('WO_MAT',AllCassIDs,WO_MAT_RDS_NO$,'X')
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
If Error_Services('NoError') then
FOR I = 1 TO COUNT(CassNos,@VM) + (CassNos NE '')
CassNo = CassNos<1,I>
Set_Status(0)
obj_WO_Mat('Delete',WONo:@RM:CassNo)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END ELSE
WOMatKey = WONo:'*':CassNo
LOCATE WOMatKey IN WORec<WO_LOG_WO_MAT_KEY$> USING @VM SETTING CassPos THEN
WORec = DELETE(WORec,WO_LOG_WO_MAT_KEY$,CassPos,0)
END
END
NEXT I
Database_Services('WriteDataRow', 'WO_LOG', WONo, WORec)
If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage')
end else
ErrorMessage = Error_Services('GetMessage')
end
If ErrorMessage NE '' then
ErrMsg(ErrorMessage)
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
LogData<3> = WONo
LogData<4> = 'Error in obj_WO_Log("RemoveCassettes"). Error message: ':ErrorMessage
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
end
RETURN
* * * * * * *
SetPartNo:
* * * * * * *
WONo = Parms[1,@RM]
NewPartNo = Parms[COL2()+1,@RM]
OrgPartNo = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF NewPartNo = '' THEN ErrorMsg = 'Null parameter "NewPartNo" passed to routine. (':Method:')'
IF OrgPartNo = '' THEN ErrorMsg = 'Null parameter "OrgPartNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WORec = XLATE('WO_LOG',WONo,'','X')
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
obj_WO_Mat('SetPartNo',WOMatKeys:@RM:NewPartNo)
RETURN
* * * * * * *
RefreshSigProfile:
* * * * * * *
WONo = Parms[1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
WOMatKeys = XLATE('WO_LOG',WONo,WO_LOG_WO_MAT_KEY$,'X')
WOMatCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
FOR I = 1 TO WOMatCnt
Set_Status(0)
WOMatKey = WOMatKeys<1,I>
obj_WO_Mat('RefreshSigProfile',WOMatKey)
IF Get_Status(errCode) THEN ErrMsg(errCode)
NEXT I
RETURN
* * * * * * *
RelQty:
* * * * * * *
WONo = Parms[1,@RM]
WORec = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WORec = '' THEN
WORec = XLATE('WO_LOG',WONo,'','X')
END
IF WORec = '' THEN RETURN
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
LineCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
FOR I = 1 TO LineCnt
WOMatRec = XLATE('WO_MAT',WOMatKeys<1,I>,'','X')
UNTIL WOMatRec<WO_MAT_REL_BY$> = ''
Result += WOMatRec<WO_MAT_WAFER_QTY$>
NEXT I
RETURN
* * * * * * *
RelDTMs:
* * * * * * *
WONo = Parms[1,@RM]
WORec = Parms[COL2()+1,@RM]
DtsOnly = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WORec = '' THEN
WORec = XLATE('WO_LOG',WONo,'','X')
END
IF WORec = '' THEN RETURN
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
AllCassRelDTMs = XLATE('WO_MAT',WOMatKeys,WO_MAT_REL_DTM$,'X')
AllCassRelBys = XLATE('WO_MAT',WOMatKeys,WO_MAT_REL_BY$,'X')
WOMatCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
RelDTMs = ''
RelDTs = ''
Result = ''
FOR N = 1 TO WOMatCnt
AllCassRelDTM = AllCassRelDTMs<1,N>
AllCassRelBy = OCONV(AllCassRelBys<1,N>,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
IF DtsOnly = 1 THEN
RelDT = AllCassRelDTM[1,'.']
LOCATE RelDT IN RelDTs BY 'AR' USING @VM SETTING DtPos ELSE
RelDTs = INSERT(RelDTs,1,DtPos,0,RelDT)
END
END
IF AllCassRelDTM NE '' THEN
LOCATE AllCassRelDTM IN RelDTMs USING @VM SETTING Pos THEN
NULL
END ELSE
RelDTMS = INSERT(RelDTMS,1,Pos,0,AllCassRelDTM)
Result = INSERT(Result,1,Pos,0,OCONV(AllCassRelDTM,'DT4/^HS'):' - ':AllCassRelBy)
END
END
NEXT N
IF DtsOnly = 1 THEN
Result = RelDTs
END
RETURN
CassRelUsers = XLATE('WO_MAT',@RECORD<31>,28,'X')
TimeStamps = ''
Tmp = ''
FOR I = 1 TO COUNT(CassRelDTMs,@VM) + (CassRelDTMs NE '')
CassRelDTM = CassRelDTMs<1,I>
CassRelUser = CassRelUsers<1,I>
LOCATE CassRelDTM IN TimeStamps SETTING Pos ELSE
TimeStamps = INSERT(TimeStamps,1,Pos,0,CassRelDTM)
Tmp = INSERT(Tmp,1,Pos,0,OCONV(CassRelDTM,'DT2/^HS'):' ':OCONV(CassRelUser,'[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
END
NEXT I
@ANS = Tmp
RETURN
* * * * * * *
RxQty:
* * * * * * *
WONo = Parms[1,@RM]
WORec = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WORec = '' THEN
WORec = XLATE('WO_LOG',WONo,'','X')
END
IF WORec = '' THEN RETURN
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
LineCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
FOR I = 1 TO LineCnt
WOMatRec = XLATE('WO_MAT',WOMatKeys<1,I>,'','X')
UNTIL WOMatRec<WO_MAT_RX_BY$> = ''
Result += WOMatRec<WO_MAT_WAFER_QTY$>
NEXT I
RETURN
* * * * * * *
ShipQty:
* * * * * * *
IF NOT(ASSIGNED(WONo)) THEN WONo = Parms[1,@RM]
IF NOT(ASSIGNED(WORec)) THEN WORec = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WORec = '' THEN
WORec = XLATE('WO_LOG',WONo,'','X')
END
IF WORec = '' THEN RETURN
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
LineCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
FOR I = 1 TO LineCnt
WOMatKey = WOMatKeys<1,I>
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
WMOKey = WOMatRec<WO_MAT_WMO_KEY$>
IF WMOKey NE '' THEN
WMOutRec = XLATE('WM_OUT',WMOKey,'','X')
ShipNo = WMOutRec<WM_OUT_SHIP_NO$>
IF ShipNo NE '' THEN
CurrWfrCnt = XLATE('WM_OUT',WMOKey,'WAFER_CNT','X')
Result += CurrWfrCnt
END
END ELSE
IF WOMatRec<WO_MAT_SHIP_NO$> NE '' THEN
CurrWfrCnt = obj_WO_Mat('CurrWaferCnt',WOMatKey:@RM:WOMatRec)
Result += CurrWfrCnt
END
END
NEXT I
RETURN
* * * * * * *
ShipPropTarg:
* * * * * * *
IF NOT(ASSIGNED(WONo)) THEN WONo = Parms[1,@RM]
IF NOT(ASSIGNED(WORec)) THEN WORec = Parms[COL2()+1,@RM]
IF NOT(ASSIGNED(PropCd)) THEN PropCd = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WORec = '' THEN
WORec = XLATE('WO_LOG',WONo,'','X')
END
IF WORec = '' THEN RETURN
IF PropCd = '' THEN RETURN
LastWOStepKey = WORec<WO_LOG_WO_STEP_KEY$>[-1,'B':@VM]
StepPSN = XLATE('WO_STEP',LastWOStepKey,WO_STEP_PROD_SPEC_ID$,'X')
PRSLayerKeys = XLATE('PROD_SPEC',StepPSN,PROD_SPEC_PRS_LAYER_KEY$,'X')
LastPRSLayerKey = PRSLayerKeys[-1,'B':@VM]
LastLayerProps = XLATE('PRS_LAYER',LastPRSLayerKey,PRS_LAYER_PRS_PROP_KEY$,'X')
PropCnt = COUNT(LastLayerProps,@VM) + (LastLayerProps NE '')
FOR I = 1 TO PropCnt
PropKey = LastLayerProps<1,I>
SpecPropCd = FIELD(PropKey,'*',3)
IF SpecPropCd[1,5] = PropCd THEN
PropRec = XLATE('PRS_PROP',PropKey,'','X')
MinVal = PropRec<2>
MaxVal = PropRec<3>
Target = MinVal + ((MaxVal - MinVal)/2)
Result = OCONV( Target,'[MET_PROP_CONV,':PropCd:']')
END
NEXT I
RETURN
* * * * * *
CloseComp:
* * * * * *
CompOrShipShort = Parms[1,@RM]
IF CompOrShipShort = '' THEN RETURN
MsgUp = Msg(@WINDOW,'','SELECT_OPEN_WO')
IF Get_Status(errCode) THEN RETURN
IF CompOrShipShort = 'Comp' THEN
SelectStatement = 'SELECT WO_LOG WITH CURR_STATUS = "COMP" AND WITHOUT CLOSE_DATE '
END ELSE
SelectStatement = 'SELECT WO_LOG WITH CURR_STATUS = "INPR" "SHIP" AND WITHOUT CLOSE_DATE '
END
RList(SelectStatement, TARGET_ACTIVELIST$, '','','')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
Msg(@WINDOW,MsgUp)
RETURN
END
Msg(@WINDOW,MsgUp)
WONos = Popup(@WINDOW,'','OPEN_WORK_ORDERS')
IF WONos = '' OR WONos = CHAR(27) THEN RETURN
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
DelCnt = COUNT(WONos,@VM) + (WONos NE '')
Proceed = Msg(@WINDOW,'','WO_CLOSE','',DelCnt)
IF Proceed = 0 THEN RETURN ;* Bailed Out
Today = Date()
Def = ""
Def<MCAPTION$> = "Closing Work Orders..."
Def<MTYPE$ > = "GC"
Def<MEXTENT$> = DelCnt
Def<MTEXTWIDTH$> = 200
MsgUp = Msg(@window, Def)
FOR I = 1 TO DelCnt
WONo = WONos<1,I>
WHILE Msg(@WINDOW,MsgUp,I,MSGINSTUPDATE$)
otParms = 'WO_LOG':@RM:WONo
WOLogRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END ELSE
WOLogRec<WO_LOG_CLOSE_DATE$> = Today
otParms = FIELDSTORE(otParms,@RM,4,0,WOLogRec)
obj_Tables('WriteRec',otParms)
END
NEXT I
Msg(@WINDOW, MsgUp) ;* take down the gauge
RETURN
* * * * * * *
Route:
* * * * * * *
WONo = Parms[1,@RM]
ProdVerNo = Parms[COL2()+1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF ProdVerNo = '' THEN ErrorMsg = 'Null parameter "ProdVerNo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_LOG':@RM:WONo
WOLogRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN
WOStepKeys = WOLogRec<WO_LOG_WO_STEP_KEY$>
IF WOStepKeys NE '' THEN
WOStepPSN = Xlate('WO_STEP', WOStepKeys, 'PROD_SPEC_ID', 'X')
If WOStepPSN NE '' then
ErrorMsg = 'WO has WO_STEPS already defined.'
obj_Tables('UnlockRec',otParms)
RETURN
END
END
* Good lock and WO_LOG record *
ProdVerRec = XLATE('PROD_VER',ProdVerNo,'','X')
* Add WO_STEP records
ProcSteps = ProdVerRec<PROD_VER_PROC_STEP_NO$>
ProcPSNs = ProdVerRec<PROD_VER_PROC_STEP_PSN$>
ProcDescs = ProdVerRec<PROD_VER_PROC_STEP_DESC$>
ProcPSNStatuses = XLATE('PROD_SPEC',ProcPSNs,PROD_SPEC_STATUS$,'X')
ProcPSNReactTypes = Xlate('PROD_SPEC',ProcPSNs,PROD_SPEC_REACTOR_TYPE$,'X')
FOR P = 1 TO COUNT(ProcPSNStatuses,@VM) + (ProcPSNStatuses NE '')
IF ProcPSNStatuses<1,P> NE 'A' THEN
ErrorMsg = 'Product Spec on Hold on Prod Ver No.'
obj_Tables('UnlockRec',otParms)
RETURN
END
NEXT P
CustNo = WOLogRec<WO_LOG_CUST_NO$>
EpiPartNo = WOLogRec<WO_LOG_EPI_PART_NO$>
DefWMOCassQtys = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,CUST_EPI_PART_WMO_LOAD_CNT$,'X')
WOStepKeys = ''
DefWMOCassQty = ''
FOR N = 1 TO COUNT(ProcSteps,@VM) + (ProcSteps NE '')
ProcStep = ProcSteps<1,N>
ProcPSN = ProcPSNs<1,N>
ProcDesc = ProcDescs<1,N>
obj_WO_Step('Create',WONo:@RM:ProcStep:@RM:ProcPSN:@RM:ProcDesc)
IF DefWMOCassQtys<1,N> NE '' THEN DefWMOCassQty = DefWMOCassQtys<1,N>
WOStepKeys<1,N> = WONo:'*':ProcStep
NEXT N
WOLogRec<WO_LOG_WO_STEP_KEY$> = WOStepKeys ;* This is currently a relational target * 11/2/2011 jch, might change later
WOLogRec<WO_LOG_OUT_CASS_LOAD_QTY$> = DefWMOCassQty
WOLogRec<WO_LOG_REACT_TYPE$> = ProcPSNReactTypes<1,1> ;* Assumes both steps run on same reactor type
* Add rest of WO fields
CustNo = ProdVerRec<PROD_VER_CUST_NO$>
EpiPN = ProdVerRec<PROD_VER_EPI_PART_NO$>
Captive = XLATE('COMPANY',CustNo,COMPANY_CAPTIVE$,'X')
IF Captive = 1 THEN
WOLogRec<WO_LOG_CUST_PART_NO$> = EpiPN
END
WOLogRec<WO_LOG_PROD_VER_NO$> = ProdVerNo
WOLogRec<WO_LOG_CUST_NO$> = CustNo
otParms = FIELDSTORE(otParms,@RM,4,0,WOLogRec)
obj_Tables('WriteRec',otParms)
RETURN
* * * * * * *
Unroute:
* * * * * * *
WONo = Parms[1,@RM]
IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
otParms = 'WO_LOG':@RM:WONo
WOLogRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock
IF Get_Status(errCode) THEN RETURN
IF WOLogRec<WO_LOG_CASS_REL_DTM$> NE '' THEN
ErrorMsg = 'WO has been released and may not Unrouted.'
obj_Tables('UnlockRec',otParms)
RETURN
END
WOStepKeys = WOLogRec<WO_LOG_WO_STEP_KEY$>
StepCnt = COUNT(WOStepKeys,@VM) + (WOStepKeys NE '')
FOR I = 1 TO StepCnt
WOStepKey = WOStepKeys<1,I>
StepNo = FIELD(WOStepKey,'*',2)
obj_WO_Step('Delete',WONo:@RM:StepNo)
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',otParms)
RETURN
END
NEXT I
WOLogRec<WO_LOG_WO_STEP_KEY$> = ''
WOLogRec<WO_LOG_OUT_CASS_LOAD_QTY$> = ''
WOLogRec<WO_LOG_CUST_PART_NO$> = ''
WOLogRec<WO_LOG_PROD_VER_NO$> = ''
WOLogRec<WO_LOG_CUST_NO$> = ''
otParms = FIELDSTORE(otParms,@RM,4,0,WOLogRec)
obj_Tables('WriteRec',otParms)
RETURN
* * * * * * *
GetAvgCycleTimes:
* * * * * * *
IF NOT(Assigned(WONo)) THEN WONo = Parms[1,@RM]
IF NOT(Assigned(WOLogRec)) THEN WOLogRec = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WOLogRec = '' THEN
WOLogRec = XLATE('WO_LOG',WONo,'','X')
IF WOLogRec = '' THEN RETURN
END
ProdVerNo = WOLogRec<WO_LOG_PROD_VER_NO$>
ReactType = XLATE('PROD_VER', ProdVerNo,PROD_VER_REACT_TYPE$, 'X' )
IF ReactType = 'EPP' THEN
* EpiPRO
RelToVerTime = ''
FirstWOMatKey = WOLogRec<WO_LOG_WO_MAT_KEY$,1>
WOMatRec= XLATE('WO_MAT',FirstWOMatKey,'','X')
StartDTM = WOMatRec<WO_MAT_REL_DTM$>
WOStepKey = WOLogRec<WO_LOG_WO_STEP_KEY$,1>
RDSNos = XLATE('WO_STEP',WOStepKey,WO_STEP_RDS_KEY$,'X')
StopDTM = XLATE('REACT_RUN',RDSNos<1,1>,REACT_RUN_VER_SIG_DTM$,'X')
IF StartDTM NE '' AND StopDTM NE '' THEN
RelToVerTime = ICONV((StopDTM - StartDTM)*24,'MD1')
END
* Average Cycle Time
TotCycleTime = 0
TotCycleCnt = 0
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
FOR I = 1 TO RDSCnt
StartDTM = ''
StopDTM = ''
ReactRunRec = XLATE('REACT_RUN',RDSNos<1,I>,'','X')
StartDTM = ReactRunRec<REACT_RUN_VER_SIG_DTM$>
StopDTM = ReactRunRec<REACT_RUN_UNLOAD_SIG_DTM$>
IF StartDTM NE '' AND StopDTM NE '' THEN
CycleTime = (StopDTM - StartDTM)*24 ;* DTM's in decimal days
TotCycleTime += CycleTime
TotCycleCnt += 1
END
NEXT I
IF TotCycleCnt > 0 THEN
AvgCycleTime = ICONV(TotCycleTime/TotCycleCnt,'MD1')
END ELSE
AvgCycleTime = ''
END
END ELSE
* ASM
WOMatKeys = WOLogRec<WO_LOG_WO_MAT_KEY$>
WOMatCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
* RelToVerTime Calculation
RelToVerTime = ''
FirstWOMatKey = WOLogRec<WO_LOG_WO_MAT_KEY$,1>
WOMatRec= XLATE('WO_MAT',FirstWOMatKey,'','X')
StartDTM = WOMatRec<WO_MAT_REL_DTM$>
RDSNos = WOMatRec<WO_MAT_RDS_NO$>
StopDTM = XLATE('REACT_RUN',RDSNos<1,1>,REACT_RUN_VER_SIG_DTM$,'X')
IF StartDTM NE '' AND StopDTM NE '' THEN
RelToVerTime = ICONV((StopDTM - StartDTM)*24,'MD1')
END
TotCycleTime = 0
TotCycleCnt = 0
FOR I = 1 TO WOMatCnt
CycleTime = obj_WO_Mat('GetCycleTime',WOMatKeys<1,I>:@RM:'':@RM:'VER':@RM:'QA')
IF CycleTime NE '' THEN
TotCycleTime += OCONV(CycleTime,'MD1')
TotCycleCnt += 1
END
NEXT I
IF TotCycleCnt > 0 THEN
AvgCycleTime = ICONV(TotCycleTime/TotCycleCnt,'MD1')
END ELSE
AvgCycleTime = ''
END
END ;* End of check for EpiPRO (EPP) reactor type
* QA To Ship Time
WOMatKeys = WOLogRec<WO_LOG_WO_MAT_KEY$>
WOMatCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
TotQAShipTime = 0
TotQAShipCnt = 0
FOR I = 1 TO WOMatCnt
WOMatKey = WOMatKeys<1,I>
QAShipTime = obj_WO_Mat('GetCycleTime',WOMatKey:@RM:'':@RM:'QA':@RM:'SB')
IF QAShipTime NE '' THEN
TotQAShipTime += OCONV(QAShipTime,'MD1')
TotQAShipCnt += 1
END
NEXT I
IF TotQAShipCnt > 0 THEN
AvgQAShipTime = ICONV(TotQAShipTime/TotQAShipCnt,'MD1')
END ELSE
AvgQAShipTime = ''
END
Result = RelToVerTime:@FM:AvgCycleTime:@FM:AvgQAShipTime
RETURN
* * * * * * *
TimeTarget:
* * * * * * *
WONo = Parms[1,@RM]
WOLogRec = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WOLogRec = '' THEN
WOLogRec = XLATE('WO_LOG',WONo,'','X')
IF WOLogRec = '' THEN RETURN
END
GOSUB GetAvgCycleTimes
WOAvgCycleTime = OCONV(Result<2>,'MD1')
Result = '' ;* Clear result set by GetAvgCycleTimes method
ProdVerNo = WOLogRec<WO_LOG_PROD_VER_NO$>
ReactType = OCONV(XLATE('PROD_VER', ProdVerNo,PROD_VER_REACT_TYPE$, 'X' ),'[REACT_TYPE_CONV,OPSREF]')
IF ReactType = '' THEN RETURN
IF WOAvgCycleTime = '' THEN RETURN
EpiPartNo = WOLogRec<WO_LOG_EPI_PART_NO$>
AllTargThick = SUM(XLATE('EPI_PART',EpiPartNo,'EPI_THICK_TARG','X'))
ThickOconv = XLATE('DICT.EPI_PART','EPI_THICK_TARG',DICT_CONV$,'X')
TargThick = OCONV(AllTargThick,ThickOconv)
BaseLine = 5.5 ;* 1st Wafer + Cleans + Tencor + QA + Bag (from Chad)
XFactor = 0 ;* Calculated periodically by Manufacturing Manager
BEGIN CASE
CASE ReactType = 'ASM'
t1 = 157.95
t2 = 3.673*TargThick
t3 = 0.1294*((TargThick - 17.5)*(TargThick - 17.5))
CASE ReactType = 'ASM+'
t1 = 185.81
t2 = 4.276*TargThick
t3 = 0.1485*((TargThick - 17.5)*(TargThick - 17.5))
CASE ReactType = 'HTR'
t1 = 263.274
t2 = 2.7118*TargThick
t3 = 0.04015*((TargThick - 35.0)*(TargThick - 35.0))
CASE ReactType = 'EpiPro'
t1 = 268.985
t2 = 1.0867*TargThick
t3 = 0.0059595*((TargThick - 67.5)*(TargThick - 67.5))
CASE 1
RETURN
END CASE
WfrsPerDay = t1 - t2 + t3
HrsPerBox = 24/(WfrsPerDay/25)
OutHrsPerBox = OCONV(ICONV(HrsPerBox,'MD1'),'MD1')
CalcCycleTime = Baseline + OutHrsPerBox + XFactor
CycleTimeDelta = WOAvgCycleTime - CalcCycleTime
Result = CycleTimeDelta
RETURN
* * * * * * *
PcntComp:
* * * * * * *
WONo = Parms[1,@RM]
WOLogRec = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WOLogRec = '' THEN
WOLogRec = XLATE('WO_LOG',WONo,'','X')
END
IF WOLogRec = '' THEN RETURN
StepNo = WOLogRec<WO_LOG_WO_STEP_KEY$>[-1,'B*'] ;* This is the shipping step for multi step WO's
WOMatKeys = WOLogRec<WO_LOG_WO_MAT_KEY$>
WOMatCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
WOWfrQty = SUM(XLATE('WO_MAT',WOMatKeys,WO_MAT_WAFER_QTY$,'X'))
WOOrderQty = WOLogRec<WO_LOG_WO_QTY$>
* Split for reactor types here
ProdVerNo = WOLogRec<WO_LOG_PROD_VER_NO$>
ReactType = XLATE('PROD_VER',ProdVerNo,PROD_VER_REACT_TYPE$,'X')
IF ReactType = 'EPP' THEN
* EpiPRO reactor
WOLoadCnt = SUM(XLATE('WO_MAT',WOMatKeys,'WMI_RDS_LOAD_CNT','X'))
WOPreEpiRej = SUM(XLATE('WO_MAT',WOMatKeys,'WM_IN_REJ_WFRS','X'))
RRunNos = XLATE('WO_STEP',WONo:'*':StepNo,6,'X')
WOUnloadCnt = SUM(XLATE('REACT_RUN',RRunNos,'EPI_PRO_UNLD_CNT','X'))
WOPTCnt = SUM(XLATE('REACT_RUN',RRunNos,'EPI_PRO_PT_CNT','X'))
IF WOLoadCnt > 0 AND WOOrderQty > 0 THEN
OrdPcntComp = ICONV(((WOPreEpiRej + WOUnloadCnt + WOPTCnt)/WOOrderQty)*100,'MD0')
END ELSE
OrdPcntComp = 0
END
Result = OCONV(OrdPcntComp,'MD0S%')
END ELSE
SAPBatchNos = XLATE('WO_MAT',WOMatKeys,'SAP_BATCH_NO','X')
CompBoxCnt = 0
BoxCnt = COUNT(SAPBatchNos,@VM) + (SAPBatchNos NE '')
FOR I = 1 TO BoxCnt
IF SAPBatchNos<1,I> NE '' THEN CompBoxCnt += 1
NEXT I
IF CompBoxCnt = 0 THEN
Result = OCONV(0,'MD0S%')
END ELSE
Result = OCONV(ICONV((CompBoxCnt/BoxCnt)*100,'MD0'),'MD0S%')
END
END
RETURN
* * * * * * *
EstComp:
* * * * * * *
WONo = Parms[1,@RM]
WOLogRec = Parms[COL2()+1,@RM]
IF WONo = '' THEN RETURN
IF WOLogRec = '' THEN
WOLogRec = XLATE('WO_LOG',WONo,'','X')
END
IF WOLogRec = '' THEN RETURN
WOMatKeys = WOLogRec<WO_LOG_WO_MAT_KEY$>
SAPBatchNos = XLATE('WO_MAT',WOMatKeys,'SAP_BATCH_NO','X')
CompBoxCnt = 0
BoxCnt = COUNT(SAPBatchNos,@VM) + (SAPBatchNos NE '')
FOR I = 1 TO BoxCnt
IF SAPBatchNos<1,I> NE '' THEN CompBoxCnt += 1
NEXT I
OpenBoxCnt = BoxCnt - CompBoxCnt
IF Method = 'EstComp' THEN
GOSUB GetAvgCycleTimes
AvgCycleTime = Result<2> ;* This is hours per box in internal MD1 format.
Result = OCONV( (OpenBoxCnt * AvgCycleTime),'MD1')
END
RETURN
* * * * * * *
SchedReacts:
* * * * * * *
WONo = Parms[1,@RM]
IF WONo = '' THEN RETURN
OPEN 'DICT.SCHED_DET' TO DictVar THEN
SearchString = 'WO_NO':@VM:WONo:@FM
SchedDetKeys = ''
Btree.Extract(SearchString, 'SCHED_DET_NG', DictVar, SchedDetKeys, '' , '')
IF Get_Status(errCode) THEN
RETURN
END
IF SchedDetKeys NE '' THEN
Reactors = ''
StartDts = ''
EndDts = ''
sdkCnt = COUNT(SchedDetKeys,@VM) + (SchedDetKeys NE '')
FOR I = 1 TO sdkCnt
SchedDetKey = SchedDetKeys<1,I>
Reactor = Xlate('SCHED_DET_NG', SchedDetKey, 'REACT_NO', 'X')
SchedDt = Xlate('SCHED_DET_NG', SchedDetKey, 'START_DTM', 'X')
SchedDt = SchedDt[1, 'F.']
LOCATE Reactor IN Reactors BY 'AR' SETTING Pos THEN
IF SchedDt < StartDts<1,I> THEN
StartDts<1,Pos> = SchedDt
END
IF SchedDt > EndDts<1,I> THEN
EndDts<1,Pos> = SchedDt
END
END ELSE
Reactors = INSERT(Reactors,1,Pos,0,Reactor)
StartDts = INSERT(StartDts,1,Pos,0,SchedDt)
EndDts = INSERT(EndDts,1,Pos,0,SchedDt)
END
NEXT I
Result = Reactors:@FM:StartDts:@FM:EndDts
END
END
RETURN