Function DBW_WO_MAST_SCHED_EVENTS(CtrlEntId, Event, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10, Param11, Param12, Param13, Param14, Param15) /******************************************************************************************************** This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written permission from SRP Computer Solutions, Inc. Name : WO Master Scheduler Events Description : Tags : [SRP] Parameters : History (Date, Initials, Notes) 09/17/2008 fjt Initial development ********************************************************************************************************/ $insert SRP_APP_INSERTS $insert SRP_EVENT_SETUP $insert WO_SCHEDULER_INSERTS Equ PRS_LAYER_RECIPE$ to 2 Declare subroutine SRP_Show_Window, SRP_Redirect_OLE_Events Declare function SVC_Scheduler, SVC_Dopant, SVC_Option_Button, SVC_SubClass_DropDown, SVC_Change_Log Declare function SVC_Process_Time, Win_Check_Req_Fields, obj_Prod_Spec, Utility_Services, NextKey Begin Case Case Event _eqc "Click" Begin Case Case Control EQ "PUB_CANCEL" ; GoSub Click.PUB_CANCEL Case Control EQ "PUB_DELETE" ; GoSub Click.PUB_DELETE Case Control EQ "PUB_SAVE" ; GoSub Click.PUB_SAVE End Case Case Event _eqc "LostFocus" Begin Case Case Control EQ "EDL_REACT_NO" ; GoSub LostFocus.EDL_REACT_NO Case Control EQ "EDL_SCHED_DT" ; GoSub LostFocus.EDL_SCHED_DT Case Control EQ "EDL_WO_NO" ; GoSub LostFocus.EDL_WO_NO End Case Case Event _eqc "OnOptionClick" Control = Field(Param1, ".", 2) Begin Case Case Control EQ "EDL_END_DATE" ; GoSub OnOptionClick.EDL_END_DATE Case Control EQ "EDL_PROC_TIME" ; GoSub OnOptionClick.EDL_PROC_TIME Case Control EQ "EDL_SCHED_DT" ; GoSub OnOptionClick.EDL_SCHED_DT End Case Case Control EQ Window Begin Case Case Event EQ "CLOSE" ; Gosub Window.CLOSE Case Event EQ "CREATE" ; GoSub Window.CREATE Case Event EQ "READ" ; GoSub Window.READ Case Event EQ "SIZE" ; Gosub Window.SIZE Case Event EQ "WRITE" ; GoSub Window.WRITE End Case End Case If Assigned(Ans) else Ans = 1 Return Ans !----- EVENTS ------------------------------------------------------------------------------------------- CLICK.PUB_CANCEL: Set_Property(@Window, "SAVEWARN", No$) Send_Event(@Window, "CLOSE") Ans = 0 return CLICK.PUB_DELETE: Key = Get_Property(@Window, "ID") Rec = Get_Property(@Window, "ATRECORD") Send_Event(@Window, "DELETE") End_Dialog(@Window, Key :@RM: "DELETE") rv = SVC_Scheduler("UnFlagSched", Key, Rec) rv = SVC_Scheduler("RemoveAppts", Key, Rec) rv = SVC_Change_Log("RemoveAppts", Key, Rec, Prev) Ans = 0 return CLICK.PUB_SAVE: Key = Get_Property(@Window, "ID") Rec = Get_Property(@Window, "ATRECORD") OK.Fields = Win_Check_Req_Fields(@Window) PSN = Get_Property(@Window:".EDL_PSN_NO", "DEFPROP") Wafer = Field(Xlate("PROD_SPEC", PSN, "SUB_WAFER_INCHES", "X"), " ", 1) Event = Get_Property(@Window:".EDL_EVENT", "DEFPROP") Reactor = Get_Property(@Window:".COB_REACT_NO", "TEXT") OK.Wafer = SVC_Scheduler("CheckWaferSize", "PUB_SAVE", Key, Reactor, Wafer, Event) GoSub Dopant_Check If Gas.Check.On$ then OK.Dopant = rv<3> else OK.Dopant = Yes$ If OK.Dopant EQ No$ then Err = "Appointment save is not allowed due to a source/dopant mismatch." rv = Utility_Services("Balloon", Error, @Window:".EDL_SOURCE_GAS", "", Err) end If OK.Fields and OK.Wafer and OK.Dopant then GoSub Valid_Date If Valid then GoSub Write_and_Update end return LOSTFOCUS.EDL_REACT_NO: rv = Get_Property(CtrlEntID, "DEFPROP") If rv EQ "" then Set_Property(CtrlEntID, "FOCUS", Yes$) return LOSTFOCUS.EDL_SCHED_DT: GoSub Process_Date_and_Time rv = Get_Property(CtrlEntID, "DEFPROP") If rv EQ "" then Set_Property(CtrlEntID, "FOCUS", Yes$) return LOSTFOCUS.EDL_WO_NO: Key = Get_Property(CtrlEntId, "ID") WO_No = Get_Property(CtrlEntId, "DEFPROP") Begin Case Case WO_No EQ "" Case RowExists("WO_MAST_SCHED", Key) rv = Get_Property(@Window, "@WO", WO_No) If WO_No NE rv then Gosub Prefill_WO Case Otherwise$ Gosub Prefill_WO End Case Set_Property(@Window, "@WO", WO_No) return OnOptionClick.EDL_PROC_TIME: WO_No = Get_Property(@Window:".EDL_WO_NO", "DEFPROP") Key = Get_Property(@Window:".EDL_APPT", "DEFPROP") GoSub Prefill_WO Set_Property(@Window, "@WO", WO_No) return OnOptionClick.EDL_END_DATE: OnOptionClick.EDL_SCHED_DT: GoSub Calendar return Window.CLOSE: Set_Property(@Window, "SAVEWARN", No$) return Window.CREATE: // Check required fields on save rv = Get_Property(@Window, "IOOPTIONS") rv<10> = Yes$ Set_Property(@Window, "IOOPTIONS", rv) rv = SVC_SubClass_DropDown("Sched Events", @Window:".EDL_EVENT") rv = SVC_Option_Button("Add", @Window, "EDL_PROC_TIME", "bmps/refresh1.bmp") rv = SVC_Option_Button("Add", @Window, "EDL_TOTAL_PACE", "bmps/blank.bmp") rv = SVC_Option_Button("Add", @Window, "EDL_SCHED_DT", "bmps/dropcal.bmp") rv = SVC_Option_Button("Add", @Window, "EDL_END_DATE", "bmps/dropcal.bmp") // Reactor dropdown rv = "" For i = 20 to 74 rv := i :@FM Next i If @USER4 EQ "SRP_FRANK" then rv := 99 :@FM rv[-1,1] = "" Set_Property(@Window:".COB_REACT_NO", "LIST", rv) If Param1 GT "" then // Passed in information Key = Field(Param1, @RM, 1) Begin Case Case Key EQ "REACTOR" React = Field(Param1, @RM, 2) Key = NextKey("WO_MAST_SCHED") Set_Property(@Window:".EDL_APPT", "DEFPROP", Key) Send_Event(@Window, "READ") Set_Property(@Window:".COB_REACT_NO", "TEXT", React) Ctrl = @Window:".EDL_WO_NO" Set_Property(Ctrl, "FOCUS", Yes$) Case Otherwise$ Set_Property(@Window:".EDL_APPT", "DEFPROP", Key) Send_Event(@Window, "READ") End Case end SRP_Redirect_OLE_Events() SRP_Show_Window(@Window, "", "C", "C", 1) return Window.READ: // Set original WO number WO_No = Get_Property(CtrlEntId, "DEFPROP") Rec = Get_Property(CtrlEntId, "ATRECORD") Set_Property(@Window, "@WO", WO_No) Set_Property(@Window, "@PREV_REC", Rec) Set_Property(@Window, "SAVEWARN", No$) GoSub Dopant_Check GoSub Qualify_Check return Window.SIZE: // Make sure scheduler window redraws after moving this window around (prevents ghost image) Set_Property("WO_MASTER_SCHEDULER.OLE_SCHEDULE", "OLE.Redraw", Yes$) return Window.WRITE: return !----- INTERNAL ROUTINES -------------------------------------------------------------------------------- Calendar: Default = Iconv(Get_Property(Param1, "DEFPROP"), "D4/") WinPos = Get_Property(@Window, "SIZE") CtrlPos = Get_Property(Param1, "SIZE") InitParam = Default:@FM:@Window:@FM:(CtrlPos<1> + WinPos<1>) + 3 :@FM:(CtrlPos<2> + WinPos<2> + CtrlPos<4> + 30) Date = Dialog_Box("POPUP_MONTH", @Window, InitParam) If (Date) then Set_Property(Param1, "DEFPROP", Oconv(Date, "D4/")) Ans = 0 end return Write_and_Update: New = Not(RowExists("WO_MAST_SCHED", Key)) Prev = Get_Property(@Window, "@PREV_REC") Send_Event(@Window, "WRITE") End_Dialog(@Window, Key :@RM: Rec) Begin Case Case New ; rv = SVC_Scheduler("AddAppts", Key, Rec) Case 1 ; rv = SVC_Scheduler("Appt", Key, Rec) End Case rv = SVC_Scheduler("FlagSched", Key, Rec) rv = SVC_Change_Log("Compare", Key, Rec, Prev) Ans = 0 return Prefill_WO: Equ Prod_Spec_Spec_Epi$ to 15 Equ QSEpiDopant$ to 10 WO_Log = Xlate("WO_LOG", WO_No, "", "X") OrderNo = WO_Log<29> ItemNos = WO_Log<30> StepKey = WO_No:"*1" ; // * StepKey = WO_Log<34> // WO Log WO_Mat = Xlate("WO_MAT", StepKey, "", "X") WO_Step = Xlate("WO_STEP", StepKey, "", "X") Status = Xlate("WO_LOG", WO_No, "CURR_STATUS", "X") Released = Xlate("WO_LOG", WO_No, "REL_STAMP", "X") GT "" EPIpart = Xlate("WO_LOG", WO_No, "ORDER_ITEM", "X")<1,1> // PSN PSN = Xlate("QUOTE", WO_Log<27>, 33, "X")<1,1> PSrec = Xlate("PROD_SPEC", PSN, "", "X") RunType = Xlate("PROD_SPEC", PSN, "SPEC_TYPE", "X") SpecEpi = PSrec Convert Char(247) to @FM in SpecEpi Convert Char(248) to @FM in SpecEpi Dopant = SpecEpi<1,QSEpiDopant$> // Part Numbers PartNo = Xlate("ORDER_DET", OrderNo:"*":ItemNos<1,1>, 8, "X") * EPIpart = Xlate("PROD_SPEC", PSN, 5, "X")<1,1> Wafer = Xlate("PROD_SPEC", PSN, "SUB_WAFER_INCHES", "X") MinPer = Xlate("PROD_SPEC", PSN, 96, "X") MinPer = Oconv(Iconv(Oconv(MinPer, "MD3"), "MD1"), "MD1") // RDS RDS_Keys = WO_Step<06> RDS_Status = Xlate("REACT_RUN", RDS_Keys, "RUN_STATUS", "X") RDS_Cnt = Count(RDS_Status, @VM) + (RDS_Status NE "") RDS_Comp = Count(RDS_Status, "COMP") + Count(RDS_Status, "RFQ") // RDS Completed RDS_Comp = 0 RDS_Keys = WO_Step<06> RDS_Unload = Xlate("REACT_RUN", RDS_Keys, "UNLOAD_SIG", "X") RDS_Cnt = Count(RDS_Keys, @VM) + (RDS_Keys NE "") Pos.x = 0 ; Delim.x = "" Loop Remove Val from RDS_Unload at Pos.x setting Delim If Val GT "" then RDS_Comp += 1 Until Delim EQ 0 Repeat // Fields Set_Property(@Window:".EDL_CUST_NO", "DEFPROP", WO_Log<03>) Set_Property(@Window:".EDL_PART_NO", "DEFPROP", PartNo) Set_Property(@Window:".EDL_EPI_PART_NO", "DEFPROP", EPIpart) Set_Property(@Window:".EDL_PSN_NO", "DEFPROP", PSN) Set_Property(@Window:".EDL_WO_STATUS", "DEFPROP", Status) Set_Property(@Window:".EDL_STEP_KEY", "DEFPROP", StepKey) Set_Property(@Window:".EDL_RDS_COUNT", "DEFPROP", RDS_Cnt) Set_Property(@Window:".EDL_RDS_COMP", "DEFPROP", RDS_Comp) Set_Property(@Window:".EDL_RUN_TYPE", "INVALUE", RunType) Set_Property(@Window:".CHK_RELEASED", "CHECK", Released) GoSub Process_Date_and_Time GoSub Dopant_Add GoSub Dopant_Check GoSub Qualify_Check Send_Event(@Window:".EDL_CUST_NAME", "CALCULATE") Send_Event(@Window:".EDL_WAFER_SIZE", "CALCULATE") Send_Event(@Window:".EDL_WAFER_QTY", "CALCULATE") Send_Event(@Window:".EDL_COMPLETED", "CALCULATE") Ans = 0 return Process_Date_and_Time: // Process Time WO_No = Get_Property(@Window:".EDL_WO_NO", "INVALUE") StartDate = Get_Property(@Window:".EDL_SCHED_DT", "INVALUE") StartTime = Get_Property(@Window:".COB_START_TIME", "INVALUE") React = Get_Property(@Window:".COB_REACT_NO", "TEXT") PSN = Get_Property(@Window:".EDL_PSN_NO", "DEFPROP") Last.Appt = "" If StartDate EQ "" then StartDate = Date() If StartTime else StartTime = 0 // Next available open date and time Loop rv = Xlate("WO_MAST_SCHED_DSR", StartDate:"*":React, 1, "X") Until rv EQ "" StartDate += 1 Last.Appt = rv Repeat Last.Rec = Get_Property(Ctrl$, "OLE.Appt[":Last.Appt:"]") Last.End = Last.Rec<03> Last.Date = Field(Last.End, ".", 1) Begin Case Case Last.Appt EQ "" StartDate = Get_Property(@Window:".EDL_SCHED_DT", "INVALUE") Case Field(Last.End, ".", 2) EQ 0 StartDate = Last.Date StartTime = 0 Case Field(Last.End, ".", 2)[1,1] EQ 5 StartDate = Last.Date StartTime = Iconv("12:00PM", "MT") End Case Rec = "" Rec<06> = PSN rv = SVC_Process_Time("ProcTime", WO_No, Rec) Proc.Hrs = Field(rv, @RM, 1) rv = SVC_Process_Time("CalcRange", StartDate, StartTime, Proc.Hrs) Set_Property(@Window:".EDL_SCHED_DT", "INVALUE", rv<1>) Set_Property(@Window:".COB_START_TIME", "INVALUE", rv<2>) Set_Property(@Window:".EDL_END_DATE", "INVALUE", rv<3>) Set_Property(@Window:".COB_END_TIME", "INVALUE", rv<4>) Set_Property(@Window:".EDL_PROC_TIME", "INVALUE", Proc.Hrs) return Dopant_Add: LayerSpecs = obj_Prod_Spec("GetLayerProp", PSN:@RM:@RM:1) ;// Returns specs for all layers in internal format 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 Recipe = Xlate("RECIPE", RecipeNo, "", "X") Dopant = Recipe<1> Source = Recipe<5> Set_Property(@Window:".EDL_DOPANT", "DEFPROP", Dopant) Set_Property(@Window:".EDL_SOURCE_GAS", "DEFPROP", Source) return Dopant_Check: Dopant = Get_Property(@Window:".EDL_DOPANT", "DEFPROP") Source = Get_Property(@Window:".EDL_SOURCE_GAS", "DEFPROP") React = Get_Property(@Window:".COB_REACT_NO", "TEXT") rv = SVC_Dopant("Check", Dopant, Source, React) Set_Property(@Window:".EDL_DOPANT", "DEFPROP", Dopant) Set_Property(@Window:".EDL_SOURCE_GAS", "DEFPROP", Source) Set_Property(@Window:".PIC_SOURCE", "OLE.BackgroundColor", rv<1>) Set_Property(@Window:".PIC_DOPANT", "OLE.BackgroundColor", rv<2>) return Qualify_Check: React = Get_Property(@Window:".COB_REACT_NO", "TEXT") PSN = Get_Property(@Window:".EDL_PSN_NO", "DEFPROP") rv = SVC_Dopant("Qualify", Qualified, Blocked, React, PSN) Set_Property(@Window:".EDL_QUALIFIED", "DEFPROP", Qualified) Set_Property(@Window:".EDL_BLOCKED", "DEFPROP", Blocked) Set_Property(@Window:".PIC_QUALIFIED", "OLE.BackgroundColor", rv<1>) Set_Property(@Window:".PIC_BLOCKED", "OLE.BackgroundColor", rv<2>) return Valid_Date: Valid = Yes$ DT.Sdate = Get_Property(@Window:".EDL_SCHED_DT", "INVALUE") DT.Stime = Get_Property(@Window:".COB_START_TIME", "INVALUE") DT.Edate = Get_Property(@Window:".EDL_END_DATE", "INVALUE") DT.Etime = Get_Property(@Window:".COB_END_TIME", "INVALUE") DT.Start = Iconv(Oconv(DT.Sdate, "D4/"):" ":Oconv(DT.Stime, "MTS"), "DT") DT.End = Iconv(Oconv(DT.Edate, "D4/"):" ":Oconv(DT.Etime, "MTS"), "DT") Begin Case Case DT.Sdate and DT.Edate and DT.Stime and DT.Etime Case DT.End GT DT.Start Case Otherwise$ Valid = No$ End Case If Not(Valid) then rv = Utility_Services("Balloon", Error, @Window:".EDL_SCHED_DT", "Valid Date", "The date, time, or date range is missing or invalid.") end return