557 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			557 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| Compile function NDW_GAN_INBOUND_MATERIAL_EVENTS(CtrlEntId, Event, @PARAMS)
 | |
| /***********************************************************************************************************************
 | |
| 
 | |
|     Name        :   NDW_GAN_INBOUND_MATERIAL_EVENTS
 | |
| 
 | |
|     Description :   Commuter module for the NDW_GAN_INBOUND_MATERIAL form.
 | |
| 
 | |
|     Notes       :   Application errors should be logged using the Error Services module. There are a few methodological
 | |
|                     assumptions built into way errors are managed which are important to understand in order to properly
 | |
|                     work with Error Services:
 | |
| 
 | |
|                     - The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
 | |
|                       the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
 | |
|                       this will appear backwards since the originating procedure always appears at the bottom of the
 | |
|                       list and the current routine appears at the top of the list. We are using this orientation because
 | |
|                       it is common to refer to the process of calling other procedures as 'drilling down'.
 | |
| 
 | |
|                     - The reason for defining the orientation of the call stack is because Error_Services allows for
 | |
|                       multiple error conditions to be appended to an original error. In most cases this will happen when
 | |
|                       a procedure at the bottom of the stack generates an error condition and then returns to its
 | |
|                       calling procedure. This higher level procedure can optionally add more information relevant to
 | |
|                       itself. This continues as the call stack 'bubbles' its way back to the top to where the
 | |
|                       originating procedure is waiting.
 | |
| 
 | |
|                     - Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
 | |
|                       preserve their error state until explicitly cleared. This can hinder the normal execution of code
 | |
|                       since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
 | |
|                       Our philosophy is that error conditions should automatically be cleared before a new procedure
 | |
|                       is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
 | |
|                       automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
 | |
|                       philosophy then it should include a call into the 'Clear' service request at the top of the
 | |
|                       program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
 | |
| 
 | |
|                     - Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
 | |
|                       error conditions that were set before.
 | |
| 
 | |
|     Parameters  :
 | |
|         Service         [in] -- Name of the service being requested
 | |
|         Param1-10   [in/out] -- Additional request parameter holders
 | |
|         Response       [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
 | |
| 
 | |
|     Metadata    :
 | |
| 
 | |
|     History     :   (Date, Initials, Notes)
 | |
|         01/24/20    djs     Original programmer.
 | |
| 
 | |
| ***********************************************************************************************************************/
 | |
| #pragma precomp SRP_PreCompiler
 | |
| #window NDW_GAN_INBOUND_MATERIAL
 | |
| 
 | |
| $Insert APP_INSERTS
 | |
| $Insert EVENT_SETUP
 | |
| $Insert WO_MAT_WFR_EQUATES
 | |
| $Insert REACT_RUN_EQUATES
 | |
| $Insert WO_WFR_EQUATES
 | |
| $Insert WO_MAT_EQUATES
 | |
| 
 | |
| EQU OI_BLUE$        TO 1 + (120*256) + (215*65536)      ;* Matches the default blue of OI selection style in edit tables
 | |
| EQU OI_GREY$        TO 225 + (225*256) + (225*65536)    ;* Matches the default grey of OI push buttons when not hot
 | |
| EQU OI_HOT_BLUE$    TO 229 + (241*256) + (251*65536)    ;* Matches the default blue of OI push buttons when hot
 | |
| EQU OI_CLICK_BLUE$  TO 205 + (228*256) + (246*65536)    ;* Matches the default blue of OI push buttons when depressed
 | |
| 
 | |
| // In Cass OLE Edit Table
 | |
| EQU COL$CASS_SLOT		    TO 1
 | |
| EQU COL$CASS_WFR_ID  		TO 2
 | |
| EQU COL$CASS_CARR_SLOT_ID	TO 3
 | |
| EQU COL$CASS_OUT_SLOT_ID    TO 4
 | |
| EQU COL$CASS_GAN_WFR_ID		TO 5
 | |
| EQU COL$CASS_SCRIBE		    TO 6
 | |
| EQU COL$CASS_GRADE	        TO 7
 | |
| EQU COL$CASS_WMI_NCR	    TO 8
 | |
| EQU COL$CASS_RDS_NCR        TO 9
 | |
| EQU COL$CASS_WMO_NCR        TO 10
 | |
| 
 | |
| // NCR OLE Edit Table
 | |
| EQU COL$NCR_NO			 TO 1
 | |
