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

1957 lines
74 KiB
Plaintext

Function NDW_Scheduler_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 Infineon.
Name : NDW_Scheduler_Events
Description : This function acts as a commuter module for all events related to this window.
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
execute Basic+ logic without having use the Form Designer to make the association, although this is
limited to the events which are currently promoted.
If the form needs to call the commuter module directly then the QuickEvent parameters should be
formatted like this:
'@SELF','@EVENT',['@PARAM1','@PARAMx']
Parameters :
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
Param1-15 [in] -- Additional event parameter holders
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
EVENT_SETUP insert
History : (Date, Initials, Notes)
06/01/17 dmb Created initial commuter module.
04/20/21 djs Updated GetReactorEntities to use PickPlace instead of Dedicated and Non-Dedicated
reactor assignments for form color purposes.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
#Window NDW_SCHEDULER
$insert APP_INSERTS
$insert EVENT_SETUP
$insert MSG_EQUATES
$insert SCHED_DET_EQUATES
$insert WO_LOG_EQUATES
$insert PRS_LAYER_EQU
$insert POPUP_EQUATES
$INSERT LOGICAL
$insert SECURITY_RIGHTS_EQU
$insert REACTOR_EQUATES
$insert WO_STEP_EQUATES
$insert SCHEDULE_EVENT_SUMMMARY_EQUATES
$insert SCHED_DET_NG_EQUATES
$insert COMPANY_EQUATES
$insert USER_CONFIG_EQUATES
$insert RLIST_EQUATES
Equ LightGrey$ TO 239 + (239*256) + (239*65536)
Equ LTORANGE$ TO 255 + (220*256) + (128*65536)
Equ Comma$ to ','
Declare function SRP_Array, Schedule_Services, Epi_Part_Services, MemberOf, Reactor_Services, SRP_JSON
Declare function EntId, MemberOf, Repository, Security_Check, Security_Err_Msg, Obj_Prod_Spec, Rds_Supplement_Maint
Declare function DateTime, Database_Services, SRP_Get_IdleTime, Environment_Services,
Declare function Logging_Services, GetCurrentProcessID
Declare subroutine obj_Appwindow, Schedule_Services, Epi_Part_Services, SRP_Stopwatch, SRP_JSON, Database_Services
Declare subroutine Security_Err_Msg, Start_Window, Messaging_Services, Work_Order_Services, Sleepery, Logging_Services
ProcessID = GetCurrentProcessID()
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\SchedulerPro'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ' : @User4 : ' ' : ProcessID : ' Crash Log.csv'
Headers = 'Logging DTM' : @FM : 'LSL User' : @FM : 'Notes'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, True$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
SubclassInfo = Form_Services('FindSubclassControl')
Subclass = SubclassInfo<1>
// 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
Transfer Param1 to Event
Transfer Param2 to Param1
Transfer Param3 to Param2
Transfer Param4 to Param3
Transfer Param5 to Param4
Transfer Param6 to Param5
Transfer Param7 to Param6
Transfer Param8 to Param7
end
GoToEvent Event for CtrlEntID
Return EventFlow else EVENT_CONTINUE$
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Events
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Event WINDOW.CREATE(CreateParam)
// Update UI based on security membership rights.
Begin Case
Case MemberOf(@USER4, 'SCHEDULER_ADMIN')
// Allowed to access everything.
Case MemberOf(@USER4, 'SCHEDULER_MASTER')
// Reactor utilization is view only.
Set_Property(@Window : '.EDL_ASM_UTILIZATION', 'ENABLED', False$)
Set_Property(@Window : '.EDL_ASM_UTILIZATION', 'BACKCOLOR', LightGrey$)
Size = Get_Property(@Window : '.EDL_ASM_UTILIZATION', 'SIZE')
Size<3> = Size<3> + 48
Set_Property(@Window : '.EDL_ASM_UTILIZATION', 'SIZE', Size)
Set_Property(@Window : '.OLE_PUB_UPDATE_ASM_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_ASM_PLUS_UTILIZATION', 'ENABLED', False$)
Set_Property(@Window : '.EDL_ASM_PLUS_UTILIZATION', 'BACKCOLOR', LightGrey$)
Size = Get_Property(@Window : '.EDL_ASM_PLUS_UTILIZATION', 'SIZE')
Size<3> = Size<3> + 48
Set_Property(@Window : '.EDL_ASM_PLUS_UTILIZATION', 'SIZE', Size)
Set_Property(@Window : '.OLE_PUB_UPDATE_ASM_PLUS_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_HTR_UTILIZATION', 'ENABLED', False$)
Set_Property(@Window : '.EDL_HTR_UTILIZATION', 'BACKCOLOR', LightGrey$)
Size = Get_Property(@Window : '.EDL_HTR_UTILIZATION', 'SIZE')
Size<3> = Size<3> + 48
Set_Property(@Window : '.EDL_HTR_UTILIZATION', 'SIZE', Size)
Set_Property(@Window : '.OLE_PUB_UPDATE_HTR_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_EPIPRO_UTILIZATION', 'ENABLED', False$)
Set_Property(@Window : '.EDL_EPIPRO_UTILIZATION', 'BACKCOLOR', LightGrey$)
Size = Get_Property(@Window : '.EDL_EPIPRO_UTILIZATION', 'SIZE')
Size<3> = Size<3> + 48
Set_Property(@Window : '.EDL_EPIPRO_UTILIZATION', 'SIZE', Size)
Set_Property(@Window : '.OLE_PUB_UPDATE_EPIPRO_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_GAN_UTILIZATION', 'ENABLED', False$)
Set_Property(@Window : '.EDL_GAN_UTILIZATION', 'BACKCOLOR', LightGrey$)
Size = Get_Property(@Window : '.EDL_GAN_UTILIZATION', 'SIZE')
Size<3> = Size<3> + 48
Set_Property(@Window : '.EDL_GAN_UTILIZATION', 'SIZE', Size)
Set_Property(@Window : '.OLE_PUB_UPDATE_GAN_UTILIZATION', 'VISIBLE', False$)
Case Otherwise$
// Reactor utilization is not visible.
Set_Property(@Window : '.OLE_DIV_REACTOR_TYPE_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.STA_ASM_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_ASM_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.OLE_PUB_UPDATE_ASM_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.STA_ASM_PLUS_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_ASM_PLUS_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.OLE_PUB_UPDATE_ASM_PLUS_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.STA_HTR_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_HTR_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.OLE_PUB_UPDATE_HTR_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.STA_EPIPRO_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_EPIPRO_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.OLE_PUB_UPDATE_EPIPRO_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.STA_GAN_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.EDL_GAN_UTILIZATION', 'VISIBLE', False$)
Set_Property(@Window : '.OLE_PUB_UPDATE_GAN_UTILIZATION', 'VISIBLE', False$)
Size = Get_Property(@Window : '.OLE_DIV_BOTTOM', 'SIZE')
Size<2> = Size<2> - 162
Set_Property(@Window : '.OLE_DIV_BOTTOM', 'SIZE', Size)
End Case
Set_Property(@Window, 'VISIBLE', 3)
GoSub Setup_OLE_Controls
ASMUtil = Epi_Part_Services('GetReactorUtilization', 'ASM')
ASMPlusUtil = Epi_Part_Services('GetReactorUtilization', 'ASM+')
HTRUtil = Epi_Part_Services('GetReactorUtilization', 'HTR')
EpiProUtil = Epi_Part_Services('GetReactorUtilization', 'EpiPro')
GaNUtil = Epi_Part_Services('GetReactorUtilization', 'GaN')
Set_Property(@Window : '.EDL_ASM_UTILIZATION', 'INVALUE', ASMUtil)
Set_Property(@Window : '.EDL_ASM_PLUS_UTILIZATION', 'INVALUE', ASMPlusUtil)
Set_Property(@Window : '.EDL_HTR_UTILIZATION', 'INVALUE', HTRUtil)
Set_Property(@Window : '.EDL_EPIPRO_UTILIZATION', 'INVALUE', EpiProUtil)
Set_Property(@Window : '.EDL_GAN_UTILIZATION', 'INVALUE', GaNUtil)
end event
Event WINDOW.CLOSE(CancelFlag)
UserConfigKey = @User4:'*':@Window
UserConfigRec = Get_Property(@Window, '@USER_CONFIG_REC')
UserConfigProps = UserConfigRec<USER_CONFIG.PROPERTY$>
UserConfigVals = UserConfigRec<USER_CONFIG.VALUE$>
IntervalSize = Get_Property(@Window:'.OLE_SCHEDULE', 'OLE.IntervalSize')
Locate 'IntervalSize' in UserConfigProps using @VM setting vPos then
UserConfigVals<0, vPos> = IntervalSize
end else
UserConfigProps<0, -1> = 'IntervalSize'
UserConfigVals<0, -1> = IntervalSize
UserConfigRec<USER_CONFIG.PROPERTY$> = UserConfigProps
end
UserConfigRec<USER_CONFIG.VALUE$> = UserConfigVals
Database_Services('WriteDataRow', 'USER_CONFIG', UserConfigKey, UserConfigRec, True$, False$, True$)
end event
Event EDL_REACTOR_FILTER.LOSTFOCUS(Flag, FocusID)
PrevFilterType = Get_Property(CtrlEntId, '@PREV_FILTER_TYPE')
FilterType = Get_Property(CtrlEntId, 'TEXT')
If FilterType NE PrevFilterType then
Begin Case
Case FilterType _EQC 'Reactor Type'
FilterOptions = 'ASM' : @FM
FilterOptions := 'ASM+' : @FM
FilterOptions := 'HTR' : @FM
FilterOptions := 'EpiPro' : @FM
FilterOptions := 'GaN'
Case FilterType _EQC 'Reactor Assignment'
FilterOptions = 'Dedicated' : @FM
FilterOptions := 'Non-Dedicated' : @FM
FilterOptions := 'GaN' : @FM
FilterOptions := 'Out of Service'
Case FilterType _EQC 'Wafer Size'
FilterOptions = '125 mm 5 in' : @FM
FilterOptions := '150 mm 6 in' : @FM
FilterOptions := '200 mm 8 in' : @FM
Case FilterType _EQC 'Cleanroom Area'
FilterOptions = 'Front-Evens' : @FM
FilterOptions := 'Front-Odds' : @FM
FilterOptions := 'Front-Evens-HTR' : @FM
FilterOptions := 'Front-Odds-HTR' : @FM
FilterOptions := 'Tunnel' : @FM
FilterOptions := 'EpiPro Room' : @FM
FilterOptions := 'Back-Evens' : @FM
FilterOptions := 'Back-Odds' : @FM
FilterOptions := 'GaN'
End Case
Set_Property(CtrlEntId, '@PREV_FILTER_TYPE', FilterType)
Ctrl = @Window : '.OLE_TRE_REACTOR_FILTER_OPTIONS'
ItemList = ''
For Each FilterOption in FilterOptions using @FM
ItemList := 1 : @VM : FilterOption : @VM : FilterOption : @VM : @VM : @VM : @VM : @VM : @VM : @VM : @VM : 'Left' : @FM
Next FilterOption
ItemList[-1, 1] = ''
Set_Property(Ctrl, 'OLE.ItemList', ItemList)
Set_Property(Ctrl, 'OLE.ItemChecked[All]', True$)
Post_Event(Ctrl, 'OLE', 'OnItemCheck')
end
end event
Event EDL_WORK_ORDER_SEARCH.LOSTFOCUS(Flag, FocusID)
PrevWorkOrderNo = Get_Property(CtrlEntId, '@PREV_WORK_ORDER_NO')
SearchWorkOrderNo = Get_Property(CtrlEntId, 'TEXT')
If SearchWorkOrderNo NE PrevWorkOrderNo then
// Restore already selected appointments to their normal backcolor.
Set_Property(@Window, 'REDRAW', False$)
SearchAppointmentKeys = Get_Property(@Window : '.OLE_SCHEDULE', '@SELECTED_KEYIDS')
If SearchAppointmentKeys NE '' then
For Each AppointmentKey in SearchAppointmentKeys using @FM
Appt = Get_Property(@Window : '.OLE_SCHEDULE', 'OLE.Appt[' : AppointmentKey : ']')
Flags = Appt<18>
Convert @SVM to @FM in Flags
Begin Case
Case Flags<1>
BackColor = 'LightCoral'
Case Flags<3>
BackColor = 'LightGray'
Case Otherwise$
BackColor = 'LightSteelBlue'
End Case
Appt<4> = BackColor
Appt<5> = 'Black'
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.Appt[' : AppointmentKey : ']', Appt)
Next AppointmentKey
end
SearchAppointmentKeys = ''
AppointmentList = Get_Property(@Window : '.OLE_SCHEDULE', 'OLE.AppointmentList')
AppointmentArray = SRP_Array('Rotate', AppointmentList, @FM, @VM)
AllAppointmentKeys = AppointmentArray<2>
For Each AppointmentKey in AllAppointmentKeys using @VM setting vPos
WorkOrderNo = Xlate('SCHED_DET_NG', AppointmentKey, 'WO_NO', 'X')
If WorkOrderNo EQ SearchWorkOrderNo then
SearchAppointmentKeys := AppointmentKey : @FM
end
Next AppointmentKey
SearchAppointmentKeys[-1, 1] = ''
For Each AppointmentKey in SearchAppointmentKeys using @FM
Appt = Get_Property(@Window : '.OLE_SCHEDULE', 'OLE.Appt[' : AppointmentKey : ']')
Flags = Appt<18>
Convert @SVM to @FM in Flags
Begin Case
Case Flags<1>
BackColor = 'LightCoral L=40'
Case Flags<3>
BackColor = 'LightGray L=40'
Case Otherwise$
BackColor = 'LightSteelBlue L=40'
End Case
Appt<4> = BackColor
Appt<5> = 'White'
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.Appt[' : AppointmentKey : ']', Appt)
Next AppointmentKey
Set_Property(@Window : '.OLE_SCHEDULE', '@SELECTED_KEYIDS', SearchAppointmentKeys)
Send_Message(@Window : '.OLE_SCHEDULE', 'OLE.EnsureVisible', SearchAppointmentKeys<1>)
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.SelAppt[' : SearchAppointmentKeys<1> : ']')
Set_Property(CtrlEntId, '@PREV_WORK_ORDER_NO', SearchWorkOrderNo)
Set_Property(@Window : '.EDL_EPI_PART_SEARCH', 'TEXT', '')
Set_Property(@Window, 'REDRAW', True$)
end
end event
Event EDL_EPI_PART_SEARCH.LOSTFOCUS(Flag, FocusID)
PrevEpiPartNo = Get_Property(CtrlEntId, '@PREV_EPI_PART_NO')
SearchEpiPartNo = Get_Property(CtrlEntId, 'TEXT')
If SearchEpiPartNo NE PrevEpiPartNo then
// Restore already selected appointments to their normal backcolor.
Set_Property(@Window, 'REDRAW', False$)
SearchAppointmentKeys = Get_Property(@Window : '.OLE_SCHEDULE', '@SELECTED_KEYIDS')
If SearchAppointmentKeys NE '' then
For Each AppointmentKey in SearchAppointmentKeys using @FM
Appt = Get_Property(@Window : '.OLE_SCHEDULE', 'OLE.Appt[' : AppointmentKey : ']')
Flags = Appt<18>
Convert @SVM to @FM in Flags
Begin Case
Case Flags<1>
BackColor = 'LightCoral'
Case Flags<3>
BackColor = 'LightGray'
Case Otherwise$
BackColor = 'LightSteelBlue'
End Case
Appt<4> = BackColor
Appt<5> = 'Black'
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.Appt[' : AppointmentKey : ']', Appt)
Next AppointmentKey
end
SearchAppointmentKeys = ''
AppointmentList = Get_Property(@Window : '.OLE_SCHEDULE', 'OLE.AppointmentList')
AppointmentArray = SRP_Array('Rotate', AppointmentList, @FM, @VM)
AllAppointmentKeys = AppointmentArray<2>
For Each AppointmentKey in AllAppointmentKeys using @VM setting vPos
WorkOrderNo = Xlate('SCHED_DET_NG', AppointmentKey, 'WO_NO', 'X')
EpiPartNo = Xlate('WO_LOG', WorkOrderNo, 'EPI_PART_NO', 'X')
If EpiPartNo EQ SearchEpiPartNo then
SearchAppointmentKeys := AppointmentKey : @FM
end
Next AppointmentKey
SearchAppointmentKeys[-1, 1] = ''
For Each AppointmentKey in SearchAppointmentKeys using @FM
Appt = Get_Property(@Window : '.OLE_SCHEDULE', 'OLE.Appt[' : AppointmentKey : ']')
Flags = Appt<18>
Convert @SVM to @FM in Flags
Begin Case
Case Flags<1>
BackColor = 'LightCoral L=40'
Case Flags<3>
BackColor = 'LightGray L=40'
Case Otherwise$
BackColor = 'LightSteelBlue L=40'
End Case
Appt<4> = BackColor
Appt<5> = 'White'
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.Appt[' : AppointmentKey : ']', Appt)
Next AppointmentKey
Set_Property(@Window : '.OLE_SCHEDULE', '@SELECTED_KEYIDS', SearchAppointmentKeys)
Send_Message(@Window : '.OLE_SCHEDULE', 'OLE.EnsureVisible', SearchAppointmentKeys<1>)
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.SelAppt[' : SearchAppointmentKeys<1> : ']')
Set_Property(CtrlEntId, '@PREV_EPI_PART_NO', SearchEpiPartNo)
Set_Property(@Window : '.EDL_WORK_ORDER_SEARCH', 'TEXT', '')
Set_Property(@Window, 'REDRAW', True$)
end
end event
Event OLE_SCHEDULE.OnApptDblClick(ApptID, Button, Shift, Ctrl)
PopupCtrl = @Window : '.OLE_POPUP'
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ True$ then GoSub DismissPopup
If Button EQ 'Left' then
SchedEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
WorkOrderNo = SchedEventRec<SCHED_DET_NG.WO_NO$>
EpiPartNo = Xlate('WO_LOG', WorkOrderNo, 'EPI_PART_NO', 'X')
ReactorNo = SchedEventRec<SCHED_DET_NG.REACT_NO$>
StartDate = Field(SchedEventRec<SCHED_DET_NG.START_DTM$>, '.', 1)
WOStepKey = WorkOrderNo : '*1'
ReactType = Xlate('REACTOR', ReactorNo, 'REACT_TYPE', 'X')
PopupId = Entid(@AppID<1>, 'POPUP', '', 'DAILY_SCHED_OPTS')
OverRide = ''
Display = Xlate('SYSREPOSPOPUPS', 'LSL2**DAILY_SCHED_OPTS', PDISPLAY$, 'X')
if MemberOf(@USER4, 'ENGINEERING') OR MemberOf(@USER4, 'SUPERVISOR') OR MemberOf(@USER4, 'LEAD') then ;* Added LEAD security group to allow asign supplements -dkk 12/5/14
* ADD OPTION TO ASSIGN SUPPLEMENTS
Display := @vm:'Assign Supplements':@tm:'SUPPLEMENTS'
end
OverRide<Pdisplay$> = Display
ChosenOpt = repository( 'EXECUTE', PopupId, @window, OverRide )
RdsKeys = ''
BEGIN CASE
CASE ChosenOpt = 'QUOTE'
IF security_check( 'Quote', Read$ ) THEN
WORec = XLATE('WO_LOG',WorkOrderNo,'','X')
OrderNo = WORec<WO_LOG_ORDER_NO$>
OrderItemNos = WORec<WO_LOG_ORDER_ITEM$>
QuoteNo = XLATE('ORDER_DET',OrderNo:'*':OrderItemNos<1,1>,1,'X')
Void = start_window( 'QUOTE2', @window, QuoteNo:'*CENTER', '', '' )
END ELSE
security_err_msg( 'Quote', Read$ )
END
CASE ChosenOpt = 'PSN'
IF security_check( 'Prod Spec', Read$ ) THEN
PSNId = XLATE('WO_STEP',WOStepKey,WO_STEP_PROD_SPEC_ID$,'X')
Void = start_window( 'PROD_SPEC', @window, PSNId:'*CENTER', '', '' )
END ELSE
security_err_msg( 'Prod Spec', Read$ )
END
CASE ChosenOpt = 'RECIPE'
if security_check( 'Recipe', Read$ ) then
PSN = XLATE('WO_STEP',WOStepKey,1,'X')
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$>
Void = start_window( 'RECIPE', @window, RecipeNo:'*CENTER', '', '' )
end else
security_err_msg( 'Recipe', Read$ )
end
CASE ChosenOpt = 'RDS'
if security_check( 'RDS', Read$ ) then
RDSKeys = Schedule_Services('GetEventRDSKeys', ApptID)
If RDSKeys NE '' then
SelRDSKeys = Dialog_Box('NDW_RDS_QUERY', @Window, RDSKeys)
IF SelRDSKeys NE '' THEN
Void = Start_Window( 'RDS', @window, SelRDSKeys:'*CENTER', '', '' )
END
end else
MsgStruct = ''
MsgStruct<MICON$> = '*' ; // Information icon
Msg(@Window, MsgStruct, 'OK', '', 'Scheduler':@FM:'RDS records for this work order event do not yet exist.')
end
end else
security_err_msg( 'RDS', Read$ )
end
CASE ChosenOpt = 'WO'
if security_check( 'WO Log', Read$ ) then
Start_Window('NDW_WO_LOG', @Window, WorkOrderNo)
end else
security_err_msg( 'WO Log', Read$ )
end
CASE ChosenOpt = 'WO_STAT'
PSN = XLATE('WO_STEP',WOStepKey,1,'X')
ReactorType = XLATE('PROD_SPEC',PSN,80,'X')
BEGIN CASE
CASE ReactorType = 'P' Or ReactorType = 'EPP'
obj_Appwindow('ViewRelated','WO_PROD_EPI':@RM:WOStepKey)
CASE ReactorType = 'GAN'
obj_Appwindow('ViewRelated','WO_PROD_GAN':@RM:WOStepKey)
CASE 1
obj_Appwindow('ViewRelated','WO_PROD':@RM:WOStepKey)
END CASE
case ChosenOpt = 'SUPPLEMENTS'
Void = rds_supplement_maint( WorkOrderNo )
case 1
Null
end case
end
end event
Event OLE_SCHEDULE.OnScheduleClick(EntityId, Button, Location, Point, Shift, Ctrl)
ContextMenu = ''
If MemberOf(@USER4, 'SCHEDULER_ADMIN') OR MemberOf(@USER4, 'SCHEDULER_MASTER') then
If Button EQ 'Right' AND Location EQ 'Entity' then
ContextMenu := 'ADD' : @VM : 'Add Work Order Events...' : @VM : 1 : @FM
ContextMenu := '' : @FM
ContextMenu := 'ADDBLOCK' : @VM : 'Add Block Out Events...' : @VM : 1 : @FM
end
end
If (@Station[1, 11] _EQC 'MESIRWAP001') OR (@Station[1, 9] _EQC 'MESSA01EC') then
If Button EQ 'Right' AND Location EQ 'Entity' then
If ContextMenu NE '' then
ContextMenu := '' : @FM
end
ContextMenu := 'ADJUSTREACTOR' : @VM : 'Auto Adjust Reactor ' : EntityId : @VM : 1 : @FM
ContextMenu := '' : @FM
ContextMenu := 'ADJUSTREACTORLOGONLY' : @VM : 'Auto Adjust Reactor ' : EntityId : ' (Log Only)' : @VM : 1 : @FM
ContextMenu := 'ADJUSTALLREACTORSLOGONLY' : @VM : 'Auto Adjust All Reactors (Log Only)' : @VM : 1 : @FM
end
end
If ContextMenu NE '' then
ContextMenu[-1, 1] = ''
X = Field(Point, ',', 1)
StartDTM = Send_Message(CtrlEntId, 'OLE.MapClientToTime', X, 1)
Send_Message(CtrlEntId, 'OLE.ShowContextMenu', Point, ContextMenu, EntityID : @VM : StartDTM)
end
end event
Event OLE_SCHEDULE.OnApptHover(ApptID, Point)
PopupCtrl = @Window : '.OLE_POPUP'
Set_Property(@Window, '@PREV_APPT_ID', ApptID)
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ False$ then GoSub DisplayPopup
end event
Event OLE_SCHEDULE.OnScheduleMouseMove(EntityId, ApptID, Location, Point, Shift, Ctrl)
PrevApptID = Get_Property(@Window, '@PREV_APPT_ID')
If ( (ApptID EQ '') or (ApptID NE PrevApptID) ) then
GoSub DismissPopup
end
end event
Event OLE_SCHEDULE.OnApptClick(ApptID, Button, Shift, Ctrl, Point)
Begin Case
Case Button EQ 'Left'
Null
Case Button EQ 'Right'
ScheduleDetail = Schedule_Services('GetScheduleDetail', ApptID)
ReactorNo = ScheduleDetail<SCHED_DET_NG.REACT_NO$>
WONo = ScheduleDetail<SCHED_DET_NG.WO_NO$>
ProcessedCass = ScheduleDetail<SCHED_DET_NG.PROCESSED_CASS$>
UnprocessedCass = ScheduleDetail<SCHED_DET_NG.UNPROCESSED_CASS$>
InProgress = (ProcessedCass NE '')
EligibleToStop = False$
EpiPro = (Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X') EQ 'EPP')
For each CassNo in UnprocessedCass using @VM setting vPos
WOMatKey = WONo:'*':CassNo
If EpiPro then
WMIKey = WONo:'*1*':CassNo
RDSNos = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X')
RDSNo = RDSNos<0, 25>
end else
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
end
DateIn = Xlate('RDS', RDSNo, 'DATE_IN', 'X')
If DateIn EQ '' then EligibleToStop = True$
Until EligibleToStop EQ True$
Next CassNo
ContextMenu = ''
If MemberOf(@USER4, 'SCHEDULER_ADMIN') OR MemberOf(@USER4, 'SCHEDULER_MASTER') then
BlockOut = ScheduleDetail<SCHED_DET_NG.BLOCK_OUT$>
If BlockOut then
ContextMenu := 'CANCELBLOCK' : @VM : 'Cancel Block Out Event...' : @VM : 1 : @FM
end else
WorkOrderNo = ScheduleDetail<SCHED_DET_NG.WO_NO$>
HotFlag = Xlate('WO_LOG', WONo, 'HOT_FLAG', 'X')
If HotFlag then
ContextMenu := 'REMOVE_HOT_FLAG' : @VM : 'Remove Hot Flag' : @VM : 1 : @FM
end else
ContextMenu := 'ADD_HOT_FLAG' : @VM : 'Add Hot Flag' : @VM : 1 : @FM
end
ContextMenu := '' : @FM
ContextMenu := 'ADD' : @VM : 'Add Work Order Events...' : @VM : 1 : @FM
ContextMenu := '' : @FM
ContextMenu := 'MODIFY' : @VM : 'Modify Work Order Event...' : @VM : 1 : @FM
ContextMenu := '' : @FM
If InProgress EQ True$ then
ContextMenu := 'STOP' : @VM : 'Stop Work Order Event...' : @VM : EligibleToStop : @FM
end else
ContextMenu := 'CANCEL' : @VM : 'Cancel Work Order Event...' : @VM : 1 : @FM
end
ContextMenu := '' : @FM
ContextMenu := 'ADDBLOCK' : @VM : 'Add Block Out Events...' : @VM : 1 : @FM
* ContextMenu := '' : @FM
* ContextMenu := 'FORCEADJUST' : @VM : 'Force Auto-Adjustment for ' : WorkOrderNo : @VM : 1 : @FM
If MemberOf(@USER4, 'SCHEDULER_MASTER') then
ContextMenu := '' : @FM
ContextMenu := 'REMOVEEVENT' : @VM : 'Remove This Work Order Event' : @VM : 1 : @FM
end
end
end
If ContextMenu NE '' then
ContextMenu[-1, 1] = ''
X = Field(Point, ',', 1)
DateTime = Send_Message(CtrlEntId, 'OLE.MapClientToTime', X, 1)
StartDate = DateTime[1, '.']
UserData = ''
UserData<0, 1> = ReactorNo
UserData<0, 2> = DateTime
UserData<0, 3> = ApptID
Send_Message(CtrlEntId, 'OLE.ShowContextMenu', Point, ContextMenu, UserData)
end
End Case
end event
Event OLE_SCHEDULE.OnContextMenuClick(Item, UserData)
PopupCtrl = @Window : '.OLE_POPUP'
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ True$ then GoSub DismissPopup
Convert @VM to @FM in UserData
ReactorNo = UserData<1>
SchedDTM = UserData<2>
ApptID = UserData<3>
RefreshWO = Xlate('SCHED_DET_NG', ApptID, 'WO_NO', 'X')
RemAppts = Xlate('REACTOR', ReactorNo, 'SCHED_EVENTS', 'X')
Swap @VM with @FM in RemAppts
Begin Case
Case Item EQ 'ADD_HOT_FLAG'
Work_Order_Services('SetHotFlag', RefreshWO, True$)
If Error_Services('NoError') then
ScheduleEventSummary = Schedule_Services('GetScheduleEventSummary', ApptID, False$)
Send_Message(CtrlEntID, 'OLE.RemoveAppts', ApptID)
ScheduleEvent = ReactorNo : @VM
ScheduleEvent := ApptID : @VM
ScheduleEvent := ScheduleEventSummary<SES_STARTDTM$> : @VM
ScheduleEvent := ScheduleEventSummary<SES_ENDDTM$> : @VM
ScheduleEvent := ScheduleEventSummary<SES_BACKCOLOR$> : ' L=' : 80 : @VM
ScheduleEvent := ScheduleEventSummary<SES_FORECOLOR$> : @VM
ScheduleEvent := ScheduleEventSummary<SES_TITLE$> : @VM
ScheduleEvent := ScheduleEventSummary<SES_DESCRIPTION$> : @VM
ScheduleEvent := @VM : @VM : @VM : @VM : @VM : @VM : @VM : @VM : @VM : @VM
ScheduleEvent := ScheduleEventSummary<SES_HOTLOTFLAG$> : @SVM : ScheduleEventSummary<SES_NOTEFLAG$> : @SVM : ScheduleEventSummary<SES_WOCLOSEDFLAG$> : @SVM : ScheduleEventSummary<SES_CURRENTFLAG$>
Send_Message(CtrlEntID, 'OLE.AddAppts', ScheduleEvent)
Send_Event('REACT_STATUS_EVEN', 'TIMER')
Send_Event('REACT_STATUS_ODD', 'TIMER')
WOLogVis = Get_Property('NDW_WO_LOG', 'VISIBLE')
If WOLogVis then
FormWONo = Get_Property('NDW_WO_LOG.EDL_WO_NO', 'TEXT')
If FormWONo EQ RefreshWO then Set_Property('NDW_WO_LOG.CHB_HOT_FLAG', 'CHECK', True$)
end
end else
Error_Services('DisplayError')
end
Case Item EQ 'REMOVE_HOT_FLAG'
Work_Order_Services('SetHotFlag', RefreshWO, False$)
If Error_Services('NoError') then
ScheduleEventSummary = Schedule_Services('GetScheduleEventSummary', ApptID, False$)
Send_Message(CtrlEntID, 'OLE.RemoveAppts', ApptID)
ScheduleEvent = ReactorNo : @VM
ScheduleEvent := ApptID : @VM
ScheduleEvent := ScheduleEventSummary<SES_STARTDTM$> : @VM
ScheduleEvent := ScheduleEventSummary<SES_ENDDTM$> : @VM
ScheduleEvent := ScheduleEventSummary<SES_BACKCOLOR$> : ' L=' : 80 : @VM
ScheduleEvent := ScheduleEventSummary<SES_FORECOLOR$> : @VM
ScheduleEvent := ScheduleEventSummary<SES_TITLE$> : @VM
ScheduleEvent := ScheduleEventSummary<SES_DESCRIPTION$> : @VM
ScheduleEvent := @VM : @VM : @VM : @VM : @VM : @VM : @VM : @VM : @VM : @VM
ScheduleEvent := ScheduleEventSummary<SES_HOTLOTFLAG$> : @SVM : ScheduleEventSummary<SES_NOTEFLAG$> : @SVM : ScheduleEventSummary<SES_WOCLOSEDFLAG$> : @SVM : ScheduleEventSummary<SES_CURRENTFLAG$>
Send_Message(CtrlEntID, 'OLE.AddAppts', ScheduleEvent)
Send_Event('REACT_STATUS_EVEN', 'TIMER')
Send_Event('REACT_STATUS_ODD', 'TIMER')
WOLogVis = Get_Property('NDW_WO_LOG', 'VISIBLE')
If WOLogVis then
FormWONo = Get_Property('NDW_WO_LOG.EDL_WO_NO', 'TEXT')
If FormWONo EQ RefreshWO then Set_Property('NDW_WO_LOG.CHB_HOT_FLAG', 'CHECK', False$)
end
end else
Error_Services('DisplayError')
end
Case Item EQ 'ADD'
AddEventDetails = Dialog_Box('NDW_SCHEDULER_ADD_WO', @Window, UserData)
If AddEventDetails NE '' then
Caption = 'Please wait...updating the schedule'
GoSub ShowWaitMessage
ReactorNo = AddEventDetails<1>
WorkOrder = AddEventDetails<2>
RefreshWO = WorkOrder
StartDTM = AddEventDetails<3>
StopDTM = AddEventDetails<4>
Description = AddEventDetails<5>
WaferQty = AddEventDetails<6>
NewApptID = Schedule_Services('AddSchedEvent', ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty)
NewAppt = Schedule_Services('GetScheduleEvent', NewApptID)
If Error_Services('NoError') then
GoSub RefreshReactor
If NewApptID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', NewApptID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec)
end
end else
Error_Services('DisplayError')
end
GoSub HideWaitMessage
end
Case Item EQ 'MODIFY'
ModifyEventDetails = Dialog_Box('NDW_SCHEDULER_MODIFY_WO', @Window, UserData)
If ModifyEventDetails NE '' then
Caption = 'Please wait...updating the schedule'
GoSub ShowWaitMessage
OrigRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
ReactorNo = ModifyEventDetails<1>
WorkOrder = ModifyEventDetails<2>
RefreshWO = WorkOrder
StartDTM = ModifyEventDetails<3>
StopDTM = ModifyEventDetails<4>
Description = ModifyEventDetails<5>
WaferQty = ModifyEventDetails<6>
Schedule_Services('ModifySchedEvent', ApptID, ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty)
If Error_Services('NoError') then
GoSub RefreshReactor
If ApptID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec, OrigRec)
end
end else
Error_Services('DisplayError')
end
GoSub HideWaitMessage
end
Case Item EQ 'STOP'
StopEventDetails = Dialog_Box('NDW_SCHEDULER_STOP_WO', @Window, UserData)
If StopEventDetails NE '' then
Caption = 'Please wait...updating the schedule'
GoSub ShowWaitMessage
OrigRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
ReactorNo = StopEventDetails<1>
WorkOrder = StopEventDetails<2>
RefreshWO = WorkOrder
StartDTM = StopEventDetails<3>
StopDTM = StopEventDetails<4>
Description = StopEventDetails<5>
WaferQty = StopEventDetails<6>
Schedule_Services('ModifySchedEvent', ApptID, ReactorNo, WorkOrder, StartDTM, StopDTM, Description, WaferQty)
If Error_Services('NoError') then
GoSub RefreshReactor
If ApptID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec, OrigRec)
end
end else
Error_Services('DisplayError')
end
GoSub HideWaitMessage
end
Case Item EQ 'CANCEL'
Response = Dialog_Box('NDW_SCHEDULER_CANCEL_WO', @Window, UserData)
If Response EQ 'Proceed' then
Caption = 'Please wait...updating the schedule'
GoSub ShowWaitMessage
OrigRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
Schedule_Services('CancelScheduleEvent', ApptID)
If Error_Services('NoError') then
GoSub RefreshReactor
If ApptID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec, OrigRec)
end
end else
Error_Services('DisplayError')
end
GoSub HideWaitMessage
end
Case Item EQ 'ADDBLOCK'
BlockEventDetails = Dialog_Box('NDW_SCHEDULER_ADD_BLOCK', @Window, UserData)
If BlockEventDetails NE '' then
Caption = 'Please wait...updating the schedule'
GoSub ShowWaitMessage
BlockReactorNo = BlockEventDetails<1>
BlockStartDTM = BlockEventDetails<2>
BlockStopDTM = BlockEventDetails<3>
BlockComment = BlockEventDetails<4>
BlockType = BlockEventDetails<5>
BlockOption = BlockEventDetails<6>
BlockId = Schedule_Services('AddBlockOutEvent', BlockReactorNo, BlockStartDTM, BlockStopDTM, BlockType, BlockComment, BlockOption)
If Error_Services('NoError') then
GoSub RefreshReactor
If BlockID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', BlockID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec)
end
end else
Error_Services('DisplayError')
end
GoSub HideWaitMessage
end
Case Item EQ 'CANCELBLOCK'
Response = Msg(@Window, MsgStruct, 'YESNO', '', 'Cancel Block Out' : @FM : 'Cancel block out event?')
If Response EQ True$ then
Caption = 'Please wait...updating the schedule'
GoSub ShowWaitMessage
OrigRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
ReactorNo = Xlate('SCHED_DET_NG', ApptID, 'REACT_NO', 'X')
UpdatedEvents = Schedule_Services('CancelScheduleEvent', ApptID, True$)
If Error_Services('NoError') then
GoSub RefreshReactor
If ApptID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec, OrigRec)
end
end else
Error_Services('DisplayError')
end
GoSub HideWaitMessage
end
Case Item EQ 'REMOVEEVENT'
Caption = 'Please wait...updating the schedule'
GoSub ShowWaitMessage
OrigRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
Schedule_Services('DeleteScheduleDetail', ApptID)
Send_Message(CtrlEntId, 'RemoveAppts', ApptID)
If Error_Services('NoError') then
GoSub RefreshReactor
If ApptID NE '' then
SchedRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
Schedule_Services('NotifySupervisorsIfSameDayChange', SchedRec, OrigRec)
end
end else
Error_Services('DisplayError')
end
GoSub HideWaitMessage
End Case
If ( (RefreshWO NE '') and (Item NE 'ADD_HOT_FLAG') and (Item NE 'REMOVE_HOT_FLAG') ) then
Work_Order_Services('UpdateUnscheduledQuantities', RefreshWO)
end
end event
Event OLE_SCHEDULE.OnDateChange(Date)
DateList = Get_Property(CtrlEntId, '@DATE_LIST')
ReloadStartDate = Date - 60
ReloadEndDate = Date + 60
ReloadWorkOrders = False$
For Date = ReloadStartDate to ReloadEndDate
Locate Date in DateList using @FM setting fPos else ReloadWorkOrders = True$
Until ReloadWorkOrders EQ True$
Next Date
If ReloadWorkOrders then
// The ShowWaitMessage gosub hides the schedule control and displays the picture contorl with the indicated caption.
Caption = 'Please wait...updating schedule'
GoSub ShowWaitMessage
// Update the work orders
AppointmentList = Schedule_Services('GetScheduleEvents', ReloadStartDate, ReloadEndDate)
Set_Property(@Window, '@APPT_LIST', AppointmentList)
Send_Message(CtrlEntId, 'OLE.AddAppts', AppointmentList)
// The SetScheduleFlags gosub loops through the AppointmentKeys array and parses the AppointmentFlags
// array for the ApptFlags property.
AppointmentArray = SRP_Array('Rotate', AppointmentList, @FM, @VM)
AppointmentKeys = AppointmentArray<2>
Convert @VM to @FM in AppointmentKeys
AppointmentFlags = AppointmentArray<19>
Convert @VM to @FM in AppointmentFlags
GoSub SetScheduleFlags
For Date = ReloadStartDate to ReloadEndDate
Locate Date in DateList using @FM setting fPos else
DateList = Insert(DateList, fPos, 0, 0, Date)
end
Next Date
Set_Property(CtrlEntId, '@DATE_LIST', DateList)
GoSub HideWaitMessage
end
end event
Event OLE_DATEPICKER.OnSelChange(FirstDate)
SelectedDate = Get_Property(CtrlEntId, 'OLE.Selection')
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.Date', SelectedDate)
Send_Event(@Window : '.OLE_SCHEDULE', 'OLE', 'OnDateChange', SelectedDate)
end event
Event OLE_TRE_REACTOR_FILTER_OPTIONS.OnItemCheck(Item, Checked)
Set_Property(@Window, 'REDRAW', False$)
FilterType = Get_Property(@Window : '.EDL_REACTOR_FILTER', 'TEXT')
FilterOptions = Get_Property(CtrlEntId, 'OLE.RootChildren')
ItemsChecked = ''
For Each FilterOption in FilterOptions using @FM setting fPos
If Get_Property(CtrlEntId, 'OLE.ItemChecked[' : FilterOption : ']') then
ItemsChecked := FilterOption : @FM
end
Next FilterOption
ItemsChecked[-1, 1] = ''
// Make sure all reactors are visible again.
EntityList = Get_Property(@Window : '.OLE_SCHEDULE', 'OLE.EntityList')
For Each Entity in EntityList using @FM
EntityID = Entity<0, 3>
If Not(Get_Property(@Window : '.OLE_SCHEDULE', 'OLE.EntityChecked[' : EntityID : ']')) then
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.EntityChecked[' : EntityID : ']', True$)
end
Next Entity
// Now apply the filter optons and hide those entities which should be hidden.
Reactors = Reactor_Services('GetReactors')
objReactors = ''
If SRP_JSON(objReactors, 'PARSE', Reactors) EQ '' then
objReactorArray = SRP_JSON(objReactors, 'GET', 'Reactors')
NumObjects = SRP_JSON(objReactorArray, 'GETCOUNT')
For ObjectCount = 1 to NumObjects
ReactorNo = SRP_JSON(objReactorArray, 'GETVALUE', '[' : ObjectCount : '].ReactorNumber')
Begin Case
Case FilterType _EQC 'Reactor Type'
Type = SRP_JSON(objReactorArray, 'GETVALUE', '[' : ObjectCount : '].TypeVerbose')
Locate Type in ItemsChecked using @FM setting fPos else
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.EntityChecked[' : ReactorNo : ']', False$)
end
Case FilterType _EQC 'Reactor Assignment'
AssignmentDescription = SRP_JSON(objReactorArray, 'GETVALUE', '[' : ObjectCount : '].AssignmentDescription')
Locate AssignmentDescription in ItemsChecked using @FM setting fPos else
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.EntityChecked[' : ReactorNo : ']', False$)
end
Case FilterType _EQC 'Cleanroom Area'
Location = SRP_JSON(objReactorArray, 'GETVALUE', '[' : ObjectCount : '].Location')
Locate Location in ItemsChecked using @FM setting fPos else
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.EntityChecked[' : ReactorNo : ']', False$)
end
Case FilterType _EQC 'Wafer Size'
WaferSize = SRP_JSON(objReactorArray, 'GETVALUE', '[' : ObjectCount : '].SusceptorSize')
Locate WaferSize in ItemsChecked using @FM setting fPos else
Set_Property(@Window : '.OLE_SCHEDULE', 'OLE.EntityChecked[' : ReactorNo : ']', False$)
end
Case FilterType _EQC 'Cleanroom Area'
Null
End Case
Next ObjectCount
SRP_JSON(objReactorArray, 'RELEASE')
end
SRP_JSON(objReactors, 'RELEASE')
Set_Property(@Window, 'REDRAW', True$)
end event
Event EDL_ASM_UTILIZATION.CHANGED(NewData)
OrigValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE')
CurrValue = Get_Property(CtrlEntId, 'DEFPROP')
If OrigValue NE CurrValue then
ButtonCtrl = CtrlEntId
Swap 'EDL' with 'OLE_PUB_UPDATE' in ButtonCtrl
Set_Property(ButtonCtrl, 'ENABLED', True$)
end
end event
Event EDL_ASM_PLUS_UTILIZATION.CHANGED(NewData)
OrigValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE')
CurrValue = Get_Property(CtrlEntId, 'DEFPROP')
If OrigValue NE CurrValue then
ButtonCtrl = CtrlEntId
Swap 'EDL' with 'OLE_PUB_UPDATE' in ButtonCtrl
Set_Property(ButtonCtrl, 'ENABLED', True$)
end
end event
Event EDL_HTR_UTILIZATION.CHANGED(NewData)
OrigValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE')
CurrValue = Get_Property(CtrlEntId, 'DEFPROP')
If OrigValue NE CurrValue then
ButtonCtrl = CtrlEntId
Swap 'EDL' with 'OLE_PUB_UPDATE' in ButtonCtrl
Set_Property(ButtonCtrl, 'ENABLED', True$)
end
end event
Event EDL_EPIPRO_UTILIZATION.CHANGED(NewData)
OrigValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE')
CurrValue = Get_Property(CtrlEntId, 'DEFPROP')
If OrigValue NE CurrValue then
ButtonCtrl = CtrlEntId
Swap 'EDL' with 'OLE_PUB_UPDATE' in ButtonCtrl
Set_Property(ButtonCtrl, 'ENABLED', True$)
end
end event
Event EDL_GAN_UTILIZATION.CHANGED(NewData)
OrigValue = Get_Property(CtrlEntId, 'GOTFOCUS_VALUE')
CurrValue = Get_Property(CtrlEntId, 'DEFPROP')
If OrigValue NE CurrValue then
ButtonCtrl = CtrlEntId
Swap 'EDL' with 'OLE_PUB_UPDATE' in ButtonCtrl
Set_Property(ButtonCtrl, 'ENABLED', True$)
end
end event
Event OLE_PUB_UPDATE_ASM_UTILIZATION.OnClick(Point, Button, Shift, Ctrl)
ASMUtil = Get_Property(@Window : '.EDL_ASM_UTILIZATION', 'INVALUE')
Epi_Part_Services('SetReactorUtilization', 'ASM', ASMUtil)
Set_Property(CtrlEntId, 'ENABLED', False$)
EditCtrl = CtrlEntId
Swap 'OLE_PUB_UPDATE' with 'EDL' in EditCtrl
Set_Property(EditCtrl, 'FOCUS', True$)
end event
Event OLE_PUB_UPDATE_ASM_PLUS_UTILIZATION.OnClick(Point, Button, Shift, Ctrl)
ASMPlusUtil = Get_Property(@Window : '.EDL_ASM_PLUS_UTILIZATION', 'INVALUE')
Epi_Part_Services('SetReactorUtilization', 'ASM+', ASMPlusUtil)
Set_Property(CtrlEntId, 'ENABLED', False$)
EditCtrl = CtrlEntId
Swap 'OLE_PUB_UPDATE' with 'EDL' in EditCtrl
Set_Property(EditCtrl, 'FOCUS', True$)
end event
Event OLE_PUB_UPDATE_HTR_UTILIZATION.OnClick(Point, Button, Shift, Ctrl)
HTRUtil = Get_Property(@Window : '.EDL_HTR_UTILIZATION', 'INVALUE')
Epi_Part_Services('SetReactorUtilization', 'HTR', HTRUtil)
Set_Property(CtrlEntId, 'ENABLED', False$)
EditCtrl = CtrlEntId
Swap 'OLE_PUB_UPDATE' with 'EDL' in EditCtrl
Set_Property(EditCtrl, 'FOCUS', True$)
end event
Event OLE_PUB_UPDATE_EPIPRO_UTILIZATION.OnClick(Point, Button, Shift, Ctrl)
EpiProUtil = Get_Property(@Window : '.EDL_EPIPRO_UTILIZATION', 'INVALUE')
Epi_Part_Services('SetReactorUtilization', 'EpiPro', EpiProUtil)
Set_Property(CtrlEntId, 'ENABLED', False$)
EditCtrl = CtrlEntId
Swap 'OLE_PUB_UPDATE' with 'EDL' in EditCtrl
Set_Property(EditCtrl, 'FOCUS', True$)
end event
Event OLE_PUB_UPDATE_GAN_UTILIZATION.OnClick(Point, Button, Shift, Ctrl)
GaNUtil = Get_Property(@Window : '.EDL_GAN_UTILIZATION', 'INVALUE')
Epi_Part_Services('SetReactorUtilization', 'GaN', GaNUtil)
Set_Property(CtrlEntId, 'ENABLED', False$)
EditCtrl = CtrlEntId
Swap 'OLE_PUB_UPDATE' with 'EDL' in EditCtrl
Set_Property(EditCtrl, 'FOCUS', True$)
end event
Event OLE_PUB_REFRESH_SCHEDULE.OnClick(Point, Button, Shift, Ctrl)
GoSub RefreshSchedule
end event
Event OLE_SUBCLASS.OnOptionClick(CtrlId)
Send_Event(CtrlId, 'OPTIONS')
end event
Event OLE_SUBCLASS.OnComboClick(CtrlId)
Send_Event(CtrlId, 'LOSTFOCUS')
end event
Event OLE_POPUP.OnItemClick(Item)
ApptID = Get_Property(CtrlEntId, '@APPTID')
SchedDetNGRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
WorkOrderNo = SchedDetNGRec<SCHED_DET_NG.WO_NO$>
EpiPartNo = Xlate('WO_LOG', WorkOrderNo, 'EPI_PART_NO', 'X')
ReactorNo = SchedDetNGRec<SCHED_DET_NG.REACT_NO$>
StartDate = Field(SchedDetNGRec<SCHED_DET_NG.START_DTM$>, '.', 1)
WOStepKey = WorkOrderNo : '*1'
// Item is the index value of the item being clicked on from the ItemList property.
PreviousItemArray = Get_Property(CtrlEntId, 'OLE.Item[' : Item - 1 : ']')
PreviousCaption = PreviousItemArray<2>
CurrentItemArray = Get_Property(CtrlEntId, 'OLE.Item[' : Item : ']')
CurrentCaption = CurrentItemArray<2>
GoSub DismissPopup
Begin Case
Case PreviousCaption _EQC 'Work Order:'
if security_check( 'WO Log', Read$ ) then
Void = start_window( 'NDW_WO_LOG', @window, WorkOrderNo, '', '' )
end else
security_err_msg( 'WO Log', Read$ )
end
Case PreviousCaption _EQC 'Epi Part:'
Void = start_window( 'EPI_PART', @window, EpiPartNo : '*CENTER', '', '' )
Case PreviousCaption _EQC 'PSN:'
IF security_check( 'Prod Spec', Read$ ) THEN
PSNId = XLATE('WO_STEP',WOStepKey,WO_STEP_PROD_SPEC_ID$,'X')
Void = start_window( 'PROD_SPEC', @window, PSNId:'*CENTER', '', '' )
END ELSE
security_err_msg( 'Prod Spec', Read$ )
END
Case PreviousCaption _EQC 'Recipe:'
if security_check( 'Recipe', Read$ ) then
PSN = XLATE('WO_STEP',WOStepKey,1,'X')
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$>
Void = start_window( 'RECIPE', @window, RecipeNo:'*CENTER', '', '' )
end else
security_err_msg( 'Recipe', Read$ )
end
Case PreviousCaption _EQC 'SCHED_DET Key:'
SchedDetKeyID = CurrentCaption
call SRP_Editor_Open('Record', 'SCHED_DET_NG' : @FM : SchedDetKeyID, 1)
End Case
end event
Event OLE_PUB_ZOOM_IN.OnClick(Point, Button, Shift, Ctrl)
PopupCtrl = @Window : '.OLE_POPUP'
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ True$ then GoSub DismissPopup
Ctrl = @Window : '.OLE_SCHEDULE'
IntervalSize = Get_Property(Ctrl, 'OLE.IntervalSize')
IntervalSize += 2
Set_Property(Ctrl, 'OLE.IntervalSize', IntervalSize) ; // Space (width) for each time increment (in pixels)
ZoomPercent = ((IntervalSize + 1) * 10):'%'
Set_Property(@Window:'.LBL_ZOOM_PERCENT', 'TEXT', ZoomPercent)
GoSub EnableZoomButtons
end event
Event OLE_PUB_ZOOM_OUT.OnClick(Point, Button, Shift, Ctrl)
PopupCtrl = @Window : '.OLE_POPUP'
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ True$ then GoSub DismissPopup
Ctrl = @Window : '.OLE_SCHEDULE'
IntervalSize = Get_Property(Ctrl, 'OLE.IntervalSize')
IntervalSize -= 2
Set_Property(Ctrl, 'OLE.IntervalSize', IntervalSize) ; // Space (width) for each time increment (in pixels)
ZoomPercent = ((IntervalSize + 1) * 10):'%'
Set_Property(@Window:'.LBL_ZOOM_PERCENT', 'TEXT', ZoomPercent)
GoSub EnableZoomButtons
end event
Event WINDOW.OMNIEVENT(Message, Param1, Param2, Param3, Param4)
If Message EQ 'RefreshSchedule' then
Sender = Param1
If Sender NE @User4 then
// Only update the schedule if someone else sent the update message (e.g. the auto-scheduler service).
PopupCtrl = @Window : '.OLE_POPUP'
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ True$ then GoSub DismissPopup
Caption = 'Please wait...refreshing schedule'
GoSub ShowWaitMessage
GoSub UpdateAppointmentList
GoSub HideWaitMessage
end
end
end event
Event WINDOW.INACTIVATED()
PopupCtrl = @Window : '.OLE_POPUP'
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ True$ then GoSub DismissPopup
end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Setup_OLE_Controls:
Ctrl = @Window : '.OLE_PICTURE'
Set_Property(Ctrl, 'OLE.BackgroundColor', 'Vertical(Gradient(LightSteelBlue L=90, LightSteelBlue L=80, 30%), Gradient(LightSteelBlue L=75, LightSteelBlue L=80), Border(LightSteelBlue L=50, LightSteelBlue L=50, LightSteelBlue L=50, LightSteelBlue L=50))')
Set_Property(Ctrl, 'OLE.Font', SystemTypeface$ : @SVM : 30 : @SVM : 700)
// The ShowWaitMessage gosub hides the schedule control and displays the picture contorl with the indicated caption.
Caption = 'Please wait...loading schedule'
GoSub ShowWaitMessage
Ctrl = @Window : '.OLE_SCHEDULE'
// Setup the inital date range during the 'Create'
StartDate = Date() - 120
EndDate = Date() + 120
DateList = ''
For Date = StartDate to EndDate
DateList := Date : @FM
Next Date
DateList[-1, 1] = ''
Set_Property(Ctrl, '@DATE_LIST', DateList)
Set_Property(Ctrl, 'OLE.Border', 'XP Flat')
Set_Property(Ctrl, 'OLE.View', 'MultiDayHorz') ; // Landscape mode
Set_Property(Ctrl, 'OLE.DateHeaderFormat', 'DDDD - mmm DD, YYYY')
Set_Property(Ctrl, 'OLE.CurrentTimeColor', 'Blue')
Set_Property(Ctrl, 'OLE.ShowCalendar', False$)
Set_Property(Ctrl, 'OLE.ShowTree', False$)
Set_Property(Ctrl, 'OLE.AllowLeadTime', False$)
Set_Property(Ctrl, 'OLE.AllowTrailTime', False$)
Set_Property(Ctrl, 'OLE.EnableLeadTrailDisplay', Trail$)
Set_Property(Ctrl, 'OLE.AppointmentMetrics', 4 : @FM : 4)
Set_Property(Ctrl, 'OLE.Interval', 60) ; // Number of minutes per interval
UserConfigKey = @User4:'*':@Window
UserConfigRec = Database_Services('ReadDataRow', 'USER_CONFIG', UserConfigKey)
If UserConfigRec NE '' then
Set_Property(@Window, '@USER_CONFIG_REC', UserConfigRec)
UserConfigProps = UserConfigRec<USER_CONFIG.PROPERTY$>
UserConfigVals = UserConfigRec<USER_CONFIG.VALUE$>
Locate 'IntervalSize' in UserConfigProps using @VM setting vPos then
IntervalSize = UserConfigVals<0, vPos>
ZoomPercent = ((IntervalSize + 1) * 10):'%'
Set_Property(@Window:'.LBL_ZOOM_PERCENT', 'TEXT', ZoomPercent)
end else
IntervalSize = 11
end
end else
IntervalSize = 11
end
Set_Property(Ctrl, 'OLE.IntervalSize', IntervalSize) ; // Space (width) for each time increment (in pixels)
Set_Property(Ctrl, 'OLE.TimeRange', 0 :@FM: 24 :@FM: 4) ; // <3> is hour display increment
// Setup the initial reactors list. This populates the EntityList variable.
GoSub GetReactorEntities
Set_Property(Ctrl, 'OLE.EntityList', EntityList)
Set_Property(Ctrl, 'OLE.AutoSize', 0)
Set_Property(Ctrl, 'OLE.EntitySize[All]', 75)
Set_Property(Ctrl, 'OLE.Date', Date()-1)
Layout = ''
Layout<1, 1> = 'APPTDATA'
Layout<1, 2> = 0 : @SVM : 0 : @SVM : -1 : @SVM : -1
Layout<1, 3> = 'NAME'
Layout<1, 4> = ''
Layout<1, 5> = 'Segoe UI' : @SVM : 9 : @SVM : 700
Layout<1, 6> = 'Center'
Layout<1, 7> = 'Center'
Layout<1, 8> = 0
Layout<1, 10> = 1
Layout<2, 1> = 'APPTDATA'
Layout<2, 2> = 0 : @SVM : 0 : @SVM : -1 : @SVM : -1
Layout<2, 3> = 'DESC'
Layout<2, 4> = ''
Layout<2, 6> = 'Center'
Layout<2, 7> = 'Bottom'
Layout<2, 8> = 1
Layout<2, 10> = 0
Layout<3, 1> = 'FLAGS'
Layout<3, 2> = 0 : @SVM : 0 : @SVM : -1 : @SVM : -1
Layout<3, 3> = 'bmps\scheduler.png'
Layout<3, 4> = 4 : @SVM : @SVM : 0
Layout<3, 6> = 'Right'
Layout<3, 7> = ''
Layout<3, 8> = ''
Layout<3, 10> = 0
Set_Property(Ctrl, 'OLE.Layout', Layout)
// The GetScheduleAppointments gosub populates the AppointmentList, AppointmentKeys, and AppointmentFlags variables.
GoSub GetScheduleAppointments
Set_Property(Ctrl, 'OLE.AppointmentList', AppointmentList)
// The SetScheduleFlags gosub loops through the AppointmentKeys array and parses the AppointmentFlags
// array for the ApptFlags property.
GoSub SetScheduleFlags
Qualify = ''
Qualify<1> = 1
Qualify<4> = 0
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnApptClick', Qualify)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnApptDblClick', Qualify)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnScheduleClick', Qualify)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', Qualify)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnApptHover', Qualify)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnScheduleMouseMove', Qualify)
Set_Property(Ctrl, "OLE.EnableMouseMoveEvent", True$)
Send_Message(@Window:'.OLE_PUB_ZOOM_IN', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
Send_Message(@Window:'.OLE_PUB_ZOOM_OUT', 'QUALIFY_EVENT', 'OLE.OnClick', Qualify)
Fonts = ''
Fonts<1> = 'Segoe UI' : @SVM : '10' ; // Column Hours
Fonts<2> = 'Segoe UI' : @SVM : '6' ; // Column Minutes
Fonts<3> = 'Segoe UI' : @SVM : '12' : @SVM : '700' ; // Reactor No
Fonts<4> = 'Segoe UI' : @SVM : '8' ; // Reactor Meta
Fonts<5> = 'Segoe UI' : @SVM : '12' : @SVM : '700' ; // Column Date and Day
Set_Property(Ctrl, 'OLE.ScheduleFonts', Fonts)
Qualify<4> = 1
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnDateChange', Qualify)
Qualify<4> = 0
GoSub HideWaitMessage
Ctrl = @Window : '.OLE_DATEPICKER'
Set_Property(Ctrl, 'OLE.Border', 'XP Flat')
Set_Property(Ctrl, 'OLE.Font', 'Segoe UI' : @SVM : '9')
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnSelChange', 1)
Ctrl = @Window : '.OLE_SUBCLASS'
EditLine = @Window : '.EDL_REACTOR_FILTER'
Set_Property(EditLine, 'TEXT', 'Reactor Type')
Post_Event(EditLine, 'LOSTFOCUS')
Handle = Get_Property(EditLine, 'HANDLE')
Send_Message(Ctrl, 'OLE.Subclass', Handle, EditLine)
EditLine = @Window : ';EDL_REACTOR_FILTER'
FilterTypes = 'Reactor Type' : @STM : 'Reactor Assignment' : @STM : 'Wafer Size' : @STM : 'Cleanroom Area'
Combo = ''
Combo<1> = 1
Combo<2, 1> = ''
Combo<2, 2> = 'L' : @STM : 'DYN'
Combo<2, 3> = FilterTypes
Combo<2, 4> = 1
Combo<2, 5> = 1
Combo<2, 6> = 0
Combo<2, 9> = 1
Combo<2,11> = 0
Set_Property(Ctrl, 'OLE.Combo[' : EditLine : ']', Combo)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnOptionClick', 1)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnComboClick', 1)
EditLine = @Window : '.EDL_WORK_ORDER_SEARCH'
Handle = Get_Property(EditLine, 'HANDLE')
Send_Message(Ctrl, 'OLE.Subclass', Handle, EditLine)
EditLine = @Window : ';EDL_WORK_ORDER_SEARCH'
ApptIDs = AppointmentArray<2>
WorkOrders = Xlate('SCHED_DET_NG', ApptIDs, 'WO_NO', 'X')
Convert @VM to @FM in WorkOrders
Convert '*' to @VM in WorkOrders
WorkOrders = SRP_Array('Rotate', WorkOrders, @FM, @VM)
WorkOrders = WorkOrders<1>
Convert @VM to @FM in WorkOrders
WorkOrders = SRP_Array('Clean', WorkOrders, 'TrimAndMakeUnique', @FM)
WorkOrders = SRP_Array('SortRows', WorkOrders, 'AR1', 'LIST', @FM, @VM)
Convert @FM to @STM in WorkOrders
Combo = ''
Combo<1> = 1
Combo<2, 1> = ''
Combo<2, 2> = 'L' : @STM : 'DYN'
Combo<2, 3> = WorkOrders
Combo<2, 4> = 1
Combo<2, 5> = 1
Combo<2, 6> = 0
Combo<2, 9> = 1
Combo<2,10> = 0
Combo<2,11> = 0
Set_Property(Ctrl, 'OLE.Combo[' : EditLine : ']', Combo)
EditLine = @Window : '.EDL_EPI_PART_SEARCH'
Handle = Get_Property(EditLine, 'HANDLE')
Send_Message(Ctrl, 'OLE.Subclass', Handle, EditLine)
EditLine = @Window : ';EDL_EPI_PART_SEARCH'
Convert @STM to @VM in WorkOrders
EpiParts = Xlate('WO_LOG', WorkOrders, 'EPI_PART_NO', 'X')
Convert @VM to @FM in EpiParts
Convert '*' to @VM in EpiParts
EpiParts = SRP_Array('Rotate', EpiParts, @FM, @VM)
Convert @VM to @FM in EpiParts
EpiParts = SRP_Array('Clean', EpiParts, 'TrimAndMakeUnique', @FM)
OSWrite EpiParts to 'E:\apps\Temp\TEMP\EpiParts.txt'
EpiParts = SRP_Array('SortRows', EpiParts, 'AR1', 'LIST', @FM, @VM)
Convert @FM to @STM in EpiParts
Combo = ''
Combo<1> = 1
Combo<2, 1> = ''
Combo<2, 2> = 'L' : @STM : 'DYN'
Combo<2, 3> = EpiParts
Combo<2, 4> = 1
Combo<2, 5> = 1
Combo<2, 6> = 0
Combo<2, 9> = 1
Combo<2,10> = 0
Combo<2,11> = 0
Set_Property(Ctrl, 'OLE.Combo[' : EditLine : ']', Combo)
Ctrl = @Window : '.OLE_TRE_REACTOR_FILTER_OPTIONS'
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnItemCheck', 1)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnApptDblClick', 1)
Ctrls = 'OLE_PUB_UPDATE_ASM_UTILIZATION,OLE_PUB_UPDATE_ASM_PLUS_UTILIZATION,OLE_PUB_UPDATE_HTR_UTILIZATION,OLE_PUB_UPDATE_EPIPRO_UTILIZATION,OLE_PUB_UPDATE_GAN_UTILIZATION'
For Each ButtonCtrl in Ctrls using ','
Ctrl = @Window : '.' : ButtonCtrl
Set_Property(Ctrl, 'OLE.Icon', '.\BMPS\Save.png')
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', 1)
Next ButtonCtrl
Ctrl = @Window : '.OLE_PUB_REFRESH_SCHEDULE'
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnClick', 1)
Ctrl = @Window : '.OLE_POPUP'
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnItemClick', 1)
Send_Message(Ctrl, 'QUALIFY_EVENT', 'OLE.OnHide', 1)
GoSub EnableZoomButtons
return
DisplayPopup:
Utility('CURSOR', 'H')
Set_Property(PopupCtrl, '@APPTID', ApptID)
Appt = Get_Property(CtrlEntID, 'OLE.Appt[' : ApptID : ']')
HoverData = ''
BackColor = 'LightSteelBlue'; //Appt<4> ; // Use the same BackColor of the current appointment as the base.
EventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', ApptID)
WorkOrderNo = EventRec<SCHED_DET_NG.WO_NO$>;
EpiPartNo = Xlate('WO_LOG', WorkOrderNo, 'EPI_PART_NO', 'X')
ReactorNo = EventRec<SCHED_DET_NG.REACT_NO$>
Date = EventRec<SCHED_DET_NG.START_DTM$>
Sequence = ''
Summary = Schedule_Services('GetScheduleEventSummary', ApptID, True$)
BlockOut = Summary<SES_BLOCK_OUT$>
If BlockOut then
HoverData := 'Reactor:' : @VM : ReactorNo : @FM
HoverData := 'Type:' : @VM : Summary<SES_TYPE$> : @FM
HoverData := 'Block Type: ' : @VM : Summary<SES_BLOCK_TYPE$> :@FM
HoverData := 'Start Date:' : @VM : OConv(Summary<SES_STARTDTM$>, 'DT/^3H') : @FM
HoverData := 'End Date:' : @VM : OConv(Summary<SES_ENDDTM$>, 'DT/^3H') : @FM
HoverData := 'Total Days:' : @VM : Summary<SES_TOTALDAYS$>
end else
HoverData := 'Reactor:' : @VM : ReactorNo : @FM
HoverData := 'Type:' : @VM : Summary<SES_TYPE$> : @FM
HoverData := 'Susceptor:' : @VM : Summary<SES_SUSCEPTOR$> : @FM
HoverData := 'Work Order:' : @VM : WorkOrderNo : @FM
HoverData := 'Customer:' : @VM : Summary<SES_CUSTNAMESHORT$> : @FM
HoverData := 'Epi Part:' : @VM : EpiPartNo : @FM
HoverData := 'PSN:' : @VM : Summary<SES_PSN$> : @FM
HoverData := 'Recipe:' : @VM : Summary<SES_RECIPE$> : @FM
HoverData := 'Start Date:' : @VM : OConv(Summary<SES_STARTDTM$>, 'DT/^3H') : @FM
HoverData := 'End Date:' : @VM : OConv(Summary<SES_ENDDTM$>, 'DT/^3H') : @FM
HoverData := 'Total Days:' : @VM : Summary<SES_TOTALDAYS$> : @FM
HoverData := 'Total Wafers:' : @VM : Summary<SES_TOTALWAFERS$> : @FM
HoverData := 'Remaining Wafers:' : @VM : Summary<SES_REMAINING$> : @FM
HoverData := 'Complete:' : @VM : Summary<SES_COMPLETE$>
end
Note = Summary<SES_DESCRIPTION$>
If Note NE '' then
HoverData := @FM : 'Note:' : @VM : Summary<SES_DESCRIPTION$>
end
If MemberOf(@USER4, 'OI_ADMIN') then
HoverData := @FM : 'SCHED_DET Key:' : @VM : ApptID
end
BackColor := ' L=40'
NumLines = DCount(HoverData, @FM)
ForeColor = 'White'
Linkcolor = 'LightGray'
// Calculate the size and position of the popup. By default it will appear to the right of the
// appointment (order), but if it will display off the screen then move it to the left.
DesktopWidth = Get_Property('SYSTEM', 'SIZE')<1>
DesktopHeight = Get_Property('SYSTEM', 'SIZE')<2>
WindowOffsetX = Get_Property(@Window, 'SIZE')<1>
WindowOffsetY = Get_Property(@Window, 'SIZE')<2>
ApptRect = Get_Property(CtrlEntId, 'OLE.ApptRect[' : ApptId : ']')
RectLeft = ApptRect<1>
RectTop = ApptRect<2>
RectRight = ApptRect<3>
RectBottom = ApptRect<4>
If BlockOut then
ItemWidth = 260
end else
ItemWidth = 300
end
PopupWidth = ItemWidth + 4 + 30
ItemHeight = 20
PopupHeight = NumLines * ItemHeight + 14
MouseX = Field(Point, ',', 1)
MouseY = Field(Point, ',', 2)
ApptHCenter = RectTop + ((RectBottom - RectTop) / 2)
ApptVCenter = RectLeft + ((RectRight - RectLeft) / 2)
ItemMargin = 12
YItemMargin = 0
Begin Case
Case ( (MouseY + PopupHeight) GT DesktopHeight)
// SRP Popup will fit if displayed on the top
TailPosition = 'Bottom'
PopupHeight = NumLines * ItemHeight + 30
PopupWidth -= 13
PopupX = MouseX - (PopupWidth / 2)
PopupY = MouseY - PopupHeight
Case ( ( (MouseX + PopupWidth) LE DesktopWidth) and ( (MouseY - PopupHeight) GT 0) )
// SRP Popup will fit if displayed on the right
TailPosition = 'Left'
ItemMargin = 28
PopupX = MouseX + 10
PopupY = (MouseY - (PopupHeight / '2.1') )
PopupWidth += 18
Case ( (MouseX + PopupWidth) GT DesktopWidth)
// SRP Popup will fit if displayed on the left
TailPosition = 'Right'
PopupWidth += 4
PopupX = MouseX - PopupWidth
PopupY = (MouseY - (PopupHeight / '2.1') )
Case Otherwise$
// SRP Popup will fit if displayed on the bottom
TailPosition = 'Top'
PopupWidth -= 12
PopupHeight = NumLines * ItemHeight + 50
PopupX = MouseX - (PopupWidth / 2)
PopupY = MouseY
YItemMargin = 20
End Case
ItemList = ''
If HoverData NE '' then
For Each Item in HoverData using @FM setting ItemCnt
// Add the label.
Label = Item<0, 1>
If BlockOut then
ItemList := ItemMargin : @SVM : 5 + (ItemCnt - 1) * ItemHeight + YItemMargin : @SVM : ItemWidth * (2/5) : @SVM : ItemHeight : @VM
end else
ItemList := ItemMargin : @SVM : 5 + (ItemCnt - 1) * ItemHeight + YItemMargin : @SVM : ItemWidth * (9/20) : @SVM : ItemHeight : @VM
end
ItemList := Label : @VM
ItemList := Forecolor : @VM
ItemList := '' : @SVM : '' : @SVM : '700' : @SVM : '0' : @SVM : '0' : @VM
ItemList := 'Left' : @SVM : 'Center' : @VM
ItemList := @FM
// Add the value.
Value = Item<0, 2>
If BlockOut then
ItemList := ItemMargin + (ItemWidth * (2/5)) : @SVM : 5 + (ItemCnt - 1) * ItemHeight + YItemMargin : @SVM : ItemWidth * (3/5) : @SVM : ItemHeight : @VM
end else
ItemList := ItemMargin + (ItemWidth * (9/20)) : @SVM : 5 + (ItemCnt - 1) * ItemHeight + YItemMargin : @SVM : ItemWidth * (11/20) : @SVM : ItemHeight : @VM
end
ItemList := Value : @VM
If Label _EQC 'Work Order:' OR Label _EQC 'Epi Part:' OR Label _EQC 'PSN:' OR Label _EQC 'Recipe:' OR Label _EQC 'SCHED_DET Key:' then
ItemList := Linkcolor : @VM
end else
ItemList := Forecolor : @VM
end
If Label _EQC 'Work Order:' OR Label _EQC 'Epi Part:' OR Label _EQC 'PSN:' OR Label _EQC 'Recipe:' OR Label _EQC 'SCHED_DET Key:' then
ItemList := '' : @SVM : '' : @SVM : '700' : @SVM : '0' : @SVM : '1' : @VM
end else
ItemList := '' : @SVM : '' : @SVM : '700' : @SVM : '0' : @SVM : '0' : @VM
end
ItemList := 'Left' : @SVM : 'Center' : @VM
If Label _EQC 'Work Order:' OR Label _EQC 'Epi Part:' OR Label _EQC 'PSN:' OR Label _EQC 'Recipe:' OR Label _EQC 'SCHED_DET Key:' then
ItemList := True$ : @VM : False$ : @VM
end
ItemList := @FM
Next Item
ItemList[-1, 1] = ''
end
Set_Property(PopupCtrl, 'OLE.Theme', 'Custom')
Set_Property(PopupCtrl, 'OLE.Opacity', 255)
Set_Property(PopupCtrl, 'OLE.Animation', 'N')
Set_Property(PopupCtrl, 'OLE.Background', 'Vertical(Gradient(' : Backcolor : ', ' : Backcolor : '), Border(' : Backcolor : ' L=20))' : @FM : 'None' : @FM : 'None')
Set_Property(PopupCtrl, 'OLE.ItemList', ItemList)
Set_Property(PopupCtrl, 'OLE.ShowDelay', 0)
Set_Property(PopupCtrl, 'OLE.Size', 0 : @FM : 0 : @FM : PopupWidth : @FM : PopupHeight)
// This identifies the position of the tail. Options are:
// Left, Top, Right, Bottom
Set_Property(PopupCtrl, 'OLE.Pointer', TailPosition)
Utility('CURSOR', 'A')
// This tells the popup to appear at the designated X and Y coordinates which
// have been calculated above based on the relative location of the order.
Send_Message(PopupCtrl, 'OLE.ShowAt', PopupX, PopupY)
return
DismissPopup:
PopupCtrl = @Window : '.OLE_POPUP'
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ True$ then
Send_Message(PopupCtrl, 'OLE.Close')
Set_Property(@Window, '@PREV_APPT_ID', '')
end
return
ShowWaitMessage:
Set_Property(@Window : '.OLE_PICTURE', 'OLE.Caption', Caption)
Set_Property(@Window : '.OLE_PICTURE', 'VISIBLE', 1)
Set_Property(@Window : '.OLE_SCHEDULE', 'VISIBLE', 0)
* Set_Property(@Window, 'REDRAW', 0)
return
HideWaitMessage:
Set_Property(@Window : '.OLE_SCHEDULE', 'VISIBLE', 1)
Set_Property(@Window : '.OLE_PICTURE', 'OLE.Caption', '')
Set_Property(@Window : '.OLE_PICTURE', 'VISIBLE', 0)
return
GetScheduleAppointments:
Ctrl = @Window : '.OLE_SCHEDULE'
AppointmentList = ''
AppointmentKeys = ''
AppointmentFlags = ''
StartDate = Date() - 160
EndDate = Date() + 160
AppointmentList = Schedule_Services('GetScheduleEvents', StartDate, EndDate)
Set_Property(@Window, '@APPT_LIST', AppointmentList)
AppointmentArray = SRP_Array('Rotate', AppointmentList, @FM, @VM)
AppointmentKeys = AppointmentArray<2>
Convert @VM to @FM in AppointmentKeys
AppointmentFlags = AppointmentArray<19>
Convert @VM to @FM in AppointmentFlags
DateList = Get_Property(@Window, '@DATE_LIST')
For Date = StartDate to EndDate
Locate Date in DateList using @FM setting fPos else
DateList = Insert(DateList, fPos, 0, 0, Date)
end
Next Date
Set_Property(CtrlEntId, '@DATE_LIST', DateList)
return
SetScheduleFlags:
Ctrl = @Window : '.OLE_SCHEDULE'
For Each AppointmentKey in AppointmentKeys using @FM setting fPos
Flags = AppointmentFlags<fPos>
If Sum(Flags) GT 0 then
Convert @SVM to @FM in Flags
Set_Property(Ctrl, 'OLE.ApptFlags[' : AppointmentKey : ']', Flags)
end
Next AppointmentKey
return
GetReactorEntities:
Ctrl = @Window : '.OLE_SCHEDULE'
If Memory_Services('IsValueCurrent', Ctrl : '*EntityList', 3600, True$) then
EntityList = Memory_Services('GetValue', Ctrl : '*EntityList')
end else
EntityList = ''
Reactors = Reactor_Services('GetReactors')
If SRP_JSON(objReactors, 'PARSE', Reactors) EQ '' then
objReactorArray = SRP_JSON(objReactors, 'GET', 'Reactors')
objReactorList = SRP_JSON(objReactorArray, 'GETELEMENTS')
For Each objReactor in objReactorList using @FM
ReactorNo = SRP_JSON(objReactor, 'GETVALUE', 'ReactorNumber')
Type = SRP_JSON(objReactor, 'GETVALUE', 'TypeVerbose')
Size = SRP_JSON(objReactor, 'GETVALUE', 'SusceptorSize')
Assignment = SRP_JSON(objReactor, 'GETVALUE', 'AssignmentCode')
SecondChamber = SRP_JSON(objReactor, 'GETVALUE', 'SecondChamber')
PickPlace = SRP_JSON(objReactor, 'GETVALUE', 'PickPlace')
NotRepairable = SRP_JSON(objReactor, 'GETVALUE', 'NotRepairable')
EpiPro = (Type EQ 'EpiPro')
Begin Case
Case Assignment EQ 'G'
// GaN
Background = 'SkyBlue'
Case Assignment EQ 'O'
// Out-of-Service
Background = 'Silver'
Case Not(NotRepairable)
Background = 'LightGreen'
Case NotRepairable
Background = LTORANGE$
Case Otherwise$
Background = 'Silver'
End Case
If (Type NE 'EpiPro') OR (SecondChamber NE '') then
EntityName = ReactorNo
If SecondChamber NE '' then EntityName := '/' : SecondChamber
EntityList := 'ENT' : @VM : 1 : @VM : ReactorNo : @VM : EntityName : @VM : Type : CRLF$ : Size : @VM : 'Black' : @VM : Background : @FM
end
SRP_JSON(objReactor, 'RELEASE')
Next objReactor
EntityList[-1, 1] = ''
SRP_JSON(objReactorArray, 'RELEASE')
end
SRP_JSON(objReactors, 'RELEASE')
Memory_Services('SetValue', Ctrl : '*EntityList', EntityList)
end
return
ParseScheduleEvent:
If Assigned(objScheduleEvent) else objScheduleEvent = ''
If objScheduleEvent EQ '' then
SRP_JSON(objScheduleEvent, 'PARSE', ScheduleEvent)
end
If objScheduleEvent GT 0 then
ReactorNo = SRP_JSON(objScheduleEvent, 'GETVALUE', 'Reactor.ReactorNumber')
ReactorType = SRP_JSON(objScheduleEvent, 'GETVALUE', 'Reactor.Type')
SusceptorSize = SRP_JSON(objScheduleEvent, 'GETVALUE', 'Reactor.SusceptorSize')
ScheduleDate = SRP_JSON(objScheduleEvent, 'GETVALUE', 'ScheduleDate')
ScheduleDate = Iconv(ScheduleDate, 'D')
Sequence = SRP_JSON(objScheduleEvent, 'GETVALUE', 'Sequence')
BackColor = SRP_JSON(objScheduleEvent, 'GETVALUE', 'BackColor')
ForeColor = SRP_JSON(objScheduleEvent, 'GETVALUE', 'ForeColor')
ModifiedDTM = SRP_JSON(objScheduleEvent, 'GETVALUE', 'ModifiedDTM')
BlockOut = Iconv(SRP_JSON(objScheduleEvent, 'GETVALUE', 'BlockOut'), 'BYes,No')
BlockOutType = SRP_JSON(objScheduleEvent, 'GETVALUE', 'BlockOutType')
Description = SRP_JSON(objScheduleEvent, 'GETVALUE', 'Note')
objWorkOrder = SRP_JSON(objScheduleEvent, 'GET', 'WorkOrder')
WorkOrderNo = SRP_JSON(objWorkOrder, 'GETVALUE', 'WorkOrderNumber')
EpiPartNo = SRP_JSON(objWorkOrder, 'GETVALUE', 'EpiPartNumber')
PSN = SRP_JSON(objWorkOrder, 'GETVALUE', 'PSN')
Recipe = SRP_JSON(objWorkOrder, 'GETVALUE', 'Recipe')
HotLot = Iconv(SRP_JSON(objWorkOrder, 'GETVALUE', 'HotLot'), 'BYes,No')
Closed = Iconv(SRP_JSON(objWorkOrder, 'GETVALUE', 'Closed'), 'BYes,No')
CustNameShort = SRP_JSON(objWorkOrder, 'GETVALUE', 'Company.NameShort')
SRP_JSON(objWorkOrder, 'RELEASE')
If BackColor EQ '' then
Begin Case
Case BackColor NE ''
// Set in the schedule detail record. Use current color.
Case HotLot
BackColor = 'LightCoral'
Case Closed
BackColor = 'LightGray'
Case BlockOut
BackColor = 'Plum'
Case Otherwise$
BackColor = 'LightSteelBlue'
End Case
end
Current = False$ ; // Assume false for now.
If (ScheduleDate GE Date()) then
If (ModifiedDTM NE '') then
CurrentDTM = Iconv(Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTH'), 'DTM')
ElapseTime = (CurrentDTM - ModifiedDTM) * 24
IF (ElapseTime LE 12) then
CurrentFlag = True$
end
end
end
If ForeColor EQ '' then ForeColor = 'Black'
FirstSchedDetKeyID = SRP_JSON(objScheduleEvent, 'GETVALUE', 'FirstSchedDetKeyID')
FirstReactorNo = FirstSchedDetKeyID[1, '*']
FirstScheduleDate = Oconv(FirstSchedDetKeyID[Col2() + 1, '*'], 'D4/')
LastSchedDetKeyID = SRP_JSON(objScheduleEvent, 'GETVALUE', 'LastSchedDetKeyID')
LastReactorNo = LastSchedDetKeyID[1, '*']
LastScheduleDate = Oconv(LastSchedDetKeyID[Col2() + 1, '*'], 'D4/')
TotalScheduledDays = SRP_JSON(objScheduleEvent, 'GETVALUE', 'TotalScheduledDays')
TotalWafers = SRP_JSON(objScheduleEvent, 'GETVALUE', 'WorkOrder.TotalWafers')
WafersRemaining = SRP_JSON(objScheduleEvent, 'GETVALUE', 'WorkOrder.WafersRemaining')
PercentComplete = SRP_JSON(objScheduleEvent, 'GETVALUE', 'WorkOrder.PercentComplete')
ScheduleEvent = SRP_JSON(objScheduleEvent, 'STRINGIFY', 'FAST')
SRP_JSON(objScheduleEvent, 'RELEASE')
end
return
EnableZoomButtons:
Ctrl = @Window : '.OLE_SCHEDULE'
IntervalSize = Get_Property(Ctrl, 'OLE.IntervalSize')
Set_Property(@Window:'.OLE_PUB_ZOOM_OUT', 'ENABLED', (IntervalSize GT 9))
Set_Property(@Window:'.LBL_ZOOM_OUT', 'ENABLED', (IntervalSize GT 9))
Set_Property(@Window:'.OLE_PUB_ZOOM_IN', 'ENABLED', (IntervalSize LT 29))
Set_Property(@Window:'.LBL_ZOOM_IN', 'ENABLED', (IntervalSize LT 29))
return
UpdateAppointmentList:
Ctrl = @Window : '.OLE_SCHEDULE'
CurrApptList = Get_Property(Ctrl, 'OLE.AppointmentList')
CurrApptArray = SRP_Array('Rotate', CurrApptList, @FM, @VM)
CurrApptKeys = CurrApptArray<2>
Convert @VM to @FM in CurrApptKeys
// Remove all appointments in the schedule control
Send_Message(Ctrl, 'OLE.RemoveAppts', CurrApptKeys)
GoSub GetScheduleAppointments
// Populate the schedule control with the the new list
Send_Message(Ctrl, 'OLE.AddAppts', AppointmentList)
GoSub SetScheduleFlags
return
RefreshReactor:
Ctrl = @Window : '.OLE_SCHEDULE'
Caption = 'Please wait...updating the schedule'
GoSub ShowWaitMessage
Set_Property(Ctrl, "OLE.Redraw", False$)
If RemAppts NE '' then Send_Message(Ctrl, 'RemoveAppts', RemAppts)
Schedule_Services('AdjustScheduleEvents', ReactorNo)
ReactEventKeys = Xlate('REACTOR', ReactorNo, 'SCHED_EVENTS', 'X')
Swap @VM with @FM in ReactEventKeys
AddAppts = ''
For each EventKey in ReactEventKeys using @FM setting fPos
AddAppts<fPos> = Schedule_Services('GetScheduleEvent', EventKey)
Next EventKey
If AddAppts NE '' then Send_Message(Ctrl, 'AddAppts', AddAppts)
Set_Property(Ctrl, "OLE.Redraw", True$)
GoSub HideWaitMessage
return
RefreshSchedule:
// The ShowWaitMessage gosub hides the schedule control and displays the picture control with the indicated caption.
PopupCtrl = @Window : '.OLE_POPUP'
PopupVisible = Get_Property(PopupCtrl, 'OLE.Visible')
If PopupVisible EQ True$ then GoSub DismissPopup
Caption = 'Please wait...refreshing schedule'
GoSub ShowWaitMessage
GoSub UpdateAppointmentList
GoSub HideWaitMessage
Return