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

1862 lines
75 KiB
Plaintext

Compile function DBW_PROD_SPEC_GAN_EVENTS(CtrlEntId, Event, @PARAMS)
/***********************************************************************************************************************
Name : DBW_PROD_SPEC_GAN_EVENTS
Description : Commuter module for the DBW_PROD_SPEC_GAN 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)
06/06/20 djs Cutover to CR-004 and CR-005
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
#window DBW_PROD_SPEC_GAN
$INSERT APP_INSERTS
$INSERT QUOTE_SPEC_EQU
$INSERT LSL_COMMON
$INSERT PS_EQUATES
$INSERT MSG_EQUATES
$INSERT SECURITY_RIGHTS_EQU
$INSERT RDS_EQU
$INSERT REACT_RUN_EQUATES
$INSERT GAN_PARAMS_EQUATES
$INSERT PROD_SPEC_EQUATES
$INSERT GAN_PARAM_CONFIG_EQUATES
$INSERT PRS_STAGE_EQUATES
$INSERT PROD_SPEC_REV_HIST_EQUATES
EQU COL$MODE_CODE TO 1
EQU COL$MODE_SIG TO 2
EQU COL$MODE_SIG_DTM TO 3
EQU TOP$ROW to 9
EQU BOTTOM$ROW to 21
Declare subroutine Set_Property, Database_Services, Dialog_Box, ErrMsg, GaN_Services, Unlock, SQL_Services
Declare subroutine Start_Window, Comm_Prod_Spec, Create_Dialog, PSN_Services
Declare function Get_Property, Form_Services, Database_Services, Datetime, SQL_Services, SRP_Array, GaN_Services
Declare function NextKey, SQL_Services
SubclassInfo = Form_Services('FindSubclassControl')
Subclass = SubclassInfo<1>
If Assigned(Param8) else Param8 = ''
// 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
// Convert ' ' to '_' for proper RADIO control event handling
Convert ' ' to '_' in CtrlEntId
GoToEvent Event for CtrlEntId else
If Event EQ 'CHANGED' then
GoSub EnableSaveButton
end
If Event EQ 'UpdateRevHist' then
GoSub UpdateRevHist
end
Ctrl = CtrlEntID[-1, 'B.']
If ( (Ctrl[1, 8] EQ 'CHK_WFR_') or (Ctrl[1, 9] EQ 'CHK_CHAR_') ) then
GoSub UpdateANKOGroups
GoSub EnableSaveButton
end
end
Return EventFlow or 1
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
SiliconFormVisible = Get_Property('PROD_SPEC', 'VISIBLE')
If SiliconFormVisible EQ True$ then
Utility('DESTROY', 'PROD_SPEC')
end
// Do not clear on write
IOOptions = Get_Property(@Window, "IOOPTIONS")
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
SRP_Show_Window(@Window, 'SYSTEM', 'C', 'C', 1, '', False$, False$, '', 1)
PSNo = CreateParam
If RowExists('PROD_SPEC', PSNo) then
Set_Property(@Window:'.PROD_SPEC_ID', 'TEXT', PSNo)
Post_Event(@Window, 'READ')
end
End Event
Event WINDOW.READ()
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
NewPSN = ( RowExists('PROD_SPEC', PSNo) EQ False$ )
Set_Property(@Window, '@NEW_PSN', NewPSN)
ReactType = Xlate('PROD_SPEC', PSNo, 'REACTOR_TYPE', 'X')
If ( (ReactType EQ 'GAN') or (NewPSN EQ True$) ) then
If NewPSN EQ True$ then
Set_Property(@Window:'.STATUS', 'DEFPROP', 'I')
PSN_Services('InitializeCritParams', PSNo)
end else
Comm_Prod_Spec('Refresh')
end
Set_Property(@Window, 'REDRAW', False$)
GoSub SetupOLEControls
CharInterval = Get_Property(@Window:'.EDL_CHAR_INTERVAL', 'TEXT')
CharInterval = Trim(CharInterval)
If Num(CharInterval) then
If ( (CharInterval NE '') and (CharInterval GE 1) ) then
CurrInterval = 1
IntervalString = 1
For Interval = 1 to 3
IntervalString := ',':(CurrInterval + CharInterval)
CurrInterval += CharInterval
Next Interval
IntervalString := '...'
Set_Property(@Window:'.LBL_INTERVAL', 'TEXT', IntervalString)
end else
Set_Property(@Window:'.LBL_INTERVAL', 'TEXT', 'None')
end
end else
Set_Property(@Window:'.LBL_INTERVAL', 'TEXT', 'None')
end
Set_Property(@Window, 'REDRAW', True$)
GoSub FillRevHistEDT
OrigRecord = Get_Property(@Window, 'ATRECORD')
Set_Property(@Window, '@ORIG_RECORD', OrigRecord)
end else
RecLocked = Database_Services('IsKeyIDLocked', 'PROD_SPEC', PSNo)
If RecLocked then Database_Services('ReleaseKeyIDLock', 'PROD_SPEC', PSNo)
ParentWindow = Get_Property(@Window, "PARENT")
Start_Window('PROD_SPEC', ParentWindow, PSNo)
end
end event
Event WINDOW.WRITE()
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
OrigRecord = Get_Property(@Window, 'ATRECORD')
Set_Property(@Window, '@ORIG_RECORD', OrigRecord)
NewPSN = Get_Property(@Window, '@NEW_PSN')
If NewPSN EQ True$ then
// Mark PSN type as GaN
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
PSRec<PROD_SPEC_REACTOR_TYPE$> = 'GAN'
PSRec<PROD_SPEC_MODE_CODE$> = 'Q':@VM:'P'
Database_Services('WriteDataRow', 'PROD_SPEC', PSNo, PSRec, True$, False$, True$)
// Create PRS_STAGE records and add PRS_STAGE keys to the new PROD_SPEC record
ReqStages = Gan_Services('GetReqStages')
For each StageID in ReqStages using @VM
Gan_Services('AddStageToPSN', PSNo, StageID)
Next StageID
Set_Property(@Window, '@NEW_PSN', False$)
end
GoSub SaveAll
// If PSN reactor type is "GAN", the tech type is "Production" (i.e. 'P'), and the status is "Active" (i.e. 'A'),
// then ensure Candela Total Defects parameter is enabled in the GAN_PARAM_CONFIG record. Otherwise, force the
// status to "Inactive" (i.e. 'I').
Database_Services('ActivateRecord', 'PROD_SPEC', PSNo)
If ( ({REACTOR_TYPE} EQ 'GAN') and ({TECH_TYPE} EQ 'P') and ({STATUS} EQ 'A') and ({CURR_PART_NO} NE '') ) then
ReadyToActivate = False$
// Need to ensure Candela Total Defects is enabled.
GaNParamKeys = {GAN_PARAM_KEYS}
CanPreKey = ''
For each ParamKey in GaNParamKeys using @VM setting vPos
Stage = Field(ParamKey, '*', 2)
If Stage EQ 'CAN_PRE' then CanPreKey = ParamKey
Until CanPreKey NE ''
Next ParamKey
If CanPreKey NE '' then
CanPreParamRec = Database_Services('ReadDataRow', 'GAN_PARAMS', CanPreKey)
If Error_Services('NoError') then
MetNames = CanPreParamRec<GAN_PARAMS.MET_NAME$>
Locate 'Candela Total Defects' in MetNames using @VM setting vPos then
ReadyToActivate = True$
end else
ErrorMsg = 'Candela Total Defects not found in the Part & Parameters configuration record. PSN not eligible to be activated.'
ErrMsg(ErrorMsg)
end
end else
ErrorMsg = 'Error reading CAN_PRE parameter configuration record. PSN not eligible to be activated.'
ErrMsg(ErrorMsg)
end
end else
ErrorMsg = 'CAN_PRE parameter record not found.'
ErrMsg(ErrorMsg)
end
If ReadyToActivate EQ False$ then
ErrMessage = 'Candela Total Defects is required in order for the PSN to be active. Enable Candela '
ErrMessage := 'Total Defects in the Part & Parameter manager in order to activate this PSN.'
ErrMsg(ErrMessage)
{STATUS} = 'I'
Database_Services('WriteDataRow', 'PROD_SPEC', PSNo, @Record, True$, False$, True$)
end
end
Post_Event(@Window, 'READ')
end event
Event CHK_ANKO.CLICK()
GoSub EnableANKOGroups
GoSub EnableSaveButton
end event
Event PUB_DUP_PSN.CLICK()
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
OrigRecord = Get_Property(@Window, 'ATRECORD')
Set_Property(@Window, '@ORIG_RECORD', OrigRecord)
NewRecord = OrigRecord
// Clear GaN Param related columns as these are part number specific and the new PSN will not have
// a part number associated with it until a PROD_VER record is created and associated with it.
NewRecord<PROD_SPEC_GAN_PARAM_KEYS$> = ''
NewRecord<PROD_SPEC_GAN_REV_CP_DTM$> = ''
NewRecord<PROD_SPEC_GAN_REV_OI_DTM$> = ''
NewRecord<PROD_SPEC_GAN_REV_USER$> = ''
NewKey = NextKey('PROD_SPEC')
Set_Property(@Window:'.PROD_SPEC_ID', 'TEXT', NewKey)
Swap PSNo with NewKey in NewRecord
NewRecord<PROD_SPEC_REACTOR_TYPE$> = 'GAN'
NewRecord<PROD_SPEC_MODE_CODE$> = 'Q':@VM:'P'
Database_Services('WriteDataRow', 'PROD_SPEC', NewKey, NewRecord, True$, False$, True$)
// Create PRS_STAGE records and add PRS_STAGE keys to the new PROD_SPEC record
ReqStages = Gan_Services('GetReqStages')
For each StageID in ReqStages using @VM
Gan_Services('AddStageToPSN', NewKey, StageID)
Next StageID
Set_Property(@Window, '@NEW_PSN', False$)
GoSub SaveAll
Post_Event(@Window, 'READ')
end event
Event EDL_CHAR_INTERVAL.CHANGED(NewData)
CharInterval = NewData
CharInterval = Trim(CharInterval)
If Num(CharInterval) then
If ( (CharInterval NE '') and (CharInterval GE 1) ) then
CurrInterval = 1
IntervalString = 1
For Interval = 1 to 3
IntervalString := ',':(CurrInterval + CharInterval)
CurrInterval += CharInterval
Next Interval
IntervalString := '...'
Set_Property(@Window:'.LBL_INTERVAL', 'TEXT', IntervalString)
end else
Set_Property(@Window:'.LBL_INTERVAL', 'TEXT', 'None')
end
end else
Set_Property(@Window:'.LBL_INTERVAL', 'TEXT', 'None')
end
GoSub EnableSaveButton
end event
Event WINDOW.CLOSE(CancelFlag)
Set_Property(@Window:'.OLE_TAB', "OLE.FlickerFree", False$)
end event
Event WINDOW.OMNIEVENT(Message, Param1, Param2, Param3, Param4)
If Message _EQC 'EnableImportButton' then
GoSub EnableImportButton
end
end event
Event EXPORT_CONTROL.CLICK()
GoSub EnableSaveButton
end event
Event STATUS.ACTIVE.CLICK()
GoSub StatusClick
GoSub EnableSaveButton
end event
Event STATUS.INACTIVE.CLICK()
GoSub StatusClick
GoSub EnableSaveButton
end event
Event STATUS.HOLD.CLICK()
GoSub StatusClick
GoSub EnableSaveButton
end event
Event RDO_TECH_TYPE.PRODUCTION.CLICK()
GoSub EnableANKOGroups
GoSub EnableAnkoCheckbox
GoSub EnableSaveButton
end event
Event RDO_TECH_TYPE.ENGINEERING.CLICK()
GoSub EnableANKOGroups
GoSub EnableAnkoCheckbox
GoSub EnableSaveButton
end event
Event PUB_PARAM_MANAGER.CLICK()
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
Create_Dialog('NDW_GAN_PARAM_MANAGER', @Window, True$, PSNo)
end event
Event PUB_IMPORT_CP.CLICK()
GoSub UpdateLimits
GoSub HideTabs
GoSub FillPartParamCtrl
GoSub ColorTabs
GoSub EnableSaveButton
end event
Event PUB_SAVE.CLICK()
Send_Event(@Window, 'WRITE')
end event
Event OLE_TAB.SelChanged(Index, PrevIndex)
GoSub FillPartParamCtrl
end event
Event OLE_CHAR_STAGE_EDT.OnCheckChanged(Cell, OldValue, NewValue)
Abort = False$
If NewValue = False$ then
Row = Field(Cell, ';', 2)
Col = Field(Cell, ';', 1)
StageID = Get_Property(CtrlEntID, 'OLE.CellText[1;':Row:']')
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
GaNParamKeys = Xlate('PROD_SPEC', PSNo, 'GAN_PARAM_KEYS', 'X')
GaNParamKeysPrime = SRP_Array('Rotate', GaNParamKeys, @VM, '*')
GaNCritStages = GaNParamKeysPrime<1, 2>
// Check if the StageID unchecked is configured in part parameters.
// If it is, then block the change and warn the user.
Locate StageID in GaNCritStages using '*' setting Dummy then
Message = 'This stage is configured as a critical stage. '
Message := 'You must remove the parameters using the Parameter Manager before you can remove this stage.'
ErrMsg(Message)
Abort = True$
Set_Property(CtrlEntID, 'OLE.CellCheck[':Cell:']', True$)
end
end
If Abort EQ False$ then
StageEnabledArray = Get_Property(CtrlEntID, 'OLE.CellCheck[3;All]')
Convert @RM to @VM in StageEnabledArray
Set_Property(@Window, '@STAGE_ENABLED_LIST', StageEnabledArray)
GoSub EnableSaveButton
end
end event
Event OLE_CHAR_STAGE_EDT.PosChanged(Cell, PrevCell, Button, RepeatCount)
Focus = Get_Property(CtrlEntID, 'OLE.Focus')
StageOrderList = Get_Property(CtrlEntID, 'OLE.ColumnData[1]')
Set_Property(@Window, '@STAGE_ORDER_LIST', StageOrderList)
GoSub EnableArrowButtons
end event
Event TAB_MAIN.CLICK()
TabIndex = Get_Property(@WINDOW:'.TAB_MAIN', 'VALUE')
Set_Property(@WINDOW, 'VPOSITION', TabIndex)
end event
Event PUB_TOP_ARROW.CLICK()
StageEDTCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
StageList = Get_Property(StageEDTCtrl, 'OLE.LIST')
SelList = Get_Property(StageEDTCtrl, 'OLE.SelPos')
SelRowIndex = SelList<2, 1>
SelRow = StageList<SelRowIndex>
StageList = Delete(StageList, SelRowIndex, 0 ,0)
StageList = Insert(StageList, TOP$ROW, 0, 0, SelRow)
Set_Property(StageEDTCtrl, 'LIST', StageList)
SelList<2, 1> = TOP$ROW
Set_Property(StageEDTCtrl, 'OLE.SelPos', SelList)
GoSub EnableArrowButtons
Set_Property(StageEDTCtrl, 'OLE.Focus', True$)
GoSub ColorCharStages
GoSub UpdateCharStageOrder
GoSub EnableSaveButton
end event
Event PUB_UP_ARROW.CLICK()
StageEDTCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
StageList = Get_Property(StageEDTCtrl, 'OLE.LIST')
SelList = Get_Property(StageEDTCtrl, 'OLE.SelPos')
SelRowIndex = SelList<2, 1>
NewRowIndex = SelRowIndex - 1
SelRow = StageList<SelRowIndex>
StageList = Delete(StageList, SelRowIndex, 0 ,0)
StageList = Insert(StageList, NewRowIndex, 0, 0, SelRow)
Set_Property(StageEDTCtrl, 'LIST', StageList)
SelList<2, 1> = NewRowIndex
Set_Property(StageEDTCtrl, 'OLE.SelPos', SelList)
GoSub EnableArrowButtons
Set_Property(StageEDTCtrl, 'OLE.Focus', True$)
GoSub ColorCharStages
GoSub UpdateCharStageOrder
GoSub EnableSaveButton
end event
Event PUB_DOWN_ARROW.CLICK()
StageEDTCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
StageList = Get_Property(StageEDTCtrl, 'OLE.LIST')
SelList = Get_Property(StageEDTCtrl, 'OLE.SelPos')
SelRowIndex = SelList<2, 1>
NewRowIndex = SelRowIndex + 1
SelRow = StageList<SelRowIndex>
StageList = Delete(StageList, SelRowIndex, 0 ,0)
StageList = Insert(StageList, NewRowIndex, 0, 0, SelRow)
Set_Property(StageEDTCtrl, 'LIST', StageList)
SelList<2, 1> = NewRowIndex
Set_Property(StageEDTCtrl, 'OLE.SelPos', SelList)
GoSub EnableArrowButtons
Set_Property(StageEDTCtrl, 'OLE.Focus', 1)
GoSub ColorCharStages
GoSub UpdateCharStageOrder
GoSub EnableSaveButton
end event
Event PUB_BOTTOM_ARROW.CLICK()
StageEDTCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
StageList = Get_Property(StageEDTCtrl, 'OLE.LIST')
SelList = Get_Property(StageEDTCtrl, 'OLE.SelPos')
SelRowIndex = SelList<2, 1>
SelRow = StageList<SelRowIndex>
StageList = Delete(StageList, SelRowIndex, 0 ,0)
StageList = Insert(StageList, BOTTOM$ROW, 0, 0, SelRow)
Set_Property(StageEDTCtrl, 'LIST', StageList)
// Return focus to the new row index.
SelList<2, 1> = BOTTOM$ROW
Set_Property(StageEDTCtrl, 'OLE.SelPos', SelList)
GoSub EnableArrowButtons
Set_Property(StageEDTCtrl, 'OLE.Focus', 1)
GoSub ColorCharStages
GoSub UpdateCharStageOrder
GoSub EnableSaveButton
end event
Event RDO_WAFER_SELECTION.PRESET_WAFER.CLICK()
ANKOWaferSel = Get_Property(@Window:'.RDO_WAFER_SELECTION', 'VALUE')
Set_Property(@Window, '@ANKO_WAFER_SELECTION', ANKOWaferSel)
GoSub EnableSaveButton
GoSub EnableANKOGroups
end event
Event RDO_WAFER_SELECTION.CANDELA_TOTAL_DEFECTS.CLICK()
ANKOWaferSel = Get_Property(@Window:'.RDO_WAFER_SELECTION', 'VALUE')
Set_Property(@Window, '@ANKO_WAFER_SELECTION', ANKOWaferSel)
GoSub EnableANKOGroups
GoSub EnableSaveButton
end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SetupOLEControls:
GoSub SetupTabCtrl
GoSub SetupPartParamCtrl
GoSub ReadCurrParams
GoSub FillPartParamCtrl
GoSub ColorTabs
GoSub HideTabs
GoSub EnableImportButton
GoSub DisplayTimestamps
GoSub SetupCharStageCtrl
GoSub FillCharStageCtrl
GoSub SetupReactorStageCtrl
GoSub FillReactorStageCtrl
GoSub SetupDispStageCtrl
GoSub FillDispStageCtrl
GoSub FillANKOGroups
GoSub EnableAnkoCheckbox
GoSub EnableANKOGroups
GoSub EnableSaveButton
return
SaveAll:
// If this is a new GaN PSN then we need to setup (i.e. create) mandatory RUN_STAGE
// and PRS_STAGE records.
PartParamOrigVals = Get_Property(@Window, '@ORIG_VALUE_LIST')
PartParamCurrVals = Get_Property(@Window, '@VALUE_LIST')
PartParamChange = (PartParamOrigVals NE PartParamCurrVals)
If PartParamChange EQ True$ then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'GAN_PARAMETERS')
Valid = Response<1>
If (Valid EQ True$) then
GoSub SavePartParams
end else
ErrMsg('Part parameters not saved. User not authorized to save part parameters.')
end
end
GoSub FillDispStageCtrl
StageOrigVals = Get_Property(@Window, '@ORIG_STAGE_ENABLED_LIST')
StageCurrVals = Get_Property(@Window, '@STAGE_ENABLED_LIST')
StageChange = (StageOrigVals NE StageCurrVals)
If StageChange EQ True$ then GoSub SaveEnabledStageList
OrigStageOrder = Get_Property(@Window, '@ORIG_STAGE_ORDER_LIST')
CurrStageOrder = Get_Property(@Window, '@STAGE_ORDER_LIST')
StageOrderChange = (OrigStageOrder NE CurrStageOrder)
* If StageOrderChange EQ True$ then GoSub SaveStageOrder
GoSub SaveStageOrder
ANKOMetPocketsOrig = Get_Property(@Window, '@ORIG_ANKO_MET_POCKETS')
ANKOMetPockets = Get_Property(@Window, '@ANKO_MET_POCKETS')
ANKOMetPocketsChange = (ANKOMetPocketsOrig NE ANKOMetPockets)
If ANKOMetPocketsChange EQ True$ then GoSub SaveANKOMetPockets
ANKOFullCharPocketOrig = Get_Property(@Window, '@ORIG_ANKO_FULL_CHAR_POCKET')
ANKOFullCharPocket = Get_Property(@Window, '@ANKO_FULL_CHAR_POCKET')
ANKOCharPocketChange = Get_Property(ANKOFullCharPocketOrig NE ANKOFullCharPocket)
If ANKOCharPocketChange EQ True$ then GoSub SaveANKOFullCharPocket
GoSub EnableSaveButton
return
SavePartParams:
GoSub SaveParameters
GoSub ResetColorArrays
GoSub FillPartParamCtrl
GoSub ColorTabs
GoSub DisplayTimestamps
ParameterList = Get_Property(@Window, '@VALUE_LIST')
Set_Property(@Window, '@ORIG_VALUE_LIST', ParameterList)
Set_Property(@Window, '@ORIG_MET_LIST', NewParamNameList)
return
SaveEnabledStageList:
// Save enabled stage list
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
StageList = Get_Property(@Window:'.OLE_CHAR_STAGE_EDT', 'OLE.LIST')
For each Row in StageList using @FM setting RowIndex
StageID = Row<0, 1>
Enabled = Row<0, 3>
PRSStageKey = PSNo:'*':StageID
If Enabled EQ True$ then
// Create PRS_STAGE record if it does not already exist
If ( RowExists('PRS_STAGE', PRSStageKey) EQ False$ ) then
// Create PRS_STAGE record
PRSStageRec = ''
PRSStageRec<PRS_STAGE_PROC_TOOL_CLASS$> = Gan_Services('GetToolClassIDs', StageID)
PRSStageRec<PRS_STAGE_PROC_INV_ACTION$> = 'START':@VM:'STOP'
Database_Services('WriteDataRow', 'PRS_STAGE', PRSStageKey, PRSStageRec, True$, False$, True$)
end
end else
// Delete the PRS_STAGE record if it exists
If ( RowExists('PRS_STAGE', PRSStageKey) EQ True$ ) then
// Delete the PRS_STAGE record
Database_Services('DeleteDataRow', 'PRS_STAGE', PRSStageKey)
end
end
Next Row
Set_Property(@Window, '@ORIG_STAGE_ENABLED_LIST', StageEnabledList)
Set_Property(@Window, '@STAGE_ENABLED_LIST', StageEnabledList)
return
SetupReactorStageCtrl:
ReactorStageCtrl = @Window:'.OLE_REACTOR_STAGE_EDT'
HeaderRowTitles = 'Stage':@VM:'Description':@VM:''
CharStageDimArray = 3:@FM:4
Set_Property(ReactorStageCtrl, "OLE.Dimension", CharStageDimArray)
Set_Property(ReactorStageCtrl, "OLE.TitleList", HeaderRowTitles)
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
Set_Property(ReactorStageCtrl, "OLE.HeaderFont[All; All]", HeaderFontArray)
HeaderColArray = 40:@FM:False$:@FM:False$:@FM:False$
Set_Property(ReactorStageCtrl, "OLE.HeaderColumn[1]", HeaderColArray)
// Disable resizing of columns as there is no need for this on this form
StageColSize = Get_Property(ReactorStageCtrl, "OLE.DataColumn[1]")
StageColSize<1> = 70
StageColSize<3> = False$
Set_Property(ReactorStageCtrl, "OLE.DataColumn[1]", StageColSize)
StageColSize<1> = 180
Set_Property(ReactorStageCtrl, "OLE.DataColumn[2]", StageColSize)
StageColSize<1> = 36
Set_Property(ReactorStageCtrl, "OLE.DataColumn[3]", StageColSize)
Set_Property(ReactorStageCtrl, "OLE.CellProtection[All; All]", 'Read Only')
Set_Property(ReactorStageCtrl, "OLE.HeaderAlignment[All; 1]", 'C':@FM:'C':@FM:'L')
// Disable scrollbars
Set_Property(ReactorStageCtrl, "OLE.ScrollBarsVisible", 'N':@FM:'N')
// Setup checkbox column
CheckBoxArray = 'Check Box'
CheckBoxArray<2,1> = True$
Set_Property(ReactorStageCtrl, "OLE.CellType[3; All]", CheckBoxArray)
Set_Property(ReactorStageCtrl, "OLE.CellCheckEnabled[3; All]", False$)
Set_Property(ReactorStageCtrl, "OLE.CellAlignment[3; All]", 'C':@FM:'C':@FM:'L')
Set_Property(ReactorStageCtrl, "OLE.AllowDeletions", False$)
Set_Property(ReactorStageCtrl, "OLE.AllowInserts", False$)
// Qualify OLE events that we want to intercept
Qualifier = ''
Qualifier<1> = 1
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
Send_Message(ReactorStageCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
return
SetupCharStageCtrl:
CharStageCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
HeaderRowTitles = 'Stage':@VM:'Description':@VM:''
CharStageDimArray = 3:@FM:17
Set_Property(CharStageCtrl, "OLE.Dimension", CharStageDimArray)
Set_Property(CharStageCtrl, "OLE.TitleList", HeaderRowTitles)
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
Set_Property(CharStageCtrl, "OLE.HeaderFont[All; All]", HeaderFontArray)
HeaderColArray = 40:@FM:False$:@FM:False$:@FM:False$
Set_Property(CharStageCtrl, "OLE.HeaderColumn[1]", HeaderColArray)
// Disable resizing of columns as there is no need for this on this form
StageColSize = Get_Property(CharStageCtrl, "OLE.DataColumn[1]")
StageColSize<1> = 70
StageColSize<3> = False$
Set_Property(CharStageCtrl, "OLE.DataColumn[1]", StageColSize)
StageColSize<1> = 180
Set_Property(CharStageCtrl, "OLE.DataColumn[2]", StageColSize)
StageColSize<1> = 36
Set_Property(CharStageCtrl, "OLE.DataColumn[3]", StageColSize)
Set_Property(CharStageCtrl, "OLE.CellProtection[All; All]", 'Read Only')
Set_Property(CharStageCtrl, "OLE.HeaderAlignment[All; 1]", 'C':@FM:'C':@FM:'L')
// Disable scrollbars
Set_Property(CharStageCtrl, "OLE.ScrollBarsVisible", 'N':@FM:'N')
// Setup checkbox column
CheckBoxArray = 'Check Box'
CheckBoxArray<2,1> = True$
Set_Property(CharStageCtrl, "OLE.CellType[3; All]", CheckBoxArray)
Set_Property(CharStageCtrl, "OLE.CellAlignment[3; All]", 'C':@FM:'C':@FM:'L')
Set_Property(CharStageCtrl, "OLE.AllowDeletions", False$)
Set_Property(CharStageCtrl, "OLE.AllowInserts", False$)
Set_Property(CharStageCtrl, "OLE.ResetSelPos", False$)
SelStyleArray = Get_Property(CharStageCtrl, "OLE.SelectionStyle")
SelStyleArray<8> = True$ ; // Always show selected row even when table loses focus
Set_Property(CharStageCtrl, "OLE.SelectionStyle", SelStyleArray)
// Qualify OLE events that we want to intercept
Qualifier = ''
Qualifier<1> = 1
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
Send_Message(CharStageCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
Send_Message(CharStageCtrl, 'QUALIFY_EVENT', 'OLE.PosChanged', Qualifier)
return
SetupDispStageCtrl:
DispStageCtrl = @Window:'.OLE_DISP_STAGE_EDT'
HeaderRowTitles = 'Stage':@VM:'Description':@VM:''
CharStageDimArray = 3:@FM:3
Set_Property(DispStageCtrl, "OLE.Dimension", CharStageDimArray)
Set_Property(DispStageCtrl, "OLE.TitleList", HeaderRowTitles)
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
Set_Property(DispStageCtrl, "OLE.HeaderFont[All; All]", HeaderFontArray)
HeaderColArray = 40:@FM:False$:@FM:False$:@FM:False$
Set_Property(DispStageCtrl, "OLE.HeaderColumn[1]", HeaderColArray)
// Disable resizing of columns as there is no need for this on this form
StageColSize = Get_Property(DispStageCtrl, "OLE.DataColumn[1]")
StageColSize<1> = 70
StageColSize<3> = False$
Set_Property(DispStageCtrl, "OLE.DataColumn[1]", StageColSize)
StageColSize<1> = 180
Set_Property(DispStageCtrl, "OLE.DataColumn[2]", StageColSize)
StageColSize<1> = 36
Set_Property(DispStageCtrl, "OLE.DataColumn[3]", StageColSize)
Set_Property(DispStageCtrl, "OLE.CellProtection[All; All]", 'Read Only')
Set_Property(DispStageCtrl, "OLE.HeaderAlignment[All; 1]", 'C':@FM:'C':@FM:'L')
// Disable scrollbars
Set_Property(DispStageCtrl, "OLE.ScrollBarsVisible", 'N':@FM:'N')
// Setup checkbox column
CheckBoxArray = 'Check Box'
CheckBoxArray<2,1> = True$
Set_Property(DispStageCtrl, "OLE.CellType[3; All]", CheckBoxArray)
Set_Property(DispStageCtrl, "OLE.CellCheckEnabled[3; All]", False$)
Set_Property(DispStageCtrl, "OLE.CellAlignment[3; All]", 'C':@FM:'C':@FM:'L')
Set_Property(DispStageCtrl, "OLE.AllowDeletions", False$)
Set_Property(DispStageCtrl, "OLE.AllowInserts", False$)
// Qualify OLE events that we want to intercept
Qualifier = ''
Qualifier<1> = 1
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
Send_Message(DispStageCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
return
FillReactorStageCtrl:
ReactorStageCtrl = @Window:'.OLE_REACTOR_STAGE_EDT'
StageList = Gan_Services('GetGaNStages', 'Reactor')
ReactorStageCtrlList = ''
For each StageID in StageList using @VM setting RowIndex
ReactorStageCtrlList<RowIndex, 1> = StageID
ReactorStageCtrlList<RowIndex, 2> = GaN_Services('GetStageDesc', StageID)
ReactorStageCtrlList<RowIndex, 3> = True$
Next StageID
Set_Property(ReactorStageCtrl, 'OLE.LIST', ReactorStageCtrlList)
// Color headers
Set_Property(ReactorStageCtrl, "OLE.HeaderColors[All; 1]", @FM:"{180, 180, 180}")
CellColorArray = 'None':@FM:"{220, 220, 220}"
Set_Property(ReactorStageCtrl, "OLE.CellColors[All; All]", CellColorArray)
return
FillCharStageCtrl:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
PRSStageKeys = PSRec<PROD_SPEC_PRS_STAGE_KEY$>
CharStageCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
ReqStages = Gan_Services('GetReqStages')
CharStages = GaN_Services('GetGaNStages', 'Metrology', PSNo)
CurrRecord = Get_Property(@Window, 'ATRECORD')
CharStageCtrlList = ''
For each StageID in CharStages using @VM setting RowIndex
ToolClassKey = 'G_':StageID
Destructive = GaN_Services('IsDestStage', StageID)
CharStageCtrlList<RowIndex, 1> = StageID
CharStageCtrlList<RowIndex, 2> = GaN_Services('GetStageDesc', StageID)
PRSStageKey = PSNo:'*':StageID
Locate PRSStageKey in PRSStageKeys using @VM setting Dummy then
StageEnabled = True$
end else
StageEnabled = False$
end
Locate StageID in ReqStages using @VM setting Dummy then
CellColorArray = 'None':@FM:"{220, 220, 220}"
Set_Property(CharStageCtrl, "OLE.CellColors[All; ":RowIndex:"]", CellColorArray)
Set_Property(CharStageCtrl, "OLE.CellCheckEnabled[3; ":RowIndex:"]", False$)
end else
Set_Property(CharStageCtrl, "OLE.CellCheckEnabled[3; ":RowIndex:"]", True$)
end
CharStageCtrlList<RowIndex, 3> = StageEnabled
Next StageID
Set_Property(CharStageCtrl, 'OLE.LIST', CharStageCtrlList)
StageEnabledList = Get_Property(CharStageCtrl, 'OLE.ColumnData[3]')
StageOrderList = Get_Property(CharStageCtrl, 'OLE.ColumnData[1]')
Set_Property(@Window, '@ORIG_STAGE_ORDER_LIST', StageOrderList)
Set_Property(@Window, '@STAGE_ORDER_LIST', StageOrderList)
Set_Property(@Window, '@ORIG_STAGE_ENABLED_LIST', StageEnabledList)
Set_Property(@Window, '@STAGE_ENABLED_LIST', StageEnabledList)
// Color headers
Set_Property(CharStageCtrl, "OLE.HeaderColors[All; 1]", @FM:"{180, 180, 180}")
GoSub ColorCharStages
return
FillDispStageCtrl:
ANKO = Get_Property(@Window:'.CHK_ANKO', 'DEFPROP')
DispStageCtrl = @Window:'.OLE_DISP_STAGE_EDT'
StageList = Gan_Services('GetGaNStages', 'Disposition')
DispStageCtrlList = ''
For each StageID in StageList using @VM setting RowIndex
DispStageCtrlList<RowIndex, 1> = StageID
DispStageCtrlList<RowIndex, 2> = GaN_Services('GetStageDesc', StageID)
If ( (StageID EQ 'G_PACK') and (ANKO EQ True$) ) then
DispStageCtrlList<RowIndex, 3> = False$
end else
DispStageCtrlList<RowIndex, 3> = True$
end
Next StageID
Set_Property(DispStageCtrl, 'OLE.LIST', DispStageCtrlList)
// Color headers
Set_Property(DispStageCtrl, "OLE.HeaderColors[All; 1]", @FM:"{180, 180, 180}")
CellColorArray = 'None':@FM:"{220, 220, 220}"
Set_Property(DispStageCtrl, "OLE.CellColors[All; All]", CellColorArray)
return
FillANKOGroups:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
ANKO = PSRec<PROD_SPEC_ANKO$>
ANKOMetPockets = PSRec<PROD_SPEC_ANKO_MET_POCKETS$>
ANKOFullCharPocket = PSRec<PROD_SPEC_ANKO_FULL_CHAR_POCKET$>
ANKOWaferSel = PSRec<PROD_SPEC_ANKO_WAFER_SELECTION$>
If ( (ANKOWaferSel EQ '') or (ANKO and (ANKOWaferSel EQ 'PRESET') ) ) then
If ANKO then
ANKOWaferSel = 'CANDELA'
end else
ANKOWaferSel = 'PRESET'
end
PSRec<PROD_SPEC_ANKO_WAFER_SELECTION$> = ANKOWaferSel
Database_Services('WriteDataRow', 'PROD_SPEC', PSNo, PSRec, True$, False$, True$)
end
If ANKOFullCharPocket EQ '' then
ANKOFullCharPocket = 1
PSRec<PROD_SPEC_ANKO_FULL_CHAR_POCKET$> = ANKOFullCharPocket
Database_Services('WriteDataRow', 'PROD_SPEC', PSNo, PSRec, True$, False$, True$)
end
For Pocket = 1 to 8
Check = ANKOMetPockets<0, Pocket>
Set_Property(@Window:'.CHK_WFR_':Pocket, 'CHECK', Check)
If Check EQ True$ then
ANKOMetPockets<0, Pocket> = True$
Set_Property(@Window:'.CHK_CHAR_':Pocket, 'ENABLED', True$)
end else
ANKOMetPockets<0, Pocket> = False$
Set_Property(@Window:'.CHK_CHAR_':Pocket, 'ENABLED', False$)
end
Next Pocket
Set_Property(@Window:'.CHK_CHAR_':ANKOFullCharPocket, 'CHECK', True$)
Set_Property(@Window:'.RDO_WAFER_SELECTION', 'VALUE', ANKOWaferSel)
Set_Property(@Window, '@ORIG_ANKO_MET_POCKETS', ANKOMetPockets)
Set_Property(@Window, '@ANKO_MET_POCKETS', ANKOMetPockets)
Set_Property(@Window, '@ORIG_ANKO_FULL_CHAR_POCKET', ANKOFullCharPocket)
Set_Property(@Window, '@ANKO_FULL_CHAR_POCKET', ANKOFullCharPocket)
Set_Property(@Window, '@ORIG_ANKO_WAFER_SELECTION', ANKOWaferSel)
Set_Property(@Window, '@ANKO_WAFER_SELECTION', ANKOWaferSel)
return
UpdateANKOGroups:
ANKO = Get_Property(@Window:'.CHK_ANKO', 'CHECK')
Pocket = Ctrl[-1, 1]
Begin Case
Case (Ctrl[1, 8] EQ 'CHK_WFR_')
ANKOMetPockets = Get_Property(@Window, '@ANKO_MET_POCKETS')
CheckVal = Get_Property(@Window:'.CHK_WFR_':Pocket, 'CHECK')
ANKOMetPockets<0, Pocket> = CheckVal
If ANKO then Set_Property(@Window:'.CHK_CHAR_':Pocket, 'ENABLED', CheckVal)
Set_Property(@Window, '@ANKO_MET_POCKETS', ANKOMetPockets)
If CheckVal EQ False$ then
CharPocket = Get_Property(@Window:'.CHK_CHAR_':Pocket, 'CHECK')
If CharPocket EQ True$ then
// Reset char pocket to 1
Set_Property(@Window:'.CHK_CHAR_1', 'CHECK', True$)
Set_Property(@Window:'.CHK_CHAR_':Pocket, 'CHECK', False$)
end
end
Case (Ctrl[1, 9] EQ 'CHK_CHAR_')
CheckVal = Get_Property(@Window:'.CHK_CHAR_':Pocket, 'CHECK')
If CheckVal EQ True$ then
ANKOCharPocket = Pocket
end else
ANKOCharPocket = 1
Set_Property(@Window:'.CHK_CHAR_':ANKOCharPocket, 'CHECK', True$)
end
Set_Property(@Window, '@ANKO_FULL_CHAR_POCKET', ANKOCharPocket)
// Ensure all other char check boxes are cleared
For CharPocket = 1 to 8
If CharPocket NE ANKOCharPocket then
Set_Property(@Window:'.CHK_CHAR_':CharPocket, 'CHECK', False$)
end
Next CharPocket
End Case
return
ResetColorArrays:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
PartNo = Get_Property(@Window, '@CURR_PART_NO')
GaNParamStages = Get_Property(@Window, '@GAN_PARAM_STAGES')
CellColorArray = ''
For each Stage in GaNParamStages using @VM setting TabIndex
GaNParamConfigKey = PSNo:'*':PartNo:'*':Stage
GaNParamConfigRec = Database_Services('ReadDataRow', 'GAN_PARAM_CONFIG', GaNParamConfigKey)
ParamNames = GaNParamConfigRec<GAN_PARAM_CONFIG.PARAM_NAME$>
For each ParamName in ParamNames using @VM setting RowPos
CellColorArray<TabIndex, RowPos, 1> = 'None'
CellColorArray<TabIndex, RowPos, 2> = 'None'
CellColorArray<TabIndex, RowPos, 3> = 'None'
CellColorArray<TabIndex, RowPos, 4> = 'None'
CellColorArray<TabIndex, RowPos, 5> = 'None'
Next ParamName
Next Stage
Set_Property(@Window, '@COLOR_ARRAY', CellColorArray)
return
DisplayTimestamps:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
If PSNo NE '' then
ProdSpecRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
RevCPDTM = ProdSpecRec<PROD_SPEC_GAN_REV_CP_DTM$>
RevOIDTM = ProdSpecRec<PROD_SPEC_GAN_REV_OI_DTM$>
RevUser = ProdSpecRec<PROD_SPEC_GAN_REV_USER$>
RevCPDTM = OConv(RevCPDTM, 'DT2/^H')
RevOIDTM = OConv(RevOIDTM, 'DT2/^H')
Set_Property(@Window:'.TXT_OI_DTM', 'TEXT', RevOIDTM)
Set_Property(@Window:'.TXT_CP_DTM', 'TEXT', RevCPDTM)
Set_Property(@Window:'.TXT_USER', 'TEXT', OConv(RevUser, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
end
return
SetupTabCtrl:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
PartNos = Xlate('PROD_SPEC', PSNo, 'PROD_VER_EPI_PART_NO', 'X')
NumPartNos = DCount(PartNos, @VM)
CurrPartNo = Field(PartNos, @VM, NumPartNos)
Set_Property(@Window, '@CURR_PART_NO', CurrPartNo)
GaNParamStages = Xlate('APP_INFO', 'GAN_PARAM_STAGES', '', 'X')
TabCtrl = @Window:'.OLE_TAB'
NumTabs = DCount(GaNParamStages, @VM)
Set_Property(TabCtrl, "OLE.TabCount", NumTabs)
Convert @VM to ',' in GaNParamStages
Convert '_' to ' ' in GaNParamStages
Set_Property(TabCtrl, "OLE.CaptionList", GaNParamStages)
FontArray = 'Segoe UI':@SVM:9:@SVM:700
Set_Property(TabCtrl, "OLE.Font", FontArray)
Set_Property(TabCtrl, "OLE.SelectFont", FontArray)
// Qualify OLE events that we want to intercept
Qualifier = ''
Qualifier<1> = 1
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
Send_Message(TabCtrl, 'QUALIFY_EVENT', 'OLE.SelChanged', Qualifier)
Set_Property(TabCtrl, "OLE.FlickerFree", True$)
return
UpdateLimits:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
If PSNo NE '' then
CurrDTM = DateTime()
PartNos = Xlate('PROD_SPEC', PSNo, 'PROD_VER_EPI_PART_NO', 'X')
NumPartNos = DCount(PartNos, @VM)
CurrPartNo = Field(PartNos, @VM, NumPartNos)
If CurrPartNo EQ 'U014' then CurrPartNo = 'G5HTMV675AA'
Response = GaN_Services('GetCurrLimits', CurrPartNo)
ResponseParamList = Response<1>
// Get Control Plan data
GaNParamKeys = Xlate('PROD_SPEC', PSNo, 'GAN_PARAM_KEYS', 'X')
Stages = Database_Services('ReadDataRow', 'APP_INFO', 'GAN_PARAM_STAGES', 'X')
ParameterList = ''
ParamNameList = ''
CellColorArray = ''
For each Stage in Stages using @VM setting TabIndex
MetType = Stage
GaNParamConfigKey = PSNo:'*':CurrPartNo:'*':MetType
GaNParamConfigRec = Database_Services('ReadDataRow', 'GAN_PARAM_CONFIG', GaNParamConfigKey)
If Error_Services('NoError') then
ConfigMetNames = GaNParamConfigRec<GAN_PARAM_CONFIG.MET_NAME$>
ConfigParams = GaNParamConfigRec<GAN_PARAM_CONFIG.PARAM_NAME$>
EnabledArray = GaNParamConfigRec<GAN_PARAM_CONFIG.ENABLED$>
CurrVals = Get_Property(@Window, '@ORIG_VALUE_LIST')<TabIndex>
CurrNames = Get_Property(@Window, '@ORIG_MET_LIST')<TabIndex>
For each ParamName in ConfigParams using @VM setting RowPos
ParamEnabled = EnabledArray<0, RowPos>
If ParamEnabled EQ True$ then
NextRow = DCount(ParamNameList<TabIndex>, @VM) + 1
ParamNameList<TabIndex, NextRow> = ConfigMetNames<0, RowPos>
Locate ParamName in CurrNames using @VM setting CurrRow then
Locate ParamName in ResponseParamList using @VM setting vPos then
NewLSL = Response<2, vPos>
NewTarget = Response<3, vPos>
NewUSL = Response<4, vPos>
PrevLSL = CurrVals<0, CurrRow, 1>
PrevTarget = CurrVals<0, CurrRow, 2>
PrevUSL = CurrVals<0, CurrRow, 3>
If (PrevLSL EQ NewLSL) then
CellColorArray<TabIndex, NextRow, 1> = 'None'
end else
CellColorArray<TabIndex, NextRow, 1> = 'Yellow'
end
If (PrevTarget EQ NewTarget) then
CellColorArray<TabIndex, NextRow, 2> = 'None'
end else
CellColorArray<TabIndex, NextRow, 2> = 'Yellow'
end
If (PrevUSL EQ NewUSL) then
CellColorArray<TabIndex, NextRow, 3> = 'None'
end else
CellColorArray<TabIndex, NextRow, 3> = 'Yellow'
end
ParameterList<TabIndex, NextRow, 1> = NewLSL
ParameterList<TabIndex, NextRow, 2> = NewTarget
ParameterList<TabIndex, NextRow, 3> = NewUSL
end else
ParameterList<TabIndex, NextRow, 1> = 'None'
ParameterList<TabIndex, NextRow, 2> = 'None'
ParameterList<TabIndex, NextRow, 3> = 'None'
end
end else
// New parameter being added
Locate ParamName in ResponseParamList using @VM setting vPos then
NewLSL = Response<2, vPos>
NewTarget = Response<3, vPos>
NewUSL = Response<4, vPos>
ParameterList<TabIndex, NextRow, 1> = NewLSL
ParameterList<TabIndex, NextRow, 2> = NewTarget
ParameterList<TabIndex, NextRow, 3> = NewUSL
CellColorArray<TabIndex, NextRow, 1> = 'Yellow'
CellColorArray<TabIndex, NextRow, 2> = 'Yellow'
CellColorArray<TabIndex, NextRow, 3> = 'Yellow'
end
end
end
Next ParamName
end
Next Stage
end
Set_Property(@Window, '@NAME_LIST', ParamNameList)
Set_Property(@Window, '@VALUE_LIST', ParameterList)
Set_Property(@Window, '@COLOR_ARRAY', CellColorArray)
return
SetupPartParamCtrl:
PartParamCtrl = @Window:'.OLE_PART_PARAM_EDT'
HeaderRowTitles = 'LSL':@VM:'Target':@VM:'USL'
DispStageDimArray = 5:@FM:1
Set_Property(PartParamCtrl, "OLE.Dimension", DispStageDimArray)
Set_Property(PartParamCtrl, "OLE.TitleList", HeaderRowTitles)
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
Set_Property(PartParamCtrl, "OLE.HeaderFont[All; All]", HeaderFontArray)
HeaderColArray = 180:@FM:True$:@FM:False$:@FM:False$
Set_Property(PartParamCtrl, "OLE.HeaderColumn[1]", HeaderColArray)
Set_Property(PartParamCtrl, "OLE.HeaderText[1; 1]", "Metrology Limits")
// Disable resizing of columns as there is no need for this on this form
StageColSize = Get_Property(PartParamCtrl, "OLE.DataColumn[1]")
StageColSize<1> = 100
StageColSize<3> = False$
Set_Property(PartParamCtrl, "OLE.DataColumn[All]", StageColSize)
Set_Property(PartParamCtrl, "OLE.CellProtection[All; All]", 'Read Only')
return
ReadCurrParams:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
If PSNo NE '' then
GaNParamStages = Xlate('APP_INFO', 'GAN_PARAM_STAGES', '', 'X')
Set_Property(@Window, '@GAN_PARAM_STAGES', GaNParamStages)
GaNParamKeys = Xlate('PROD_SPEC', PSNo, 'GAN_PARAM_KEYS', 'X')
ParameterList = ''
ParamNameList = ''
MetNameList = ''
For each GaNParamKey in GaNParamKeys using @VM
MetType = Field(GaNParamKey, '*', 2)
Locate MetType in GaNParamStages using @VM setting TabPos then
GaNParamRec = Database_Services('ReadDataRow', 'GAN_PARAMS', GaNParamKey)
PartNo = Field(GaNParamKey, '*', 1)
ParamNames = GaNParamRec<GAN_PARAMS.PARAM_NAME$>
MetNames = GaNParamRec<GAN_PARAMS.MET_NAME$>
For each ParamName in ParamNames using @VM setting RowPos
MetNameList<TabPos, RowPos> = ParamName
ParamNameList<TabPos, RowPos> = MetNames<0, RowPos>
ParameterList<TabPos, RowPos, 1> = GaNParamRec<GAN_PARAMS.LSL$, RowPos>
ParameterList<TabPos, RowPos, 2> = GaNParamRec<GAN_PARAMS.TARGET$, RowPos>
ParameterList<TabPos, RowPos, 3> = GaNParamRec<GAN_PARAMS.USL$, RowPos>
Next ParamName
end
Next GaNParamKey
Set_Property(@Window, '@NAME_LIST', ParamNameList)
Set_Property(@Window, '@VALUE_LIST', ParameterList)
Set_Property(@Window, '@ORIG_VALUE_LIST', ParameterList)
Set_Property(@Window, '@ORIG_MET_LIST', MetNameList)
end
return
FillPartParamCtrl:
PartParamCtrl = @Window:'.OLE_PART_PARAM_EDT'
TabCtrl = @Window:'.OLE_TAB'
TabIndex = Get_Property(TabCtrl, 'OLE.SelectedTab')
HeaderTitles = Get_Property(@Window, '@NAME_LIST')<TabIndex>
ParameterList = Get_Property(@Window, '@VALUE_LIST')<TabIndex>
CellColorArray = Get_Property(@Window, '@COLOR_ARRAY')<TabIndex>
NumCols = 3
NumRows = DCount(ParameterList, @VM)
DispStageDimArray = NumCols:@FM:NumRows
Set_Property(PartParamCtrl, "OLE.Dimension", DispStageDimArray)
Convert @VM to @FM in ParameterList
Convert @SVM to @VM in ParameterList
Set_Property(@Window:'.OLE_PART_PARAM_EDT', 'OLE.LIST', ParameterList)
Convert @VM to @FM in HeaderTitles
Convert @SVM to @VM in HeaderTitles
For each HeaderTitle in HeaderTitles using @FM setting RowIndex
Set_Property(PartParamCtrl, "OLE.HeaderText[1; ":RowIndex + 1:"]", HeaderTitle)
Next HeaderTitle
Set_Property(PartParamCtrl, "OLE.HeaderAlignment[1; 2-":NumRows + 1:"]", 'C':@FM:'L':@FM:'L')
Set_Property(PartParamCtrl, "OLE.CellAlignment[All; All]", 'C':@FM:'R':@FM:'L')
Set_Property(PartParamCtrl, "OLE.HeaderAlignment[All; 1]", 'C':@FM:'C':@FM:'L')
GoSub ColorCells
return
EnableSaveButton:
ChangeDetected = False$
PartParamOrigVals = Get_Property(@Window, '@ORIG_VALUE_LIST')
PartParamCurrVals = Get_Property(@Window, '@VALUE_LIST')
StageOrigVals = Get_Property(@Window, '@ORIG_STAGE_ENABLED_LIST')
StageCurrVals = Get_Property(@Window, '@STAGE_ENABLED_LIST')
StageOrderOrigVals = Get_Property(@Window, '@ORIG_STAGE_ORDER_LIST')
StageOrderCurrVals = Get_Property(@Window, '@STAGE_ORDER_LIST')
ANKOMetPocketsOrig = Get_Property(@Window, '@ORIG_ANKO_MET_POCKETS')
ANKOMetPockets = Get_Property(@Window, '@ANKO_MET_POCKETS')
ANKOCharPocketOrig = Get_Property(@Window, '@ORIG_ANKO_FULL_CHAR_POCKET')
ANKOCharPocket = Get_Property(@Window, '@ANKO_FULL_CHAR_POCKET')
ANKOWaferSelOrig = Get_Property(@Window, '@ORIG_ANKO_WAFER_SELECTION')
ANKOWaferSel = Get_Property(@Window, '@ANKO_WAFER_SELECTION')
FormOrigVals = Get_Property(@Window, '@ORIG_RECORD')
FormCurrVals = Get_Property(@Window, 'ATRECORD')
PartParamChange = (PartParamOrigVals NE PartParamCurrVals)
DataboundChange = (FormOrigVals NE FormCurrVals)
StageChange = (StageOrigVals NE StageCurrVals)
StageOrderChange = (StageOrderOrigVals NE StageOrderCurrVals)
ANKOMetPocketsChange = (ANKOMetPocketsOrig NE ANKOMetPockets)
ANKOCharPocketChange = (ANKOCharPocketOrig NE ANKOCharPocket)
ANKOWaferSelChange = (ANKOWaferSelOrig NE ANKOWaferSel)
ChangeDetected = (PartParamChange or DataboundChange or StageChange or StageOrderChange or ANKOMetPocketsChange or ANKOCharPocketChange or ANKOWaferSelChange)
NewPSN = Get_Property(@Window, '@NEW_PSN')
SaveEnabled = (ChangeDetected or NewPSN)
Set_Property(@Window:'.PUB_SAVE', 'ENABLED', SaveEnabled)
Set_Property(@Window, 'SAVEWARN', ChangeDetected)
return
EnableImportButton:
NameList = Get_Property(@Window, '@NAME_LIST')
ChangeDetected = False$
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
CurrPartNo = Get_Property(@Window, '@CURR_PART_NO')
Stages = Get_Property(@Window, '@GAN_PARAM_STAGES')
DataToImport = False$
For each Stage in Stages using @VM setting TabIndex
ThisNameList = NameList<TabIndex>
GaNParamConfigKey = PSNo:'*':CurrPartNo:'*':Stage
GaNParamConfigRec = Database_Services('ReadDataRow', 'GAN_PARAM_CONFIG', GaNParamConfigKey)
If Error_Services('NoError') then
MetNames = GaNParamConfigRec<GAN_PARAMS.MET_NAME$>
EnabledArray = GaNParamConfigRec<GAN_PARAM_CONFIG.ENABLED$>
If MetNames NE '' then
For each MetName in MetNames using @VM setting vPos
Enabled = EnabledArray<0, vPos>
If Enabled EQ True$ then
Locate MetName in ThisNameList using @VM setting nPos else
ChangeDetected = True$
end
end else
Locate MetName in ThisNameList using @VM setting nPos then
ChangeDetected = True$
end
end
Until ChangeDetected EQ True$
Next MetName
end
end
Until ChangeDetected EQ True$
Next Stage
Set_Property(@Window:'.PUB_IMPORT_CP', 'ENABLED', ChangeDetected)
return
EnableAnkoCheckbox:
TechType = Get_Property(@Window:'.RDO_TECH_TYPE', 'DEFPROP')
If TechType EQ 'P' then
Set_Property(@Window:'.CHK_ANKO', 'ENABLED', True$)
end else
Set_Property(@Window:'.CHK_ANKO', 'ENABLED', False$)
end
return
ColorCells:
PartParamCtrl = @Window:'.OLE_PART_PARAM_EDT'
DimArray = Get_Property(PartParamCtrl, "OLE.Dimension")
NumCols = DimArray<1>
NumRows = DimArray<2>
For Row = 1 to NumRows
For Col = 1 to NumCols
CellColor = CellColorArray<0, Row, Col>
Set_Property(PartParamCtrl, 'OLE.CellColors[':Col:';':Row:']', @FM:CellColor)
Next Col
Next Row
return
ColorTabs:
GaNParamStages = Get_Property(@Window, '@GAN_PARAM_STAGES')
CellColorArray = Get_Property(@Window, '@COLOR_ARRAY')
For each Stage in GaNParamStages using @VM setting TabIndex
ThisCellColorArray = CellColorArray<TabIndex>
GoSub ColorTab
Next Stage
return
HideTabs:
SelTabIndex = Get_Property(@Window:".OLE_TAB", "OLE.SelectedTab")
GaNParamStages = Get_Property(@Window, '@GAN_PARAM_STAGES')
NumTabs = DCount(GaNParamStages, @VM)
NameArray = Get_Property(@Window, '@NAME_LIST')
For each Stage in GaNParamStages using @VM setting TabIndex
ThisNameArray = NameArray<TabIndex>
GoSub HideTab
Next Stage
SelTabVisible = Get_Property(@Window:'.OLE_TAB', 'OLE.TabVisible[':SelTabIndex:']')
If SelTabVisible EQ False$ then
For TabIndex = 1 to NumTabs
TabVisible = Get_Property(@Window:'.OLE_TAB', 'OLE.TabVisible[':TabIndex:']')
Until TabVisible EQ True$
Next TabIndex
If TabVisible EQ True$ then Set_Property(@Window:".OLE_TAB", "OLE.SelectedTab", TabIndex)
end
return
HideTab:
If ThisNameArray EQ '' then
Set_Property(@Window:'.OLE_TAB', 'OLE.TabVisible[':TabIndex:']', False$)
end else
Set_Property(@Window:'.OLE_TAB', 'OLE.TabVisible[':TabIndex:']', True$)
end
return
ColorTab:
NumRows = DCount(ThisCellColorArray, @VM)
NumCols = DCount(ThisCellColorArray, @SVM)
ChangeDetected = False$
For Row = 1 to NumRows
For Col = 1 to NumCols
CellColor = ThisCellColorArray<0, Row, Col>
If CellColor EQ 'Yellow' then
ChangeDetected = True$
end
Until ChangeDetected EQ True$
Next Col
Until ChangeDetected EQ True$
Next Row
If ChangeDetected EQ False$ then
Colors = ""
Colors<1, 2> = "None"
Colors<2, 2> = "None"
Colors<3, 2> = "None"
Colors<4, 1> = "None"
Colors<4, 2> = "None"
Colors<5> = "None"
Set_Property(TabCtrl, "OLE.TabColors[":TabIndex:"]", Colors)
end else
Colors = ""
Colors<1, 2> = "Vertical(Gradient(Yellow L=80, Yellow L=90), Border(Yellow))"
Colors<2, 2> = "Vertical(Gradient(Yellow L=90, Yellow L=95), Border(Yellow))"
Colors<3, 2> = "Vertical(Gradient(Yellow L=85, Yellow L=95), Border(Yellow))"
Colors<4, 1> = "Gray"
Colors<4, 2> = "Vertical(Gradient(Gray L=80, Gray L=90), Border(Gray))"
Colors<5> = "Vertical(Gradient(Yellow L=95, Yellow L=80), Border(Yellow))"
Set_Property(TabCtrl, "OLE.TabColors[":TabIndex:"]", Colors)
end
return
SaveParameters:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
PartNo = Get_Property(@Window, '@CURR_PART_NO')
If ( (PSNo NE '') and (PartNo NE '') ) then
CurrDTM = DateTime()
// Get Control Plan data
NewGaNParamKeys = ''
ProdSpecRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
GaNParamKeys = ProdSpecRec<PROD_SPEC_GAN_PARAM_KEYS$>
GaNParamStages = Database_Services('ReadDataRow', 'APP_INFO', 'GAN_PARAM_STAGES')
NewParamNameList = ''
For each GaNParamStage in GaNParamStages using @VM setting TabIndex
MetType = GaNParamStage
GaNParamConfigKey = PSNo:'*':PartNo:'*':MetType
GaNParamConfigRec = Database_Services('ReadDataRow', 'GAN_PARAM_CONFIG', GaNParamConfigKey)
MetNames = GaNParamConfigRec<GAN_PARAM_CONFIG.MET_NAME$>
ParamNames = GaNParamConfigRec<GAN_PARAM_CONFIG.PARAM_NAME$>
HeaderTitles = Get_Property(@Window, '@NAME_LIST')<TabIndex>
ParameterList = Get_Property(@Window, '@VALUE_LIST')<TabIndex>
If ParameterList NE '' then
// Create new GaN Param record.
GaNParamRec = ''
For each ParamName in HeaderTitles using @VM setting RowPos
Locate ParamName in MetNames using @VM setting vPos then
NewParamNameList<TabIndex, RowPos> = ParamNames<0, vPos>
GaNParamRec<GAN_PARAMS.MET_NAME$, RowPos> = MetNames<0, vPos>
GaNParamRec<GAN_PARAMS.PARAM_NAME$, RowPos> = ParamNames<0, vPos>
GaNParamRec<GAN_PARAMS.LSL$, RowPos> = ParameterList<0, RowPos, 1>
GaNParamRec<GAN_PARAMS.TARGET$, RowPos> = ParameterList<0, RowPos, 2>
GaNParamRec<GAN_PARAMS.USL$, RowPos> = ParameterList<0, RowPos, 3>
end
Next ParamName
NewGaNParamKey = PartNo:'*':MetType:'*':CurrDTM
NewGaNParamKeys<0, -1> = NewGaNParamKey
Database_Services('WriteDataRow', 'GAN_PARAMS', NewGaNParamKey, GaNParamRec, True$, False$, True$)
end
Next GaNParamStage
Query = "SELECT [Stamp] " |
: "FROM [ControlPlans].[dbo].[Part_Parameter] " |
: "WHERE [Part] = 'U012' " |
: "GROUP BY [Stamp]"
ControlPlanDTM = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
ControlPlanDTM[-3, 1] = ''
ControlPlanDTM = IConv(ControlPlanDTM, "DT")
ProdSpecRec<PROD_SPEC_GAN_PARAM_KEYS$> = NewGaNParamKeys
ProdSpecRec<PROD_SPEC_GAN_REV_CP_DTM$> = ControlPlanDTM
ProdSpecRec<PROD_SPEC_GAN_REV_OI_DTM$> = CurrDTM
ProdSpecRec<PROD_SPEC_GAN_REV_USER$> = @User4
Database_Services('WriteDataRow', 'PROD_SPEC', PSNo, ProdSpecRec, True$, False$, True$)
GaNParamKeysPrime = SRP_Array('Rotate', NewGaNParamKeys, @VM, '*')
GaNCritStages = GaNParamKeysPrime<1, 2>
// Cross reference the PRS_STAGE records.
MetStages = GaN_Services('GetGaNStages', 'Metrology')
For each StageID in MetStages using @VM setting vPos
Locate StageID in GaNCritStages using '*' setting Dummy then
// Check if a PRS_STAGE record exists. If it does not, then create one.
PRSStageKey = PSNo:'*':StageID
If (RowExists('PRS_STAGE', PRSStageKey) EQ False$) then
// Create PRS_STAGE record
PRSStageRec = ''
PRSStageRec<PRS_STAGE_PROC_TOOL_CLASS$> = Gan_Services('GetToolClassIDs', StageID)
PRSStageRec<PRS_STAGE_PROC_INV_ACTION$> = 'START':@VM:'STOP'
Database_Services('WriteDataRow', 'PRS_STAGE', PRSStageKey, PRSStageRec, True$, False$, True$)
end
end
Next Stage
end
return
StatusClick:
/* DPC 1/28/19 - when PSN is statused (any status), want to add entry to PROD_SPEC_REV_HIST (history) table */
ReactorType = Get_Property(@WINDOW:'.RTYPE','DEFPROP')
PSNo = Get_Property(@WINDOW:'.PROD_SPEC_ID','DEFPROP')
NewStatus = Get_Property(@WINDOW:'.STATUS','DEFPROP')
PSRec = Get_Property(@WINDOW, 'ATRECORD')
IF PSNo = '' THEN RETURN
Begin Case
Case NewStatus EQ 'A'
// Need to check if this PSN is eligible to be activated.
ReadyToActivate = True$
TechType = Get_Property(@Window:'.RDO_TECH_TYPE', 'DEFPROP')
If TechType EQ 'P' then
ReadyToActivate = False$
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
CurrPartNo = Get_Property(@Window:'.EDL_PART_NO', 'TEXT')
If CurrPartNo NE '' then
// Need to ensure Candela Total Defects is enabled.
GaNParamKeys = PSRec<PROD_SPEC_GAN_PARAM_KEYS$>
CanPreKey = ''
For each ParamKey in GaNParamKeys using @VM setting vPos
Stage = Field(ParamKey, '*', 2)
If Stage EQ 'CAN_PRE' then CanPreKey = ParamKey
Until CanPreKey NE ''
Next ParamKey
If CanPreKey NE '' then
CanPreParamRec = Database_Services('ReadDataRow', 'GAN_PARAMS', CanPreKey)
If Error_Services('NoError') then
MetNames = CanPreParamRec<GAN_PARAMS.MET_NAME$>
Locate 'Candela Total Defects' in MetNames using @VM setting vPos then
ReadyToActivate = True$
end else
ErrorMsg = 'Candela Total Defects not found in the Part & Parameters configuration record. PSN not eligible to be activated.'
ErrMsg(ErrorMsg)
end
end else
ErrorMsg = 'Error reading CAN_PRE parameter configuration record. PSN not eligible to be activated.'
ErrMsg(ErrorMsg)
end
end else
ErrorMsg = 'CAN_PRE parameter record not found.'
ErrMsg(ErrorMsg)
end
end else
ErrorMsg = 'A part number (i.e. PROD_VER) is required in order for the PSN to be activated.'
ErrMsg(ErrorMsg)
end
end
If ReadyToActivate EQ False$ then
Set_Property(@Window:'.STATUS', 'DEFPROP', 'I')
end
Case Otherwise$
Null
End Case
return
FillRevHistEDT:
// Fill Revision History Edit Table
PSNo = Get_Property(@Window : '.PROD_SPEC_ID', 'DEFPROP')
RevHistRec = Database_Services('ReadDataRow', 'PROD_SPEC_REV_HIST', PSNo)
List = ''
RevisionCol = 1
UsernameCol = 2
DateCol = 3
TimeCol = 4
For each Field in RevHistRec using @FM setting fPos
For Each Value in Field using @VM setting vPos
Begin Case
Case fPos EQ 1
List<vPos, UsernameCol> = Value
Case fPos EQ 2
List<vPos, DateCol> = OConv(Value, 'D2/HS')
Case fPos EQ 3
List<vPos, TimeCol> = OConv(Value, 'MTH')
Case fPos EQ 4
List<vPos, RevisionCol> = Value
End Case
Next Value
Next Field
Set_Property(@Window : '.EDT_REV_HIST', 'LIST', List)
return
UpdateRevHist:
// Gather one line revision detail
Result = False$
Response = Dialog_Box('NDW_ADD_PSN_REVISION', @WINDOW)
Valid = Response<1>
RevisionDetail = Response<2>
If Valid then
// Update PROD_SPEC_REV_HIST record
CtrlName = @Window : '.PROD_SPEC_ID'
PSNo = Get_Property(CtrlName,'DEFPROP')
If RowExists('PROD_SPEC_REV_HIST', PSNo) then
PSRevHistRec = Database_Services('ReadDataRow', 'PROD_SPEC_REV_HIST', PSNo)
end else
PSRevHistRec = ''
Database_Services('WriteDataRow', 'PROD_SPEC_REV_HIST', PSNo, PSRevHistRec, True$)
If Error_Services('NoError') then
// Rev Hist record created successfully
end else
Errmsg('Error creating PROD_SPEC_REV_HIST record: ' : PSNo : @SVM : 'Please notify OpenInsight administrator')
end
end
If Error_Services('NoError') then
Usernames = PSRevHistRec<PROD_SPEC_REV_HIST_MOD_USERNAME$>
Dates = PSRevHistRec<PROD_SPEC_REV_HIST_MOD_DATE$>
Times = PSRevHistRec<PROD_SPEC_REV_HIST_MOD_TIME$>
Revisions = PSRevHistRec<PROD_SPEC_REV_HIST_REVISION_DETAIL$>
ModUser = OConv( @user4, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' )
ModDate = Date()
ModTime = Time()
ModRevision = RevisionDetail
PSRevHistRec<PROD_SPEC_REV_HIST_MOD_USERNAME$> = Insert(Usernames, 0, 1, 0, ModUser)
PSRevHistRec<PROD_SPEC_REV_HIST_MOD_DATE$> = Insert(Dates, 0, 1, 0, ModDate)
PSRevHistRec<PROD_SPEC_REV_HIST_MOD_TIME$> = Insert(Times, 0, 1, 0, ModTime)
PSRevHistRec<PROD_SPEC_REV_HIST_REVISION_DETAIL$> = Insert(Revisions, 0, 1, 0, ModRevision)
Database_Services('WriteDataRow', 'PROD_SPEC_REV_HIST', PSNo, PSRevHistRec, True$)
If Error_Services('NoError') then
Result = True$
end else
Errmsg('Error writing PROD_SPEC_REV_HIST record: ' : PSNo : @SVM : 'Please notify OpenInsight administrator')
end
end else
Errmsg('Error reading PROD_SPEC_REV_HIST record: ' : PSNo : @SVM : 'Please notify OpenInsight administrator')
end
end else
Errmsg('You must enter revision details in order to save changes to product specifications')
end
Return Result
EnableArrowButtons:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
TechType = Get_Property(@Window:'.RDO_TECH_TYPE', 'VALUE')
TopArrow = @Window:'.PUB_TOP_ARROW'
UpArrow = @Window:'.PUB_UP_ARROW'
DownArrow = @Window:'.PUB_DOWN_ARROW'
BottomArrow = @Window:'.PUB_BOTTOM_ARROW'
StageEDTCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
SelRow = ''
SelList = Get_Property(StageEDTCtrl, 'OLE.SelPos')
SelRows = SelList<2>
NumSelRows = DCount(SelRows, @VM)
SelRow = SelRows<0, 1>
If TechType EQ 'E' then
Set_Property(TopArrow, 'ENABLED', False$)
Set_Property(UpArrow , 'ENABLED', False$)
Set_Property(DownArrow, 'ENABLED', False$)
Set_Property(BottomArrow, 'ENABLED', False$)
end else
Begin Case
Case SelRow EQ TOP$ROW
Set_Property(TopArrow, 'ENABLED', False$)
Set_Property(UpArrow , 'ENABLED', False$)
Set_Property(DownArrow, 'ENABLED', True$)
Set_Property(BottomArrow, 'ENABLED', True$)
Case (SelRow EQ BOTTOM$ROW)
Set_Property(TopArrow, 'ENABLED', True$)
Set_Property(UpArrow , 'ENABLED', True$)
Set_Property(DownArrow, 'ENABLED', False$)
Set_Property(BottomArrow, 'ENABLED', False$)
Case ( (SelRow GT TOP$ROW) and (SelRow LT BOTTOM$ROW) )
Set_Property(TopArrow, 'ENABLED', True$)
Set_Property(UpArrow , 'ENABLED', True$)
Set_Property(DownArrow, 'ENABLED', True$)
Set_Property(BottomArrow, 'ENABLED', True$)
Case Otherwise$
Set_Property(TopArrow, 'ENABLED', False$)
Set_Property(UpArrow , 'ENABLED', False$)
Set_Property(DownArrow, 'ENABLED', False$)
Set_Property(BottomArrow, 'ENABLED', False$)
End Case
end
return
ColorCharStages:
CharStageCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
StageList = Get_Property(CharStageCtrl, 'OLE.List')
DestColorArray = 'Red'
DefColorArray = 'None'
For RowIndex = TOP$ROW to BOTTOM$ROW
Row = StageList<RowIndex>
StageID = Row<0, 1>
Destructive = GaN_Services('IsDestStage', StageID)
If Destructive EQ True$ then
Set_Property(CharStageCtrl, "OLE.CellColors[All; ":RowIndex:"]", DestColorArray)
end else
Set_Property(CharStageCtrl, "OLE.CellColors[All; ":RowIndex:"]", DefColorArray)
end
Next RowIndex
return
SaveStageOrder:
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
If PSNo NE '' then
StageOrderList = ''
ReactorStageList = Get_Property(@Window:'.OLE_REACTOR_STAGE_EDT', 'OLE.LIST')
For each Row in ReactorStageList using @FM setting RowIndex
StageID = Row<0, 1>
StageOrderList<0, -1> = StageID
Next Row
CharStageList = Get_Property(@Window:'.OLE_CHAR_STAGE_EDT', 'OLE.LIST')
For each Row in CharStageList using @FM setting RowIndex
StageID = Row<0, 1>
StageOrderList<0, -1> = StageID
Next Row
DispStageList = Get_Property(@Window:'.OLE_DISP_STAGE_EDT', 'OLE.LIST')
For each Row in DispStageList using @FM setting RowIndex
StageID = Row<0, 1>
StageOrderList<0, -1> = StageID
Next Row
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
PSRec<PROD_SPEC_PRS_STAGE_ROUTE$> = StageOrderList
Database_Services('WriteDataRow', 'PROD_SPEC', PSNo, PSRec, True$, False$, True$)
Set_Property(@Window, '@ORIG_STAGE_ORDER_LIST', StageOrderList)
Set_Property(@Window, '@STAGE_ORDER_LIST', StageOrderList)
end
return
UpdateCharStageOrder:
CharStageCtrl = @Window:'.OLE_CHAR_STAGE_EDT'
StageOrderList = Get_Property(CharStageCtrl, 'OLE.ColumnData[1]')
Set_Property(@Window, '@STAGE_ORDER_LIST', StageOrderList)
return
EnableANKOGroups:
TechType = Get_Property(@Window:'.RDO_TECH_TYPE', 'VALUE')
ANKOFlag = Get_Property(@Window:'.CHK_ANKO', 'CHECK')
GroupsEnabled = ( (ANKOFlag EQ True$) or (TechType EQ 'P') )
Set_Property(@Window:'.GRP_ANKO_MET_POCKETS', 'ENABLED', GroupsEnabled)
Set_Property(@Window:'.GRP_ANKO_WAFER_SELECTION', 'ENABLED', GroupsEnabled)
If GroupsEnabled EQ True$ then
ANKOWaferSel = Get_Property(@Window:'.RDO_WAFER_SELECTION', 'VALUE')
If ANKOWaferSel EQ 'PRESET' then
Set_Property(@Window:'.GRP_ANKO_FULL_CHAR', 'ENABLED', True$)
ANKOMetPockets = Get_Property(@Window, '@ANKO_MET_POCKETS')
For Pocket = 1 to 8
Check = ANKOMetPockets<0, Pocket>
If ( (Check EQ True$) and ANKOFlag ) then
Set_Property(@Window:'.CHK_CHAR_':Pocket, 'ENABLED', True$)
end else
Set_Property(@Window:'.CHK_CHAR_':Pocket, 'ENABLED', False$)
end
Next Pocket
end else
Set_Property(@Window:'.GRP_ANKO_FULL_CHAR', 'ENABLED', False$)
end
end else
Set_Property(@Window:'.GRP_ANKO_FULL_CHAR', 'ENABLED', ANKOFlag)
end
Begin Case
Case ANKOFlag EQ True$
Set_Property(@Window:'.RDO_WAFER_SELECTION', 'ENABLED', True$)
Case TechType EQ 'P'
Set_Property(@Window:'.RDO_WAFER_SELECTION', 'VALUE', 'CANDELA')
Set_Property(@Window:'.RDO_WAFER_SELECTION', 'ENABLED', -1)
Case TechType EQ 'E'
Set_Property(@Window:'.RDO_WAFER_SELECTION', 'ENABLED', False$)
End Case
return
SaveANKOMetPockets:
ANKOMetPockets = Get_Property(@Window, '@ANKO_MET_POCKETS')
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
PSRec = Database_Services('ReadDataRow', 'PROD_SPEC', PSNo)
PSRec<PROD_SPEC_ANKO_MET_POCKETS$> = ANKOMetPockets
Database_Services('WriteDataRow', 'PROD_SPEC', PSNo, PSRec, True$, False$, True$)
Set_Property(@Window, '@ORIG_ANKO_MET_POCKETS', ANKOMetPockets)
return
SaveANKOFullCharPocket:
ANKOFullCharPocket = Get_Property(@Window, '@ANKO_FULL_CHAR_POCKET')
PSNo = Get_Property(@Window:'.PROD_SPEC_ID', 'TEXT')
PSRec<PROD_SPEC_ANKO_FULL_CHAR_POCKET$> = ANKOFullCharPocket
Database_Services('WriteDataRow', 'PROD_SPEC', PSNo, PSRec, True$, False$, True$)
Set_Property(@Window, '@ORIG_ANKO_FULL_CHAR_POCKET', ANKOFullCharPocket)
return