| EQU COL$NCR_STATUS		 TO 2
 | |
| EQU COL$NCR_REJ_QTY		 TO 3
 | |
| EQU COL$NCR_RESP		 TO 4
 | |
| EQU COL$NCR_STAGE		 TO 5
 | |
| EQU COL$NCR_LOSS_DESC	 TO 6
 | |
| EQU COL$NCR_LOSS_COMM	 TO 7
 | |
| EQU COL$NCR_FIN_SIG		 TO 8
 | |
| EQU COL$NCR_FIN_SIG_DTM	 TO 9
 | |
| 
 | |
| Declare subroutine SRP_Show_Window, Set_Property, Set_Status, ErrMsg, Dialog_Box, Database_Services
 | |
| Declare subroutine GaN_Services
 | |
| Declare function Database_Services, Get_Property, SRP_Array, RGB, obj_NCR, Get_Status
 | |
| 
 | |
| 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 else
 | |
|     // Event not implemented
 | |
| end
 | |
| 
 | |
| Return EventFlow or 1
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // EVENT HANDLERS
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| Event WINDOW.CREATE(CreateParam)
 | |
| 
 | |
|     GoSub SetupOLEControls
 | |
|     If CreateParam NE '' then
 | |
|         WOMatKey = CreateParam
 | |
|         WONo     = Field(WOMatKey, '*', 1)
 | |
|         CassNo   = Field(WOMatKey, '*', 2)
 | |
|         Set_Property(@Window:'.WO_NO', 'TEXT', WONo)
 | |
|         Set_Property(@Window:'.CASS_NO', 'TEXT', CassNo)               
 | |
|         GoSub FillForm       
 | |
|     end
 | |
|     SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
 | |
|     EventFlow = 1
 | |
|     
 | |
| End Event
 | |
| 
 | |
| 
 | |
| Event PUB_CREATE_NCR.CLICK()
 | |
|     
 | |
|     CassCtrl  = @Window:".OLE_EDT_IN_CASS"
 | |
|     CassList  = Get_Property(CassCtrl, 'OLE.List')
 | |
|     SelectedRows = Get_Property(CassCtrl, "OLE.ColumnData[":COL$CASS_WMI_NCR:"]")
 | |
|     CONVERT @VM TO @FM in SelectedRows
 | |
|     NumWfrs		= DCount(SelectedRows, @FM)
 | |
| 
 | |
|     WONo		= Get_Property(@Window:'.WO_NO', 'TEXT')
 | |
|     CassNo      = Get_Property(@Window:'.CASS_NO', 'TEXT')
 | |
|     RejWfrIDs	= ''
 | |
|     RejSlotIDs	= ''
 | |
|     
 | |
|     GoodLines = 0
 | |
|     FOR WfrIndex = 1 TO NumWfrs
 | |
|         RowSelected = SelectedRows<WfrIndex>
 | |
|         If RowSelected EQ True$ then
 | |
|             GoodLines += 1
 | |
|             RejWfrIDs<1,GoodLines> = CassList<WfrIndex,COL$CASS_WFR_ID>
 | |
|         end        
 | |
|     NEXT I
 | |
| 
 | |
|     ncrParms  = WONo:@RM
 | |
|     ncrParms := '1':@RM
 | |
|     ncrParms := CassNo:@RM		;* Place holder for WO_MAT_CASS_NO
 | |
|     ncrParms := '':@RM		    ;* Single RDS field 
 | |
|     ncrParms := '':@RM		    ;* Reactor No
 | |
|     ncrParms := '':@RM			;* Loss Stage
 | |
|     ncrParms := RejWfrIDs:@RM	;* WfrIDs			;* CarrWafer IDs
 | |
|     ncrParms := '':@RM	        ;* CarrSlotIDs		;* GaN PostEpi Carrier Slot ID	-> GaN non-characterization wafers
 | |
|     ncrParms := '':@RM			;* CassSlotIDs		;* WOMat Cassette Slot ID		-> Rej from cassette
 | |
|     ncrParms := ''				;* RunPocketZone	;* RPZ							-> Rej from susceptor
 | |
| 
 | |
|     Set_Status(0)
 | |
|     NCRNo = obj_NCR('CreateWfr',ncrParms)		;* Create new NCR for this wafer/group of wafers
 | |
| 
 | |
|     IF Get_Status(errCode) THEN
 | |
|         ErrMsg(errCode)
 | |
|     end else
 | |
