Modified WM_IN ZPL label generation to include a 2D datamatrix

barcode. Implemented 2D barcode verification in PTI and FQA Label Check
Operations.

Bug fixes

Changed WMI 2D barcode to have 8 fields to keep code base simpler

minor changes to error message verbiage

Refactored code to use post log. Refactored code to not use multiple returns. Modfield input form fields to force upper case only.

changed LSL password verification to be case insensitive to avoid barcode scanning issues when caps lock is on

temporary change to allow 1D WMI scans at PTI while we exhaust current supply
This commit is contained in:
Infineon\Mitchem
2025-05-28 12:58:56 -07:00
committed by Stieber Daniel (CSC FI SPS MESLEO)
parent 2f6b376ece
commit b2c9e500f8
16 changed files with 5621 additions and 2639 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -572,7 +572,7 @@
"<3,8>": "28",
"<3,9>": "",
"<3,10>": {
"<3,10,1>": "0x5E000080",
"<3,10,1>": "0x5E000088",
"<3,10,2>": "0x200"
},
"<3,11>": {
@ -739,7 +739,7 @@
"<4,8>": "28",
"<4,9>": "",
"<4,10>": {
"<4,10,1>": "0x5E000080",
"<4,10,1>": "0x5E000088",
"<4,10,2>": "0x200"
},
"<4,11>": {

View File

@ -9,7 +9,7 @@
"<2>": "-2",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -76,11 +76,21 @@
"<28>": "",
"<29>": "0",
"<30>": "0",
"<31>": "0",
"<31>": "1",
"<32>": "0",
"<33>": "0",
"<34>": "16777215",
"<35>": "16777215"
"<34>": "-2",
"<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-2",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -84,11 +84,21 @@
"<28>": "",
"<29>": "0",
"<30>": "0",
"<31>": "0",
"<31>": "1",
"<32>": "0",
"<33>": "0",
"<34>": "16777215",
"<35>": "16777215"
"<34>": "-2",
"<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-2",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "MS Sans Serif",
@ -93,8 +93,21 @@
"<28>": "",
"<29>": "0",
"<30>": "0",
"<31>": "0",
"<32>": "0"
"<31>": "1",
"<32>": "0",
"<33>": "0",
"<34>": "-2",
"<35>": "-2",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -62,11 +62,8 @@ Options SCAN_TYPES_PTO = 'LABEL1', 'LABEL2'
//----------------------------------------------------------------------------------------------------------------------
Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Param3)
ErrorMsg = ''
If (ScanData NE '') then
// Code 3of9 encodes the asterisk and underscore characters. These need to be decoded.
//ScanData = Scan_Services('DecodeScanData', ScanData)
If Error_Services('NoError') then
ColumnIndex = ''
ColumnValue = ''
@ -91,25 +88,31 @@ Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
ValidLot = Rds_Services('IsValidSubLot', CassetteID, RDSType, ScanSubLot)
If ValidLot NE True$ then
// Add error to error stack
ErrorMessage = 'Invalid Supplier Lot: ':ScanData
Error_Services('Add', ErrorMessage)
ErrorMsg = 'Invalid Supplier Lot: ':ScanData
end
If Error_Services('NoError') then
Response = ScanSubLot
end
If ErrorMsg EQ '' then Response = ScanSubLot
Case ScanType EQ 'CASSETTE1'
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
If ScanData[1, 2] EQ '1T' then
ScanData[1, 2] = ''
end else If ScanData[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
ScanData[1,1] = ''
DelimCount = DCount(ScanData, '|')
Begin Case
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
SeqNo = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
CassetteID = ScanData
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
@ -119,20 +122,14 @@ Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
WOMatKey = Xlate('RDS', CassetteID, 'WO_MAT_KEY', 'X')
end
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType )
If RDSType EQ 'EPP' then
LotDesc = 'EPP Lot '
end else
LotDesc = 'RDS Number '
end
If ValidCassetteID EQ True$ then
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
Error_Services('Add', LotDesc:'Mismatch: ':CassetteID: ' does not match ': Param1)
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Param1
end
If ErrorMsg EQ '' then
// Check if FQA is signed
FQASigned = ''
WorkOrdNo = Field(WOMatKey, '*', 1)
@ -148,31 +145,78 @@ Service ProcessFQAScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
FQASigned = Signature_Services('CheckSignature', WOMatKey, QAStage)
IF NOT(FQASigned) THEN
Error_Services('Add', 'FQA not signed for ':LotDesc:CassetteID: '!')
END
end else
Error_Services('Add', 'Invalid ':LotDesc:CassetteID)
If NOT(FQASigned) then ErrorMsg = 'FQA not signed for ':CassetteID:'!'
end
If Error_Services('NoError') then
Response = CassetteID
end else
ErrorMsg = 'Invalid Lot ID ':CassetteID
end
If ErrorMsg EQ '' then
Response = ''
Response<1> = CassetteID
Response<2> = SeqNo
end
end
Case ScanType EQ 'CASSETTE2'
Response = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE1', Param1)
Response = ScanData
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
Cassette1ID = Param1
Seq1No = Param2
DelimCount = DCount(ScanData, '|')
Begin Case
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
Seq2No = Field(ScanData, '|', 8)
End Case
end
end else
Error_Services('Add', 'ScanData argument was missing in the ' : Service : ' service.')
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType )
If ValidCassetteID EQ True$ then
If Cassette1ID NE '' AND (CassetteID NE Cassette1ID) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Cassette1ID
end
If Seq1No EQ Seq2No then
ErrorMsg = 'FQA Label verification failed due':CRLF$:'to operator double-scanning barcode.'
end
end else
ErrorMsg = 'Invalid RDS Number: ':CassetteID
end
If ErrorMsg EQ '' then Response = CassetteID
end
End Case
end else
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessPTIScanData
//
@ -183,11 +227,8 @@ end service
//----------------------------------------------------------------------------------------------------------------------
Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Param3)
ErrorMsg = ''
If (ScanData NE '') then
// Code 3of9 encodes the asterisk and underscore characters. These need to be decoded.
//ScanData = Scan_Services('DecodeScanData', ScanData)
If Error_Services('NoError') then
ColumnIndex = ''
ColumnValue = ''
@ -198,39 +239,48 @@ Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
Begin Case
Case ScanType EQ 'SUPPLIER'
ValidLot = False$
If ScanData[1, 2] EQ '2T' OR ScanData[1,2] EQ '1T' then ScanData[1, 2] = ''
ScanSubLot = ScanData
CassetteID = Param1
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidLot = Rds_Services('IsValidSubLot', CassetteID, RDSType, ScanSubLot)
If ValidLot NE True$ then
// Add error to error stack
ErrorMessage = 'Invalid Supplier Lot: ':ScanData
Error_Services('Add', ErrorMessage)
end
If Error_Services('NoError') then
Response = ScanSubLot
end
If ValidLot NE True$ then ErrorMsg = 'Invalid Supplier Lot: ':ScanData
If ErrorMsg EQ '' then Response = ScanSubLot
Case ScanType EQ 'CASSETTE1'
debug
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
If ScanData[1, 2] EQ '1T' then
ScanData[1, 2] = ''
end else If ScanData[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
ScanData[1,1] = ''
end
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
DelimCount = DCount(ScanData, '|')
Begin Case
Case (ScanData[1, 1] EQ 'I')
! Temporary exception while we exhaust current WMI inventory on KIT racks that
! do not have a 2D barcode.
CassetteID = ScanData
SeqNo = 'SEQ1'
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
SeqNo = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
@ -238,37 +288,87 @@ Service ProcessPTIScanData(ScanData, ScanType = SCAN_TYPES, Param1, Param2, Para
RDSType = 'SIC'
end
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType)
If ValidCassetteID EQ True$ then
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
Error_Services('Add', 'RDS Mismatch: ':CassetteID: ' does not match ': Param1)
If Param1 NE '' AND (ScanData NE Param1) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Param1
end
end else
Error_Services('Add', 'Invalid RDS Number: ':CassetteID)
ErrorMsg = 'Invalid Cassette Number: ':CassetteID
end
If Error_Services('NoError') then
Response = CassetteID
If ErrorMsg EQ '' then
Response = ''
Response<1> = CassetteID
Response<2> = SeqNo
end
end
Case ScanType EQ 'CASSETTE2'
Response = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE1', Param1)
Response = ScanData
// Assume this is intended to be a Cassette ID scan (either WMO or RDS). Only if this is a
// non-existent carrier will the scan data be considered invalid.
// Strip '1T', 'I', and 'O' prefixes.
ValidCassetteID = False$ ; // Assume Cassette ID is not valid for now.
Cassette1ID = Param1
Seq1No = Param2
DelimCount = DCount(ScanData, '|')
Begin Case
Case (ScanData[1, 1] EQ 'I')
! Temporary exception while we exhaust current WMI inventory on KIT racks that
! do not have a 2D barcode.
CassetteID = ScanData
Seq2No = 'SEQ2'
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 1] EQ 'O') )
ErrorMsg = '1D Lot Label Scanned. 2D Lot Label Required.'
Case (DelimCount NE 8)
ErrorMsg = 'Invalid Lot Label Scan.'
Case Otherwise$
CassetteID = Field(ScanData, '|', 3)
Seq2No = Field(ScanData, '|', 8)
End Case
If ErrorMsg EQ '' then
If CassetteID[1, 2] EQ '1T' then
CassetteID[1, 2] = ''
end else If CassetteID[1,1] EQ 'I' OR CassetteID[1,1] EQ 'O' then
CassetteID[1,1] = ''
end
If INDEX(CassetteID,'.',2) then
RDSType = 'EPP'
end else
RDSType = 'SIC'
end
ValidCassetteID = Rds_Services('IsValidRDS', CassetteID, RDSType)
If ValidCassetteID EQ True$ then
If Cassette1ID NE '' AND (CassetteID NE Cassette1ID) then ;*Cassette2 Scan
ErrorMsg = 'Lot Label Mismatch: ':CassetteID: ' does not match ': Cassette1ID
end
If Seq1No EQ Seq2No then
ErrorMsg = 'PTI Label verification failed due':CRLF$:'to operator double-scanning barcode.'
end
end else
ErrorMsg = 'Invalid Cassette Number: ':CassetteID
end
If ErrorMsg EQ '' then Response = CassetteID
end
End Case
end
end else
Error_Services('Add', 'ScanData argument was missing in the ' : Service : ' service.')
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
//to do before release of ProcessPTOScanData
//1. prerequisite - waiting on newly printed (on/after 10/18/21) labels to make their way through warehouse, though not critical
//2. showstopper - need barcode scanners to be able to scan 2D barcodes - currently only 1 such scanner (purchased for shipping but not deployed, given to Cheryl)
//3. fix prod print routine to use SRP GetPrinter methods similar to what the Test_Print_SAP_Cass_Ship_Label does
//----------------------------------------------------------------------------------------------------------------------
// ProcessPTOScanData
//
@ -282,11 +382,10 @@ end service
//----------------------------------------------------------------------------------------------------------------------
Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
ErrorMsg = ''
Location = 'PTO Mat'
If (ScanData NE '') then
If Error_Services('NoError') then
ColumnIndex = ''
ColumnValue = ''
Cassette1 = ''
@ -295,7 +394,7 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
Begin Case
Case ScanType EQ 'LABEL1'
//determine whether regular NEPP or EPP label scan
// Determine whether regular NEPP or EPP label scan
// NEPP should be data matrix scan and have 7 parts, RDS_No is the 3rd
// EPP is 1D scan and will have the WMO number (e.g. 170369*1*48)
// This should be a multi-part 2D datamatrix scan, so there should be a long string separated by pipe symbols.
@ -303,18 +402,16 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
// and b) is currently is the proper state to do PTO transaction.
// Strip any standardized prefixes (e.g. '1T', '2T', etc.) as necessary
// data from Label1 should have 8 parts (no matter type - Si or EPP), we're looking for the 3rd
// Data from Label1 should have 8 parts (no matter type - Si or EPP), we're looking for the 3rd
cnt = DCount(ScanData, '|')
if cnt NE 8 then
Cassette1 = 0
Error_Services('Add', 'Invalid Lot Label Scan.')
return
ErrorMsg = 'Invalid Lot Label Scan.'
end else
//RDS should be 3rd position
Cassette1 = Field(ScanData, '|', 3)
end
//strip the prefix encoding
If ErrorMsg EQ '' then
// Strip the prefix encoding
If Cassette1[1, 2] EQ '1T' OR Cassette1[1, 2] EQ '2T' then
Cassette1[1, 2] = ''
end else If Cassette1[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
@ -352,18 +449,16 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
If Rds_Services('IsPackaged', Cassette1, RDSType) EQ True$ then
ValidCassette1 = True$
end else
Error_Services('Add', RDSType: ' RDS ':testCass1: ' has not completed packaging.')
return
ErrorMsg = RDSType: ' RDS ':testCass1: ' has not completed packaging.'
end
end else
Error_Services('Add', RDSType: ' RDS ':testCass1: ' is currently on hold.')
return
ErrorMsg = RDSType: ' RDS ':testCass1: ' is currently on hold.'
end
end else
Error_Services('Add', RDSType: ' RDS ' : testCass1 : ' is an invalid RDS number.')
return
ErrorMsg = RDSType: ' RDS ' : testCass1 : ' is an invalid RDS number.'
end
If ErrorMsg EQ '' then
LastPTO = obj_WO_Mat('OutofPTO',WOMatKey)
StepNo = 1
IF LastPTO THEN
@ -374,27 +469,26 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
OK = Msg(@WINDOW, '','YESNO','',MsgHead:@FM:MsgText)
IF NOT(OK) THEN
Error_Services('Add', 'Scan Cancelled')
RETURN
ErrorMsg = 'Scan Cancelled'
END else
Print_SAP_Cass_Ship_Label(WONo,StepNo,CassNo,Cassette1, RDSType)
end
end else
Print_SAP_Cass_Ship_Label(WONo,StepNo,CassNo,Cassette1, RDSType)
END
end
If ErrorMsg EQ '' then
If ValidCassette1 EQ True$ then
If Param1 NE '' AND ScanData NE Param1 then ;*Cassette2 Scan
Error_Services('Add', 'RDS Mismatch: ':Cassette1: ' does not match ': Param1)
return
ErrorMsg = 'RDS Mismatch: ':Cassette1: ' does not match ': Param1
end
end else
Error_Services('Add', 'Invalid RDS Number: ':Cassette1)
return
ErrorMsg = 'Invalid RDS Number: ':Cassette1
end
If Error_Services('NoError') then
Response = Cassette1
If ErrorMsg EQ '' then Response = Cassette1
end
end
end
Case ScanType EQ 'LABEL2'
@ -403,14 +497,15 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
// Tower is customer and RDS should be 2nd position
Cassette2 = Field(ScanData, ';', 2)
end else if cnt EQ 10 then
//all other customers and RDS should be 3rd position
// All other customers and RDS should be 3rd position
Cassette2 = Field(ScanData, ';', 3)
end else
Error_Services('Add', 'Invalid Shipping Label Scan.')
return
ErrorMsg = 'Invalid Shipping Label Scan.'
end
//strip the prefix encoding
If ErrorMsg EQ '' then
// Strip the prefix encoding
If Cassette2[1, 2] EQ '1T' OR Cassette2[1, 2] EQ '2T' then
Cassette2[1, 2] = ''
end else If Cassette2[1,1] EQ 'I' OR ScanData[1,1] EQ 'O' then
@ -427,29 +522,25 @@ Service ProcessPTOScanData(ScanData, ScanType = SCAN_TYPES_PTO, Param1, Param2)
: 'RDS Label #2: ':testCass2:CRLF$
ScanMismatch = True$
gosub ToggleLotHold
Error_Services('Add', ErrorMsg)
return
GoSub ToggleLotHold
end
If Error_Services('NoError') then
Response = Cassette2
If ErrorMsg EQ '' then Response = Cassette2
end
End Case
end
end else
Error_Services('Add', 'ScanData argument was missing in the ' : Service : ' service.')
ErrorMsg = 'ScanData argument was missing in the ' : Service : ' service.'
end
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
end service
Service SaveRecord(CassetteID, Warehouse, Location, OperatorID)
* Write success record in Material Log
// Write success record in Material Log
RDSKey = CassetteID
WMOKey = CassetteID
Convert '.' to '*' in WMOKey
@ -504,40 +595,33 @@ Service SaveRecord(CassetteID, Warehouse, Location, OperatorID)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
* aiParms = 'WO_MAT':@RM:WONo:@RM:CassNo:@RM:WhCd:'*':LocCd:@RM:Action:@RM:InvDTM:@RM:UserID:@RM:Tag:@RM:ToolID
* obj_WO_Mat('AddInvTrans', aiParms)
IF Get_Status(errCode) THEN
swap @SVM with CRLF$ in errCode
ErrorMsg = 'Errors calling obj_WO_Mat_Log("Create"). Error code: ':errCode:', Len(errCode)=':Len(errCode):'. FI has been notified.'
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Errors calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Error_Services('Add', ErrorMsg)
if LEN(errCode) > 5 then
Gosub SendErrorNotification
end
end
end
end service
SendErrorNotification:
Recipients = XLATE('NOTIFICATION','FI_SUPPORT',NOTIFICATION_USER_ID$,'X')
Recipients = ''
SentFrom = 'MATERIAL_MOVEMENT_SERVICES'
Subject = 'ERROR CALLING OBJ_WO_MAT '
Message = 'Error occured while attempting to write WO_MAT_LOG at ':Location:' Scan':CRLF$:ErrorMsg
AttachKey = WoMatKey
AttachWindow = ''
SendToGroup = ''
SendToGroup = 'FI_SUPPORT'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
return
ToggleLotHold:
If ScanMismatch EQ True$ then
@ -578,22 +662,26 @@ ToggleLotHold:
// To do: Throw Error
End Case
Convert '*' to '.' in Cassette1
HoldEntityID = Cassette1
// Manually add work order material log entry
WOMatKey = WONo:'*':CassNo
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
NumTimestamps = Dcount(WOMatRec<WO_MAT_INV_WH$>, @VM)
NewEntryPos = NumTimestamps + 1
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_WH$, NewEntryPos, 0, WhCd)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_LOCATION$, NewEntryPos, 0, LocCd)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_ACTION$, NewEntryPos, 0, Action)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_DTM$, NewEntryPos, 0, LogDTM)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_USER$, NewEntryPos, 0, UserID)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TAG$, NewEntryPos, 0, Tags)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TOOL_ID$, NewEntryPos, 0, ToolID)
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
WOMLParms = LogFile:@RM
WOMLParms := LogDTM:@RM
WOMLParms := Action:@RM
WOMLParms := WhCd:@RM
WOMLParms := LocCd:@RM
WOMLParms := WONo:@RM
WOMLParms := CassNo:@RM
WOMLParms := UserID:@RM
WOMLParms := Tags:@RM
WOMLParms := ToolID
Set_Status(0)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Gosub SendErrorNotification
end
// Place first cassette on hold
WOMatKey = WONo:'*':CassNo
@ -637,24 +725,26 @@ ToggleLotHold:
ToolID = ''
HoldEntityID = Cassette2
// Manually add work order material log entry
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
NumTimestamps = Dcount(WOMatRec<WO_MAT_INV_WH$>, @VM)
NewEntryPos = NumTimestamps + 1
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_WH$, NewEntryPos, 0, WhCd)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_LOCATION$, NewEntryPos, 0, LocCd)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_ACTION$, NewEntryPos, 0, Action)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_DTM$, NewEntryPos, 0, LogDTM)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_USER$, NewEntryPos, 0, UserID)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TAG$, NewEntryPos, 0, Tags)
WOMatRec = INSERT(WOMatRec, WO_MAT_INV_TOOL_ID$, NewEntryPos, 0, ToolID)
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
//pause before putting second cassette on hold
WOMLParms = LogFile:@RM
WOMLParms := LogDTM:@RM
WOMLParms := Action:@RM
WOMLParms := WhCd:@RM
WOMLParms := LocCd:@RM
WOMLParms := WONo:@RM
WOMLParms := CassNo:@RM
WOMLParms := UserID:@RM
WOMLParms := Tags:@RM
WOMLParms := ToolID
Set_Status(0)
errCode = ''
obj_WO_Mat_Log('Create',WOMLParms)
If Get_Status(errCode) then
Swap @SVM with CRLF$ in errCode
ErrorMsg = 'Error calling obj_WO_Mat_Log("Create"). Error code: ':errCode
Gosub SendErrorNotification
end
// Place second cassette on hold
WOMatKey = WONo:'*':CassNo
CtrlEntID = False$ ;* Control checked/unchecked
OriginFlag = 'PTO' ;* Flag to indicate a hold initiated from the packaging form
@ -662,7 +752,8 @@ ToggleLotHold:
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEntID, OriginFlag, '', OperatorID)
end
gosub SendPTOMismatchNotification
GoSub SendPTOMismatchNotification
errCode = ''
IF Get_Status(errCode) THEN Error_Services('Add', 'Error code ':errCode:' in ':Service:' service.')
Error_Services('Add', 'Cassette scans did not match! Both cassettes placed on hold - Supervisor, Lead, or Engineering disposition required.')
@ -671,6 +762,7 @@ ToggleLotHold:
return
SendPTOMismatchNotification:
// Send scan mismatch notification

