open-insight/LSL2/STPROC/DBW_WO_MAST_SCHED_EVENTS.txt
Infineon\StieberD 7762b129af pre cutover push
2024-09-04 20:33:41 -07:00

451 lines
14 KiB
Plaintext

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<Prod_Spec_Spec_Epi$>
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<PRS_LAYER_RECIPE$>
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