|         Dialog_Box('NCR', @Window, NCRNo)
 | |
|         PrevCursor  = Set_Property('SYSTEM', 'CURSOR', 'H')
 | |
|         GaN_Services('ConsumeInboundMaterial', RejWfrIDs)
 | |
|         // Add NCRNo to the rejected wafer ID records (WO_WFR table)
 | |
|         For each WfrID in RejWfrIDs using @VM
 | |
|             WOWfrRec = Database_Services('ReadDataRow', 'WO_WFR', WfrID)
 | |
|             WOWfrRec<WO_WFR_WMI_NCR_NO$> = NCRNo
 | |
|             Database_Services('WriteDataRow', 'WO_WFR', WfrID, WOWfrRec, True$, False$, True$)
 | |
|         Next WfrID
 | |
|         Set_Property(CassCtrl, "OLE.CellCheck[":COL$CASS_WMI_NCR:";All]", False$)
 | |
|         GoSub FillCassEditTable
 | |
|         GoSub FillNCREditTable
 | |
|         GoSub EnableCreateNCRButton
 | |
|         // If the GaN work order processing form is open, then refresh the page to update the inbound quantities.
 | |
|         GaNProdVis = Get_Property('WO_PROD_GAN', 'VISIBLE')
 | |
|         If GaNProdVis EQ True$ then Send_Event('WO_PROD_GAN', 'READ')
 | |
|         PrevCursor  = Set_Property('SYSTEM', 'CURSOR', 'A')
 | |
|     end
 | |
| 
 | |
| end event
 | |
| 
 | |
| 
 | |
| Event CASS_NO.LOSTFOCUS(Flag, FocusID)
 | |
| 
 | |
|     WONo         = Get_Property(@Window:'.WO_NO', 'TEXT')
 | |
|     CassNo       = Get_Property(@Window:'.CASS_NO', 'TEXT')
 | |
|     If ( (WONo NE '') and (CassNo NE '') ) then
 | |
|         PrevWONo = Get_Property(@Window, '@WO_NO')
 | |
|         PrevCassNo = Get_Property(@Window, '@CASS_NO')
 | |
|         If ( (PrevWONo NE WONo) or (PrevCassNo NE CassNo) ) then
 | |
|             GoSub FillForm
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end event
 | |
| 
 | |
| 
 | |
| Event OLE_EDT_IN_CASS.OnCheckChanged(Cell, OldValue, NewValue)
 | |
| 
 | |
|     GoSub EnableCreateNCRButton
 | |
|     
 | |
| end event
 | |
| 
 | |
| 
 | |
| Event OLE_EDT_NCR.OnDblClick(Cell, Point, Button, Shift, Ctrl)
 | |
| 
 | |
|     Row   = Field(Cell, ';', 2, 1)
 | |
|     NCRNo = Get_Property(CtrlEntID, "OLE.CellText[":COL$NCR_NO:";":Row:"]")
 | |
|     If RowExists('NCR', NCRNo) then
 | |
|         PreNCRRec  = Database_Services('ReadDataRow', 'NCR', NCRNo)
 | |
|         Dialog_Box('NCR', @Window, NCRNo)
 | |
|         PostNCRRec = Database_Services('ReadDataRow', 'NCR', NCRNo)
 | |
|         If PreNCRRec NE PostNCRRec then GoSub FillNCREditTable          
 | |
|     end
 | |
| end event
 | |
| 
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // Internal GoSubs
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| 
 | |
| SetupOLEControls:
 | |
|     
 | |
|     NumCassCols = 10
 | |
|     NumCassRows = 25
 | |
|     NumNCRCols  = 9
 | |
|     NumNCRRows  = 5
 | |
|     CassCtrl    = @Window:'.OLE_EDT_IN_CASS'
 | |
|     NCRCtrl     = @Window:'.OLE_EDT_NCR'
 | |
|     
 | |
|     HeaderFontArray   = 'Segoe UI':@SVM:8:@SVM:700
 | |
|     CassDimArray      = NumCassCols :@FM: NumCassRows
 | |
|     NCRDimArray       = NumNCRCols :@FM: NumNCRRows
 | |
|     
 | |
|     Set_Property(CassCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8)
 | |
|     Set_Property(CassCtrl, "OLE.Dimension", CassDimArray)
 | |
|     Set_Property(CassCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray)
 | |
|     Set_Property(CassCtrl, "OLE.HeaderFont[1; All]", HeaderFontArray)
 | |
