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:
Stieber Daniel (CSC FI SPS MESLEO)
2025-07-23 15:40:25 +00:00
parent 84da66ccd5
commit de2e6af5f7
26 changed files with 53999 additions and 14791 deletions

View File

@ -865,5 +865,3 @@ Restore_System_Variables:
@FILE.ERROR = OrigFileError
return

View File

@ -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

View File

@ -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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -1614,5 +1614,3 @@ end service
// Internal GoSubs
//----------------------------------------------------------------------------------------------------------------------

View File

@ -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

View File

@ -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')

View File

@ -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

View File

@ -5581,5 +5581,3 @@ ExpCOA:
RETURN

View File

@ -986,4 +986,3 @@ Restore_System_Variables:
return

View File

@ -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

View File

@ -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

View File

@ -248,4 +248,3 @@ Restore_System_Variables:
return

View File

@ -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

View File

@ -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.