COMPILE FUNCTION obj_Order_Det(Method,Parms) /* Methods for the Order Detail (ORDER_DET) table 01/15/2005 JCH - Initial Coding Properties: Methods: Create(OrdNo,ItemNo,QuoteNo,WONo,ItemDesc,ItemQty,UnitPrice) ;* Create new WO Step entry */ DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, obj_Quote DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList $INSERT MSG_EQUATES $INSERT WO_LOG_EQU $INSERT QUOTE_EQU $INSERT ORDER_EQU $INSERT ORDER_DET_EQU $INSERT PROD_SPEC_EQU $INSERT QUOTE_SPEC_EQU $INSERT EPI_SUSCEPTOR_EQUATES EQU TARGET_ACTIVELIST$ TO 5 ErrTitle = 'Error in Stored Procedure "obj_OrderDet"' 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 = 'Create' ; GOSUB Create CASE Method = 'CurrStatus' ; GOSUB CurrStatus CASE Method = 'AddWONo' ; GOSUB AddWONo CASE Method = 'AddVisionInvoice' ; GOSUB AddVisionInvoice CASE Method = 'InvoicedQty' ; GOSUB InvoicedQty CASE Method = 'Cancel' ; GOSUB Cancel CASE Method = 'EpiPROAdd' ; GOSUB EpiPROAdd CASE Method = 'ProdVerNo' ; GOSUB ProdVerNo CASE Method = 'PartNo' ; GOSUB ProdVerNo CASE Method = 'ActiveProdVerNo' ; GOSUB ActiveProdVerNo CASE 1 ErrorMsg = 'Unknown Method ':QUOTE(Method):' passed to routine.' END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) RETURN '' END RETURN Result * * * * * * * Create: * * * * * * * OrderNo = Parms[1,@RM] ItemNo = Parms[COL2()+1,@RM] QuoteNo = Parms[COL2()+1,@RM] EpiPN = Parms[COL2()+1,@RM] ItemDesc = Parms[COL2()+1,@RM] UnitPrice = Parms[COL2()+1,@RM] ItemQty = Parms[COL2()+1,@RM] WONo = Parms[COL2()+1,@RM] VisionItemNo = Parms[COL2()+1,@RM] VisionItemStatus = Parms[COL2()+1,@RM] VisionPartType = Parms[COL2()+1,@RM] CustPartNo = Parms[COL2()+1,@RM] VisionShipQty = Parms[COL2()+1,@RM] PromiseDt = Parms[COL2()+1,@RM] ReqShipDt = Parms[COL2()+1,@RM] ShipWinOpenDt = Parms[COL2()+1,@RM] CustReqDt = Parms[COL2()+1,@RM] IF OrderNo = '' THEN ErrorMsg = 'Null parameter "OrderNo" passed to routine. (':Method:')' IF ItemNo = '' THEN ErrorMsg = 'Null parameter "ItemNo" passed to routine. (':Method:')' IF QuoteNo = '' THEN ErrorMsg = 'Null parameter "QuoteNo" passed to routine. (':Method:')' IF EpiPN = '' THEN Null ;* Not used during conversion OrderDetKey = OrderNo:'*':ItemNo PSNo = XLATE('QUOTE',QuoteNo,QUOTE_PROC_STEP_PSN$,'X')<1,1> ;* Field is multivalued - take the first one SuppliedBy = XLATE('PROD_SPEC',PSNo,'SUB_SUPPLIED_BY','X') TableVar = '' OtParms = 'ORDER_DET':@RM:OrderDetKey:@RM:TableVar OrderDetRec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update So OK maybe it's not STRICTLY a create method... OrderDetRec = '' OrderDetRec = QuoteNo OrderDetRec = EpiPN OrderDetRec = ItemDesc OrderDetRec = ICONV(UnitPrice,'MD2') OrderDetRec = ICONV(ItemQty,'MD0') OrderDetRec = WONo OrderDetRec = VisionItemStatus OrderDetRec = VisionPartType OrderDetRec = CustPartNo OrderDetRec = ICONV(VisionShipQty,'MD0') OrderDetRec = ICONV(PromiseDt,'D') OrderDetRec = ICONV(ReqShipDt,'D') OrderDetRec = ICONV(ShipWinOpenDt,'D') OrderDetRec = ICONV(CustReqDt,'D') OrderDetRec = VisionItemNo OrderDetRec = SuppliedBy OtParms = FieldStore(OtParms,@RM,4,1,OrderDetRec) obj_Tables('WriteRec',OtParms) RETURN * * * * * * * CurrStatus: * * * * * * * OrderNo = Parms[1,@RM] ItemNo = Parms[COL2()+1,@RM] OrderDetRec = Parms[COL2()+1,@RM] IF OrderNo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ItemNo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter WONo = OrderDetRec VisionItemStatus = OrderDetRec ItemQty = OrderDetRec ShipQty = SUM(XLATE('COC',OrderDetRec,'TOT_QTY','X')) IF VisionItemStatus = 'C' THEN IF (ShipQty = ItemQty) AND ItemQty > 0 THEN Result = 'COMP' END ELSE Result = 'CANC' END RETURN END WOStatus = XLATE('WO_LOG',WONo,'CURR_STATUS','X') IF WOStatus = 'NEW' THEN SuppliedBy = OrderDetRec IF SuppliedBy = 'C' THEN Result = 'RTP' END ELSE Result = 'ASN' END RETURN END ELSE Result = WOStatus END RETURN * * * * * * * AddWONo: * * * * * * * OrderNo = Parms[1,@RM] ItemNos = Parms[COL2()+1,@RM] WONo = Parms[COL2()+1,@RM] ErrorMsg = '' IF OrderNo = '' THEN ErrorMsg = 'Null parameter "OrderNo" passed to routine. (':Method:')' IF ItemNos = '' THEN ErrorMsg = 'Null parameter "ItemNos" passed to routine. (':Method:')' IF WONo = '' THEN ErrorMsg = 'Null parameter "WONo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN TableVar = '' FOR I = 1 TO COUNT(ItemNos,@VM) + (ItemNos NE '') ItemNo = ItemNos<1,I> OrderDetKey = OrderNo:'*':ItemNo OtParms = 'ORDER_DET':@RM:OrderDetKey:@RM:TableVar OrderDetRec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update OrderDetRec = WONo OtParms = FieldStore(OtParms,@RM,4,1,OrderDetRec) obj_Tables('WriteRec',OtParms) NEXT I RETURN * * * * * * * AddVisionInvoice: * * * * * * * OrderNo = Parms[1,@RM] ItemNo = Parms[COL2()+1,@RM] VisionInvoiceNo = Parms[COL2()+1,@RM] VisionInvoiceItem = Parms[COL2()+1,@RM] ErrorMsg = '' IF OrderNo = '' THEN ErrorMsg = 'Null parameter "OrderNo" passed to routine. (':Method:')' IF ItemNo = '' THEN ErrorMsg = 'Null parameter "ItemNo" passed to routine. (':Method:')' IF VisionInvoiceNo = '' THEN ErrorMsg = 'Null parameter "VisionInvoiceNo" passed to routine. (':Method:')' IF VisionInvoiceItem = '' THEN ErrorMsg = 'Null parameter "VisionInvoiceNo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN OrderDetKey = OrderNo:'*':ItemNo OtParms = 'ORDER_DET':@RM:OrderDetKey OrderDetRec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update LOCATE VisionInvoiceNo IN OrderDetRec USING @VM SETTING POS ELSE OrderDetRec = INSERT(OrderDetRec,ORDER_DET_VISION_INVOICE_NO$,POS,0,VisionInvoiceNo) OrderDetRec = INSERT(OrderDetRec,ORDER_DET_VISION_INVOICE_ITEM$,POS,0,VisionInvoiceItem) END OtParms = FieldStore(OtParms,@RM,4,1,OrderDetRec) obj_Tables('WriteRec',OtParms) RETURN * * * * * * * InvoicedQty: * * * * * * * OrderNo = Parms[1,@RM] ItemNo = Parms[COL2()+1,@RM] OrderDetRec = Parms[COL2()+1,@RM] IF OrderNo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF ItemNo = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter IF OrderDetRec = '' THEN OrderDetRec = XLATE('ORDER_DET',OrderNo:'*':ItemNo,'','X') IF OrderDetRec = '' THEN RETURN END InvoiceNos = OrderDetRec InvoicedQtys = '' FOR I = 1 TO COUNT(InvoiceNos,@VM) + (InvoiceNos NE '') InvoiceNo = InvoiceNos<1,I> InvODItemNos = XLATE('INVOICE',InvoiceNo,48,'X') InvQtys = XLATE('INVOICE',InvoiceNo,35,'X') FOR N = 1 TO COUNT(InvODItemNos,@VM) + (InvODItemNos NE '') IF InvODItemNos<1,N> = ItemNo THEN InvoicedQtys<1,I> = InvoicedQtys<1,I> + SUM(InvQtys<1,N>) END NEXT N NEXT I Result = InvoicedQtys RETURN * * * * * * * Cancel: * * * * * * * OrderNo = Parms[1,@RM] ItemNo = Parms[COL2()+1,@RM] ErrorMsg = '' IF OrderNo = '' THEN ErrorMsg = 'Null parameter "OrderNo" passed to routine. (':Method:')' IF ItemNo = '' THEN ErrorMsg = 'Null parameter "ItemNo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN OrderDetKey = OrderNo:'*':ItemNo OtParms = 'ORDER_DET':@RM:OrderDetKey OrderDetRec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update OrderDetRec = 0 OrderDetRec = 0 OtParms = FieldStore(OtParms,@RM,4,1,OrderDetRec) obj_Tables('WriteRec',OtParms) RETURN * * * * * * * EpiPROAdd: * * * * * * * OrderDetKey = Parms[1,@RM] OrderDetRec = Parms[COL2()+1,@RM] IF OrderDetKey = '' THEN RETURN IF OrderDetRec = '' THEN OrderDetRec = XLATE('ORDER_DET',OrderDetKey,'','X') OrderNo = FIELD(OrderDetKey,'*',1,1) CustNo = XLATE('ORDER',OrderNo,ORDER_CUST_NO$,'X') QuoteNo = OrderDetRec ProcStepPSNs = XLATE('QUOTE',QuoteNo,'PROC_STEP_PSN','X') PSNo = ProcStepPSNs<1,1> ;* Wafers don't change size from one step to the other so use the first PSN PSNWaferSize = XLATE('PROD_SPEC',PSNo,'SUB_WAFER_SIZE','X') PSNReactorType = XLATE('PROD_SPEC',PSNo,'REACTOR_TYPE','X') PSNSubstrateSpec = XLATE('PROD_SPEC',PSNo,PROD_SPEC_SPEC_SUBSTRATE$,'X') PSType = PSNSubstrateSpec<1,QSSubSpecType$> IF PSNReactorType NE 'P' AND PSNReactorType NE 'EPP' THEN RETURN ;* Not an EpiPRO specification *IF PSType = 'Q' OR CustNo = '7034' OR CustNo = '7035' THEN ;* Removed Vishay 2/21/2008 JCH IF PSType = 'Q'THEN Result = 0 ;* This is an EpiPRO Qual Run or a Vishay production order -> no extra boxes required RETURN END BEGIN CASE CASE PSNWaferSize = '150 mm 6 in' EpiSusceptor = XLATE('EPI_SUSCEPTOR','6','','X') CASE PSNWaferSize = '125 mm 5 in' EpiSusceptor = XLATE('EPI_SUSCEPTOR','5','','X') CASE 1 RETURN ;* No error - this is called from the data dictionary END CASE TestWfrsRun = OCONV(EpiSusceptor,'MD2') ProveInWfrsWO = EpiSusceptor Pockets = EpiSusceptor PocketCnt = COUNT(Pockets,@VM) + (Pockets NE '') OrderQty = OrderDetRec FracRuns = (OrderQty + ProveInWfrsWO)/(PocketCnt - TestWfrsRun) ReqRuns = INT(FracRuns) IF MOD(FracRuns,ReqRuns) > 0 THEN ReqRuns += 1 EstWafersReq = ReqRuns * PocketCnt BoxCnt = INT(EstWafersReq/25) IF MOD(EstWafersReq,25) THEN BoxCnt += 1 ;* Now have the total number of boxes to be pulled Result = (BoxCnt*25) - OrderQty ;* Total number of wafers beyond the order quantity in a multiple of 25 RETURN * * * * * * * ProdVerNo: * * * * * * * OrdDetKey = Parms[1,@RM] OrdDetRec = Parms[COL2()+1,@RM] IF OrdDetKey = '' THEN RETURN IF OrdDetRec = '' THEN OrdDetRec = XLATE('ORDER_DET',OrdDetKey,'','X') IF OrdDetRec = '' THEN RETURN END CustPN = OrdDetRec SubPN = OrdDetRec Supplier = SubPN[-1,'B-'] IF Supplier[1,1] = 'I' AND LEN(Supplier) = 2 ELSE Supplier = '' OrdNo = OrdDetKey[1,'*'] OrdRec = XLATE('ORDER',OrdNo,'','X') CustNo = OrdRec OrderDt = OrdRec IF OrderDt < ICONV('8/1/2005','D') THEN RETURN ;* No part numbers on older records ProcStepPSNs = XLATE('ORDER_DET',OrdDetKey,'QUOTE_PROC_STEP_PSN','X') PsnID = ProcStepPSNs CONVERT @VM TO '.' IN PsnID ShipPSN = ProcStepPSNs[-1,'B':@VM] ReactType = XLATE('PROD_SPEC',ShipPSN,PROD_SPEC_REACTOR_TYPE$,'X') /* Dead 9/5/2014 JCH BEGIN CASE CASE ShipReactType = 'A' ; ReactType = 'ASM+' CASE ShipReactType = 'P' ; ReactType = 'EPP' CASE ShipReactType = 'E' ; ReactType = 'EPS' CASE ShipReactType = 'H' ; ReactType = 'HTR' CASE ShipReactType = 'C' ; ReactType = 'SIG' CASE 1 ; ReactType = '' END CASE */ SubPN = TRIM(SubPN) CONVERT @LOWER_CASE TO @UPPER_CASE IN SubPN SortKey = SubPN:'*':ReactType:'*':PSNId ;* PART_WORK key * * * * * * * * * CONVERT @LOWER_CASE TO @UPPER_CASE IN SortKey Result = XLATE('PART_WORK',SortKey,1,'X') ;* Only field in PART_WORK is ProdVer (was Part) No. RETURN * * * * * * * ActiveProdVerNo: * * * * * * * OrdDetKey = Parms[1,@RM] OrdDetRec = Parms[COL2()+1,@RM] IF OrdDetKey = '' THEN RETURN IF OrdDetRec = '' THEN OrdDetRec = XLATE('ORDER_DET',OrdDetKey,'','X') IF OrdDetRec = '' THEN RETURN END PsnID = XLATE('QUOTE',OrdDetRec<1>,'PROC_STEP_PSN','X') CONVERT @VM TO '.' IN PsnID OPEN 'DICT.PROD_VER' TO DictProdVer ELSE ErrMsg('Unable to Open DICT.PROD_VER table for BTREE.EXTRACT') RETURN END *Search = 'PSN_ID':@VM:PsnID:@FM:'STATUS':@VM:'A':@FM Search = 'PSN_ID':@VM:PsnID:@FM Table = 'PROD_VER' ActiveProdVerNos = '' Option = '' Flag = '' Btree.Extract(Search,Table,DictProdVer,ActiveProdVerNos,Option,Flag) Result = ActiveProdVerNos RETURN