|         
 | |
|     Set_Property(NCRCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8)
 | |
|     Set_Property(NCRCtrl, "OLE.Dimension", NCRDimArray)
 | |
|     Set_Property(NCRCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray)
 | |
|     Set_Property(NCRCtrl, "OLE.HeaderFont[1; All]", HeaderFontArray)
 | |
|     
 | |
|     CassHeaderTitles  = 'Slot':@VM:'Inbound':@VM:'Carrier':@VM:'Outbound':@VM:'GaN Wfr ID':@VM:'Scribe':@VM:'Grade':@VM
 | |
|     CassHeaderTitles := 'WMI NCR':@VM:'RDS NCR':@VM:'WMO NCR'
 | |
|     Set_Property(CassCtrl, "OLE.TitleList", CassHeaderTitles)
 | |
|     Set_Property(CassCtrl, "OLE.HeaderAlignment[All; 1]", 'C':@FM:'C':@FM:'L')
 | |
|     Set_Property(CassCtrl, "OLE.CellAlignment[1; All]", 'C':@FM:'C':@FM:'L')
 | |
|     Set_Property(CassCtrl, "OLE.CellAlignment[2-":COL$CASS_GRADE:"; All]", 'C':@FM:'L':@FM:'L')
 | |
|     Set_Property(CassCtrl, "OLE.CellAlignment[":COL$CASS_WMI_NCR:"-":COL$CASS_WMO_NCR:"; All]", 'C':@FM:'C':@FM:'L')
 | |
|     Set_Property(CassCtrl, "OLE.AllowDeletions", False$)
 | |
|     Set_Property(CassCtrl, "OLE.AllowInserts", False$)
 | |
|     HeaderColArray    = ''
 | |
|     HeaderColArray<2> = False$
 | |
|     Set_Property(CassCtrl, "OLE.HeaderColumn[1]", HeaderColArray)
 | |
|     
 | |
|     NCRHeaderTitles = 'NCR':@VM:'Status':@VM:'Qty':@VM:'Responsible':@VM:'Stage':@VM:'Loss Desc':@VM:'Loss Comments' |
 | |
|                     :@VM:'Signature':@VM:'Date & Time'
 | |
|     Set_Property(NCRCtrl, "OLE.TitleList", NCRHeaderTitles)
 | |
|     Set_Property(NCRCtrl, "OLE.HeaderAlignment[All; 1]", 'C':@FM:'C':@FM:'L')
 | |
|     Set_Property(NCRCtrl, "OLE.CellAlignment[All; All]", 'C':@FM:'C':@FM:'L')
 | |
|     Set_Property(NCRCtrl, "OLE.AllowDeletions", False$)
 | |
|     Set_Property(NCRCtrl, "OLE.AllowInserts", False$)
 | |
|     HeaderColArray    = ''
 | |
|     HeaderColArray<2> = False$
 | |
|     Set_Property(NCRCtrl, "OLE.HeaderColumn[1]", HeaderColArray)
 | |
|     
 | |
|     // Set default header colors
 | |
|     HeaderColorArray    = ''
 | |
|     HeaderColorArray<1> = 'Auto'
 | |
|     HeaderColorArray<2> = 'None'
 | |
|     HeaderColorArray<3> = 'None'
 | |
|     HeaderColorArray<4> = OI_HOT_BLUE$
 | |
|     HeaderColorARray<5> = False$
 | |
|     Set_Property(CassCtrl, "OLE.HeaderColors[All; All]", HeaderColorArray)
 | |
|     Set_Property(NCRCtrl, "OLE.HeaderColors[All; All]", HeaderColorArray)
 | |
|    
 | |
|     // Qualify OLE events that we want to intercept
 | |
|     Qualifier = ''
 | |
|     Qualifier<1> = 1
 | |
|     Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
 | |
|     Send_Message(CassCtrl,          'QUALIFY_EVENT', 'OLE.OnCheckChanged',      Qualifier)
 | |
|     Send_Message(NCRCtrl,           'QUALIFY_EVENT', 'OLE.OnDblClick',          Qualifier)
 | |
|     
 | |
|     //////////////////////////////////// In Cass OLE Edit Table //////////////////////////////////////////////
 | |
|     
 | |
|     // Disable resizing of the header row and header column
 | |
|     // Resize header column to fit contents
 | |
|     HeaderRowArray = Get_Property(CassCtrl, "OLE.HeaderRow[1]")
 | |
