1957 lines
		
	
	
		
			74 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
| 
 | |
| 
 | |
| 
 |