COMPILE FUNCTION obj_React_Item(Method,Parms) /* Methods for React_Item table 01/13/2014 JCH - Initial Coding Properties: Methods: Install(RINo,ReactNo,DTM,ReactHrs,ReactWfrs,RL_Id) ;* Adds Reactor Installation line item to record Remove(RINo,ReactNo,DTM,ReactHrs,ReactWfrs,RL_Id,RDSWfrCnt) ;* Adds Removal information to Reactor Installation line item */ DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Send_Dyn, obj_Popup, obj_React_Item_Hist, obj_React_Item DECLARE FUNCTION Printer_Select, Set_Printer, obj_Install, Direct_Print, Environment_Services DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Direct_Print DECLARE SUBROUTINE ErrMsg, Btree.Extract $INSERT MSG_EQUATES $INSERT REACT_ITEM_EQUATES $INSERT REACT_ITEM_HIST_EQUATES $INSERT REACTOR_EQUATES $INSERT REACT_READS_EQUATES EQU PI$LEFT TO 1 EQU PI$TOP TO 2 EQU PI$RIGHT TO 3 EQU PI$BOTTOM TO 4 EQU PI$WIDTH TO 5 EQU PI$HEIGHT TO 6 EQU PI$SIZE TO 7 EQU CRLF$ TO \0D0A\ EQU TAB$ TO CHAR(9) ErrTitle = 'Error in Stored Procedure "obj_ReactItem"' ErrorMsg = '' IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine' IF NOT(ASSIGNED(Parms)) THEN Parms = '' IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) RETURN '' END Result = '' BEGIN CASE CASE Method = 'CurrStatus' ; GOSUB CurrStatus CASE Method = 'ServiceHrs' ; GOSUB ServiceHrs CASE Method = 'ServiceWfrs' ; GOSUB ServiceWfrs CASE Method = 'Serial_RINo' ; GOSUB Serial_RINo CASE Method = 'ReactWfrCnt' ; GOSUB ReactWfrCnt CASE Method = 'ReactHrs' ; GOSUB ReactHrs CASE Method = 'CalcDesc' ; GOSUB CalcDesc CASE Method = 'PrintLabel' ; GOSUB PrintLabel CASE 1 ErrorMsg = 'Unknown Method ':QUOTE(Method):' passed to routine.' END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) END RETURN Result * * * * * * * CurrStatus: * * * * * * * IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM] IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM] IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X') Parms = '':@RM:RINo:@RM:'' HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one HistKey = HistKeys<1,1> ;* This is the most recent LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X') InstDTM = FIELD(HistKey,'*',3) RemDTM = LastInstallRec RetireDt = ReactItemRec Notes = ReactItemRec CONVERT @LOWER_CASE TO @UPPER_CASE IN NOtes BEGIN CASE CASE RetireDt NE '' ; Result = 'R' CASE InstDTM NE '' AND RemDTM = '' ; Result = 'I' CASE InstDTM NE '' AND RemDTM NE '' OR INDEX(Notes,'USED',1) ; Result = 'U' CASE InstDTM = '' AND RemDTM = '' ; Result = 'N' CASE 1 ; Result = '?' END CASE RETURN * * * * * * * ServiceHrs: * * * * * * * IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM] IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM] IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X') LastRemDtm = ReactItemRec IF LastRemDTM = '' THEN ReactNo = ReactItemRec LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_HRS_DTM$,'X') LastReadHrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_HOURS$,'X') END ELSE LastReadHrs = '' END Ans = '' IRCnt = COUNT(ReactItemRec,@VM) + (ReactItemRec NE '') FOR I = 1 TO IRCnt RemReactHrs = ReactItemRec InstReactHrs = ReactItemRec IF I = 1 AND LastReadHrs NE '' THEN ReactNo = ReactItemRec LastReadDTM = XLATE('REACTOR',ReactNo,25,'X') LastReadHrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,1,'X') RemReactHrs = LastReadHrs END IF RemReactHrs > InstReactHrs AND NUM(InstReactHrs) AND NUM(RemReactHrs) THEN Ans<1,I> = RemReactHrs - InstReactHrs END ELSE Ans<1,I> = '' END NEXT I Result = Ans RETURN * * * * * * * ServiceWfrs: * * * * * * * IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM] IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM] IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X') LastRemDtm = ReactItemRec IF LastRemDTM = '' THEN ReactNo = ReactItemRec LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_WFRS_DTM$,'X') LastReadWfrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_WAFER_CNT$,'X') END ELSE LastReadWfrs = '' END Ans = '' IRCnt = COUNT(ReactItemRec,@VM) + (ReactItemRec NE '') IF IRCnt = 0 THEN Ans = LastReadWfrs END ELSE FOR I = 1 TO IRCnt RemReactWfrs = ReactItemRec InstReactWfrs = ReactItemRec IF I = 1 AND LastReadWfrs NE '' THEN RemReactWfrs = LastReadWfrs END IF RemReactWfrs > InstReactWfrs AND NUM(InstReactWfrs) AND NUM(RemReactWfrs) THEN Ans<1,I> = RemReactWfrs - InstReactWfrs END ELSE Ans<1,I> = '' END NEXT I END Result = Ans RETURN Result * * * * * * * Serial_RINo: * * * * * * * * Temporary for conversion SerialNos = Parms[1,@RM] IF SerialNos = '' THEN RETURN OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE RETURN END snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '') FOR I = 1 TO snCnt SerialNo = SerialNos<1,I> IF SerialNo NE '' THEN IF RowExists('REACT_ITEM',SerialNo) THEN RINo = SerialNo END ELSE SearchString = 'SERIAL':@VM:SerialNo:@FM Option = '' Flag = '' Btree.Extract(SearchString,'REACT_ITEM',DictReactItem,RINo,Option,Flag) IF INDEX(RINo,@VM,1) THEN RINo = FIELD(RINo,@VM,1,3) END Result<1,I> = RINo END ;* End of check for null SerialNo NEXT I RETURN * * * * * * * ServicePCRC: * * * * * * * IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM] IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM] IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X') LastRemDtm = ReactItemRec IF LastRemDTM = '' THEN ReactNo = ReactItemRec LastReadDTM = XLATE('REACTOR',ReactNo,REACTOR_LAST_READ_WFRS_DTM$,'X') LastReadWfrs = XLATE('REACT_READS',ReactNo:'*':LastReadDTM,REACT_READS_WAFER_CNT$,'X') END ELSE LastReadWfrs = '' END Ans = '' IRCnt = COUNT(ReactItemRec,@VM) + (ReactItemRec NE '') IF IRCnt = 0 THEN Ans = LastReadWfrs END ELSE FOR I = 1 TO IRCnt RemReactWfrs = ReactItemRec InstReactWfrs = ReactItemRec ;* This should always be set to zero IF I = 1 AND LastReadWfrs NE ''THEN RemReactWfrs = LastReadWfrs END IF RemReactWfrs > InstReactWfrs AND NUM(InstReactWfrs) AND NUM(RemReactWfrs) THEN Ans<1,I> = RemReactWfrs - InstReactWfrs - ReactItemRec END ELSE Ans<1,I> = '' END NEXT I END Result = Ans RETURN * * * * * * * ReactWfrCnt: * * * * * * * IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM] IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM] IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X') ReactNos = ReactItemRec ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '') Ans = '' FOR I = 1 TO ReactCnt ReactNo = ReactNos<1,I> InstWfrCnt = ReactItemRec RemWfrCnt = ReactItemRec IF I = 1 AND RemWfrCnt = '' THEN LastReadDTM = XLATE( 'REACTOR', ReactNo, REACTOR_LAST_READ_WFRS_DTM$, 'X' ) RemWfrCnt = XLATE( 'REACT_READS' ,ReactNo:'*':LastReadDTM, REACT_READS_WAFER_CNT$, 'X' ) END Delta = '' IF InstWfrCnt NE '' THEN IF RemWfrCnt NE '' THEN IF RemWfrCnt >= InstWfrCnt THEN Delta = RemWfrCnt - InstWfrCnt END END ;* End of check for RemWfrCnt END ;* End of check for InstWfrCnt Ans<1,I> = Delta NEXT I Result = Ans RETURN * * * * * * * ReactHrs: * * * * * * * IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM] IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM] IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X') ReactNos = ReactItemRec ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '') Ans = '' FOR I = 1 TO ReactCnt ReactNo = ReactNos<1,I> InstHrs = ReactItemRec RemHrs = ReactItemRec IF I = 1 AND RemHrs = '' THEN LastReadDTM = XLATE( 'REACTOR', ReactNo, REACTOR_LAST_READ_HRS_DTM$, 'X' ) RemHrs = XLATE( 'REACT_READS' ,ReactNo:'*':LastReadDTM, REACT_READS_HOURS$, 'X' ) END Delta = '' IF InstHrs NE '' THEN IF RemHrs NE '' THEN IF RemHrs >= InstHrs THEN Delta = RemHrs - InstHrs END END ;* End of check for RemHrs END ;* End of check for InstHrs Ans<1,I> = Delta NEXT I Result = Ans return * * * * * * * Serial_GRNo: * * * * * * * * Temporary for conversion SerialNos = Parms[1,@RM] IF SerialNos = '' THEN RETURN OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE RETURN END snCnt = COUNT(SerialNos,@VM) + (SerialNos NE '') FOR I = 1 TO snCnt SerialNo = SerialNos<1,I> IF SerialNo NE '' THEN SearchString = 'SERIAL':@VM:SerialNo:@FM Option = '' Flag = '' Btree.Extract(SearchString,'REACT_ITEM',DictReactItem,RINo,Option,Flag) IF INDEX(RINo,@VM,1) THEN RINo = FIELD(RINo,@VM,1,3) Result<1,I> = RINo END ;* End of check for null SerialNo NEXT I RETURN * * * * * * * SplitSerial: * * * * * * * PartNo = Parms[1,@RM] IF PartNo = '' THEN ErrorMsg = 'Null Parameter "PartNo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN OPEN 'DICT.REACT_ITEM' TO DictReactItem ELSE DEBUG RETURN END SelectSent = 'SERIAL':@VM:'[':PartNo:']':@FM Option = '' Flag = '' Btree.Extract(SelectSent,'REACT_ITEM',DictReactItem,RINos,Option,Flag) IF Get_Status(errCode) THEN ErrMsg(errCode) RETURN END grCnt = COUNT(RINos,@VM) + (RINos NE '') FOR I = 1 TO grCnt RINo = RINos<1,I> otParms = 'REACT_ITEM':@RM:RINo ReactItemRec = obj_Tables('ReadRec',otParms) Serial = ReactItemRec SWAP PartNo WITH '' IN Serial *Serial[1,LEN(PartNo)] = '' IF Serial[1,1] = '-' THEN Serial[1,1] = '' ReactItemRec = Serial ReactItemRec = PartNo otParms = FIELDSTORE(OtParms,@RM,4,0,ReactItemRec) obj_Tables('WriteRec',otParms) NEXT I Result = RINos RETURN * * * * * * * CalcDesc: * * * * * * * IF NOT(ASSIGNED(RINo)) THEN RINo = Parms[1,@RM] IF NOT(ASSIGNED(ReactItemRec)) THEN ReactItemRec = Parms[COL2()+1,@RM] IF RINo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ReactItemRec = '' THEN ReactItemRec = XLATE('REACT_ITEM',RINo,'','X') RIType = ReactItemRec BEGIN CASE CASE RITYpe = 'W' CalcDesc = ReactItemRec CASE RIType = 'A' CalcDesc = ReactItemRec CASE RIType = 'T' Desc = ReactItemRec Style = ReactItemRec Pressure = ReactItemRec RITypeDesc = obj_Popup('CodeDesc','REACT_ITEM_TYPE':@RM:RIType) IF INDEX(Desc,'2000',1) THEN CalcDesc = 'Kit 2000, ':RITypeDesc IF Style NE '' THEN CalcDesc := ' - ':Style IF Pressure NE '' THEN CalcDesc := ' - ':Pressure END ELSE CalcDesc = RITypeDesc IF Style NE '' THEN CalcDesc := ' - ':Style IF Pressure NE '' THEN CalcDesc := ' - ':Pressure END CASE 1 * Graphite types Desc = ReactItemRec RIType = ReactItemRec RITypeDesc = obj_Popup('CodeDesc','REACT_ITEM_TYPE':@RM:RIType) SuscSize = ReactItemRec PktQty = ReactItemRec PktSize = ReactItemRec IF INDEX(Desc,'2000',1) THEN CalcDesc = 'Kit 2000, ' END ELSE CalcDesc = '' END IF PktQty = '' THEN PktQty = 1 BEGIN CASE CASE PktQty = 1 ; PktLabel = 'pkt' CASE PktQty > 1 ; PktLabel = 'pkts' CASE 1 ; PktLabel = '' END CASE IF RIType[1,1] = 'R' THEN RingDesc = RITypeDesc:', ':PktSize:'in' END ELSE RingDesc = '' END BEGIN CASE CASE RingDesc NE '' AND SuscSize EQ '' AND PktSize NE '' ; CalcDesc := RingDesc CASE RingDesc NE '' AND SuscSize NE '' ; CalcDesc := RingDesc:' for ':SuscSize:'in Susceptor with ':PktQty:' ':PktLabel *CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:', ':SuscSize:'in with ':PktSize:'in':PktQty:' ':PktLabel ;* Replaced PktQty with PktSize -dkk 9/11/14 CASE RingDesc EQ '' AND SuscSize NE '' ; CalcDesc := RITypeDesc:' ':SuscSize:'in, with ':PktQty: ' ':PktLabel:' @ ':PktSize:'in' ;* Replaced PktQty with PktSize -dkk 9/11/14 CASE 1 END CASE END CASE Result = CalcDesc RETURN * * * * * * * PrintLabel: * * * * * * * RINo = Parms[1,@RM] RIRec = Parms[COL2()+1,@RM] IF RINo = '' THEN RETURN END IF RIRec = '' THEN RIRec = XLATE('REACT_ITEM',RINo,'','X') IF RIRec = '' THEN RETURN END END EnterDTM = OCONV(RIRec,'DT4/^HS') Desc = RIRec MfrCd = RIRec MfrName = XLATE('REACT_ITEM',RINo,'MFR_NAME','X') MfrPartNo = RIRec MfrPartNoRev = RIRec SerialNo = RIRec CurrStatus = OCONV(XLATE('REACT_ITEM',RINo,'CURR_STATUS','X'),'[CONV_ITEM_CURR_STATUS]') RITypeDesc = XLATE('REACT_ITEM',RINo,'RI_TYPE_DESC','X') SuscSize = RIRec SuscSizeDesc = XLATE('REACT_ITEM',RINo,'SUSC_SIZE_DESC','X') PktSize = RIRec PktSizeDesc = XLATE('REACT_ITEM',RINo,'PKT_SIZE_DESC','X') PktQty = RIRec PPlusRDSNo = RIRec * Build calculated description from field data CalcDesc = obj_React_Item('CalcDesc',RINo:@RM:'') IF PPLusRDSNo NE '' THEN CalcDesc := ' ( P++ )' END Parms = '':@RM:RINo:@RM:'' HistKeys = obj_React_Item_Hist('GetHistory',Parms) ;* 3 parameters RINo is the middle one HistKey = HistKeys<1,1> ;* This is the most recent LastInstallRec = XLATE('REACT_ITEM_HIST',HistKeys<1,1>,'','X') ReactNo = HistKey[1,'*'] InstallDTM = OCONV(FIELD(HistKey,'*',3),'DT4/^S') RemoveDTM = OCONV(LastInstallRec,'DT4/^S') FileName = "Printing Label" Title = "Printing Label" PageInfo = '' PageInfo = 0.1 PageInfo = 0.1 PageInfo = 0.1 PageInfo = 0.1 PageSetup = '1' ;* Landscape PrintSetup = '' ;* Preview PrinterID = '\\mesirwfp001\MESZBRPRT002' ;* This is the Zebra 105se PrintPath = Printer_Select(PrinterID) ;* Popup is skipped IF Printer ID is passed If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then stat = Set_Printer("INIT",FileName,Title,PageInfo,PageSetup,PrintSetup,PrintPath) end else stat = Direct_Print('START', PrintPath<1>, '', '') end IF stat < 0 THEN GOTO OIPrint_Error EQU DosPath$ TO 'C:\WINDOWS\OIZPL.TXT' ;* remove jch Str = '^XA' Str := '^LH0,0' Str := '^PR2' ;* Print speed 2 inches per second Str := '^LL406' ;* Label length = 203.2dpi x 2in Str := '^PW812' ;* Print width = 203.2dpi x 4in ;* This was 900 jch 12/30/2013 Str := '^MD15' ;* Media darkness Str := '^MMT' ;* Media mode t=tear off mode *Str := '^PQ2' ;* Print 2 labels for each pass through here Str := '^FS' ;* end command ****** First Line Str := '^FO30,25^A0,,36^FD':obj_Install('Get_Prop','Company'):'^FS' Str := '^FO310,25^AC,18^FDRI No:^FS':CRLF$ ;* Label Str := '^FO390,25^A045,36^FD':RINo:'^FS':CRLF$ ;* Data Str := '^FO560,25^AC,18^FDStatus:^FS':CRLF$ ;* Label Str := '^FO650,25^A045,36^FD':CurrStatus:'^FS':CRLF$ ;* Data ****** Second Line Str:= '^FO30,70^AC,18^FDDesc:^FS':CRLF$ Str:= '^FO95,70^A050,30^FD':CalcDesc:'^FS':CRLF$ Str := '^BY2,2.0':CRLF$ Str := '^FO600,70^B3,,23,N^FD':RINo:'^FS':CRLF$ Str := '^BY2,3.0':CRLF$ ****** Third Line Str:= '^FO30,115^AC,18^FDMfr:^FS' ;* Label MfrData = MfrCd:' - ':MfrName Str:= '^FO90,115^A0,,25^FD':MfrData:'^FS':CRLF$ ;* Data ****** Fourth Line Str:= '^FO30,160^AC,18^FDPN:^FS':CRLF$ ;* Label Str:= '^FO70,160^A045,25^FD':MfrPartNo:'^FS':CRLF$ ;* Data Str:= '^FO300,160^AC,18^FDRev:^FS':CRLF$ ;* Label Str:= '^FO350,160^A045,25^FD':MfrPartNoRev:'^FS':CRLF$ ;* Data Str:= '^FO500,160^AC,18^FDSN:^FS':CRLF$ ;* Label Str:= '^FO540,160^A045,25^FD':SerialNo:'^FS':CRLF$ ;* Data ****** Separator bar *Str:= '^FO15,128^GB795,1^FS' ****** Fifth Line Str := '^FO30,205^AC,18^FDEntered:^FS':CRLF$ Str := '^FO150,205^A0,20^FD':EnterDTM:'^FS':CRLF$ ****** Sixth Line Str := '^FO30,250^AC,18^FDInstalled:^FS':CRLF$ Str := '^FO150,250^A0,20^FD':InstallDTM:'^FS':CRLF$ Str := '^FO500,250^AC,18^FDReact No:^FS':CRLF$ Str := '^FO610,250^A0,20^FD':ReactNo:'^FS':CRLF$ ****** Seventh Line Str := '^FO30,295^AC,18^FDRemoved:^FS':CRLF$ Str := '^FO150,295^A0,20^FD':RemoveDTM:'^FS':CRLF$ *Str := '^FO410,295^AC,18^FDReact Type:^FS':CRLF$ *Str := '^FO560,295^A0,20^FD':PrintReactType:'^FS':CRLF$ * * * * * * Jump: * * * * * * Str:= '^XZ' If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then stat = Set_Printer('TEXT',Str) end else stat = Direct_Print('PRINT', Str) end * * * * * * OIPrint_Error: * * * * * * If Environment_Services('GetLabelPrintMethod') _EQC 'OIPI' then stat = Set_Printer("TERM") end else stat = Direct_Print('STOP') end RETURN