|     HeaderRowArray<3> = False$
 | |
|     Set_Property(NCRCtrl, "OLE.HeaderRow[1]", HeaderRowArray)
 | |
|     // Disable resizing of columns as there is no need for this on this form
 | |
|     ColSize = Get_Property(CassCtrl, "OLE.DataColumn[1]")
 | |
|     ColSize<3> = False$
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[All]", ColSize)
 | |
|     ColSize<1> = 40
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_SLOT:"]", ColSize)
 | |
|     ColSize<1> = 80
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_WFR_ID:"]", ColSize)
 | |
|     ColSize<1> = 60
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_CARR_SLOT_ID:"]", ColSize)
 | |
|     ColSize<4> = True$
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_OUT_SLOT_ID:"]", ColSize)
 | |
|     ColSize<4> = False$
 | |
|     ColSize<1> = 95
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_GAN_WFR_ID:"]", ColSize)
 | |
|     ColSize<1> = 70
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_SCRIBE:"]", ColSize)
 | |
|     ColSize<1> = 40
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_GRADE:"]", ColSize)
 | |
|     ColSize<1> = 65
 | |
|     Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_WMI_NCR:"-":COL$CASS_WMO_NCR:"]", ColSize)
 | |
|     
 | |
|     // Hide scrollbars
 | |
|     Set_Property(CassCtrl, "OLE.ScrollBarsVisible", 'N':@FM:'N')
 | |
|     
 | |
|     // Disable resizing of rows as there is no need for this on this form
 | |
|     RowSizeProps = Get_Property(CassCtrl, "OLE.DataRow[1]")
 | |
|     RowSizeProps<3> = False$
 | |
|     Set_Property(CassCtrl, "OLE.DataRow[All]", RowSizeProps)   
 | |
|     Set_Property(CassCtrl, "OLE.CellProtection[All; All]", 'SEL')
 | |
|     
 | |
|     // Color headers
 | |
|     Set_Property(CassCtrl, "OLE.HeaderColors[All; 1]", @FM:"{200, 200, 200}")
 | |
|     
 | |
|     // Color cells
 | |
|     Set_Property(CassCtrl, "OLE.CellColors[All; All]", 'None':@FM:RGB(192,220,192))
 | |
|                  
 | |
|     //////////////////////////////////// NCR OLE Edit Table //////////////////////////////////////////////
 | |
|     
 | |
|     // Disable resizing of the header row and header column
 | |
|     // Resize header column to fit contents
 | |
|     HeaderRowArray = Get_Property(NCRCtrl, "OLE.HeaderRow[1]")
 | |
|     HeaderRowArray<3> = False$
 | |
|     Set_Property(NCRCtrl, "OLE.HeaderRow[1]", HeaderRowArray)
 | |
|     // Disable resizing of columns as there is no need for this on this form
 | |
|     ColSize = Get_Property(NCRCtrl, "OLE.DataColumn[1]")
 | |
|     ColSize<3> = False$
 | |
|     ColSize<1> = 50
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_NO:"]", ColSize)
 | |
|     ColSize<1> = 45
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_STATUS:"]", ColSize)
 | |
|     ColSize<1> = 32
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_REJ_QTY:"]", ColSize)
 | |
|     ColSize<1> = 70
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_RESP:"]", ColSize)
 | |
|     ColSize<1> = 58
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_STAGE:"]", ColSize)
 | |
|     ColSize<1> = 100
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_LOSS_DESC:"]", ColSize)
 | |
|     ColSize<1> = 100
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_LOSS_COMM:"]", ColSize)
 | |
|     ColSize<4> = True$
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_FIN_SIG:"]", ColSize)
 | |
|     ColSize<4> = False$
 | |
|     ColSize<1> = 100
 | |
|     Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_FIN_SIG_DTM:"]", ColSize)
 | |
|     
 | |
|     // Left-align the last four columns
 | |
|     Set_Property(NCRCtrl, "OLE.CellAlignment[":COL$NCR_LOSS_DESC:"-":COL$NCR_FIN_SIG_DTM:";All]", 'C':@FM:'L':@FM:'L')
 | |
|     
 | |
|     // Disable resizing of rows as there is no need for this on this form
 | |
|     RowSizeProps = Get_Property(NCRCtrl, "OLE.DataRow[1]")
 | |
|     RowSizeProps<3> = False$
 | |
