Merged PR 21598: Refactored receive and release codebase.
Refactored receive and release codebase. bug fixes and performance improvements modified WO_REC form to use the same receive and same release dtm for all cassettes released in a given batch Related work items: #259878
This commit is contained in:
@ -865,5 +865,3 @@ Restore_System_Variables:
|
||||
@FILE.ERROR = OrigFileError
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
@ -10,11 +10,12 @@ COMPILE FUNCTION Comm_Dialog_WO_Scan(Method, Parm1)
|
||||
DECLARE SUBROUTINE Set_Property, End_Dialog, Set_Status, ErrMsg, Extract_SI_Keys, Logging_Services
|
||||
DECLARE SUBROUTINE obj_Appwindow, Start_Window, Msg, Btree.Extract, Error_Services
|
||||
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Send_Message, Set_FSError, Environment_Services
|
||||
DECLARE FUNCTION obj_Vendor_Code, Msg, Error_Services, Logging_Services
|
||||
DECLARE FUNCTION obj_Vendor_Code, Msg, Error_Services, Logging_Services, Error_Services, Service_Services
|
||||
|
||||
$INSERT LOGICAL
|
||||
$INSERT MSG_EQUATES
|
||||
$INSERT APPCOLORS
|
||||
$INSERT IFX_EQUATES
|
||||
|
||||
EQU CRLF$ TO \0D0A\
|
||||
|
||||
@ -23,14 +24,16 @@ EQU COL$LQP_QTY TO 2
|
||||
EQU COL$LQP_PART TO 3 ;* This is either Cust Part No OR Substrate Part Number depending on which control is visible
|
||||
EQU COL$LQP_VENDOR TO 4 ;* Vendor code on the Substrate screen 7/14/2011 JCH for SAP
|
||||
|
||||
EQU CA$ITEM_NO TO 1 ;* Equates for Checking Array passed to Scan routine
|
||||
EQU CA$LOT_NO TO 2
|
||||
EQU CA$LOT_QTY TO 3
|
||||
EQU CA$CUST_PART_NO TO 4
|
||||
EQU CA$SUB_PART_NO TO 5
|
||||
EQU CA$SCANNED_LOT_QTY TO 6
|
||||
EQU CA$VERIFY_PART_NO TO 7
|
||||
EQU CA$SUB_SUPP_BY TO 8
|
||||
EQU CA$ITEM_NO TO 1 ;* Equates for Checking Array passed to Scan routine
|
||||
EQU CA$LOT_NO TO 2
|
||||
EQU CA$LOT_QTY TO 3
|
||||
EQU CA$CUST_PART_NO TO 4
|
||||
EQU CA$SUB_PART_NO TO 5
|
||||
EQU CA$SCANNED_LOT_QTY TO 6
|
||||
EQU CA$VERIFY_PART_NO TO 7
|
||||
EQU CA$SUB_SUPP_BY TO 8
|
||||
EQU CA$WO_NO TO 9
|
||||
EQU CA$REC_DTM TO 10
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Receiving'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -48,7 +51,6 @@ Result = ''
|
||||
BEGIN CASE
|
||||
CASE Method = 'Create' ; GOSUB Create
|
||||
CASE Method = 'OK' ; GOSUB OK
|
||||
CASE Method = 'Cancel' ; GOSUB Cancel
|
||||
CASE Method = 'FieldClick' ; GOSUB FieldClick
|
||||
CASE Method = 'LQP' ; GOSUB LQP
|
||||
CASE 1
|
||||
@ -61,47 +63,47 @@ RETURN Result
|
||||
Create:
|
||||
* * * * * * *
|
||||
|
||||
VendorDef = Parm1[1,@FM]
|
||||
VendorDef = Parm1[1,@FM]
|
||||
|
||||
CheckArray = FIELD(Parm1,@FM,2,999)
|
||||
CheckArray = FIELD(Parm1,@FM,2,999)
|
||||
|
||||
Set_Property(@WINDOW,'@VENDOR_DEF',VendorDef)
|
||||
Set_Property(@WINDOW,'@VENDOR_DEF',VendorDef)
|
||||
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
Set_Property(@WINDOW:'.OPEN_QTY','TEXT',OCONV(OpenQty,'MD0,')) ;* 12/6/2011 JCH
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
Set_Property(@WINDOW:'.OPEN_QTY','TEXT',OCONV(OpenQty,'MD0,')) ;* 12/6/2011 JCH
|
||||
|
||||
Set_Property(@WINDOW,'@CHECK_ARRAY',CheckArray)
|
||||
obj_AppWindow('Create')
|
||||
Set_Property(@WINDOW,'@CHECK_ARRAY',CheckArray)
|
||||
obj_AppWindow('Create')
|
||||
|
||||
TimeStamp = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
||||
Set_Property(@WINDOW:'.RX_DTM','DEFPROP',TimeStamp)
|
||||
Set_Property(@WINDOW,'FOCUS',@WINDOW:'.RX_DTM')
|
||||
Set_Property(@WINDOW:'.RX_DTM','SELECTION',1:@FM:65534)
|
||||
TimeStamp = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
||||
Set_Property(@WINDOW:'.RX_DTM','DEFPROP',TimeStamp)
|
||||
Set_Property(@WINDOW,'FOCUS',@WINDOW:'.RX_DTM')
|
||||
Set_Property(@WINDOW:'.RX_DTM','SELECTION',1:@FM:65534)
|
||||
|
||||
GOSUB Refresh
|
||||
GOSUB Refresh
|
||||
|
||||
|
||||
* * * * * * *
|
||||
FieldClick:
|
||||
* * * * * * *
|
||||
|
||||
CtrlEntID = @WINDOW:'.FIELD_RADIO'
|
||||
CtrlEntID = @WINDOW:'.FIELD_RADIO'
|
||||
|
||||
ControlSelection = Get_Property(CtrlEntID,'VALUE')
|
||||
ControlSelection = Get_Property(CtrlEntID,'VALUE')
|
||||
|
||||
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.WINDOW_LABEL_FIX' ; Props := 'TEXT'
|
||||
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.WINDOW_LABEL_FIX' ; Props := 'TEXT'
|
||||
|
||||
|
||||
BEGIN CASE
|
||||
CASE ControlSelection = 'LQ' ; Vals = '1':@RM:'0':@RM:'0':@RM:'Customer Wafers'
|
||||
CASE ControlSelection = 'LQP' ; Vals = '0':@RM:'1':@RM:'0':@RM:'Customer Wafers'
|
||||
CASE ControlSelection = 'LQSP' ; Vals = '0':@RM:'0':@RM:'1':@RM:'Substrates'
|
||||
END CASE
|
||||
BEGIN CASE
|
||||
CASE ControlSelection = 'LQ' ; Vals = '1':@RM:'0':@RM:'0':@RM:'Customer Wafers'
|
||||
CASE ControlSelection = 'LQP' ; Vals = '0':@RM:'1':@RM:'0':@RM:'Customer Wafers'
|
||||
CASE ControlSelection = 'LQSP' ; Vals = '0':@RM:'0':@RM:'1':@RM:'Substrates'
|
||||
END CASE
|
||||
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -109,11 +111,15 @@ RETURN
|
||||
Close:
|
||||
* * * * * * *
|
||||
|
||||
* * * * * * *
|
||||
Cancel:
|
||||
* * * * * * *
|
||||
ProcIds = Get_Property(@Window, '@PROC_IDS')
|
||||
|
||||
End_Dialog(@WINDOW,'Cancel')
|
||||
If ProcIds NE '' then
|
||||
Response = ProcIds
|
||||
end else
|
||||
Response = 'Cancel'
|
||||
end
|
||||
|
||||
End_Dialog(@WINDOW,Response)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -122,271 +128,288 @@ RETURN
|
||||
Refresh:
|
||||
* * * * * * *
|
||||
|
||||
ListArray = Get_Property(CtrlEntId,'ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
ListArray = Get_Property(CtrlEntId,'ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','TEXT',OCONV(TotalScannedQty,'MD0,'))
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','TEXT',OCONV(TotalScannedQty,'MD0,'))
|
||||
|
||||
IF TotalScannedQty < OpenQty THEN
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',GREEN$)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',RED$)
|
||||
END
|
||||
IF TotalScannedQty < OpenQty THEN
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',GREEN$)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.SCANNED_QTY','BACKCOLOR',RED$)
|
||||
END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
LQP:
|
||||
* * * * * * *
|
||||
|
||||
CtrlEntID = Get_Property(@WINDOW,'FOCUS')
|
||||
StripANSI = Get_Property(@WINDOW:'.STRIP_ANSI','CHECK')
|
||||
SkipSubANSI = Get_Property(@WINDOW:'.SKIP_SUBSTRATE_ANSI','CHECK')
|
||||
CtrlEntID = Get_Property(@WINDOW,'FOCUS')
|
||||
StripANSI = Get_Property(@WINDOW:'.STRIP_ANSI','CHECK')
|
||||
SkipSubANSI = Get_Property(@WINDOW:'.SKIP_SUBSTRATE_ANSI','CHECK')
|
||||
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
|
||||
BEGIN CASE
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY' ; ColCnt = 2
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY_PART' ; ColCnt = 3
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY_SUB_PART' ; ColCnt = 4
|
||||
END CASE
|
||||
BEGIN CASE
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY' ; ColCnt = 2
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY_PART' ; ColCnt = 3
|
||||
CASE CtrlEntID = @WINDOW:'.LOT_QTY_SUB_PART' ; ColCnt = 4
|
||||
END CASE
|
||||
|
||||
PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS")
|
||||
PrevCol = PrevSelPos<1>
|
||||
PrevRow = PrevSelPos<2>
|
||||
CurrPos = Get_Property(CtrlEntId,'SELPOS')
|
||||
CurrCol = CurrPos<1>
|
||||
CurrRow = CurrPos<2>
|
||||
ListData = Get_Property(CtrlEntId,'LIST')
|
||||
PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS")
|
||||
PrevCol = PrevSelPos<1>
|
||||
PrevRow = PrevSelPos<2>
|
||||
CurrPos = Get_Property(CtrlEntId,'SELPOS')
|
||||
CurrCol = CurrPos<1>
|
||||
CurrRow = CurrPos<2>
|
||||
ListData = Get_Property(CtrlEntId,'LIST')
|
||||
|
||||
IF ListData<CurrRow,CurrCol> = '' THEN
|
||||
ColPointer = CurrCol
|
||||
LinePointer = CurrRow
|
||||
|
||||
* Find the first non-empty cell
|
||||
LOOP
|
||||
Test = ListData<LinePointer,(ColPointer) >
|
||||
UNTIL Test NE '' OR (LinePointer = 0 AND ColPointer = 1)
|
||||
ColPointer -= 1
|
||||
IF ColPointer = 0 THEN
|
||||
ColPointer = ColCnt
|
||||
LinePointer -= 1
|
||||
END
|
||||
REPEAT
|
||||
* Move one past the non empty cell
|
||||
BEGIN CASE
|
||||
CASE LinePointer = 0
|
||||
* Empty Table
|
||||
LinePointer = 1
|
||||
CoilPointer = 1
|
||||
CASE ColPointer = ColCnt
|
||||
LinePointer += 1
|
||||
ColPointer = 1
|
||||
CASE 1
|
||||
ColPointer += 1
|
||||
END CASE
|
||||
Set_Property(CtrlEntId,"SELPOS",ColPointer:@FM:LinePointer)
|
||||
END
|
||||
|
||||
// Global scan validation check. Only alpha-numeric, dashes, spaces, and periods permitted.
|
||||
ValidationScan = Trim(ListData<PrevRow,PrevCol>)
|
||||
Convert @Lower_Case to @Upper_Case in ValidationScan
|
||||
Convert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789- ./' to '' in ValidationScan
|
||||
//DPC 2/18/20 - changed validation to allow foward slash per supplier lot naming (Global Wafer)
|
||||
//FYI - conversion would only work when separated from above line
|
||||
Convert '/' to '' in ValidationScan
|
||||
If ValidationScan NE '' then
|
||||
Error_Services('Set', 'Scanned code ' : Quote(Trim(ListData<PrevRow,PrevCol>)) : ' contains an invalid character. Please re-scan.')
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
IF ListData<PrevRow,PrevCol> NE '' THEN
|
||||
IF ListData<CurrRow,CurrCol> = '' THEN
|
||||
ColPointer = CurrCol
|
||||
LinePointer = CurrRow
|
||||
|
||||
* Find the first non-empty cell
|
||||
LOOP
|
||||
Test = ListData<LinePointer,(ColPointer) >
|
||||
UNTIL Test NE '' OR (LinePointer = 0 AND ColPointer = 1)
|
||||
ColPointer -= 1
|
||||
IF ColPointer = 0 THEN
|
||||
ColPointer = ColCnt
|
||||
LinePointer -= 1
|
||||
END
|
||||
REPEAT
|
||||
* Move one past the non empty cell
|
||||
BEGIN CASE
|
||||
CASE PrevCol = COL$LQP_LOT
|
||||
|
||||
IF StripANSI THEN
|
||||
RawLot = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawLot[1,2] = '1T' OR RawLot[1,2] = '2T' THEN
|
||||
LotNo = RawLot[3,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawLot):' is not an ANSI Lot No.')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
LotNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
END
|
||||
|
||||
IF CtrlEntID NE @WINDOW:'.LOT_QTY_SUB_PART' THEN
|
||||
|
||||
* Don't check Customer Lot Numbers if scanning substrates
|
||||
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',LotNo,PrevSelPos)
|
||||
|
||||
CASE PrevCol = COL$LQP_QTY
|
||||
|
||||
IF StripANSI THEN
|
||||
RawLotQty = ListData<PrevRow,PrevCol>
|
||||
IF RawLotQty[1,1] = 'Q' THEN
|
||||
LotQty = RawLotQty[2,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawLotQty):' is not an ANSI Quantity')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
LotQty = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF NOT(NUM(LotQty)) THEN
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Lot Qty ':QUOTE(LotQty):' is not a number!')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',LotQty,PrevSelPos)
|
||||
|
||||
|
||||
CASE PrevCol = COL$LQP_PART
|
||||
// Check scanned part number for 5 segments. If there are 5 segments then use segments 3 and 4
|
||||
// to make the actual part number.
|
||||
ScannedPartNo = Trim(ListData<PrevRow, PrevCol>)
|
||||
If DCount(ScannedPartNo, '-') EQ 5 then
|
||||
RawPartNo = ''
|
||||
If ScannedPartNo[1, 1] _EQC 'P' then RawPartNo := 'P'
|
||||
If ScannedPartNo[1, 1] _EQC 'S' then RawPartNo := 'S'
|
||||
RawPartNo := Field(ScannedPartNo, '-', 3, 2)
|
||||
ListData<PrevRow, PrevCol> = RawPartNo
|
||||
end
|
||||
RawPartNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF StripANSI AND NOT(SkipSubAnsi) THEN ;***************************************
|
||||
RawPartNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawPartNo[1,1] _EQC 'P' OR RawPartNo[1,1] _EQC 'S' THEN
|
||||
PartNo = RawPartNo[2,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawPartNo):' is not an ANSI Part No')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
PartNo = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF CtrlEntID = @WINDOW:'.LOT_QTY_PART' THEN
|
||||
* Check Customer Part Numbers
|
||||
LOCATE PartNo IN CheckArray<CA$VERIFY_PART_NO> USING @VM SETTING Pos THEN
|
||||
PartNo = CheckArray<CA$CUST_PART_NO,Pos>
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Part No ':QUOTE(PartNo):' not found in':@TM:'Order Customer Part Numbers!')
|
||||
PartNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
END ELSE
|
||||
* Check Substrate Part Numbers
|
||||
LOCATE PartNo IN CheckArray<CA$SUB_PART_NO> USING @VM SETTING Pos ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Part No ':QUOTE(PartNo):' not found in':@TM:'Order Substrate Part Numbers!')
|
||||
PartNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
END ;* End of check for Customer supplied or Inventory substrate part number
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',PartNo,PrevSelPos)
|
||||
|
||||
CASE PrevCol = COL$LQP_VENDOR
|
||||
|
||||
SubSuppBy = CheckArray<CA$SUB_SUPP_BY>
|
||||
VendCode = ''
|
||||
IF StripANSI AND NOT(SkipSubAnsi) THEN
|
||||
RawVendCode = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawVendCode[1,2] = '1V' THEN
|
||||
VendCode = RawVendCode[3,99]
|
||||
END ELSE
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Scanned Code ':QUOTE(RawVendCode):' is not an ANSI Vendor Code'
|
||||
Resp = Msg(@WINDOW, '','OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawVendCode):' is not an ANSI Vendor Code')
|
||||
Set_Property(CtrlEntID,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
VendCode = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF RowExists('SEMI_VEND_CODE', VendCode) OR SubSuppBy = 'C' ELSE
|
||||
* Accept or Rescan message
|
||||
If VendCode EQ '' then VendCode = RawVendCode
|
||||
Resp = Msg(@WINDOW, '','OK', '', 'Scan Error':@FM:'Vendor Code ':QUOTE(VendCode):' not found in':@TM:'Vendor Codes on file!')
|
||||
VendCode = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',VendCode,PrevSelPos)
|
||||
|
||||
ExpectedCode = Get_Property(@WINDOW,'@VENDOR_DEF')
|
||||
|
||||
IF VendCode NE ExpectedCode AND ExpectedCode NE '' THEN
|
||||
void = Msg(@WINDOW,'','EXPECTED_VENDOR_CODE','',ExpectedCode:@FM:VendCode)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
ListArray = Get_Property(CtrlEntId,'ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
|
||||
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
|
||||
IF TotalScannedQty >= OpenQty THEN
|
||||
|
||||
Resp = Msg(@WINDOW,'','WO_REC_COMPLETE')
|
||||
|
||||
GOTO OK
|
||||
END
|
||||
|
||||
CASE LinePointer = 0
|
||||
* Empty Table
|
||||
LinePointer = 1
|
||||
CoilPointer = 1
|
||||
CASE ColPointer = ColCnt
|
||||
LinePointer += 1
|
||||
ColPointer = 1
|
||||
CASE 1
|
||||
ColPointer += 1
|
||||
END CASE
|
||||
END
|
||||
end
|
||||
Set_Property(CtrlEntId,"SELPOS",ColPointer:@FM:LinePointer)
|
||||
END
|
||||
|
||||
If Error_Services('HasError') then
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
Message = Error_Services('GetMessage')
|
||||
TypeOver<MTEXT$> = Message
|
||||
Msg(@Window, TypeOver, 'LABEL_DATA_ERROR')
|
||||
Set_Property(CtrlEntId, 'SELPOS', PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'INVALUE', '', PrevSelPos)
|
||||
Error_Services('Clear')
|
||||
end else
|
||||
GOSUB Refresh
|
||||
end
|
||||
// Global scan validation check. Only alpha-numeric, dashes, spaces, and periods permitted.
|
||||
ValidationScan = Trim(ListData<PrevRow,PrevCol>)
|
||||
Convert @Lower_Case to @Upper_Case in ValidationScan
|
||||
Convert 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789- ./' to '' in ValidationScan
|
||||
//DPC 2/18/20 - changed validation to allow foward slash per supplier lot naming (Global Wafer)
|
||||
//FYI - conversion would only work when separated from above line
|
||||
Convert '/' to '' in ValidationScan
|
||||
If ValidationScan NE '' then
|
||||
Error_Services('Set', 'Scanned code ' : Quote(Trim(ListData<PrevRow,PrevCol>)) : ' contains an invalid character. Please re-scan.')
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
IF ListData<PrevRow,PrevCol> NE '' THEN
|
||||
BEGIN CASE
|
||||
CASE PrevCol = COL$LQP_LOT
|
||||
|
||||
IF StripANSI THEN
|
||||
RawLot = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawLot[1,2] = '1T' OR RawLot[1,2] = '2T' THEN
|
||||
LotNo = RawLot[3,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawLot):' is not an ANSI Lot No.')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
LotNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
END
|
||||
|
||||
IF CtrlEntID NE @WINDOW:'.LOT_QTY_SUB_PART' THEN
|
||||
|
||||
* Don't check Customer Lot Numbers if scanning substrates
|
||||
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',LotNo,PrevSelPos)
|
||||
|
||||
CASE PrevCol = COL$LQP_QTY
|
||||
|
||||
IF StripANSI THEN
|
||||
RawLotQty = ListData<PrevRow,PrevCol>
|
||||
IF RawLotQty[1,1] = 'Q' THEN
|
||||
LotQty = RawLotQty[2,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawLotQty):' is not an ANSI Quantity')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
LotQty = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF NOT(NUM(LotQty)) THEN
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Lot Qty ':QUOTE(LotQty):' is not a number!')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',LotQty,PrevSelPos)
|
||||
|
||||
|
||||
CASE PrevCol = COL$LQP_PART
|
||||
// Check scanned part number for 5 segments. If there are 5 segments then use segments 3 and 4
|
||||
// to make the actual part number.
|
||||
ScannedPartNo = Trim(ListData<PrevRow, PrevCol>)
|
||||
If DCount(ScannedPartNo, '-') EQ 5 then
|
||||
RawPartNo = ''
|
||||
If ScannedPartNo[1, 1] _EQC 'P' then RawPartNo := 'P'
|
||||
If ScannedPartNo[1, 1] _EQC 'S' then RawPartNo := 'S'
|
||||
RawPartNo := Field(ScannedPartNo, '-', 3, 2)
|
||||
ListData<PrevRow, PrevCol> = RawPartNo
|
||||
end
|
||||
RawPartNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF StripANSI AND NOT(SkipSubAnsi) THEN ;***************************************
|
||||
RawPartNo = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawPartNo[1,1] _EQC 'P' OR RawPartNo[1,1] _EQC 'S' THEN
|
||||
PartNo = RawPartNo[2,99]
|
||||
END ELSE
|
||||
Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawPartNo):' is not an ANSI Part No')
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
PartNo = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF CtrlEntID = @WINDOW:'.LOT_QTY_PART' THEN
|
||||
* Check Customer Part Numbers
|
||||
LOCATE PartNo IN CheckArray<CA$VERIFY_PART_NO> USING @VM SETTING Pos THEN
|
||||
PartNo = CheckArray<CA$CUST_PART_NO,Pos>
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Part No ':QUOTE(PartNo):' not found in':@TM:'Order Customer Part Numbers!')
|
||||
PartNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
|
||||
END ELSE
|
||||
* Check Substrate Part Numbers
|
||||
LOCATE PartNo IN CheckArray<CA$SUB_PART_NO> USING @VM SETTING Pos ELSE
|
||||
* Accept or Rescan message
|
||||
Resp = Msg(@Window, '', 'OK', '', 'Scan Error':@FM:'Part No ':QUOTE(PartNo):' not found in':@TM:'Order Substrate Part Numbers!')
|
||||
PartNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END
|
||||
END ;* End of check for Customer supplied or Inventory substrate part number
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',PartNo,PrevSelPos)
|
||||
|
||||
CASE PrevCol = COL$LQP_VENDOR
|
||||
|
||||
SubSuppBy = CheckArray<CA$SUB_SUPP_BY>
|
||||
VendCode = ''
|
||||
IF StripANSI AND NOT(SkipSubAnsi) THEN
|
||||
RawVendCode = TRIM(ListData<PrevRow,PrevCol>)
|
||||
IF RawVendCode[1,2] = '1V' THEN
|
||||
VendCode = RawVendCode[3,99]
|
||||
END ELSE
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Scanned Code ':QUOTE(RawVendCode):' is not an ANSI Vendor Code'
|
||||
Resp = Msg(@WINDOW, '','OK', '', 'Scan Error':@FM:'Scanned Code ':QUOTE(RawVendCode):' is not an ANSI Vendor Code')
|
||||
Set_Property(CtrlEntID,"SELPOS",PrevSelPos)
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
VendCode = ListData<PrevRow,PrevCol>
|
||||
END
|
||||
|
||||
IF RowExists('SEMI_VEND_CODE', VendCode) OR SubSuppBy = 'C' ELSE
|
||||
* Accept or Rescan message
|
||||
If VendCode EQ '' then VendCode = RawVendCode
|
||||
Resp = Msg(@WINDOW, '','OK', '', 'Scan Error':@FM:'Vendor Code ':QUOTE(VendCode):' not found in':@TM:'Vendor Codes on file!')
|
||||
VendCode = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",PrevSelPos) ;* Cursor to Lot No for a rescan
|
||||
Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
RETURN
|
||||
END
|
||||
|
||||
Set_Property(CtrlEntID,'INVALUE',VendCode,PrevSelPos)
|
||||
|
||||
ExpectedCode = Get_Property(@WINDOW,'@VENDOR_DEF')
|
||||
|
||||
IF VendCode NE ExpectedCode AND ExpectedCode NE '' THEN
|
||||
void = Msg(@WINDOW,'','EXPECTED_VENDOR_CODE','',ExpectedCode:@FM:VendCode)
|
||||
Set_Property(CtrlEntID, 'FOCUS', True$)
|
||||
END else
|
||||
ProcIds = Get_Property(@Window, '@PROC_IDS')
|
||||
ListData = Get_Property(CtrlEntId, 'LIST')
|
||||
WONo = CheckArray<CA$WO_NO - 1>
|
||||
RecDtm = CheckArray<CA$REC_DTM - 1>
|
||||
ScanLotNo = ListData<PrevRow, 1>
|
||||
ScanQty = ListData<PrevRow, 2>
|
||||
ScanSubPartNo = ListData<PrevRow, 3>
|
||||
ScanVendor = ListData<PrevRow, 4>
|
||||
ProcIds<-1> = Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'ReceiveReleaseCassette':SD$:WONo:SD$:@User4:SD$:ScanLotNo:SD$:ScanQty:SD$:ScanSubPartNo:SD$:ScanVendor:SD$:RecDtm)
|
||||
If Error_Services('NoError') then
|
||||
Set_Property(@Window, '@PROC_IDS', ProcIds)
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'Error submitting scan data to server for processing')
|
||||
end
|
||||
end
|
||||
|
||||
ListArray = Get_Property(CtrlEntId,'ARRAY')
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
|
||||
TotalScannedQty = SUM(ListArray<COL$LQP_QTY>)
|
||||
OpenQty = CheckArray<CA$LOT_QTY>
|
||||
|
||||
IF TotalScannedQty >= OpenQty THEN
|
||||
|
||||
Resp = Msg(@WINDOW,'','WO_REC_COMPLETE')
|
||||
|
||||
GOTO OK
|
||||
END
|
||||
|
||||
END CASE
|
||||
END
|
||||
end
|
||||
|
||||
If Error_Services('HasError') then
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
Message = Error_Services('GetMessage')
|
||||
TypeOver<MTEXT$> = Message
|
||||
Msg(@Window, TypeOver, 'LABEL_DATA_ERROR')
|
||||
Set_Property(CtrlEntId, 'SELPOS', PrevSelPos)
|
||||
Set_Property(CtrlEntID, 'INVALUE', '', PrevSelPos)
|
||||
Error_Services('Clear')
|
||||
end else
|
||||
GOSUB Refresh
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
@ -395,159 +418,166 @@ RETURN
|
||||
OK:
|
||||
* * * * * * *
|
||||
|
||||
CtrlEntID = @WINDOW:'.FIELD_RADIO'
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
CtrlEntID = @WINDOW:'.FIELD_RADIO'
|
||||
CheckArray = Get_Property(@WINDOW,'@CHECK_ARRAY')
|
||||
|
||||
ControlSelection = Get_Property(CtrlEntID,'VALUE')
|
||||
ControlSelection = Get_Property(CtrlEntID,'VALUE')
|
||||
|
||||
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART' ; Props := 'VISIBLE'
|
||||
Ctrls = @WINDOW:'.LOT_QTY':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_PART':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.LOT_QTY_SUB_PART' ; Props := 'VISIBLE'
|
||||
|
||||
BEGIN CASE
|
||||
CASE ControlSelection = 'LQ' ; Ctrl = @WINDOW:'.LOT_QTY'
|
||||
CASE ControlSelection = 'LQP' ; Ctrl = @WINDOW:'.LOT_QTY_PART'
|
||||
CASE ControlSelection = 'LQSP' ; Ctrl = @WINDOW:'.LOT_QTY_SUB_PART'
|
||||
END CASE
|
||||
BEGIN CASE
|
||||
CASE ControlSelection = 'LQ' ; Ctrl = @WINDOW:'.LOT_QTY'
|
||||
CASE ControlSelection = 'LQP' ; Ctrl = @WINDOW:'.LOT_QTY_PART'
|
||||
CASE ControlSelection = 'LQSP' ; Ctrl = @WINDOW:'.LOT_QTY_SUB_PART'
|
||||
END CASE
|
||||
|
||||
ListData = Get_Property(Ctrl,'LIST')
|
||||
ListData = Get_Property(Ctrl,'LIST')
|
||||
|
||||
TimeStamp = Get_Property(@WINDOW:'.RX_DTM','TEXT')
|
||||
TimeStamp = ICONV(TimeStamp,'DT')
|
||||
IF TimeStamp = '' THEN
|
||||
ErrMsg('Invalid Received DateTime data entered. "mm/dd/yy hh:mm:ss" is the basic format.')
|
||||
RETURN
|
||||
END
|
||||
TimeStamp = Get_Property(@WINDOW:'.RX_DTM','TEXT')
|
||||
TimeStamp = ICONV(TimeStamp,'DT')
|
||||
IF TimeStamp = '' THEN
|
||||
ErrMsg('Invalid Received DateTime data entered. "mm/dd/yy hh:mm:ss" is the basic format.')
|
||||
RETURN
|
||||
END
|
||||
|
||||
CheckArray<CA$SCANNED_LOT_QTY> = '' ;* Clear scanned lot quantities column
|
||||
CheckArray<CA$SCANNED_LOT_QTY> = '' ;* Clear scanned lot quantities column
|
||||
|
||||
LineCnt = 1
|
||||
LOOP
|
||||
TestVal = ListData<LineCnt,1>
|
||||
UNTIL TestVal = ''
|
||||
LotNo = TRIM(ListData<LineCnt,1>)
|
||||
Qty = TRIM(ListData<LineCnt,2>)
|
||||
|
||||
IF ControlSelection = 'LQ' THEN
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,Pos>
|
||||
CustPartNo = CheckArray<CA$CUST_PART_NO,Pos>
|
||||
SubPartNo = CheckArray<CA$SUB_PART_NO,Pos>
|
||||
CheckArray<CA$SCANNED_LOT_QTY,Pos> = CheckArray<CA$SCANNED_LOT_QTY,Pos> + Qty
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!'
|
||||
Resp = Msg(@WINDOW,TypeOver,'LABEL_DATA_ERROR')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",CA$LOT_NO:@FM:LineCnt) ;* Cursor to Lot No for a rescan
|
||||
RETURN
|
||||
END
|
||||
LineCnt = 1
|
||||
LOOP
|
||||
TestVal = ListData<LineCnt,1>
|
||||
UNTIL TestVal = ''
|
||||
LotNo = TRIM(ListData<LineCnt,1>)
|
||||
Qty = TRIM(ListData<LineCnt,2>)
|
||||
|
||||
IF ControlSelection = 'LQ' THEN
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,Pos>
|
||||
CustPartNo = CheckArray<CA$CUST_PART_NO,Pos>
|
||||
SubPartNo = CheckArray<CA$SUB_PART_NO,Pos>
|
||||
CheckArray<CA$SCANNED_LOT_QTY,Pos> = CheckArray<CA$SCANNED_LOT_QTY,Pos> + Qty
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!'
|
||||
Resp = Msg(@WINDOW,TypeOver,'LABEL_DATA_ERROR')
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",CA$LOT_NO:@FM:LineCnt) ;* Cursor to Lot No for a rescan
|
||||
RETURN
|
||||
END
|
||||
|
||||
END
|
||||
|
||||
IF ControlSelection = 'LQP' THEN
|
||||
CustPartNo = TRIM(ListData<LineCnt,3>)
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,Pos>
|
||||
SubPartNo = CheckArray<CA$SUB_PART_NO,Pos>
|
||||
CheckArray<CA$SCANNED_LOT_QTY,Pos> = CheckArray<CA$SCANNED_LOT_QTY,Pos> + Qty
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!'
|
||||
Resp = Msg(@WINDOW,TypeOver,'LABEL_DATA_ERROR')
|
||||
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",CA$LOT_NO:@FM:LineCnt) ;* Cursor to Lot No for a rescan
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
IF ControlSelection = 'LQSP' THEN
|
||||
|
||||
SubPartNo = TRIM(ListData<LineCnt,3>)
|
||||
Vendor = TRIM(ListData<LineCnt,4>) ;* Added 7/14/2011 JCH for SAP
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,1> ;* Changed 2/8/2010 from ' = 1 ' JCH
|
||||
CustPartNo = CheckArray<CA$CUST_PART_NO,1>
|
||||
|
||||
END ELSE
|
||||
Vendor = ''
|
||||
END
|
||||
END
|
||||
|
||||
IF ControlSelection = 'LQP' THEN
|
||||
CustPartNo = TRIM(ListData<LineCnt,3>)
|
||||
LOCATE LotNo IN CheckArray<CA$LOT_NO> USING @VM SETTING Pos THEN
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,Pos>
|
||||
SubPartNo = CheckArray<CA$SUB_PART_NO,Pos>
|
||||
CheckArray<CA$SCANNED_LOT_QTY,Pos> = CheckArray<CA$SCANNED_LOT_QTY,Pos> + Qty
|
||||
END ELSE
|
||||
* Accept or Rescan message
|
||||
TypeOver = ''
|
||||
TypeOver<MTYPE$> = 'B&Rescan'
|
||||
TypeOver<MTEXT$> = 'Lot No ':QUOTE(LotNo):' not found in':@TM:'Order Item Lot Numbers!'
|
||||
Resp = Msg(@WINDOW,TypeOver,'LABEL_DATA_ERROR')
|
||||
|
||||
LotNo = '' ;* Clear entered field for a rescan
|
||||
Set_Property(CtrlEntId,"SELPOS",CA$LOT_NO:@FM:LineCnt) ;* Cursor to Lot No for a rescan
|
||||
RETURN
|
||||
END
|
||||
END
|
||||
|
||||
IF ControlSelection = 'LQSP' THEN
|
||||
|
||||
SubPartNo = TRIM(ListData<LineCnt,3>)
|
||||
Vendor = TRIM(ListData<LineCnt,4>) ;* Added 7/14/2011 JCH for SAP
|
||||
OrderItemNo = CheckArray<CA$ITEM_NO,1> ;* Changed 2/8/2010 from ' = 1 ' JCH
|
||||
CustPartNo = CheckArray<CA$CUST_PART_NO,1>
|
||||
|
||||
END ELSE
|
||||
Vendor = ''
|
||||
END
|
||||
|
||||
Result<1,LineCnt> = LineCnt
|
||||
Result<2,LineCnt> = LotNo ;* Lot No
|
||||
Result<3,LineCnt> = Qty
|
||||
Result<4,LineCnt> = CustPartNo ;* PartNo
|
||||
Result<5,LineCnt> = SubPartNo ;* Substrate Part No
|
||||
Result<6,LineCnt> = Vendor ;* Substrate Vendor Code
|
||||
Result<7,LineCnt> = OCONV(TimeStamp,'DT')
|
||||
Result<8,LineCnt> = @USER4
|
||||
Result<9,LineCnt> = OrderItemNo
|
||||
|
||||
LineCnt += 1
|
||||
REPEAT
|
||||
Result<1,LineCnt> = LineCnt
|
||||
Result<2,LineCnt> = LotNo ;* Lot No
|
||||
Result<3,LineCnt> = Qty
|
||||
Result<4,LineCnt> = CustPartNo ;* PartNo
|
||||
Result<5,LineCnt> = SubPartNo ;* Substrate Part No
|
||||
Result<6,LineCnt> = Vendor ;* Substrate Vendor Code
|
||||
Result<7,LineCnt> = OCONV(TimeStamp,'DT')
|
||||
Result<8,LineCnt> = @USER4
|
||||
Result<9,LineCnt> = OrderItemNo
|
||||
|
||||
LineCnt += 1
|
||||
REPEAT
|
||||
|
||||
IF ControlSelection NE 'LQSP' THEN
|
||||
IF ControlSelection NE 'LQSP' THEN
|
||||
|
||||
* Orders with Epi supplied substrates don't have any lot quantities to check against.
|
||||
|
||||
ProblemQtyLots = ''
|
||||
FOR I = 1 TO COUNT(CheckArray<CA$LOT_NO>,@VM) + (CheckArray<CA$LOT_NO> NE '')
|
||||
IF (CheckArray<CA$SCANNED_LOT_QTY,I> NE '') AND (CheckArray<CA$LOT_QTY,I> NE CheckArray<CA$SCANNED_LOT_QTY,I>) THEN
|
||||
* Lot quantity mismatch
|
||||
ProblemQtyLots<-1> = CheckArray<CA$LOT_NO,I>
|
||||
END
|
||||
NEXT I
|
||||
* Orders with Epi supplied substrates don't have any lot quantities to check against.
|
||||
|
||||
ProblemQtyLots = ''
|
||||
FOR I = 1 TO COUNT(CheckArray<CA$LOT_NO>,@VM) + (CheckArray<CA$LOT_NO> NE '')
|
||||
IF (CheckArray<CA$SCANNED_LOT_QTY,I> NE '') AND (CheckArray<CA$LOT_QTY,I> NE CheckArray<CA$SCANNED_LOT_QTY,I>) THEN
|
||||
* Lot quantity mismatch
|
||||
ProblemQtyLots<-1> = CheckArray<CA$LOT_NO,I>
|
||||
END
|
||||
NEXT I
|
||||
|
||||
IF ProblemQtyLots NE '' THEN
|
||||
LineCnt = 1
|
||||
LOOP
|
||||
TestVal = ListData<LineCnt,1>
|
||||
UNTIL TestVal = ''
|
||||
LotNo = TRIM(ListData<LineCnt,1>)
|
||||
LOCATE LotNo IN ProblemQtyLots USING @FM SETTING Pos THEN
|
||||
stat = Send_Message(Ctrl,'COLOR_BY_POS',0,LineCnt,RED$) ;* Flag all the lines with lot numbers having qty problems
|
||||
END
|
||||
LineCnt += 1
|
||||
REPEAT
|
||||
|
||||
ErrMsg('Lot Quantity(s) Scanned do not match Order Item Lot Quantity(s)!||Review and rescan highlighted items.')
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
*
|
||||
END
|
||||
IF ProblemQtyLots NE '' THEN
|
||||
LineCnt = 1
|
||||
LOOP
|
||||
TestVal = ListData<LineCnt,1>
|
||||
UNTIL TestVal = ''
|
||||
LotNo = TRIM(ListData<LineCnt,1>)
|
||||
LOCATE LotNo IN ProblemQtyLots USING @FM SETTING Pos THEN
|
||||
stat = Send_Message(Ctrl,'COLOR_BY_POS',0,LineCnt,RED$) ;* Flag all the lines with lot numbers having qty problems
|
||||
END
|
||||
LineCnt += 1
|
||||
REPEAT
|
||||
|
||||
ErrMsg('Lot Quantity(s) Scanned do not match Order Item Lot Quantity(s)!||Review and rescan highlighted items.')
|
||||
RETURN
|
||||
END
|
||||
END ELSE
|
||||
*
|
||||
END
|
||||
|
||||
NumRows = DCount(Result, @FM)
|
||||
NullFound = False$
|
||||
For LineIndex = 1 to NumRows
|
||||
Row = Result<LineIndex>
|
||||
NumVals = DCount(Row, @VM)
|
||||
For ValIndex = 1 to NumVals
|
||||
Val = Row<0, ValIndex>
|
||||
If Val EQ '' then NullFound = True$
|
||||
Next ValIndex
|
||||
Until NullFound
|
||||
Next LineIndex
|
||||
If NullFound EQ True$ then
|
||||
ErrMsg('Missing value found in scanned data! Verify your labels and restart your scan operation.')
|
||||
Result = 'Cancel'
|
||||
end
|
||||
NumRows = DCount(Result, @FM)
|
||||
NullFound = False$
|
||||
For LineIndex = 1 to NumRows
|
||||
Row = Result<LineIndex>
|
||||
NumVals = DCount(Row, @VM)
|
||||
For ValIndex = 1 to NumVals
|
||||
Val = Row<0, ValIndex>
|
||||
If Val EQ '' then NullFound = True$
|
||||
Next ValIndex
|
||||
Until NullFound
|
||||
Next LineIndex
|
||||
If NullFound EQ True$ then
|
||||
ErrMsg('Missing value found in scanned data! Verify your labels and restart your scan operation.')
|
||||
Result = 'Cancel'
|
||||
end
|
||||
|
||||
ScanResult = Result
|
||||
Swap @VM with ' | ' in ScanResult
|
||||
ScanResult = Result
|
||||
Swap @VM with ' | ' in ScanResult
|
||||
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
LogData<3> = ScanResult
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
LogData<3> = ScanResult
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
|
||||
End_Dialog(@WINDOW,Result)
|
||||
ProcIds = Get_Property(@Window, '@PROC_IDS')
|
||||
|
||||
If ProcIds NE '' then
|
||||
Response = ProcIds
|
||||
end else
|
||||
Response = 'Cancel'
|
||||
end
|
||||
|
||||
End_Dialog(@WINDOW,Response)
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -527,7 +527,7 @@ end service
|
||||
// Reads a data column for the indicated Key ID and database table.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service ReadDataColumn(TableName, KeyID, ColumnNo, NotExpired, ExpirationDuration, IgnoreMFSRoutines)
|
||||
|
||||
|
||||
If NotExpired NE False$ then NotExpired = True$
|
||||
If (ExpirationDuration EQ '') OR (Not(Num(ExpirationDuration))) then ExpirationDuration = 0
|
||||
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
|
||||
@ -609,7 +609,6 @@ Service ReadDataRow(TableName, KeyID, NotExpired, ExpirationDuration, IgnoreMFSR
|
||||
Memory_Services('SetValue', ServiceKeyID, DataRow)
|
||||
end else
|
||||
Error_Services('Add', 'Error reading ' : KeyID : ' from the ' : TableName : ' table in the ' : Service : ' service. Error = ' : @File_Error<1>)
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -943,11 +942,9 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
|
||||
Error_Services('Add', 'Error writing ' : KeyID : ' to the ' : TableName : ' table in the ' : Service : ' service. Error message: ':ErrorMsg)
|
||||
end
|
||||
end
|
||||
* If Error_Services('NoError') then
|
||||
If IgnoreAllLocks EQ False$ then
|
||||
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
|
||||
end
|
||||
* end
|
||||
If IgnoreAllLocks EQ False$ then
|
||||
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
|
||||
end
|
||||
@ -958,6 +955,68 @@ Service WriteDataRow(TableName, KeyID, DataRow, IgnoreSelfLock, IgnoreMFSRoutine
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// WriteDataColumn
|
||||
//
|
||||
// TableName. The linear hash database table name. - [REQUIRED]
|
||||
// KeyID. The KeyID to the database table. - [REQUIRED]
|
||||
// ColumnNo. Column number of the table to write. - [REQUIRED]
|
||||
//
|
||||
// Writes a value to a column for the indicated Key ID and database table.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service WriteDataColumn(TableName, KeyID, ColumnNo, Value, IgnoreSelfLock, IgnoreMFSRoutines, IgnoreAllLocks)
|
||||
|
||||
If TableName NE '' AND KeyID NE '' AND ColumnNo NE '' then
|
||||
|
||||
If ( Num(ColumnNo) and (ColumnNo GT 0) ) then
|
||||
If Unassigned(Value) then Value = ''
|
||||
If IgnoreSelfLock NE True$ then IgnoreSelfLock = False$
|
||||
If IgnoreMFSRoutines NE True$ then IgnoreMFSRoutines = False$
|
||||
If IgnoreAllLocks NE True$ then IgnoreAllLocks = False$
|
||||
If IgnoreAllLocks then
|
||||
HaveLock = True$
|
||||
end else
|
||||
HaveLock = Database_Services('GetKeyIDLock', TableName, KeyID, IgnoreSelfLock)
|
||||
end
|
||||
If HaveLock EQ True$ then
|
||||
TableHandle = Database_Services('GetTableHandle', TableName)
|
||||
If IgnoreMFSRoutines then
|
||||
MFSList = TableHandle<1, 1> ; // MFS routines are @SVM delimited.
|
||||
NumMFS = DCount(MFSList, @SVM)
|
||||
For MFSCnt = NumMFS to 1 Step -1
|
||||
MFSRoutine = MFSList<0, 0, MFSCnt>
|
||||
If (MFSRoutine NE 'SI.MFS') AND (MFSRoutine NE 'RTP57') then
|
||||
MFSList = Delete(MFSList, 0, 0, MFSCnt)
|
||||
end
|
||||
Next MFSCnt
|
||||
TableHandle<1, 1> = MFSList
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
WriteV Value on TableHandle, KeyID, ColumnNo then
|
||||
Memory_Services('SetValue', ServiceModule : '*' : 'ReadDataColumn' : '*' : TableName : '*' : KeyID : '*' : ColumnNo, Value)
|
||||
end else
|
||||
ErrorMsg = 'Error writing value ' : Quote(Value) ' to column number ' : ColumnNo : ' to key ' : KeyID |
|
||||
: ' of table ' : TableName : ' in the ' : Service : ' service.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end
|
||||
If IgnoreAllLocks EQ False$ then
|
||||
Database_Services('ReleaseKeyIDLock', TableName, KeyID)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Unable to lock ' : KeyID : ' for the ' : TableName : ' table in the ' : Service : ' service.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'ColumnNo was not a number or was not greater than zero in the ' :Service : ' service.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'TableName, KeyID, or ColumnNo argument was missing in the ' : Service : ' service.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// UnlockKeyID
|
||||
//
|
||||
@ -1043,5 +1102,3 @@ end service
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
@ -1614,5 +1614,3 @@ end service
|
||||
// Internal GoSubs
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
@ -54,7 +54,7 @@ $Insert MSG_EQUATES
|
||||
$Insert POPUP_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
|
||||
Declare subroutine Errmsg, Btree.Extract, Set_Status, Logging_Services, Work_Order_Services
|
||||
Declare subroutine Errmsg, Btree.Extract, Set_Status, Logging_Services, Work_Order_Services, PlaceDialog
|
||||
Declare function obj_WO_Log, Work_Order_Services, Environment_Services, Logging_Services, Database_Services
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
@ -92,7 +92,7 @@ Return EventFlow or 1
|
||||
|
||||
Event WINDOW.CREATE(CreateParam)
|
||||
|
||||
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
|
||||
PlaceDialog(-2, -2)
|
||||
|
||||
End Event
|
||||
|
||||
@ -156,44 +156,6 @@ Event PUB_RX.CLICK()
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_RELEASE.CLICK()
|
||||
|
||||
WONo = Get_Property(@Window:'.EDL_WO_NO', 'TEXT')
|
||||
If WONo NE '' then
|
||||
NumRelCass = 0
|
||||
ReleaseStartTime = Time()
|
||||
NumRelCass = Work_Order_Services('ReleaseCassettes', WONo)
|
||||
ReleaseStopTime = Time()
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end
|
||||
RefreshStartTime = Time()
|
||||
GoSub PopulateControls
|
||||
RefreshStopTime = Time()
|
||||
ReleaseDuration = ReleaseStopTime - ReleaseStartTime
|
||||
RefreshDuration = RefreshStopTime - RefreshStartTime
|
||||
TotalDuration = ReleaseDuration + RefreshDuration
|
||||
If NumRelCass GT 0 then
|
||||
SecPerCass = TotalDuration / NumRelCass
|
||||
end else
|
||||
SecPerCass = 'N/A'
|
||||
end
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = WONo
|
||||
LogData<3> = @User4
|
||||
LogData<4> = NumRelCass
|
||||
LogData<5> = ReleaseDuration
|
||||
LogData<6> = RefreshDuration
|
||||
LogData<7> = TotalDuration
|
||||
LogData<8> = SecPerCass
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM)
|
||||
end
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_LABELS.CLICK()
|
||||
|
||||
WONo = Get_Property(@Window:'.EDL_WO_NO', 'TEXT')
|
||||
@ -250,12 +212,14 @@ PopulateControls:
|
||||
|
||||
NumCtrls = DCount(Ctrls, ',')
|
||||
|
||||
Def = ""
|
||||
Def<MCAPTION$> = "Loading Work Order Details..."
|
||||
Def<MTYPE$> = "GC"
|
||||
Def<MEXTENT$> = NumCtrls
|
||||
Def<MTEXTWIDTH$> = 600
|
||||
MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message
|
||||
Def = ""
|
||||
Def<MCAPTION$> = "Loading Work Order Details..."
|
||||
Def<MTYPE$> = "GC"
|
||||
Def<MEXTENT$> = NumCtrls
|
||||
Def<MTEXTWIDTH$> = 600
|
||||
Def<MCOL$> = -2
|
||||
Def<MROW$> = -2
|
||||
MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message
|
||||
|
||||
Swap ',' with @VM in Ctrls
|
||||
Swap ',' with @VM in Cols
|
||||
|
@ -459,21 +459,6 @@ Event PUB_RX.CLICK()
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_RELEASE.CLICK()
|
||||
|
||||
WONo = Get_Property(@Window:'.EDL_WO_NO', 'TEXT')
|
||||
NumRelCass = Work_Order_Services('ReleaseCassettes', WONo)
|
||||
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
ErrMsg(ErrorMsg)
|
||||
end
|
||||
|
||||
GoSub PopulateControls
|
||||
|
||||
end event
|
||||
|
||||
|
||||
Event PUB_LABELS.CLICK()
|
||||
|
||||
WONo = Get_Property(@Window:'.EDL_WO_NO', 'TEXT')
|
||||
|
@ -132,7 +132,6 @@ CurrStatus:
|
||||
|
||||
ReturnVals = ''
|
||||
|
||||
|
||||
RDSCnt = COUNT(RDSNos,@VM) + (RDSNos NE '')
|
||||
FOR R = 1 TO RDSCnt
|
||||
|
||||
@ -147,13 +146,11 @@ CurrStatus:
|
||||
|
||||
RotrAction = XLATE('RDS',RDSNos,'ROTR_ACTION','X')
|
||||
|
||||
|
||||
IF RotrAction = 'F' Then ;* Drive the CURR_STATUS to PostEpi Clean if the ROTR fails
|
||||
ReturnVals<1,R> = 'PSTC'
|
||||
GOTO StatusHere
|
||||
END
|
||||
|
||||
|
||||
* Check for out of spec
|
||||
|
||||
OutOfSpec = 0 ;
|
||||
@ -178,9 +175,6 @@ CurrStatus:
|
||||
GOTO StatusHere
|
||||
END
|
||||
|
||||
|
||||
* * * * * * *
|
||||
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
CassNo = RDSRec<RDS_CASS_NO$>
|
||||
WOStepKey = RDSRec<RDS_WO_STEP_KEY$>
|
||||
@ -241,7 +235,6 @@ CurrStatus:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Create:
|
||||
* * * * * * *
|
||||
@ -291,85 +284,6 @@ Create:
|
||||
return
|
||||
end
|
||||
|
||||
// Delete old instance of this RDS if it exists ------------------------------------------------------------------------
|
||||
If RowExists('RDS', RDSNo) then
|
||||
Database_Services('DeleteDataRow', 'RDS', RDSNo, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Results = 'RDS ' : RDSNo : ' deleted'
|
||||
end else
|
||||
Results = 'RDS ' : RDSNo : ' not deleted. Error : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Delete related RDS_LAYER records ------------------------------------------------------------------------------------
|
||||
Layers = 'L1,L2,2'
|
||||
For each Layer in Layers using ','
|
||||
RDSLayerKey = RDSNo:'*':Layer
|
||||
If RowExists('RDS_LAYER', RDSLayerKey) then
|
||||
// Look for related RDS_TEST records and delete them first
|
||||
RDSTestKeys = Xlate('RDS_LAYER', RDSLayerKey, 'RDS_TEST_KEYS', 'X')
|
||||
If RDSTestKeys NE '' then
|
||||
For each RDSTestKey in RDSTestKeys using @VM
|
||||
// Look for related TW_USE records and delete them first
|
||||
TWKeys = Xlate('RDS_TEST', RDSTestKey, 'TW_USE_ID', 'X')
|
||||
If TWKeys NE '' then
|
||||
For each TWKey in TWKeys using @VM
|
||||
Database_Services('DeleteDataRow', 'TW_USE', TWKey, True$, True$)
|
||||
Next TWKey
|
||||
end
|
||||
Database_Services('DeleteDataRow', 'RDS_TEST', RDSTestKey, True$, True$)
|
||||
If Error_Services('NoError') then
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = RDSTestKey
|
||||
LogData<3> = 'RDS_Test record deleted without error.'
|
||||
Logging_Services('AppendLog', objRDSTestDeleteLog , LogData, @RM, @FM, False$)
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = ErrorMessage
|
||||
Logging_Services('AppendLog', objRDSTestDeleteLog , LogData, @RM, @FM, False$)
|
||||
end
|
||||
Next RDSTestKey
|
||||
end
|
||||
Database_Services('DeleteDataRow', 'RDS_LAYER', RDSLayerKey, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Results = 'RDS_LAYER ' : RDSLayerKey : ' deleted'
|
||||
end else
|
||||
Results = 'RDS_LAYER ' : RDSLayerKey : ' not deleted. Error : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
Next Layer
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Delete old REACT_RUN record if it exists ----------------------------------------------------------------------------
|
||||
If RowExists('REACT_RUN', RDSNo) then
|
||||
// Delete old CLEAN_INSP record(s) if they exist
|
||||
CIKeys = Xlate('REACT_RUN', RDSNo, 'CI_NO', 'X')
|
||||
For each CIKey in CIKeys using @VM
|
||||
If RowExists('CLEAN_INSP', CIKey) then
|
||||
Database_Services('DeleteDataRow', 'CLEAN_INSP', CIKey, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Results = 'CLEAN_INSP ' : CIKey : ' deleted'
|
||||
end else
|
||||
Results = 'CLEAN_INSP ' : CIKey : ' not deleted. Error : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
Next CIKey
|
||||
Database_Services('DeleteDataRow', 'REACT_RUN', RDSNo, True$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Results = 'REACT_RUN ' : RDSNo : ' deleted'
|
||||
end else
|
||||
Results = 'REACT_RUN ' : RDSNo : ' not deleted. Error : ' : Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Create new record
|
||||
RDSRec = ''
|
||||
RDSRec<RDS_ENTRY_ID$> = @USER4
|
||||
@ -388,7 +302,6 @@ Create:
|
||||
RDSRec<RDS_COMMIT_DATE_FINAL$> = SchedDt
|
||||
RDSRec<RDS_LOT_NUM$> = LotNo
|
||||
RDSRec<RDS_PART_NUM$> = CustPartNo
|
||||
|
||||
RDSRec<RDS_CASS_WAFER_QTY$> = WaferQty
|
||||
RDSRec<RDS_SUB_PART_NO$> = SubPartNo
|
||||
RDSRec<RDS_LAST_STEP$> = LastStep
|
||||
@ -396,8 +309,7 @@ Create:
|
||||
RDSRec<RDS_SUB_PRE_CLEAN$> = SubPreClean
|
||||
RDSRec<RDS_SUB_POST_CLEAN$> = SubPostClean
|
||||
|
||||
|
||||
IF CassNo = 1 THEN
|
||||
IF CassNo EQ 1 THEN
|
||||
WOVStatus = 'O' ;* Open status (?)
|
||||
WOVNotes = ''
|
||||
WOVNo = obj_WO_Verify('Create',RDSNo:@RM:WOVStatus:@RM:WOVNotes) ;* Create a WO_Verify record on 1st run order
|
||||
@ -407,18 +319,13 @@ Create:
|
||||
end
|
||||
End
|
||||
|
||||
|
||||
PSRec = XLATE('PROD_SPEC',PS_No,'','X')
|
||||
|
||||
ReactorType = PSRec<PROD_SPEC_REACTOR_TYPE$> ;* This isn't used anwhere in the program 8/27/2014 JCH
|
||||
PSRec = XLATE('PROD_SPEC',PS_No,'','X')
|
||||
ReactorType = PSRec<PROD_SPEC_REACTOR_TYPE$> ;* This isn't used anwhere in the program 8/27/2014 JCH
|
||||
RDSRec<RDS_SPECIAL_INST$> = PSRec<PROD_SPEC_SPEC_INST$> ;* 3/25/2013 jch
|
||||
RDSRec<RDS_SPEC_TYPE_ORIG$> = XLATE('PROD_SPEC',PS_No,'SPEC_TYPE','X')
|
||||
|
||||
Send_Info('Retrieving PSN Layer Properties...')
|
||||
|
||||
LayerSpecs = obj_Prod_Spec('GetLayerProp',PS_No:@RM:@RM:1) ;* Returns specs for all layers in internal format
|
||||
|
||||
|
||||
* LayerSpecs is @RM between layers, @FM between fields, LayerSet ID is in the first Field and needs to peeled off
|
||||
* before the equates match up correctly
|
||||
|
||||
@ -434,7 +341,6 @@ Create:
|
||||
|
||||
RDSRec<RDS_OVERGROW_REQ$> = LayerSpec<PRS_LAYER_RES_MEASUREMENT$,9> ;* JCH 2/27/2006
|
||||
|
||||
|
||||
IF QXJFlag THEN
|
||||
RDSRec<RDS_QXJ_POST$> = 0 ;* And here a couple of minor cluster operations
|
||||
END
|
||||
@ -448,27 +354,12 @@ Create:
|
||||
LayerSpec = FIELD(LayerSpecs,@RM,I) ;* Take the Ith Layer
|
||||
LayerSet = FIELD(LayerSpec,@FM,1)
|
||||
LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet
|
||||
|
||||
IF LayerSet = I THEN NoCombinedLayerFlag = 1 ELSE NoCombinedLayerFlag = 0
|
||||
|
||||
Send_Info('Creating RDS Layer ':LayerSet:'...')
|
||||
|
||||
obj_RDS_Layer('Create',RDSNo:@RM:LayerSet:@RM:PS_No:@RM:NoCombinedLayerFlag)
|
||||
|
||||
RDSRec<RDS_RDS_LAYER_KEYS$,I> = RDSNo:'*':LayerSet ;* Added 4/17/2006 JCH
|
||||
|
||||
Send_Info('Creating Metrology for Layer Set ':LayerSet:'...')
|
||||
|
||||
obj_RDS_Test('Create',RDSNo:@RM:LayerSet:@RM:PS_No)
|
||||
|
||||
NEXT I
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Send_Info('Saving RDS record...')
|
||||
|
||||
obj_Tables('WriteRec','RDS':@RM:RDSNo:@RM:@RM:RDSRec)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
@ -485,15 +376,14 @@ Create:
|
||||
Lot_Services('AddLotOperationIntoSequence', NewLotId, 'POST_EPI', 4, False$)
|
||||
Lot_Services('AddLotOperationIntoSequence', NewLotId, 'RDS_CLOSE', 5, False$)
|
||||
|
||||
Lot_Services('StartLot', NewLotId, @User4) ; // LOT_START event and move in to RDS_CREATE operation
|
||||
Lot_Services('StartLot', NewLotId, @User4) ; // LOT_START event and move in to RDS_CREATE operation
|
||||
Lot_Services('MoveOutLot', NewLotId, @User4) ; // Move out of RDS_CREATE operation
|
||||
Lot_Services('MoveInLot', NewLotId, @User4) ; // Move in to PRE_EPI operation
|
||||
end
|
||||
|
||||
Result = RDSNo
|
||||
********************************
|
||||
*Automatically Apply Supplement*
|
||||
********************************
|
||||
|
||||
// Automatically Apply Supplement
|
||||
// If first cassette in work order, then there is no supplement in place, therefore skip this step.
|
||||
If RDSRec<RDS_CASS_NO$> GT 1 then
|
||||
WoStepKey = RDSRec<RDS_WO_STEP_KEY$>
|
||||
@ -516,11 +406,7 @@ Create:
|
||||
end
|
||||
END
|
||||
|
||||
* * * * * * *
|
||||
|
||||
Send_Info('Conversion to REACT_RUN record...')
|
||||
|
||||
RDS_React_Run(RDSNo) ;********************************** Conversion stuff JCH 9/26/2008 *********************
|
||||
RDS_React_Run(RDSNo)
|
||||
|
||||
RETURN
|
||||
|
||||
@ -558,9 +444,6 @@ VerifySpecInfo:
|
||||
|
||||
ErrNum = 1
|
||||
|
||||
* IF RDSRec<RDS_RECIPE_NO$> NE RecipeNo THEN ErrNum = -11
|
||||
|
||||
|
||||
* This section is here because the targets calculated in the existing SCHEDULE*WRITE event are not done correctly
|
||||
* There is a last decimal point difference in the calculation that causes a mismatch whenever a remainder of .5
|
||||
* is generated during the division by 2. WRITE event code doesn't drop the remainder like it should
|
||||
@ -653,138 +536,6 @@ VerifySpecInfo:
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
* Update:
|
||||
* * * * * * *
|
||||
*
|
||||
* RDSNo = Parms[1,@RM]
|
||||
*
|
||||
* IF NOT(ASSIGNED(RDSNo)) THEN ErrorMsg = 'Unassigned Parm "RDSNo" passed to routine. (':Method:')'
|
||||
*
|
||||
* IF ErrorMsg NE '' THEN RETURN
|
||||
*
|
||||
* IF RDSNo = '' THEN ErrorMsg = 'Null Parameter "RDSNo" passed to routine. (':Method:')'
|
||||
*
|
||||
* IF ErrorMsg NE '' THEN RETURN
|
||||
*
|
||||
* RDSRec<RDS_ENTRY_ID$> = @USER4
|
||||
* RDSRec<RDS_ENTRY_DATE$> = Date()
|
||||
* RDSRec<RDS_ENTRY_TIME$> = Time()
|
||||
* RDSRec<RDS_SCHEDULE_NO$> = SchedNo
|
||||
* RDSRec<RDS_WO$> = WONo
|
||||
*
|
||||
* WO Run Order number is not stored in the RDS
|
||||
*
|
||||
* RDSRec<RDS_QUOTE_NO$> = QuoteNo
|
||||
* RDSRec<RDS_ORDER_NO$> = OrderNo
|
||||
* RDSRec<RDS_CUST_NO$> = CustNo
|
||||
* RDSRec<RDS_PO$> = PONo
|
||||
* RDSRec<RDS_PROD_SPEC_ID$> = PS_No
|
||||
* RDSRec<RDS_STATUS$> = RDSStatus ;* Usually passed as 'C' - Received
|
||||
* RDSRec<RDS_COMMIT_DATE_FINAL$> = SchedDt
|
||||
* RDSRec<RDS_LOT_NUM$> = LotNo
|
||||
* RDSRec<RDS_PART_NUM$> = PartNo
|
||||
*
|
||||
* IF CassNo = 1 THEN
|
||||
* WOVStatus = 'O' ;* Open status (?)
|
||||
* WOVNotes = ''
|
||||
* WOVNo = obj_WO_Verify('Create',RDSNo:@RM:WOVStatus:@RM:WOVNotes) ;* Create a WO_Verify record on 1st run order
|
||||
* RDSRec<RDS_WO_VERIFY_ID$> = WOVNo ;* Add pointer to RDS record
|
||||
* END
|
||||
*
|
||||
* PSRec = XLATE('PROD_SPEC',PS_No,'','X')
|
||||
*
|
||||
* RDSRec<RDS_SPECIAL_INST$> = PSRec<PROD_SPEC_SPEC_INST$>
|
||||
* RDSRec<RDS_SPEC_TYPE_ORIG$> = XLATE('PROD_SPEC',PS_No,'SPEC_TYPE','X')
|
||||
*
|
||||
* LayerSpecs = obj_Prod_Spec('GetLayerProp',PS_No:@RM:@RM:1) ;* Returns specs for all layers without output conversion
|
||||
*
|
||||
* LayerSpecs is @RM between layers, @FM between fields, LayerSet ID is in the first Field and needs to peeled off
|
||||
* before the equates match up correctly
|
||||
*
|
||||
* Prod_Spec table has layer specs all in one field
|
||||
* RDS has First layer stuff in individual fields and then has 2 and 3 shoved into Field 33 (Layer Info)
|
||||
*
|
||||
* LayerSpec = FIELD(LayerSpecs,@RM,1) ;* Take the first Layer
|
||||
* LayerSet = FIELD(LayerSpec,@FM,1) ;* Not used here but shown for clarity
|
||||
* LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet
|
||||
*
|
||||
* RecipeNo = LayerSpec<PRS_LAYER_RECIPE$>
|
||||
* RecipeRec = XLATE('RECIPE',RecipeNo,'','X') ;* This used in 2nd and 3rd layer stuff (in error it appears)
|
||||
*
|
||||
* RDSRec<RDS_RECIPE_NO$> = RecipeNo
|
||||
* RDSRec<RDS_CON_MIN$> = LayerSpec<PRS_LAYER_CONC_MIN$>
|
||||
* RDSRec<RDS_CON_MAX$> = LayerSpec<PRS_LAYER_CONC_MAX$>
|
||||
* RDSRec<RDS_CON_UNITS$> = LayerSpec<PRS_LAYER_CONC_UNITS$>
|
||||
* RDSRec<RDS_CON_TARGET$> = LayerSpec<PRS_LAYER_CONC_TARGET$>
|
||||
*
|
||||
* RDSRec<RDS_RES_MIN$> = LayerSpec<PRS_LAYER_RES_MIN$>
|
||||
* RDSRec<RDS_RES_MAX$> = LayerSpec<PRS_LAYER_RES_MAX$>
|
||||
* RDSRec<RDS_RES_UNITS$> = LayerSpec<PRS_LAYER_RES_UNITS$>
|
||||
* RDSRec<RDS_RES_TARGET$> = LayerSpec<PRS_LAYER_RES_TARGET$>
|
||||
*
|
||||
* RDSRec<RDS_THICK_MIN$> = LayerSpec<PRS_LAYER_THICK_MIN$>
|
||||
* RDSRec<RDS_THICK_MAX$> = LayerSpec<PRS_LAYER_THICK_MAX$>
|
||||
* RDSRec<RDS_THICK_UNITS$> = LayerSpec<PRS_LAYER_THICK_UNITS$>
|
||||
* RDSRec<RDS_THICK_TARGET$> = LayerSpec<PRS_LAYER_THICK_TARGET$>
|
||||
*
|
||||
* LayerInfo = ''
|
||||
*
|
||||
* FOR I = 2 TO COUNT(LayerSpecs,@RM) + (LayerSpecs NE '')
|
||||
* LayerSpec = FIELD(LayerSpecs,@RM,I) ;* Take the Ith Layer
|
||||
* LayerSpec = FIELD(LayerSpec,@FM,2,99) ;* LayerSpec without the LayerSet
|
||||
*
|
||||
* thisLayerInfo = '' ;* Empty bucket to parse into
|
||||
*
|
||||
* thisLayerInfo<1,RLConMin$> = LayerSpec<PRS_LAYER_CONC_MIN$>
|
||||
* thisLayerInfo<1,RLConMax$> = LayerSpec<PRS_LAYER_CONC_MAX$>
|
||||
* thisLayerInfo<1,RLConUnits$> = LayerSpec<PRS_LAYER_CONC_UNITS$>
|
||||
* thisLayerInfo<1,RLConTarget$> = LayerSpec<PRS_LAYER_CONC_TARGET$>
|
||||
*
|
||||
* thisLayerInfo<1,RLRecipeNo$> = RecipeNo ;* Copied from the original in the WRITE event of the Schedule window
|
||||
* thisLayerInfo<1,RLThickRead$> = STR(@SVM,16)
|
||||
* thisLayerInfo<1,RLSheetRhoRead$> = STR(@SVM,16)
|
||||
*
|
||||
* thisLayerInfo<1,RLResMin$> = LayerSpec<PRS_LAYER_RES_MIN$>
|
||||
* thisLayerInfo<1,RLResMax$> = LayerSpec<PRS_LAYER_RES_MAX$>
|
||||
* thisLayerInfo<1,RLResUnits$> = LayerSpec<PRS_LAYER_RES_UNITS$>
|
||||
* thisLayerInfo<1,RLResTarget$> = LayerSpec<PRS_LAYER_RES_TARGET$>
|
||||
*
|
||||
* thisLayerInfo<1,RLThickMin$> = LayerSpec<PRS_LAYER_THICK_MIN$>
|
||||
* thisLayerInfo<1,RLThickMax$> = LayerSpec<PRS_LAYER_THICK_MAX$>
|
||||
* thisLayerInfo<1,RLThickUnits$> = LayerSpec<PRS_LAYER_THICK_UNITS$>
|
||||
* thisLayerInfo<1,RLThickTarget$> = LayerSpec<PRS_LAYER_THICK_TARGET$>
|
||||
*
|
||||
* LayerInfo := thisLayerInfo:CHAR(248)
|
||||
*
|
||||
* NEXT I
|
||||
*
|
||||
* LayerInfo[-1,1] = '' ;* Strip trailing CHAR(248)
|
||||
*
|
||||
*
|
||||
* RDSRec<RDS_LAYER_INFO$> = LayerInfo ;* End of the great Layer cluster function
|
||||
*
|
||||
* IF QXJFlag THEN
|
||||
* RDSRec<RDS_QXJ_POST$> = 0 ;* And here a couple of minor cluster operations
|
||||
* END
|
||||
*
|
||||
* IF CustNo = '621' AND CassNo = 1 THEN
|
||||
* RDSRec<RDS_QXJ_POST$> = 0
|
||||
* END
|
||||
*
|
||||
* obj_Tables('WriteRec','RDS':@RM:RDSKey:@RM:@RM:RDSRec)
|
||||
*
|
||||
* IF Get_Status(errCode) THEN
|
||||
* Result = ''
|
||||
* END ELSE
|
||||
* Result = RDSKey
|
||||
* END
|
||||
*
|
||||
*
|
||||
*
|
||||
* RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
SchedWfrQty:
|
||||
* * * * * * *
|
||||
@ -1473,6 +1224,7 @@ CalcResTarget:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
CalcThickTarget:
|
||||
* * * * * * *
|
||||
@ -1490,5 +1242,3 @@ CalcThickTarget:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5581,5 +5581,3 @@ ExpCOA:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -986,4 +986,3 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -174,36 +174,40 @@ Service ProcessProcedureQueue()
|
||||
ServerPort = Environment_Services('GetServiceManagerPort')
|
||||
Convert '\' to '' in ServerIP
|
||||
|
||||
Open 'PROC_QUEUE2' to hProcQueue then
|
||||
Select hProcQueue
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext RequestKeyID else EOF = True$
|
||||
Until EOF
|
||||
SendRequest = True$
|
||||
Read RequestRec from hProcQueue, RequestKeyID then
|
||||
InQueue = RequestRec<PROC_QUEUE.IN_QUEUE$>
|
||||
If InQueue then
|
||||
QueuedDtm = RequestRec<PROC_QUEUE.QUEUED_DTM$>
|
||||
If QueuedDtm GT SRP_Datetime('AddMinutes', Datetime(), -10) then
|
||||
SendRequest = False$
|
||||
end
|
||||
end
|
||||
end
|
||||
If SendRequest then
|
||||
TcpClientHandle = 0
|
||||
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
|
||||
RequestRec<PROC_QUEUE.IN_QUEUE$> = True$
|
||||
RequestRec<PROC_QUEUE.QUEUED_DTM$> = Datetime()
|
||||
Write RequestRec on hProcQueue, RequestKeyID then
|
||||
Command = 'RUN SERVICE_SERVICES "ProcessRequest", ':Quote(RequestKeyID)
|
||||
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
||||
end
|
||||
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
||||
end
|
||||
end
|
||||
Repeat
|
||||
ErrCode = ''
|
||||
RList('SELECT PROC_QUEUE2 BY ENTRY_DTM', TARGET_ACTIVELIST$, '', '', '')
|
||||
If Not(Get_Status(ErrCode)) then
|
||||
Open 'PROC_QUEUE2' to hProcQueue then
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext RequestKeyID else EOF = True$
|
||||
Until EOF
|
||||
SendRequest = True$
|
||||
Read RequestRec from hProcQueue, RequestKeyID then
|
||||
InQueue = RequestRec<PROC_QUEUE.IN_QUEUE$>
|
||||
If InQueue then
|
||||
QueuedDtm = RequestRec<PROC_QUEUE.QUEUED_DTM$>
|
||||
If QueuedDtm GT SRP_Datetime('AddMinutes', Datetime(), -10) then
|
||||
SendRequest = False$
|
||||
end
|
||||
end
|
||||
end
|
||||
If SendRequest then
|
||||
TcpClientHandle = 0
|
||||
If SRP_TcpClient(TcpClientHandle, 'CONNECT', ServerIP, ServerPort) then
|
||||
RequestRec<PROC_QUEUE.IN_QUEUE$> = True$
|
||||
RequestRec<PROC_QUEUE.QUEUED_DTM$> = Datetime()
|
||||
Write RequestRec on hProcQueue, RequestKeyID then
|
||||
Command = 'RUN SERVICE_SERVICES "ProcessRequest", ':Quote(RequestKeyID)
|
||||
SRP_TcpClient(TcpClientHandle, 'SEND_SES', Command)
|
||||
end
|
||||
SRP_TcpClient(TcpClientHandle, 'CLOSE_SES')
|
||||
end
|
||||
end
|
||||
Repeat
|
||||
end
|
||||
end
|
||||
|
||||
Unlock hSysLists, ServiceKeyID else Null
|
||||
end
|
||||
|
||||
@ -338,10 +342,9 @@ Service ProcessRequest(RequestKeyID)
|
||||
end service
|
||||
|
||||
|
||||
Service PostProcedure(ProcedureName, Params, Critical=BOOLEAN)
|
||||
Service PostProcedure(ProcedureName, Params)
|
||||
|
||||
If Critical EQ '' then Critical = True$
|
||||
PostToQueue = True$
|
||||
ErrorMsg = ''
|
||||
If (ProcedureName NE '') then
|
||||
RequestKeyID = RTI_CreateGUID()
|
||||
RequestRow = ''
|
||||
@ -350,8 +353,18 @@ Service PostProcedure(ProcedureName, Params, Critical=BOOLEAN)
|
||||
RequestRow<PROC_QUEUE.ENTRY_DTM$> = Datetime()
|
||||
RequestRow<PROC_QUEUE.IN_QUEUE$> = False$
|
||||
Database_Services('WriteDataRow', 'PROC_QUEUE2', RequestKeyID, RequestRow, True$, False$, False$)
|
||||
If Error_Services('NoError') then
|
||||
Response = RequestKeyId
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in ':Service:' service. Null ProcedureName passed in.')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null ProcedureName passed in.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
Response = False$
|
||||
end
|
||||
|
||||
return
|
||||
|
@ -43,7 +43,7 @@ Return Response or ""
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service PostWriteFieldTransaction(Table, Key, FieldNo, FieldVal)
|
||||
Service PostWriteFieldTransaction(Table, Key, FieldNo, FieldVal, MvPos)
|
||||
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
@ -55,6 +55,8 @@ Service PostWriteFieldTransaction(Table, Key, FieldNo, FieldVal)
|
||||
ErrorMsg = 'Error in ':Service:' service. Null Table passed into service.'
|
||||
Case Not(Num(FieldNo))
|
||||
ErrorMsg = 'Error in ':Service:' service. FieldNo ':FieldNo:' is not a number.'
|
||||
Case ( (MvPos NE '') and Not(Num(MvPos)) )
|
||||
ErrorMsg = 'Error in ':Service:' service. MvPos ':MvPos:' is not a number.'
|
||||
Case Otherwise$
|
||||
TransKey = RTI_CreateGuid()
|
||||
TransRec = ''
|
||||
@ -64,6 +66,7 @@ Service PostWriteFieldTransaction(Table, Key, FieldNo, FieldVal)
|
||||
TransRec<TRANSACTION_QUEUE.KEY$> = Key
|
||||
TransRec<TRANSACTION_QUEUE.COLUMN$> = FieldNo
|
||||
TransRec<TRANSACTION_QUEUE.VALUE$> = FieldVal
|
||||
TransRec<TRANSACTION_QUEUE.MV_POS$> = Int(MvPos)
|
||||
Database_Services('WriteDataRow', 'TRANSACTION_QUEUE', TransKey, TransRec)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
End Case
|
||||
@ -148,7 +151,7 @@ Service ProcessTransactionQueue()
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Transaction Queue Log.csv'
|
||||
Headers = 'Logging DTM':@FM:'Result':@FM:'Action':@FM:'Table':@FM:'Key':@FM:'Base64Record'
|
||||
Headers := @FM:'Column':@FM:'Value'
|
||||
Headers := @FM:'Column':@FM:'Value':@FM:'MvPos'
|
||||
objQueueLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
@ -170,6 +173,7 @@ Service ProcessTransactionQueue()
|
||||
Action = TransRec<TRANSACTION_QUEUE.ACTION$>
|
||||
Table = TransRec<TRANSACTION_QUEUE.TABLE$>
|
||||
Key = TransRec<TRANSACTION_QUEUE.KEY$>
|
||||
MvPos = TransRec<TRANSACTION_QUEUE.MV_POS$>
|
||||
LogData<3> = Action
|
||||
LogData<4> = Table
|
||||
LogData<5> = Key
|
||||
@ -181,13 +185,29 @@ Service ProcessTransactionQueue()
|
||||
FieldVal = TransRec<TRANSACTION_QUEUE.VALUE$>
|
||||
LogData<7> = FieldNo
|
||||
LogData<8> = FieldVal
|
||||
LogData<9> = MvPos
|
||||
Open Table to hTable then
|
||||
WriteV FieldVal on hTable, Key, FieldNo then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling WriteV. '
|
||||
ErrorMsg := 'File error: ':@File_Error
|
||||
end
|
||||
If MvPos NE '' then
|
||||
ReadV Col from hTable, Key, FieldNo then
|
||||
Col<0, MvPos> = FieldVal
|
||||
WriteV Col on hTable, Key, FieldNo then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling WriteV. '
|
||||
ErrorMsg := 'File error: ':@File_Error
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error reading column ':Col:' from table ':Table:'. '
|
||||
ErrorMsg := 'File error: ':@File_Error
|
||||
end
|
||||
end else
|
||||
WriteV FieldVal on hTable, Key, FieldNo then
|
||||
DeleteTrans = True$
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error calling WriteV. '
|
||||
ErrorMsg := 'File error: ':@File_Error
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error opening ':Table:'.'
|
||||
end
|
||||
|
@ -248,4 +248,3 @@ Restore_System_Variables:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
@ -48,15 +48,18 @@ $Insert WM_IN_EQUATES
|
||||
$Insert WM_OUT_EQUATES
|
||||
$Insert VOIDED_LOT_EQUATES
|
||||
$Insert IFX_EQUATES
|
||||
$Insert CUST_EPI_PART_EQUATES
|
||||
|
||||
Declare subroutine Error_Services, Work_Order_Services, Memory_Services, RList, Database_Services, SRP_JSON
|
||||
Declare subroutine Btree.Extract, Set_Status, obj_WO_Log, obj_Notes, Print_Wo_Mat_In_Labels, Print_Wo_Mat_Out_Labels
|
||||
Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Labels, Logging_Services, Service_Services
|
||||
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services, Transaction_Services, Extract_Si_Keys
|
||||
Declare subroutine Mona_Services, Lot_Event_Services, RDS_Services, Lot_Services, WM_In_Services, WM_Out_Services
|
||||
Declare subroutine obj_WO_Mat, obj_Post_Log
|
||||
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
|
||||
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, Datetime, obj_WO_Log, obj_WO_Step, Memberof
|
||||
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services, RTI_CreateGUID
|
||||
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, obj_WO_Log, obj_WO_Step, Memberof, Datetime
|
||||
Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services, Lot_Services
|
||||
Declare function SRP_Datetime, RTI_CreateGUID
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -589,120 +592,283 @@ Service UpdateUnscheduledQuantities(WOList)
|
||||
end service
|
||||
|
||||
|
||||
Service ReleaseCassettes(WONo)
|
||||
Service ReceiveCassette(WONo, ReceiveUser, LotNo, CassQty, SubPartNo, SubVendorCode, RecDtm)
|
||||
|
||||
NumRelCass = 0
|
||||
ErrorMsg = ''
|
||||
If WONo NE '' then
|
||||
WOMatKey = ''
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case ( (WONo EQ '') or Not( RowExists('WO_LOG', WONo) ) )
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid WONo ':Quote(WONo):'.'
|
||||
Case ( (ReceiveUser EQ '') or Not(RowExists('LSL_USERS', ReceiveUser) ) )
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid ReceiveUser ':Quote(ReceiveUser):'.'
|
||||
Case (LotNo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid LotNo ':Quote(LotNo):'.'
|
||||
Case ( (CassQty EQ '') or Not( Num(CassQty) ) )
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid CassQty ':Quote(CassQty):'.'
|
||||
Case (SubPartNo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid SubPartNo ':Quote(SubPartNo):'.'
|
||||
Case (SubVendorCode EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid SubVendorCode ':Quote(SubVendorCode):'.'
|
||||
End Case
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
If RecDtm EQ '' then RecDtm = Datetime()
|
||||
WORec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
If Error_Services('NoError') then
|
||||
|
||||
OrderItemNo = 1
|
||||
CustPartNo = WORec<WO_LOG_CUST_PART_NO$>
|
||||
ProdOrderNo = WORec<WO_LOG_PROD_ORD_NO$>
|
||||
ProdVerNo = WORec<WO_LOG_PROD_VER_NO$>
|
||||
CustNo = WORec<WO_LOG_CUST_NO$>
|
||||
ProdVerRec = Xlate('PROD_VER',ProdVerNo,'','X')
|
||||
ProcStepPSNs = ProdVerRec<PROD_VER_PROC_STEP_PSN$>
|
||||
ReactType = ProdVerRec<PROD_VER_REACT_TYPE$>
|
||||
SpecType = Xlate('PROD_SPEC',ProcStepPSNs[-1,'B':@VM],'SPEC_TYPE','X')
|
||||
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
|
||||
CustEpiPartRec = Xlate('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
|
||||
MUWaferFlag = CustEpiPartRec<CUST_EPI_PART_MAKEUP_WAFERS$>
|
||||
RetRejects = CustEpiPartRec<CUST_EPI_PART_RET_REJECTS$>
|
||||
If SpecType EQ 'Q' then
|
||||
CassShipQty = ''
|
||||
end else
|
||||
CassShipQty = CustEpiPartRec<CUST_EPI_PART_CASS_SHIP_QTY$>
|
||||
end
|
||||
MinCassShipQty = CustEpiPartRec<CUST_EPI_PART_MIN_CASS_SHIP_QTY$>
|
||||
ShipShort = CustEpiPartRec<CUST_EPI_PART_EPI_PRO_SHIP_SHORT$>
|
||||
Reprocessed = ''
|
||||
EpiPartRec = Database_Services('ReadDataRow', 'EPI_PART', EpiPartNo)
|
||||
|
||||
If Error_Services('NoError') then
|
||||
|
||||
SubSuppBy = EpiPartRec<EPI_PART_SUB_SUPP_BY$> ;* L - EpiSvcs supplied, C - Customer Supplied
|
||||
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
|
||||
WOMatKeys = SRP_Array('SortRows', WOMatKeys, 'AR2', 'LIST', @VM, '*')
|
||||
|
||||
If WOMatKeys NE '' then
|
||||
WOMatKeys = SRP_Array('SortRows', WOMatKeys, 'AR2', 'LIST', @VM, '*')
|
||||
LastCassNo = WOMatKeys[-1, 'B*']
|
||||
end else
|
||||
LastCassNo = 0
|
||||
end
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
CassNo = ''
|
||||
CandidateCassNo = LastCassNo + 1
|
||||
Loop
|
||||
CandidateWOMatKey = WONo:'*':CandidateCassNo
|
||||
If Not(RowExists('WO_MAT', CandidateWOMatKey)) then
|
||||
Lock hSysLists, CandidateWOMatKey then
|
||||
CassNo = CandidateCassNo
|
||||
end
|
||||
end
|
||||
Until (CassNo NE '')
|
||||
CandidateCassNo = CandidateCassNo + 1
|
||||
Repeat
|
||||
|
||||
Parms = WONo:@RM
|
||||
Parms := CassNo:@RM
|
||||
Parms := ProdVerNo:@RM
|
||||
Parms := LotNo:@RM
|
||||
Parms := CassQty:@RM
|
||||
Parms := CustPartNo:@RM
|
||||
Parms := OrderItemNo:@RM
|
||||
Parms := ReactType:@RM
|
||||
Parms := SubPartNo:@RM
|
||||
Parms := 'SR':@RM ;* Warehouse = 'SR' - Shipping/Receiving Area
|
||||
Parms := 'RB':@RM ;* Location = 'RB' - Receiving Bench
|
||||
Parms := OConv(RecDtm, 'DT2/^H'):@RM
|
||||
Parms := ReceiveUser:@RM
|
||||
Parms := SubSuppBy:@RM
|
||||
Parms := MUWaferFlag:@RM
|
||||
Parms := RetRejects :@RM
|
||||
Parms := Reprocessed:@RM
|
||||
Parms := CassShipQty:@RM
|
||||
Parms := ShipShort:@RM
|
||||
Parms := SubVendorCode:@RM
|
||||
Parms := MinCassShipQty
|
||||
|
||||
obj_WO_Mat('Create',Parms)
|
||||
ErrCode = ''
|
||||
If Not(Get_Status(ErrCode)) then
|
||||
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
|
||||
Locate WOMatKey in WOMatKeys by 'AR' using @VM setting NewPos else
|
||||
WOMatKeys<0, CassNo> = WOMatKey
|
||||
Transaction_Services('PostWriteFieldTransaction', 'WO_LOG', WONo, WO_LOG_WO_MAT_KEY$, WOMatKey, CassNo)
|
||||
ErrCode = ''
|
||||
If Get_Status(ErrCode) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':ErrCode
|
||||
end
|
||||
end
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
Recipients = ''
|
||||
SentFrom = ReceiveUser
|
||||
Subject = 'Cassette ':CassNo:' Received for Work Order ':WONo
|
||||
Message ='Cassette ':CassNo:' Received for Work Order ':WONo
|
||||
AttachWindow = 'NDW_WO_LOG'
|
||||
AttachKey = WONo
|
||||
SendToGroup = 'MATERIAL_RECEIPT'
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end
|
||||
Unlock hSysLists, CandidateWOMatKey else Null
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
Response = WOMatKey
|
||||
end else
|
||||
Response = False$
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// ReleaseCassette
|
||||
//
|
||||
// Input:
|
||||
// WOMatKey [Required] - Cassette to be released
|
||||
// ReleaseUser [Required] - User to be recorded in REL transaction
|
||||
// RelDtm [Optional] - Will be used as the REL dtm if provided, otherwise it will use the current dtm.
|
||||
//
|
||||
// Output:
|
||||
// Returns true if successful, false otherwise. If false, the error will be added to Error_Services.
|
||||
//
|
||||
// Releases a given cassette. This will create all child records for a given WO_MAT record and record a REL transaction
|
||||
// in the material log.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service ReleaseCassette(WOMatKey, ReleaseUser, RelDtm)
|
||||
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case (WOMatKey EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null WOMatKey passed into service.'
|
||||
Case Not( RowExists('WO_MAT', WOMatKey) )
|
||||
ErrorMsg = 'Error in ':Service:' service. WO_MAT ':Quote(WOMatKey):' does not exist.'
|
||||
Case (ReleaseUser EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Null ReleaseUser passed into service.'
|
||||
Case Not( RowExists('LSL_USERS', ReleaseUser) )
|
||||
ErrorMsg = 'Error in ':Service:' service. User ':ReleaseUser:' does not exist.'
|
||||
End Case
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
|
||||
PSNo = Xlate('WO_LOG', WONo, 'PS_NO', 'X')
|
||||
PSMode = Xlate('PROD_SPEC',PSNo,'SPEC_TYPE','X')
|
||||
|
||||
If PSMode = 'Q' OR PSMode = 'U' then
|
||||
|
||||
ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X')
|
||||
|
||||
If ReactType = 'EPP' OR ReactType = 'EpiPro' then
|
||||
|
||||
OutLoadQty = Xlate('WO_LOG', WONo, 'CUST_EPI_PART_WMO_LOAD_CNT', 'X')
|
||||
If OutLoadQty = '' then
|
||||
ErrorMsg = 'Outbound Load Cnt is required for ':OCONV(PSMode,'[PROD_SPEC_MODE_CONV]'):' Work Orders.'
|
||||
end
|
||||
|
||||
end else
|
||||
|
||||
OutLoadQty = Xlate('WO_LOG', WONo, 'CUST_EPI_PART_SHIP_QTY', 'X')
|
||||
If OutLoadQty = '' then
|
||||
ErrorMsg = 'Cass Ship Qty is required for ':OCONV(PSMode,'[PROD_SPEC_MODE_CONV]'):' Work Orders.'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
|
||||
CassList = Xlate('WO_LOG', WONo, 'WO_MAT_CASS_NO', 'X')
|
||||
RelDTMs = Xlate('WO_LOG', WONo, 'WO_MAT_REL_DTM', 'X')
|
||||
SAPCassIDs = Xlate('WO_LOG', WONo, 'WO_MAT_CASS_ID_SAP', 'X')
|
||||
CassStatus = Xlate('WO_LOG', WONo, 'WO_MAT_CURR_STATUS', 'X')
|
||||
CassRelDtm = Xlate('WO_MAT', WOMatKey, 'REL_DTM', 'X')
|
||||
CassRxDtm = Xlate('WO_MAT', WOMatKey, 'RX_DTM', 'X')
|
||||
|
||||
Loop
|
||||
LastLine = CassList[-1,'B':@VM]
|
||||
Until LastLine<1,1> NE '' OR LastLine = ''
|
||||
CassList[COL1(),COL2()] = ''
|
||||
Repeat
|
||||
|
||||
CassCnt = DCount(CassList, @VM)
|
||||
|
||||
UnReleasedCassNos = ''
|
||||
For I = 1 to CassCnt
|
||||
If ( (RelDTMs<0, I> = '') and (CassStatus<0, I> EQ '') ) then
|
||||
ErrorMsg = 'Error in obj_WO_Log("ReleaseCassettes"). Cass status is null for ':CassList<0, I>:'!'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @USER4
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
||||
end
|
||||
If ErrorMsg EQ '' then
|
||||
// Log work order, cassette number, status, and release DTM in the event that a release
|
||||
// issue occurs again.
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
LogData<3> = WONo
|
||||
LogData<4> = CassList<0, I> ; // CassNo
|
||||
LogData<5> = CassStatus<0, I> ; // Cass Status
|
||||
LogData<6> = Quote(RelDTMs<0, I>) ; // Release DTM
|
||||
Logging_Services('AppendLog', objReleaseLog, LogData, @RM, @FM, False$)
|
||||
If ( (RelDTMs<0, I> = '') and ( (CassStatus<0, I> = 'RX') or (CassStatus<0, I> = 'MT'))) then
|
||||
UnReleasedCassNos<1,-1> = CassList<0, I>
|
||||
end
|
||||
end
|
||||
Until ErrorMsg NE ''
|
||||
Next I
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
|
||||
TempWONo = WONo
|
||||
If ( (CassRelDtm EQ '') and ( CassRxDtm NE '' ) ) then
|
||||
RelWONo = Field(WOMatKey, '*', 1, 1)
|
||||
RelCassNo = Field(WOMatKey, '*', 2, 1)
|
||||
Set_Status(0)
|
||||
|
||||
obj_WO_Log('ReleaseCassettes',TempWONo:@RM:UnReleasedCassNos) ;* This variable gets changed down the line
|
||||
errCode = ''
|
||||
|
||||
obj_WO_Log('ReleaseCassettes',RelWONo:@RM:RelCassNo:@RM:ReleaseUser:@RM:RelDtm)
|
||||
errCode = ''
|
||||
If Get_Status(errCode) then
|
||||
|
||||
ErrorMsg = 'Error in obj_WO_Log("ReleaseCassettes"). Error code ':errCode:'.'
|
||||
Database_Services('ReleaseKeyIDLock', 'WO_LOG', WONo)
|
||||
|
||||
end else
|
||||
|
||||
NumRelCass = CassCnt
|
||||
OrderNo = Get_Property(@WINDOW:'.ORD_NO','TEXT')
|
||||
|
||||
Recipients = XLATE('NOTIFICATION','WO_ENTRY',NOTIFICATION_USER_ID$,'X')
|
||||
SentFrom = @USER4
|
||||
Subject = 'Work Order Released ':WONo
|
||||
Message = 'Work Order Released to Production.'
|
||||
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
|
||||
If NewForm then
|
||||
AttachWindow = 'NDW_WO_LOG'
|
||||
end else
|
||||
AttachWindow = 'WO_LOG2'
|
||||
ErrorMsg = 'Error in ':Service:' service. Error code ':errCode:'.'
|
||||
If Database_Services('IsKeyIDLocked', 'WO_LOG', RelWONo) then
|
||||
Database_Services('ReleaseKeyIDLock', 'WO_LOG', RelWONo)
|
||||
end
|
||||
AttachKey = WONo
|
||||
SendToGroup = ''
|
||||
|
||||
end else
|
||||
Recipients = ''
|
||||
SentFrom = ReleaseUser
|
||||
Subject = 'Cassette ':WOMatKey:' released for work order ':RelWONo
|
||||
Message = 'Cassette ':WOMatKey:' released for work order ':RelWONo
|
||||
AttachWindow = 'WO_MAT'
|
||||
AttachKey = WOMatKey
|
||||
SendToGroup = 'WO_ENTRY'
|
||||
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
|
||||
obj_Notes('Create',Parms)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. WO_MAT ':WOMatKey:' is ineligible to be released.'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Work_Order_Services('UpdateReleasedQty', WONo)
|
||||
If ErrorMsg EQ '' then
|
||||
Response = True$
|
||||
end else
|
||||
Response = False$
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = DCount(UnReleasedCassNos, @VM)
|
||||
end service
|
||||
|
||||
|
||||
Service ReceiveReleaseCassette(WONo, ReceiveUser, LotNo, CassQty, SubPartNo, SubVendorCode, RecDtm)
|
||||
|
||||
WOMatKey = ''
|
||||
ErrorMsg = ''
|
||||
Begin Case
|
||||
Case ( (WONo EQ '') or Not( RowExists('WO_LOG', WONo) ) )
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid WONo ':Quote(WONo):'.'
|
||||
Case ( (ReceiveUser EQ '') or Not(RowExists('LSL_USERS', ReceiveUser) ) )
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid ReceiveUser ':Quote(ReceiveUser):'.'
|
||||
Case (LotNo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid LotNo ':Quote(LotNo):'.'
|
||||
Case ( (CassQty EQ '') or Not( Num(CassQty) ) )
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid CassQty ':Quote(CassQty):'.'
|
||||
Case (SubPartNo EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid SubPartNo ':Quote(SubPartNo):'.'
|
||||
Case (SubVendorCode EQ '')
|
||||
ErrorMsg = 'Error in ':Service:' service. Invalid SubVendorCode ':Quote(SubVendorCode):'.'
|
||||
End Case
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
If RecDtm EQ '' then RecDtm = Datetime()
|
||||
WOMatKey = Work_Order_Services('ReceiveCassette', WONo, ReceiveUser, LotNo, CassQty, SubPartNo, SubVendorCode, RecDtm)
|
||||
If Error_Services('NoError') then
|
||||
If RowExists('WO_MAT', WOMatKey) then
|
||||
RelDtm = SRP_Datetime('AddSeconds', RecDtm, 30)
|
||||
If Not(Work_Order_Services('ReleaseCassette', WOMatKey, ReceiveUser, RelDtm)) then
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error receiving cassette. WO_MAT ':WOMatKey:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
Response = WOMatKey
|
||||
end else
|
||||
Response = False$
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
@ -1329,15 +1495,15 @@ Service CreateVoidedLotRecord(LotId, LegacyLotId, LegacyLotType, WoMatKey, UserI
|
||||
|
||||
If ErrorMessage NE '' then
|
||||
If RowExists('LOT', LotId) then
|
||||
NewVoidedLotId = RTI_CreateGUID()
|
||||
NewVoidedLotRec = ''
|
||||
NewVoidedLotId = RTI_CreateGUID()
|
||||
NewVoidedLotRec = ''
|
||||
NewVoidedLotRec<VOIDED_LOT_WORK_ORDER_LOG_ID$> = Field(WoMatKey, '*', 1)
|
||||
NewVoidedLotRec<VOIDED_LOT_VOID_BY$> = UserId
|
||||
NewVoidedLotRec<VOIDED_LOT_VOID_DTM$> = Datetime()
|
||||
NewVoidedLotRec<VOIDED_LOT_ENTITY_TYPE$> = LegacyLotType
|
||||
NewVoidedLotRec<VOIDED_LOT_LOT_ID$> = LotId
|
||||
NewVoidedLotRec<VOIDED_LOT_LEGACY_LOT_ID$> = LegacyLotId
|
||||
NewVoidedLotRec<VOIDED_LOT_WO_MAT_KEY$> = WoMatKey
|
||||
NewVoidedLotRec<VOIDED_LOT_VOID_BY$> = UserId
|
||||
NewVoidedLotRec<VOIDED_LOT_VOID_DTM$> = Datetime()
|
||||
NewVoidedLotRec<VOIDED_LOT_ENTITY_TYPE$> = LegacyLotType
|
||||
NewVoidedLotRec<VOIDED_LOT_LOT_ID$> = LotId
|
||||
NewVoidedLotRec<VOIDED_LOT_LEGACY_LOT_ID$> = LegacyLotId
|
||||
NewVoidedLotRec<VOIDED_LOT_WO_MAT_KEY$> = WoMatKey
|
||||
Database_Services('WriteDataRow', 'VOIDED_LOT', NewVoidedLotId, NewVoidedLotRec)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
@ -1399,7 +1565,7 @@ Service SignVoidNonEpp(WOMatKeys, WONo, Username)
|
||||
If Error_Services('NoError') then
|
||||
//Create a voided LOT record then record an event.
|
||||
Work_Order_Services('CreateVoidedLotRecord', '', RDSNo, 'RDS', WoMatKey, Username)
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, DateTime, 'VOID', 'Lot voided by ' : Username, '', Username, True$, 'RDS')
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'VOID', 'Lot voided by ' : Username, '', Username, True$, 'RDS')
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
|
@ -268,7 +268,7 @@ return
|
||||
|
||||
WRITE_RECORD_PRE:
|
||||
|
||||
WOMatKeyID = Name
|
||||
WOMatKeyID = Name
|
||||
|
||||
CriticalFields = WO_MAT_RDS_NO$:@VM:WO_MAT_LOT_NO$:@VM:WO_MAT_WAFER_QTY$:@VM:WO_MAT_CUST_PART_NO$:@VM
|
||||
CriticalFields := WO_MAT_SUB_PART_NO$:@VM:WO_MAT_INV_ACTION$:@VM:WO_MAT_SLOT_NO$:@VM:WO_MAT_RX_DTM$:@VM
|
||||
@ -600,8 +600,8 @@ WRITE_RECORD_PRE:
|
||||
Case Otherwise$
|
||||
Null
|
||||
End Case
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
||||
@ -611,6 +611,20 @@ WRITE_RECORD:
|
||||
CassNo = Field(Name, '*', 2)
|
||||
WOMatKeyID = Name
|
||||
|
||||
OrigWfrQty = OrigRecord<WO_MAT_WAFER_QTY$>
|
||||
NewWfrQty = Record<WO_MAT_WAFER_QTY$>
|
||||
OrigRelDtm = OrigRecord<WO_MAT_REL_DTM$>
|
||||
NewRelDtm = Record<WO_MAT_REL_DTM$>
|
||||
OrigRecDtm = OrigRecord<WO_MAT_RX_DTM$>
|
||||
NewRecDtm = Record<WO_MAT_RX_DTM$>
|
||||
|
||||
If ( ( (OrigWfrQty NE '' ) and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRecDtm EQ '') and (NewRecDtm NE '') ) ) then
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReceivedQty':SD$:WONo)
|
||||
end
|
||||
If ( ( (OrigWfrQty NE '') and (OrigWfrQty NE NewWfrQty) ) or ( (OrigRelDtm EQ '') and (NewRelDtm NE '') ) ) then
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'UpdateReleasedQty':SD$:WONo)
|
||||
end
|
||||
|
||||
If {REACTOR_TYPE} NE 'EPP' then
|
||||
If {MAKEUP_BOX} then
|
||||
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
|
||||
@ -850,11 +864,6 @@ WRITE_RECORD:
|
||||
end
|
||||
end
|
||||
|
||||
If OrigRecord<WO_MAT_WAFER_QTY$> NE Record<WO_MAT_WAFER_QTY$> then
|
||||
Work_Order_Services('UpdateReceivedQty', WONo)
|
||||
Work_Order_Services('UpdateReleasedQty', WONo)
|
||||
end
|
||||
|
||||
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
|
||||
If CurrWaferCount EQ 0 then
|
||||
// This should catch cases where the entire cassette is "peeled off", NCR'ed, or used for destructive testing.
|
||||
|
Reference in New Issue
Block a user