View File

@ -48,8 +48,6 @@ Declare subroutine Obj_Wo_Mat_Log, Errmsg, Utility, SRP_Show_Window, Material_Mo
Declare function Get_Property, Send_Message, SendMessage, Material_Movement_Services, Error_Services,
Declare function Popup, obj_WO_Mat, Database_Services, Utility, Rds_Services, Message_Box
*Subclass = @Window : '.OLE_SUBCLASS'
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then
Transfer Event to OIEvent
@ -69,7 +67,6 @@ end
Return EventFlow or 1
*global
ScanField = ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -78,27 +75,18 @@ ScanField = ''
Event WINDOW.CREATE(CreateParam)
* CurrVer = Xlate('APP_INFO', 'LSL2_VERSION', '', 'X')
* UserVer = Xlate('LSL_USERS', @User4, 'LSL2_VERSION', 'X')
* If UserVer NE CurrVer then
* // Error message and close form
* ErrMsg = 'OpenInsight Version Error':@FM:'You are running an outdated version of OpenInsight and cannot release material until you restart your session.'
* Msg(@Window, '', 'OK', '', ErrMsg)
* Post_Event(@Window, 'CLOSE')
* end else
GoSub SetupOLEControls
GoSub ResetForm
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
MsgStruct = ''
MsgStruct<MTEXTWIDTH$> = MSG_WIDTH$
* end
end event
Event OLE_BTN_CLEAR.OnClick(Point, Button, Shift, Ctrl)
*get count of unprocessed records
*get count of unprocessed records
allCompleted = True$
resp = ''
Data = Get_Property(EditTable$, "OLE.ARRAY")
@ -120,10 +108,12 @@ Event OLE_BTN_CLEAR.OnClick(Point, Button, Shift, Ctrl)
GoSub ResetForm
end
end
end event
Event OLE_BTN_SAVE.OnClick(Point, Button, Shift, Ctrl)
*check for unfinished scan
F1 = Get_Property(Cassette1$, 'TEXT')
F2 = Get_Property(Cassette2$, 'TEXT')
@ -137,17 +127,22 @@ Event OLE_BTN_SAVE.OnClick(Point, Button, Shift, Ctrl)
Location = 'PTI'
Gosub SaveRecords
end
end event
Event EDL_CASSETTE1_SCAN.LOSTFOCUS(Flag, FocusID)
ScanField = 'Cassette1'
If Flag EQ 1 then
ScanData = Get_Property(CtrlEntID, 'TEXT')
If ScanData NE '' then
ScanData = Material_Movement_Services('ProcessFQAScanData', ScanData, 'CASSETTE1')
If Error_Services('NoError') then
Set_Property(CtrlEntID, 'TEXT', ScanData)
RDSNo = ScanData<1>
SeqNo = ScanData<2>
Set_Property(Cassette1$, '@SEQNO', SeqNo)
Set_Property(CtrlEntID, 'TEXT', RDSNo)
Set_Property(Cassette2$, 'ENABLED', True$)
Set_Property(Cassette2$, 'FOCUS', True$)
Set_Property(CtrlEntID, 'ENABLED', False$)
@ -159,23 +154,25 @@ Event EDL_CASSETTE1_SCAN.LOSTFOCUS(Flag, FocusID)
end
end
end
end event
Event EDL_CASSETTE2_SCAN.LOSTFOCUS(Flag, FocusID)
ScanField = 'Cassette2'
If Flag EQ 1 then
ScanData = Get_Property(CtrlEntID, 'TEXT')
Cass1 = Get_Property(Cassette1$, 'TEXT')
Seq1No = Get_Property(Cassette1$, '@SEQNO')
retVal = Set_Property(@window, '@IsEpp', False$)
If ScanData[1,1] = 'O' OR ScanData[1,3] = '1TO' then
If Index(ScanData, '.', 1) then
retVal = Set_Property(@window, '@IsEpp', True$)
end
If ScanData NE '' then
ScanData = Material_Movement_Services('ProcessFQAScanData', ScanData, 'CASSETTE2', Cass1)
ScanData = Material_Movement_Services('ProcessFQAScanData', ScanData, 'CASSETTE2', Cass1, Seq1No)
If Error_Services('NoError') then
* IF EPP, prepopulate lot and just validate
If Get_Property(@window, '@IsEpp') EQ True$ then
Set_Property(CtrlEntID, 'TEXT', ScanData)
Set_Property(Supplier$, 'TEXT', 'EpiPRO')
@ -198,10 +195,12 @@ Event EDL_CASSETTE2_SCAN.LOSTFOCUS(Flag, FocusID)
end
end
end
end event
Event EDL_SUPPLIER_SCAN.LOSTFOCUS(Flag, FocusID)
ScanField = 'Lot'
If Flag EQ 1 then
Cassette1 = Get_Property(Cassette1$, 'TEXT')
@ -219,6 +218,7 @@ Event EDL_SUPPLIER_SCAN.LOSTFOCUS(Flag, FocusID)
end
end
end
end event
@ -227,6 +227,7 @@ end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SaveRecords:
*iterate thround all records in the grid, saving them and updating the status and location
Data = Get_Property(EditTable$, "OLE.ARRAY")
cnt = count(Data<1>, @VM) + (Data<1># '')
@ -274,6 +275,7 @@ return
ValidateGrid:
F1 = Get_Property(Cassette1$, 'TEXT')
F2 = Get_Property(Cassette2$, 'TEXT')
F3 = Get_Property(Supplier$, 'TEXT')
@ -285,11 +287,6 @@ ValidateGrid:
result = 1
end
end
* if ScanField = 'Lot' then ; * do not look for duplicates
* result = 0
* end else
* result = InList(Data, ScanData, @VM) OR InList(Data, ScanData, @FM)
* end
If INDEX(F1,'.',2) then
RDSType = 'EPP'
@ -346,12 +343,14 @@ return
DisableFormControls:
Set_Property(@Window:'.EDL_CASSETTE1_SCAN', 'TEXT', '')
Set_Property(@Window:'.EDL_CASSETTE2_SCAN', 'TEXT', '')
Set_Property(@Window:'.EDL_SUPPLIER_SCAN', 'TEXT', '')
Set_Property(@Window:'.EDL_CASSETTE1_SCAN', 'ENABLED', False$)
Set_Property(@Window:'.EDL_CASSETTE2_SCAN', 'ENABLED', False$)
Set_Property(@Window:'.EDL_SUPPLIER_SCAN', 'ENABLED', False$)
return
@ -396,6 +395,8 @@ SetupOLEControls:
SelStyleArray = 'Black' : @VM : OI_HOT_BLUE$ : ' L=70' : @FM : 'Black' : @VM : OI_HOT_BLUE$
Set_Property(EditTable$, 'OLE.SelectionStyle', SelStyleArray) ; // Automatically highlight the current row with one color and highlight the current row with another color.
Set_Property(@Window:'.OLE_BTN_CLEAR', 'OLE.Style', 'STD')
return
@ -414,5 +415,7 @@ ResetForm:
cnt = count(Data<1>, @VM) + (Data<1># '')
Set_Property(@Window:'.OLE_BTN_SAVE', 'ENABLED', cnt GE 1)
Set_Property(EditTable$, 'OLE.CellColors[ALL;All]', 'Auto':@FM:'Auto')
Set_Property(Cassette1$, '@SEQNO', '')
return

View File

@ -48,8 +48,6 @@ Declare subroutine Obj_Wo_Mat_Log, Errmsg, Utility, SRP_Show_Window, Material_Mo
Declare function Get_Property, Send_Message, SendMessage, Material_Movement_Services, Error_Services,
Declare function Popup, obj_WO_Mat, Database_Services, Utility, Rds_Services, Message_Box
*Subclass = @Window : '.OLE_SUBCLASS'
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then
Transfer Event to OIEvent
@ -69,7 +67,6 @@ end
Return EventFlow or 1
*global
ScanField = ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -151,7 +148,10 @@ Event EDL_CASSETTE1_SCAN.LOSTFOCUS(Flag, FocusID)
If ScanData NE '' then
ScanData = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE1')
If Error_Services('NoError') then
Set_Property(CtrlEntID, 'TEXT', ScanData)
RDSNo = ScanData<1>
SeqNo = ScanData<2>
Set_Property(Cassette1$, '@SEQNO', SeqNo)
Set_Property(CtrlEntID, 'TEXT', RDSNo)
Set_Property(Cassette2$, 'ENABLED', True$)
Set_Property(Cassette2$, 'FOCUS', True$)
Set_Property(CtrlEntID, 'ENABLED', False$)
@ -174,8 +174,9 @@ Event EDL_CASSETTE2_SCAN.LOSTFOCUS(Flag, FocusID)
If Flag EQ 1 then
ScanData = Get_Property(CtrlEntID, 'TEXT')
Cass1 = Get_Property(Cassette1$, 'TEXT')
Seq1No = Get_Property(Cassette1$, '@SEQNO')
If ScanData NE '' then
ScanData = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE2', Cass1)
ScanData = Material_Movement_Services('ProcessPTIScanData', ScanData, 'CASSETTE2', Cass1, Seq1No)
If Error_Services('NoError') then
Set_Property(CtrlEntID, 'TEXT', ScanData)
Gosub ValidateGrid
@ -379,6 +380,9 @@ SetupOLEControls:
SelStyleArray = 'Black' : @VM : OI_HOT_BLUE$ : ' L=70' : @FM : 'Black' : @VM : OI_HOT_BLUE$
Set_Property(EditTable$, 'OLE.SelectionStyle', SelStyleArray) ; // Automatically highlight the current row with one color and highlight the current row with another color.
Set_Property(@Window:'.OLE_BTN_CLEAR', 'OLE.Style', 'STD')
Set_Property(@Window:'.OLE_BTN_SAVE', 'OLE.Style', 'STD')
return

View File

@ -15,6 +15,7 @@ $INSERT EPI_PART_EQUATES
$INSERT COMPANY_EQUATES
$INSERT CUST_EPI_PART_EQUATES
$INSERT PRS_STAGE_EQUATES
$INSERT UNIT_EQUATES
DECLARE FUNCTION FIELDCOUNT, MSG, Key_Sort, Get_Printer, SRP_Math, Set_Printer, Utility, obj_Install, Printer_Select, obj_Vendor_Code, Direct_Print, Environment_Services
DECLARE SUBROUTINE Extract_Si_Keys, Update_Index, ErrMsg
@ -48,6 +49,8 @@ EQU PS$RECIPE TO 3
EQU PS$FREQ TO 4
EQU PS$PATTERN TO 11
Main:
IF NOT(ASSIGNED(RdsIds)) THEN RdsIds = '' ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
IF NOT(ASSIGNED(MultiStep)) THEN MultiStep = '' ;* 5/21/2005 - JCH - Added for Order Entry/Vision upgrade
@ -77,7 +80,7 @@ If PrintPath NE '' then
stat = Direct_Print('START', PrintPath<1>, '', '')
end
IF stat < 0 THEN GOTO OIPrint_Error
IF stat GE 0 THEN
EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch
@ -158,9 +161,17 @@ If PrintPath NE '' then
CustNo = XLATE('WO_LOG',WONo,WO_LOG_CUST_NO$,'X')
Void = UTILITY( 'CURSOR', 'A' )
END
end
GoSub EndPrint
end
RETURN
* * * * * *
OIPrint_Error:
EndPrint:
* * * * * *
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
@ -168,9 +179,9 @@ If PrintPath NE '' then
end else
stat = Direct_Print('STOP')
end
end
RETURN
return
* * * * * * * * * * * * Local Subroutines * * * * * * * * * * * *
@ -246,9 +257,7 @@ PrintCleanRoomLabels:
PSNIds = XLATE( 'RDS', RdsIds, rds_prod_spec_id$, 'X' )
SpecType = OCONV( XLATE( 'RDS', RdsIds, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
SubPartNum = XLATE( 'RDS', RdsIds, 'SUB_PART_NUM', 'X' )
RecipeInfo = XLATE( 'RECIPE', RecipeIDS, 'RECIPE_NAME_NO', 'X' )
ThickVar = XLATE( 'PROD_SPEC', PSNIds, 'THICK_MEASURE_L1', 'X' )
ResVar = XLATE( 'PROD_SPEC', PSNIds, 'RES_MEASURE_L1', 'X' )
ConVar = XLATE( 'PROD_SPEC', PSNIds, 'CON_MEASURE_L1', 'X' )
@ -618,16 +627,16 @@ PrintCleanRoomLabels:
END
swap '~' with fmt( ' ', 'L#2' ) in PrintThickPrintVar
swap 'æm' with 'um' in PrintThickTargets
swap 'ê-cm' with 'ohm.cm' in PrintThickTargets
swap 'ê/Ü' with 'ohm/sq' in PrintThickTargets
swap '' with 'A' in PrintThickTargets
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
swap UNIT_A$ with 'A' in PrintThickTargets
swap '~' with fmt( ' ', 'L#2' ) in PrintResPrintVar
swap 'æm' with 'um' in PrintResTargets
swap 'ê-cm' with 'ohm.cm' in PrintResTargets
swap 'ê/Ü' with 'ohm/sq' in PrintResTargets
swap '' with 'A' in PrintResTargets
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
swap UNIT_A$ with 'A' in PrintResTargets
//only print cheat sheet label on cassette #1
IF CassNo EQ 1 then
@ -644,6 +653,7 @@ RETURN
* * * * * * *
PrintLabel:
* * * * * * *
* Standard RDS Label print method
IF PrintSpecType EQ 'Production' THEN PrintSpecType = 'Prod'
IF PrintSpecType EQ 'Pre-Production' THEN PrintSpecType = 'Pre'
@ -659,7 +669,7 @@ PrintLabel:
PrintQARecipe = FIELD(PrintRecipe, @VM, 1)
PrintCompany = PrintCompany[1,32]
//looping instead of using ^PQ2 since I have to set sequential key in 2D barcode
// Looping instead of using ^PQ2 since I have to set sequential key in 2D barcode
Str = ''
For cnt = 1 to 2
@ -668,7 +678,7 @@ For cnt = 1 to 2
Str := '^PR1' ;* Print speed 2 inches per second
Str := '^LL406' ;* Label length @203 dpi
Str := '^PW900'
Str := '^MD0' ;* Media darkness
Str := '^MD5' ;* Media darkness
Str := '^MMT' ;* Media mode t=tear off mode
*Str := '^PQ2' ;* Print 2 labels for each pass through here
@ -783,7 +793,6 @@ PrintWOLabel:
END ELSE
Str:= '^FO70,30^A0220,210^FD':PrintUniqueWO:'^FS':CRLF$
END
CustName = XLATE( 'COMPANY', CustNo, 'ABBREV_OR_CO_NAME', 'X' )
@ -801,6 +810,7 @@ PrintWOLabel:
end else
stat = Direct_Print('PRINT', Str)
end
RETURN

View File

@ -14,10 +14,11 @@ $INSERT ORDER_EQU
$INSERT ORDER_DET_EQU
$INSERT WM_IN_EQUATES
$INSERT CUST_EPI_PART_EQUATES
$insert UNIT_EQUATES
DECLARE FUNCTION Msg, Get_Printer, Set_Printer, Utility, obj_Install, Printer_Select, FieldCount, Popup
DECLARE FUNCTION MemberOF, Direct_Print, Environment_Services
DECLARE SUBROUTINE Btree.Extract, ErrMsg
DECLARE SUBROUTINE Btree.Extract, ErrMsg, SRP_Set_Clipboard
* 5/18/2006 - Cloned from Print_Cass_Labels
@ -35,6 +36,8 @@ EQU PS$RECIPE TO 3
EQU PS$FREQ TO 4
EQU PS$PATTERN TO 11
Main:
IF NOT(ASSIGNED(WONo)) THEN RETURN
IF WONo = '' THEN RETURN
@ -61,7 +64,7 @@ end else
stat = Direct_Print('START', PrintPath<1>, '', '')
end
IF stat < 0 THEN GOTO OIPrint_Error
IF stat GE 0 THEN
CLOrientation = '' ;* used for printing on cleanroom labels
@ -77,6 +80,7 @@ IF WMInKeys = '' THEN RETURN
TypeOver = ''
TypeOver<PDISPLAY$> = WMInKeys
TypeOver<PTITLE$> = 'WM_IN - Inbound Cassettes'
TypeOver<PSHOWGAUGE$> = True$
WMInKeys = Popup(@WINDOW,TypeOver,'PRINT_WMI_LABELS')
CONVERT '.' TO '*' IN WMInKeys
@ -126,42 +130,30 @@ IF Captive THEN
NEXT I
END
EpiPartNo = WORec<WO_LOG_EPI_PART_NO$>
CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPartNo,'','X')
ShipBagReq = CustEpiPartRec<CUST_EPI_PART_SHIP_BAG_REQ$>
PreSurfscan = PSRec<PROD_SPEC_PRE_SURFSCAN$>
FirstSurfscan = PSRec<PROD_SPEC_FIRST_SURFSCAN$>
PostCleanSurfScan = PSRec<PROD_SPEC_POST_CLEAN_SURFSCAN$>
SubPreClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_PRE_CLEAN', 'X' )
SubPostClean = XLATE( 'PROD_SPEC', PSNo, 'SUB_POST_CLEAN', 'X' )
PreCleanTool = SubPreClean ;* Temporary for 2x4 -> 4x4 conversion
PostCleanTool = SubPostClean
PreAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'PRE_AKRION_RECIPE', 'X' )
PostAkrionRecipe = XLATE( 'PROD_SPEC', PSNo, 'POST_AKRION_RECIPE', 'X' )
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO_L1', 'X' )
RecipeName = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NAME_L1', 'X' )
SpecType = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SPEC_TYPE', 'X' ), '[SPEC_TYPE_CONV]' )
SubOxide = OCONV( XLATE( 'PROD_SPEC', PSNo, 'SUB_OXIDE_STRIP', 'X' ), 'B' )
ThickTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'THICK_TARGET_ALL', 'X' ), 'MD3' )
ResTarget = OCONV( XLATE( 'PROD_SPEC', PSNo, 'RES_TARGET_ALL', 'X' ), 'MD3' )
ThickUnit = XLATE( 'PROD_SPEC', PSNo, 'THICK_UNITS_ALL', 'X' )
ResUnit = XLATE( 'PROD_SPEC', PSNo , 'RES_UNITS_ALL', 'X' )
Dopant = XLATE( 'PROD_SPEC', PSNo, 'DOPANT_L1', 'X' )
RecipeNo = XLATE( 'PROD_SPEC', PSNo, 'RECIPE_NO', 'X' )
RecipeInfo = XLATE( 'RECIPE', RecipeNo, 'RECIPE_NAME_NO', 'X' )
CleaningReqs = ''
ThickCnt = FIELDCOUNT( ThickTarget<1>, @VM )
PrintThickTargets = ''
FOR J = 1 TO ThickCnt
@ -192,16 +184,15 @@ END
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
swap 'æm' with 'um' in PrintThickTargets
swap 'ê-cm' with 'ohm.cm' in PrintThickTargets
swap 'ê/Ü' with 'ohm/sq' in PrintThickTargets
swap '' with 'A' in PrintThickTargets
swap 'æm' with 'um' in PrintResTargets
swap 'ê-cm' with 'ohm.cm' in PrintResTargets
swap 'ê/Ü' with 'ohm/sq' in PrintResTargets
swap '' with 'A' in PrintResTargets
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
swap UNIT_A$ with 'A' in PrintThickTargets
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
swap UNIT_A$ with 'A' in PrintResTargets
WMIBoxCnt = COUNT( WMInKeys, @VM ) + (WMInKeys NE '')
@ -209,7 +200,6 @@ GOSUB PrintCleanRoomLabels
GOSUB PrintWOLabels ;* Activated WO label printing again -dkk 12/3/14
* Check to see if they get the monitor wafers based on the PSN
MonitorWafer = CustEpiPartRec<CUST_EPI_PART_MONITOR_WAFER_LABEL$>
@ -218,10 +208,8 @@ IF MonitorWafer THEN
GOSUB PrintMonitorLabels
END
* Check to see if they get a surfscan label
IF (CustNo = '6874') OR (CustNo = '6593') ELSE
IF ( PreSurfscan ) or ( FirstSurfscan ) or ( PostCleanSurfscan ) THEN
*GOSUB PrintSurfscanLabels
@ -229,9 +217,18 @@ IF (CustNo = '6874') OR (CustNo = '6593') ELSE
END
Void = UTILITY( 'CURSOR', 'A' )
end
GoSub EndPrint
Return
* * * * * * * * * * * * L o c a l S u b r o u t i n e s * * * * * * * * * * * *
* * * * * *
OIPrint_Error:
EndPrint:
* * * * * *
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
@ -240,20 +237,16 @@ end else
stat = Direct_Print('STOP')
end
RETURN
return
* * * * * * * * * * * *` L o c a l S u b r o u t i n e s * * * * * * * * * * * *
* * * * * * *
PrintCleanRoomLabels:
* * * * * * *
FOR I = 1 TO WMIBoxCnt
WMInKey = WMInKeys<1,I>
PrintWMInKey = WMInKey
CONVERT '*' TO '.' IN PrintWMInKey
@ -267,6 +260,7 @@ FOR I = 1 TO WMIBoxCnt
CustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
SubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
OrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
Vendor = WOMatRec<WO_MAT_SUB_VEND_CD$>
OrderDetKey = WORec<WO_LOG_ORDER_NO$>:'*':OrderItem
@ -298,15 +292,16 @@ RETURN
PrintLabel:
* * * * * * *
Str = ''
For cnt = 1 to 2
Str = '^XA'
Str := '^XA'
Str := '^LH0,0'
Str := '^PR2' ;* Print speed 2 inches per second
Str := '^LL406' ;* Label length @203 dpi
Str := '^PW900'
Str := '^MD15' ;* Media darkness
Str := '^MD8' ;* Media darkness
Str := '^MMT' ;* Media mode t=tear off mode
Str := '^PQ2' ;* Print 2 labels for each pass through here
Str := '^FO15,15^GB795,398,3,B^FS' ;* Border
@ -405,6 +400,7 @@ NEXT M
****** Separator bar
Str := '^FO15,373^GB795,1^FS'
****** Fourteenth Line
Str := '^FO30,385^AC,18^FDProd Spec No:^FS':CRLF$
Str := '^FO190,385^A0,25^FD':PSNo:'^FS':CRLF$
@ -418,8 +414,14 @@ end
Str := '^FO275,385^AC,18^FDSpec Type:^FS':CRLF$
Str := '^FO400,385^A0,25^FD':SpecType:'^FS':CRLF$
****** Data Matrix barcode
Str := '^FO720,280^CI28':CRLF$
Str := '^BXN,2,200^FDP':PartNo:'|S':SubPartNo:'|1T':PrintWMInKey:'|2T':LotNo:'|':PSNo:'|Q':WfrQty:'|1V':Vendor:'|SEQ':Cnt:'^FS':CRLF$
Str:= '^XZ'
Next
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
stat = Set_Printer('TEXT',Str)
end else
@ -901,8 +903,6 @@ end
RETURN
***************************************************
* * * * * * *
PrintWOLabels:
@ -951,7 +951,7 @@ PrintMonitorLabels:
* * * * * * *
FOR I = 1 TO WMIBoxCnt
RDSIds = ''
Str = '^XA^CFD'
Str := '^LH0,0'
Str := '^PR2' ;* Print speed 2 inches per second
@ -993,7 +993,6 @@ FOR I = 1 TO WMIBoxCnt
Str:= '^MD15' ;* Media darkness
Str:= '^MMT' ;* Media mode t=tear off mode
Str:= '^FO30,30^A060,40^FDSurfscan Required^FS'
*Str:= '^FO550,30^A060,40^FDRDS#':RDSIds<I>:'^FS'
IF PreSurfscan THEN
Str:= '^FO30,130^A060,40^FDPre Epi:^FS'
Str:= '^FO250,130^A060,40^FDDefects________^FS'
@ -1017,13 +1016,7 @@ FOR I = 1 TO WMIBoxCnt
stat = Direct_Print('PRINT', Str)
end
NEXT I
RETURN

View File

@ -28,6 +28,7 @@ $INSERT WM_OUT_EQUATES
$INSERT EPI_PART_EQUATES
$INSERT CUST_EPI_PART_EQUATES
$INSERT PRS_STAGE_EQUATES
$insert UNIT_EQUATES
DECLARE FUNCTION Msg, Get_Printer, Set_Printer, Utility, obj_Install, Printer_Select, FieldCount, Popup
DECLARE FUNCTION MemberOf, Direct_Print, Environment_Services
@ -41,6 +42,8 @@ EQU PI$WIDTH TO 5
EQU PI$HEIGHT TO 6
EQU PI$SIZE TO 7
Main:
IF NOT(ASSIGNED(WONo)) THEN RETURN
IF WONo = '' THEN RETURN
@ -67,16 +70,15 @@ end else
stat = Direct_Print('START', PrintPath<1>, '', '')
end
IF stat < 0 THEN GOTO OIPrint_Error
IF stat GE 0 THEN
CLOrientation = '' ;* used for printing on cleanroom labels
WMOutKeys = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_WM_OUT_KEYS$,'X')
TypeOver = ''
TypeOver<PDISPLAY$> = WMOutKeys
TypeOver<PTITLE$> = 'WM_OUT - Outbound Cassettes'
TypeOver<PSHOWGAUGE$> = True$
WMoutKeys = Popup(@WINDOW,TypeOver,'PRINT_WM_LABELS')
CONVERT '.' TO '*' IN WMOutKeys
@ -200,15 +202,15 @@ END
PrintCleaningReqs = TRIM( 'Strip:':SubOxide:' Pre:':SubPreClean:APreRec:' Post:':SubPostClean:APostRec )
swap 'æm' with 'um' in PrintThickTargets
swap 'ê-cm' with 'ohm.cm' in PrintThickTargets
swap 'ê/Ü' with 'ohm/sq' in PrintThickTargets
swap '' with 'A' in PrintThickTargets
swap UNIT_MICROMETER$ with 'um' in PrintThickTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintThickTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintThickTargets
swap UNIT_A$ with 'A' in PrintThickTargets
swap 'æm' with 'um' in PrintResTargets
swap 'ê-cm' with 'ohm.cm' in PrintResTargets
swap 'ê/Ü' with 'ohm/sq' in PrintResTargets
swap '' with 'A' in PrintResTargets
swap UNIT_MICROMETER$ with 'um' in PrintResTargets
swap UNIT_OHM_CM$ with 'ohm.cm' in PrintResTargets
swap UNIT_OHM_PER_SQ$ with 'ohm/sq' in PrintResTargets
swap UNIT_A$ with 'A' in PrintResTargets
WMOBoxCnt = COUNT( WMOutKeys, @VM ) + (WMOutKeys NE '')
@ -217,8 +219,15 @@ GOSUB PrintWOLabels ;* Activated WO label printing again -dkk 12/3/14
Void = UTILITY( 'CURSOR', 'A' )
end
GoSub EndPrint
return
* * * * * *
OIPrint_Error:
EndPrint:
* * * * * *
If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then
@ -469,3 +478,4 @@ end else
end
RETURN

View File

@ -62,7 +62,8 @@ Service AuthenticateLSLCredentials(LSLUsername, LSLPassword)
Response = False$
If ( (LSLUsername NE '') and (LSLPassword NE '') ) then
Convert @Lower_Case to @Upper.Case in LSLUsername
Convert @Lower_Case to @Upper_Case in LSLUsername
Convert @Lower_Case to @Upper_Case in LSLPassword
If RowExists('LSL_USERS', LSLUsername) then
Password = Xlate('LSL_USERS', LSLUsername, 'PASSWORD', 'X')
If LSLPassword EQ Password then
@ -313,67 +314,3 @@ Service GetLSLUser(Username)
end service
//----------------------------------------------------------------------------------------------------------------------
// VerifyUserSessions
//
//
//----------------------------------------------------------------------------------------------------------------------
Service VerifyUserSessions()
// Use MESSENGER as the recipient. It will process callback procedures.
Messaging_Services('SendMessage', 'GetLoggedInUsers', 'Request', 'MESSENGER', 'All', '', 'Procedure', 'Security_Services,UserSessionsListener,@MESSAGE,@ARGUMENTS')
end service
Service UserSessionsListener()
// Process message
// If user is running an old version of LSL, then send them a popup asking them to restart their session.
Transfer Param2 to SessionInfo
Station = SessionInfo<1, 2>
OIUserName = SessionInfo<2, 2>
SSOUserName = SessionInfo<3, 2>
ProcessID = SessionInfo<4, 2>
LSL2Version = SessionInfo<5, 2>
OCXVersion = SessionInfo<6, 2>
CurrLSL2Version = Database_Services('ReadDataRow', 'APP_INFO', 'LSL2_VERSION')
If ((LSL2Version NE '') and (LSL2Version NE CurrLSL2Version)) then
// Send a message to the user
Message = 'You are running an outdated version of LSL. Restart your application ASAP to pickup the latest code.'
Messaging_Services('SendMessage', 'SetPopupMessage', 'Request', '', Station, Message)
* If OIUserName EQ 'DANIEL_ST' then
* Messaging_Services('SendMessage', 'RunProcedure', 'Request', '', Station, 'SECURITY_SERVICES,REQUIREREAUTHENTICATION', '', '', '')
* end
end
end service
Service RequireReauthentication()
Authenticated = False$
If MemberOf(@USER4, 'OI_ADMIN') then
ParentForm = 'NDW_MAIN'
end else
ParentForm = 'LSL_MAIN2'
end
Loop
Response = Dialog_Box('NDW_VERIFY_USER', ParentForm, @USER4)
Authenticated = Response<1>
If Not(Authenticated) then
ErrorMessage = 'You must reauthenticate to continue running your old version of OpenInsight.'
rv = Msg('', '', 'OK', '', 'Authentication Required':@FM:ErrorMessage)
end
Until Authenticated
Repeat
end service

View File

@ -796,6 +796,7 @@ Service PrintLabels(WONo)
TypeOver<PDISPLAY$> = RDSNos
TypeOver<PFIELD$> = 2
TypeOver<PTYPE$> = 'K'
TypeOver<PSHOWGAUGE$> = True$
RDSKeys = Popup(@WINDOW,TypeOver,'WO_LOG_RTS')
@ -1565,5 +1566,3 @@ ClearCursors:
return

View File

@ -0,0 +1,13 @@
compile insert UNIT_EQUATES
/*----------------------------------------
Author : DJM
Written : 11/6/2025
Description : Insert for unit-hex conversion.
----------------------------------------*/
Equ UNIT_MICROMETER$ To \E66D\
Equ UNIT_OHM_CM$ To \EA2D636D\
Equ UNIT_OHM_PER_SQ$ To \EA2FDC\
Equ UNIT_A$ To ''