|     Set_Property(NCRCtrl, "OLE.DataRow[All]", RowSizeProps)   
 | |
|     Set_Property(NCRCtrl, "OLE.CellProtection[":COL$NCR_NO:"-":COL$NCR_FIN_SIG_DTM:"; All]", 'SEL')
 | |
|     
 | |
|     // Color headers
 | |
|     Set_Property(NCRCtrl, "OLE.HeaderColors[All; 1]", @FM:"{200, 200, 200}")
 | |
|     
 | |
|     // Color cells
 | |
|     Set_Property(NCRCtrl, "OLE.CellColors[All; All]", 'None':@FM:RGB(192,220,192))
 | |
|     
 | |
|     // Scroll bars
 | |
|     Set_Property(NCRCtrl, "OLE.ScrollBarsVisible", 'A':@FM:'A')
 | |
| 
 | |
| return
 | |
| 
 | |
| 
 | |
| FillForm:
 | |
|        
 | |
|     WONo         = Get_Property(@Window:'.WO_NO', 'TEXT')
 | |
|     CassNo       = Get_Property(@Window:'.CASS_NO', 'TEXT')
 | |
|     If ( (WONo NE '') and (CassNo NE '') ) then
 | |
|         Set_Property(@Window, '@WO_NO', WONo)
 | |
|         Set_Property(@Window, '@CASS_NO', CassNo)
 | |
|         WOMatKey   = WONo:'*':CassNo
 | |
|         WOMatRec   = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
 | |
|         LotNo      = WOMatRec<WO_MAT_LOT_NO$>
 | |
|         SubPartNo  = WOMatRec<WO_MAT_SUB_PART_NO$>
 | |
|         CustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
 | |
|         Set_Property(@Window:'.LOT_NO', 'TEXT', LotNo)
 | |
|         Set_Property(@Window:'.SUB_PART_NO', 'TEXT', SubPartNo)
 | |
|         Set_Property(@Window:'.CUST_PART_NO', 'TEXT', CustPartNo)
 | |
|     end
 | |
|     
 | |
|     GoSub FillCassEditTable
 | |
|     GoSub FillNCREditTable
 | |
|     
 | |
| return
 | |
| 
 | |
| 
 | |
| FillCassEditTable:
 | |
|     
 | |
|     CassCtrl     = @Window:'.OLE_EDT_IN_CASS'
 | |
|     WONo         = Get_Property(@Window:'.WO_NO', 'TEXT')
 | |
|     CassNo       = Get_Property(@Window:'.CASS_NO', 'TEXT')
 | |
|     
 | |
|     If ( (WONo NE '') and (CassNo NE '') ) then
 | |
|         // Suppress redraw until all properties are set
 | |
|         Set_Property(CassCtrl, "OLE.Redraw", False$)
 | |
|         
 | |
|         WOMatKey     = WONo:'*':CassNo
 | |
|         WOMatWfrRec  = Database_Services('ReadDataRow', 'WO_MAT_WFR', WOMatKey)
 | |
|         AvailWfrs    = WOMatWfrRec<WO_MAT_WFR_IN_WFR_ID$>   
 | |
|         ConsumedWfrs = WOMatWfrRec<WO_MAT_WFR_IN_PREV_WFR_ID$>
 | |
|         InWfrIDs     = ''
 | |
|         For Slot = 1 to 25
 | |
|             If AvailWfrs<0, Slot> NE '' then
 | |
|                 InWfrIDs<0, Slot> = AvailWfrs<0, Slot>
 | |
|             end else
 | |
|                 InWfrIDs<0, Slot> = ConsumedWfrs<0, Slot>
 | |
|             end
 | |
|         Next Slot
 | |
|         
 | |
|         CassCtrlArray = ''
 | |
|         For each InWfrID in InWfrIDs using @VM setting RowIndex
 | |
|             CarrSlotID  = ''
 | |
|             OutSlotID   = ''
 | |
|             GaNWfrID    = ''
 | |
|             Scribe      = ''
 | |
|             Grade       = ''
 | |
|             WMINCRNo    = ''
 | |
|             RDSNCRNo    = ''
 | |
|             WMONCRNo    = ''
 | |
|             RDSNo = Xlate('WO_WFR', InWfrID, 'RDS_NO', 'X')
 | |
|             If RDSNo NE '' then
 | |
|                 ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo, True$, 30, False$)
 | |
|                 RDSWfrIDs   = ReactRunRec<REACT_RUN_IN_WFR_ID$>
 | |
|                 Locate InWfrID in RDSWfrIDs using @VM setting WfrIndex then
 | |
|                     CarrSlotID = ReactRunRec<REACT_RUN_CARR_SLOT_ID$, WfrIndex>
 | |
|                     OutSlotID  = ReactRunRec<REACT_RUN_OUT_SLOT_ID$, WfrIndex>
 | |
|                     GaNWfrID   = Xlate('WO_WFR', InWfrID, 'GAN_WFR_ID', 'X')
 | |
|                     Scribe     = Xlate('WO_WFR', InWfrID, 'SCRIBE', 'X')
 | |
|                     Grade      = Xlate('WO_WFR', InWfrID, 'GRADE', 'X')                  
 | |
|                 end
 | |
|             end
 | |
|             WOWfrRec = Database_Services('ReadDataRow', 'WO_WFR', InWfrID)
 | |
|             WMINCRNo = WOWfrRec<WO_WFR_WMI_NCR_NO$>
 | |
|             RDSNCRNo = WOWfrRec<WO_WFR_RDS_NCR_NO$>
 | |
|             WMONCRNo = WOWfrRec<WO_WFR_WMO_NCR_NO$>
 | |
|             CassCtrlArray<COL$CASS_SLOT, RowIndex>         = RowIndex
 | |
|             CassCtrlArray<COL$CASS_WFR_ID, RowIndex>       = InWfrID
 | |
|             CassCtrlArray<COL$CASS_CARR_SLOT_ID, RowIndex> = CarrSlotID
 | |
|             CassCtrlArray<COL$CASS_OUT_SLOT_ID, RowIndex>  = OutSlotID
 | |
|             CassCtrlArray<COL$CASS_GAN_WFR_ID, RowIndex>   = GaNWfrID
 | |
|             CassCtrlArray<COL$CASS_SCRIBE, RowIndex>       = Scribe
 | |
|             CassCtrlArray<COL$CASS_GRADE, RowIndex>        = Grade
 | |
|             CassCtrlArray<COL$CASS_WMI_NCR, RowIndex>      = WMINCRNo
 | |
|             CassCtrlArray<COL$CASS_RDS_NCR, RowIndex>      = RDSNCRNo
 | |
|             CassCtrlArray<COL$CASS_WMO_NCR, RowIndex>      = WMONCRNo
 | |
|             
 | |
|             If ( (WMINCRNo EQ '') and (CarrSlotID EQ '') ) then
 | |
|                 // This inbound wafer is eligible to be NCR'd
 | |
|                 // Convert NCR cell for this row into a check box
 | |
|                 Set_Property(CassCtrl, "OLE.CellText[":COL$CASS_WMI_NCR:";":RowIndex:"]", '')
 | |
|                 CheckBoxArray      = 'Check Box'
 | |
|                 CheckBoxArray<2,1> = True$
 | |
|                 Set_Property(CassCtrl, "OLE.CellType[":COL$CASS_WMI_NCR:";":RowIndex:"]", CheckBoxArray)
 | |
|                 Set_Property(CassCtrl, "OLE.CellCheckEnabled[":COL$CASS_WMI_NCR:";":RowIndex:"]", True$)                
 | |
|             end else                
 | |
|                 Set_Property(CassCtrl, "OLE.CellType[":COL$CASS_WMI_NCR:";":RowIndex:"]", 'Text')
 | |
|             end
 | |
|         Next InWfrID
 | |
|         
 | |
|         Set_Property(CassCtrl, 'OLE.ARRAY', CassCtrlArray)
 | |
|         // Re-enable redraw now that all properties are set
 | |
|         Set_Property(CassCtrl, "OLE.Redraw", True$)
 | |
|     end
 | |
|     
 | |
| return
 | |
| 
 | |
| 
 | |
| FillNCREditTable:
 | |
|     
 | |
|     CassCtrl     = @Window:".OLE_EDT_IN_CASS"
 | |
|     NCRCtrl      = @Window:'.OLE_EDT_NCR'
 | |
|     WMINCRNos    = Get_Property(CassCtrl, "OLE.ColumnData[":COL$CASS_WMI_NCR:"]")
 | |
|     Swap 0 with '' in WMINCRNos ; // We don't wan't checkmark values (False = 0)
 | |
|     RDSNCRNos    = Get_Property(CassCtrl, 'OLE.ColumnData[':COL$CASS_RDS_NCR:']')
 | |
|     WMONCRNos    = Get_Property(CassCtrl, "OLE.ColumnData[":COL$CASS_WMO_NCR:"]")
 | |
|     NCRNos       = SRP_Array('Join', WMINCRNos, RDSNCRNos, 'OR', @VM)
 | |
|     NCRNos       = SRP_Array('Join', NCRNos, WMONCRNos, 'OR', @VM)
 | |
|     NCRNos       = SRP_Array('Clean', NCRNos, 'TrimAndMakeUnique', @VM)
 | |
|     NCRCtrlArray = ''
 | |
|     Set_Property(NCRCtrl, "OLE.Redraw", False$)
 | |
|     
 | |
|     If ( (NCRNos NE 0) and (NCRNos NE '') ) then           
 | |
|         NCRCtrl = @Window:'.OLE_EDT_NCR'
 | |
|         For each NCRNo in NCRNos using @VM setting nPos
 | |
|             If ( (RowExists('NCR', NCRNo)) and (NCRNo NE 0) ) then
 | |
|                 Database_Services('ActivateRecord', 'NCR', NCRNo)
 | |
|                 NCRCtrlArray<COL$NCR_NO, nPos>          =  NCRNo
 | |
|                 NCRCtrlArray<COL$NCR_STATUS, nPos>      = {STATUS}
 | |
|                 NCRCtrlArray<COL$NCR_REJ_QTY, nPos>     = {REJ_CNT}
 | |
|                 NCRCtrlArray<COL$NCR_RESP, nPos>        = {LOSS_BY}
 | |
|                 NCRCtrlArray<COL$NCR_STAGE, nPos>       = {LOSS_STAGE}
 | |
|                 NCRCtrlArray<COL$NCR_LOSS_DESC, nPos>   = {LOSS_DESC}
 | |
|                 NCRCtrlArray<COL$NCR_LOSS_COMM, nPos>   = {LOSS_COMMENTS}
 | |
|                 NCRCtrlArray<COL$NCR_FIN_SIG, nPos>     = OConv({AUTH_SHIP_SIG}, '[XLATE_CONV,LSL_USERS*FIRST_LAST]')
 | |
|                 NCRCtrlArray<COL$NCR_FIN_SIG_DTM, nPos> = OConv({AUTH_SHIP_SIG_DTM}, 'DT')
 | |
|             end
 | |
|         Next NCR
 | |
|     end else
 | |
|         // No NCRs associated with this inbound cassette, so clear the NCR table.
 | |
|         For nPos = 1 to 5
 | |
|             NCRCtrlArray<COL$NCR_NO, nPos>          = ''
 | |
|             NCRCtrlArray<COL$NCR_STATUS, nPos>      = ''
 | |
|             NCRCtrlArray<COL$NCR_REJ_QTY, nPos>     = ''
 | |
|             NCRCtrlArray<COL$NCR_RESP, nPos>        = ''
 | |
|             NCRCtrlArray<COL$NCR_STAGE, nPos>       = ''
 | |
|             NCRCtrlArray<COL$NCR_LOSS_DESC, nPos>   = ''
 | |
|             NCRCtrlArray<COL$NCR_LOSS_COMM, nPos>   = ''
 | |
|             NCRCtrlArray<COL$NCR_FIN_SIG, nPos>     = ''
 | |
|             NCRCtrlArray<COL$NCR_FIN_SIG_DTM, nPos> = ''
 | |
|         Next nPos
 | |
|     end
 | |
|     Set_Property(NCRCtrl, "OLE.ARRAY", NCRCtrlArray)
 | |
|     Set_Property(NCRCtrl, "OLE.Redraw", True$)
 | |
| return
 | |
| 
 | |
| 
 | |
| EnableCreateNCRButton:
 | |
| 
 | |
|     CassCtrl = @Window:'.OLE_EDT_IN_CASS'
 | |
|     Checkmarks = Get_Property(CassCtrl, "OLE.CellCheck[":COL$CASS_WMI_NCR:"; All]")
 | |
|     Checksum   = Sum(Checkmarks)
 | |
|     ButtonEnabled = False$
 | |
|     If ( Checksum GT 0 ) then ButtonEnabled = True$ 
 | |
|     Set_Property(@Window:'.PUB_CREATE_NCR', 'ENABLED', ButtonEnabled)
 | |
| 
 | |
| return
 | |
| 
 |