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

1114 lines
38 KiB
Plaintext

Compile function WO_MAT_GAN_EVENTS(CtrlEntId, Event, @PARAMS)
/***********************************************************************************************************************
Name : WO_Mat_Gan_Events
Description : Commuter module for the WO_MAT_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)
08/05/19 djs Coverted old commuter module, WO_MAT_GAN, to WO_MAT_GAN_EVENTS.
Updated the form to allow users to reorder wafers in the cassette via arrow buttons.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
#window WO_MAT_GAN
DECLARE SUBROUTINE Set_Property, Set_Status,obj_WO_Wfr, obj_React_Run, Print_GaN_Out_Labels, obj_WO_Mat
DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, obj_AppWindow, Security_Err_Msg, Forward_Event
DECLARE SUBROUTINE End_Window,obj_React_Reads, obj_WO_Mat_Log, obj_WO_Mat, obj_Appwindow,obj_Run_Stage
DECLARE SUBROUTINE Database_Services, Gan_Services, Error_Services, Dialog_Box, Btree.Extract, Print_Manifest
DECLARE SUBROUTINE Material_Services, Print_Gan_Scribe_Labels
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Popup, Collect.Ixvals, obj_Appwindow, Database_Services
DECLARE FUNCTION Send_Message, Msg, Security_Check, obj_WO_Log, Set_Property, Create_Dialog, obj_wo_Mat_GaN, SRP_Array
DECLARE FUNCTION Error_Services, GaN_Services, Datetime, RGB, Form_Services
$INSERT REACT_RUN_EQUATES
$INSERT RUN_STAGE_EQUATES
$INSERT WO_MAT_EQUATES
$INSERT WO_MAT_WFR_EQUATES
$INSERT WO_WFR_EQUATES
$INSERT LSL_USERS_EQUATES
$INSERT POPUP_EQUATES
$INSERT TOOL_CLASS_EQUATES
$INSERT RTI_STYLE_EQUATES
$INSERT MSG_EQUATES
$INSERT APPCOLORS
$INSERT SECURITY_RIGHTS_EQU
$INSERT RUN_STAGE_WFR_EQUATES
$INSERT WO_LOG_EQUATES
EQU COL$OUT_SLOT TO 1
EQU COL$OUT_WFR_ID TO 2
EQU COL$OUT_CARR_SLOT_ID TO 3
EQU COL$OUT_GAN_WFR_ID TO 4
EQU COL$OUT_SCRIBE TO 5
EQU COL$OUT_GRADE TO 6
EQU COL$POP_WFR_ID TO 1
EQU COL$POP_CARR_SLOT_ID TO 2
Equ COL$LOG_FILE to 1
Equ COL$LOG_DTM to 2
Equ COL$ACTION to 3
Equ COL$WH_CD to 4
Equ COL$LOC_CD to 5
Equ COL$WO_NOS to 6
Equ COL$CASS_NOS to 7
Equ COL$USER_ID to 8
Equ COL$TAGS to 9
Equ COL$TOOL_ID to 10
// 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_GAN_WFR_ID TO 4
EQU COL$CASS_SCRIBE TO 5
EQU COL$CASS_GRADE TO 6
EQU COL$CASS_WMO_NCR TO 7
// 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
EQU CRLF$ TO \0D0A\
EQU TAB$ TO \09\
EQU TOP$ROW TO 1
EQU BOTTOM$ROW TO 25
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
GoToEvent Event for CtrlEntId else
// Event not implemented
end
Return EventFlow or 1
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
obj_Appwindow('Create',@WINDOW)
End Event
Event WINDOW.READ()
Set_Property(@Window, 'REDRAW', False$)
Set_Property(@Window:'.OLE_EDT_IN_CASS', 'OLE.Redraw', False$)
Set_Property(@Window:'.OLE_EDT_NCR', 'OLE.Redraw', False$)
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
IF RowExists('WO_MAT',WONo:'*':CassNo) THEN
IF NOT(Security_Check('RDS',READ$)) THEN
Send_Event(@WINDOW,'CLEAR')
Security_Err_Msg('Work Order Mat',READ$)
RETURN
END
IF NOT(Security_Check('RDS',EDIT$)) THEN
obj_Appwindow('ReadOnly',@WINDOW) ;*Set to Read Only
END
END ELSE
ErrMsg('Work Order Mat entries are only created by the program.')
Send_Event(@WINDOW,'CLEAR')
RETURN
END
GoSub SetupOLEControls
GoSub FillForm
GoSub EnableArrowButtons
GoSub EnableAddButton
GoSub EnableRemoveButton
GoSub EnableSignButton
GoSub StyleSymbolics
CassList = Get_Property(@Window:'.OLE_EDT_IN_CASS', 'OLE.LIST')
Set_Property(@Window, '@ORIGCASSLIST', CassList)
Set_Property(@Window, 'REDRAW', True$)
Set_Property(@Window:'.OLE_EDT_IN_CASS', 'OLE.Redraw', True$)
Set_Property(@Window:'.OLE_EDT_NCR', 'OLE.Redraw', True$)
end event
Event WINDOW.CLOSE(CancelFlag)
obj_Appwindow('DetailReturn')
end event
Event WINDOW.CLEAR(bSaveKey, bSuppressWarning, bMaintainFocus, CtrlIDFocus)
GoSub StyleSymbolics
end event
Event WINDOW.WRITE()
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
CassEDTCtrl = @Window:'.OLE_EDT_IN_CASS'
CassList = Get_Property(CassEDTCtrl, 'OLE.ARRAY')
OutSlots = CassList<1>
InWfrIDs = CassList<2>
CarrSlotIDs = CassList<3>
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
CassNo = Get_Property(@Window:'.CASS_NO', 'TEXT')
// Update WO_MAT_WFR record
WOMatWfrKey = WONo:'*':CassNo
WOMatWfrRec = Database_Services('ReadDataRow', 'WO_MAT_WFR', WOMatWfrKey)
WOMatWfrRec<WO_MAT_WFR_OUT_WFR_ID$> = InWfrIDs
Database_Services('WriteDataRow', 'WO_MAT_WFR', WOMatWfrKey, WOMatWfrRec, True$, False$, True$)
// Update REACT_RUN and WO_WFR records
For each InWfrID in InWfrIDs using @VM setting wPos
OutSlotID = WONo:'*':CassNo:'*':OutSlots<0, wPos>
RDSNo = Xlate('WO_WFR', InWfrID, 'RDS_NO', 'X')
// Update REACT_RUN record
ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
RRInWfrIDs = ReactRunRec<REACT_RUN_IN_WFR_ID$>
RROutSlotIDs = ReactRunRec<REACT_RUN_OUT_SLOT_ID$>
Locate InWfrID in RRInWfrIDs using @VM setting vPos then
RROutSlotIDs<0, vPos> = OutSlotID
end
ReactRunRec<REACT_RUN_OUT_SLOT_ID$> = RROutSlotIDs
Database_Services('WriteDataRow', 'REACT_RUN', RDSNo, ReactRunRec, True$, False$, True$)
// Update WO_WFR record
WOWfrRec = Database_Services('ReadDataRow', 'WO_WFR', InWfrID)
EventDTMs = WOWfrRec<WO_WFR_LOC_DTM$>
NumEvents = DCount(EventDTMs, @VM)
SlotIDs = WOWfrRec<WO_WFR_SLOT_ID$>
SlotIDs<0, NumEvents> = OutSlotID
WOWfrRec<WO_WFR_SLOT_ID$> = SlotIDs
Database_Services('WriteDataRow', 'WO_WFR', InWfrID, WOWfrRec, True$, False$, True$)
Next InWfrID
Forward_Event()
Send_Event(@Window, 'READ')
end event
Event PUB_ADD_WAFERS.CLICK()
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
CurrLoad = Get_Property(@WINDOW:'.OLE_EDT_IN_CASS', 'OLE.ARRAY')
CurrSlotNos = CurrLoad<COL$OUT_SLOT>
CurrWfrIDs = CurrLoad<COL$OUT_WFR_ID>
OutCassID = WONo:'*':CassNo
WfrData = obj_WO_Mat_GaN('GetManifestWfrs', WONo)
IF Not( Get_Status(errCode) ) THEN
IF WfrData NE '' THEN
CONVERT @VM:@FM TO @SVM:@VM IN WfrData
TypeOver = ''
TypeOver<PDISPLAY$> = WfrData
SelWfrs = Popup(@WINDOW, TypeOver, 'WO_WFRS')
swCnt = DCount(SelWfrs, @FM)
WfrArray = SRP_Array('Rotate', SelWfrs, @FM, @VM)
WaferIDs = WfrArray<1>
Error_Services('Clear')
Gan_Services('AddWfrsToOutCass', OutCassID, WaferIDs)
If Error_Services('NoError') then
Send_Event(@Window, 'READ')
GoSub EnableAddButton
GoSub EnableRemoveButton
end else
ErrorMessage = Error_Services('GetMessage')
ErrMsg(ErrorMessage)
end
end else
Msg(@WINDOW,'','NO_SHIPPABLE')
end
end else
ErrMsg(errCode)
end
end event
Event PUB_REM_WAFERS.CLICK()
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
SlotSelection = Get_Property(@WINDOW:'.OLE_EDT_IN_CASS', 'OLE.SelPos')
SelectedRows = SlotSelection<2>
WfrIDs = ''
WfrArray = Get_Property(@WINDOW:'.OLE_EDT_IN_CASS', 'OLE.ARRAY')
InWfrIDs = WfrArray<2>
For each SelRow in SelectedRows using @VM setting vPos
WfrIDs<0, -1> = InWfrIDs<0, SelRow>
Next SelRow
OutCassID = WONo:'*':CassNo
Error_Services('Clear')
Gan_Services('RemoveWfrsFromOutCass', OutCassID, WfrIDs)
If Error_Services('NoError') then
Send_Event(@Window, 'READ')
GoSub EnableAddButton
GoSub EnableRemoveButton
end else
ErrorMessage = Error_Services('GetMessage')
ErrMsg(ErrorMessage)
end
end event
Event PUB_SIGN_FQA.CLICK()
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
Valid = Dialog_Box( 'QUOTE_SIG_PWD_ENTRY', @WINDOW, @USER4:@VM:XLATE( 'LSL_USERS', @USER4, LSL_USERS_PASSWORD$, 'X' ) )
IF NOT(Valid) THEN
RETURN 0
END
SigDTM = OCONV( Date(), 'D4/' ):' ':OCONV( Time(), 'MTS' )
Set_Property(@WINDOW:'.CASS_FINAL_SIG','DEFPROP',@USER4)
Set_Property(@WINDOW:'.CASS_FINAL_SIG_DTM','DEFPROP',SigDTM)
Send_Event(@WINDOW,'WRITE')
ScanUser = @USER4
ScanDTM = SigDTM
WOStep = '1' ;* GaN is a single step process
StatusStage = 'G_FQA'
WhCd = 'CR'
LocCd = 'QA'
Tags = ''
ToolID = ''
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:StatusStage:@RM:ScanUser:@RM:ScanDTM:@RM:ToolID:@RM:WHCd:@RM:LocCD:@RM:Tags
If Get_Status(errCode) then
ErrMsg(errCode)
end else
EventParms = ''
EventParms<COL$LOG_FILE> = 'WO_MAT'
EventParms<COL$LOG_DTM> = SigDTM
EventParms<COL$ACTION> = WOStep:'QA'
EventParms<COL$WH_CD> = 'CR'
EventParms<COL$LOC_CD> = 'QA'
EventParms<COL$WO_NOS> = WONo
EventParms<COL$CASS_NOS> = CassNo
EventParms<COL$USER_ID> = @USER4
EventParms<COL$TAGS> = ''
EventParms<COL$TOOL_ID> = ''
CONVERT @FM TO @RM IN EventParms
obj_WO_Mat_Log('Create',EventParms)
If Get_Status(errCode) Then
ErrMsg(errCode)
End
// Move wafers out of G_PACK location queue
CurrDTM = Datetime()
EDTList = Get_Property(@Window:'.OLE_EDT_IN_CASS', 'OLE.LIST')
* WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
* AvailSlotList = WOLogRec<WO_LOG_AVAIL_OUT_SLOTS$>
For each Row in EDTList using @FM setting RowIndex
WfrID = Row<0, COL$OUT_WFR_ID>
RDSNo = Field(Row<0, COL$OUT_CARR_SLOT_ID>, '.', 1)
CurrStage = GaN_Services('GetCurrStage', WfrID)
CurrQ = GaN_Services('GetWfrQueue', WfrID)
Gan_Services('RemoveWfrFromWIP', WfrID)
// Mark current stage complete
Convert '*' to '.' in WfrID
RunStageWfrKey = RDSNo:'*':CurrStage:'*':WfrID
RunStageWfrRec = Database_Services('ReadDataRow', 'RUN_STAGE_WFR', RunStageWfrKey)
StageStatus = RunStageWfrRec<RUN_STAGE_WFR_STATUS$>
If StageStatus _EQC 'INIT' then
// Mark DISP stage as complete
RunStageWfrRec<RUN_STAGE_WFR_COMP_BY$> = @USER4
RunStageWfrRec<RUN_STAGE_WFR_COMP_DTM$> = CurrDTM
RunStageWfrRec<RUN_STAGE_WFR_STATUS$> = 'COMP'
Database_Services('WriteDataRow', 'RUN_STAGE_WFR', RunStageWfrKey, RunStageWfrRec, True$, False$, True$)
end
// Ensure all slots are marked as unavailable in the WO_LOG record
Convert '.' to '*' in WfrID
SlotNo = RowIndex
SlotKey = CassNo:'*':SlotNo
* Locate SlotKey in AvailSlotList using @VM setting vPos then
* AvailSlotList<0, vPos> = 0
* end
Next Row
* WOLogRec<WO_LOG_AVAIL_OUT_SLOTS$> = AvailSlotList
* Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, True$, False$, True$)
end
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WONo:'*':CassNo)
end event
Event PUB_PRINT_CASS_LABEL.CLICK()
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
Print_Gan_Out_Labels(WONo,CassNo)
end event
Event PUB_PRINT_MANIFEST.CLICK()
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
Print_Manifest(WONo, CassNo)
end event
Event PUB_UPDATE_DB.CLICK()
Response = Msg(@Window, '', 'YESNO', '', 'Verification':@FM:'Have you verified the wafer List accuracy?')
If Response EQ Yes$ then
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
CassNo = Get_Property(@Window:'.CASS_NO', 'TEXT')
WMOKey = WONo:'*1*':CassNo
Material_Services('UpdateWaferLocation', WMOKey)
Msg(@Window, '', 'OK', '', 'Success':@FM:'Data updated successfully!')
end
end event
Event PUB_TOP_ARROW.CLICK()
CassEDTCtrl = @Window:'.OLE_EDT_IN_CASS'
CassList = Get_Property(CassEDTCtrl, 'OLE.LIST')
SelList = Get_Property(CassEDTCtrl, 'OLE.SelPos')
SelRowIndex = SelList<2, 1>
SelRow = CassList<SelRowIndex>
CassList = Delete(CassList, SelRowIndex, 0 ,0)
CassList = Insert(CassList, TOP$ROW, 0, 0, SelRow)
Set_Property(CassEDTCtrl, 'LIST', CassList)
GoSub UpdateSlotNos
GoSub SetSavewarn
Set_Property(CassEDTCtrl, 'SELPOS', 0:@FM:TOP$ROW)
GoSub EnableArrowButtons
end event
Event PUB_UP_ARROW.CLICK()
CassEDTCtrl = @Window:'.OLE_EDT_IN_CASS'
CassList = Get_Property(CassEDTCtrl, 'OLE.LIST')
SelList = Get_Property(CassEDTCtrl, 'OLE.SelPos')
SelRowIndex = SelList<2, 1>
SelRow = CassList<SelRowIndex>
CassList = Delete(CassList, SelRowIndex, 0 ,0)
NewRowIndex = SelRowIndex - 1
CassList = Insert(CassList, NewRowIndex, 0, 0, SelRow)
Set_Property(CassEDTCtrl, 'LIST', CassList)
GoSub UpdateSlotNos
GoSub SetSavewarn
Set_Property(CassEDTCtrl, 'SELPOS', 0:@FM:NewRowIndex)
GoSub EnableArrowButtons
end event
Event PUB_DOWN_ARROW.CLICK()
CassEDTCtrl = @Window:'.OLE_EDT_IN_CASS'
CassList = Get_Property(CassEDTCtrl, 'OLE.LIST')
SelList = Get_Property(CassEDTCtrl, 'OLE.SelPos')
SelRowIndex = SelList<2, 1>
SelRow = CassList<SelRowIndex>
CassList = Delete(CassList, SelRowIndex, 0 ,0)
NewRowIndex = SelRowIndex + 1
CassList = Insert(CassList, NewRowIndex, 0, 0, SelRow)
Set_Property(CassEDTCtrl, 'LIST', CassList)
GoSub UpdateSlotNos
GoSub SetSavewarn
Set_Property(CassEDTCtrl, 'SELPOS', 0:@FM:NewRowIndex)
GoSub EnableArrowButtons
end event
Event PUB_BOTTOM_ARROW.CLICK()
CassEDTCtrl = @Window:'.OLE_EDT_IN_CASS'
CassList = Get_Property(CassEDTCtrl, 'OLE.LIST')
SelList = Get_Property(CassEDTCtrl, 'OLE.SelPos')
SelRowIndex = SelList<2, 1>
SelRow = CassList<SelRowIndex>
CassList = Delete(CassList, SelRowIndex, 0 ,0)
CassList = Insert(CassList, BOTTOM$ROW, 0, 0, SelRow)
Set_Property(CassEDTCtrl, 'LIST', CassList)
GoSub UpdateSlotNos
GoSub SetSavewarn
// Return focus to the new row index.
Set_Property(CassEDTCtrl, 'SELPOS', 0:@FM:BOTTOM$ROW)
GoSub EnableArrowButtons
end event
Event PUB_CREATE_NCR.CLICK()
! To do
end event
Event OLE_EDT_IN_CASS.OnClick(Cell, Point, Button, Shift, Ctrl)
GoSub EnableArrowButtons
GoSub EnableRemoveButton
end event
Event OLE_EDT_IN_CASS.OnCheckChanged(Cell, OldValue, NewValue)
Col = Field(Cell, ';', 1, 1)
Row = Field(Cell, ';', 2, 1)
NCRButton = ''
Begin Case
Case Col EQ COL$CASS_WMO_NCR
// The checkbox is only used for creating NCRs. We don't need to save anything at this time.
// Check (no pun intended) if any of the checkboxes in this column are True$. If so, then enable
// the "Create NCR" button, otherwise disable it.
GoSub EnableNCRButton
End Case
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
Event PUB_PRINT_SCRIBE.CLICK()
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
If ( (WONo NE '') and (CassNo NE '') ) then
Response = Dialog_Box('NDW_REC_SEND', @Window)
If Response then
Recipient = Response<1>
Sender = Response<2>
If ( (Sender NE '') and (Recipient NE '') ) then
Print_Gan_Scribe_Labels(WONo, CassNo, Recipient, Sender)
end
end
end
end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
StyleSymbolics:
* Turn edit table symbolic column backgrounds to green
ETSymbolics = Get_Property('WO_MAT_WFR','@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow
ETCtrls = ETSymbolics<1>
ETCols = ETSymbolics<2>
FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
ETCtrl = ETCtrls<1,I>
IF ETCtrl NE 'WO_MAT_WFR.SLOT_NO' THEN
ETList = Get_Property(ETCtrl,'LIST')
FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
IF ETList<Line,1> NE '' THEN
FOR N = 1 TO COUNT(ETCols<1,I>,@SVM) + (ETCols<1,I> NE '')
stat = Send_Message(ETCtrl,'COLOR_BY_POS',ETCols<1,I,N>,Line,GREEN$)
NEXT N
END
NEXT Line
END
NEXT I
return
EnableArrowButtons:
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
PSNo = Xlate('WO_LOG', WONo, 'PS_NO', 'X')
TechType = Xlate('PROD_SPEC', PSNo, 'TECH_TYPE', 'X')
CassEDTCtrl = @Window:'.OLE_EDT_IN_CASS'
TopArrow = @Window:'.PUB_TOP_ARROW'
UpArrow = @Window:'.PUB_UP_ARROW'
DownArrow = @Window:'.PUB_DOWN_ARROW'
BottomArrow = @Window:'.PUB_BOTTOM_ARROW'
CassList = Get_Property(CassEDTCtrl, 'OLE.ARRAY')
SelRow = ''
SelWfrID = ''
WfrList = CassList<2>
NumWfrs = 0
For each Row in WfrList using @VM setting fPos
If Row NE '' then NumWfrs += 1
Next Row
SelList = Get_Property(CassEDTCtrl, 'OLE.SelPos')
SelRows = SelList<2>
NumSelRows = DCount(SelRows, @VM)
If NumSelRows EQ 1 then
SelRow = SelRows<0, 1>
SelWfrID = WfrList<0, SelRow>
end
CassList = Delete(CassList, 1, 0, 0)
Convert @FM to '' in CassList
Convert @VM to '' in CassList
Convert @FM to '' in SelList
Convert @VM to '' in SelList
Begin Case
Case TechType EQ 'P'
Set_Property(TopArrow, 'ENABLED', False$)
Set_Property(UpArrow , 'ENABLED', False$)
Set_Property(DownArrow, 'ENABLED', False$)
Set_Property(BottomArrow, 'ENABLED', False$)
Case (CassList NE '') and (SelList NE '') and (NumSelRows EQ 1) and (SelWfrID NE '')
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 Otherwise$
Set_Property(TopArrow, 'ENABLED', True$)
Set_Property(UpArrow , 'ENABLED', True$)
Set_Property(DownArrow, 'ENABLED', True$)
Set_Property(BottomArrow, 'ENABLED', True$)
End Case
Case Otherwise$
Set_Property(TopArrow, 'ENABLED', False$)
Set_Property(UpArrow , 'ENABLED', False$)
Set_Property(DownArrow, 'ENABLED', False$)
Set_Property(BottomArrow, 'ENABLED', False$)
End Case
return
UpdateSlotNos:
CassEDTCtrl = @Window:'.OLE_EDT_IN_CASS'
CassList = Get_Property(CassEDTCtrl, 'OLE.ARRAY')
SlotList = ''
SlotNo = ''
For SlotNo = 1 to 25
SlotList<0, -1> = SlotNo
Next SlotNo
CassList<1> = SlotList
Set_Property(CassEDTCtrl, 'OLE.ARRAY', CassList)
return
SetSavewarn:
CurrCassList = Get_Property(@Window:'.OLE_EDT_IN_CASS', 'OLE.LIST')
OrigCassList = Get_Property(@Window, '@ORIGCASSLIST')
If CurrCassList NE OrigCassList then
Set_Property(@Window, 'SAVEWARN', True$)
end else
Set_Property(@Window, 'SAVEWARN', False$)
end
return
EnableRemoveButton:
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
PSNo = Xlate('WO_LOG', WONo, 'PS_NO', 'X')
TechType = Xlate('PROD_SPEC', PSNo, 'TECH_TYPE', 'X')
CassArray = Get_Property(@Window:'.OLE_EDT_IN_CASS', 'OLE.ARRAY')
SlotSelection = Get_Property(@Window:'.OLE_EDT_IN_CASS', 'OLE.SelPos')
WfrSelected = False$
WfrCol = CassArray<2>
SelectedRows = SlotSelection<2>
SelCnt = DCount(SelectedRows, @VM)
If SelCnt GT 0 then
For each RowIndex in SelectedRows using @VM setting vPos
// Does at least one row selected have a wafer ID in it?
WfrID = WfrCol<0, RowIndex>
If WfrID NE '' then WfrSelected = True$
Until WfrSelected EQ True$
Next RowIndex
end
Begin Case
Case TechType EQ 'P'
Set_Property(@Window:'.PUB_REM_WAFERS', 'ENABLED', False$)
Case ( (SelCnt GT 0) and (WfrSelected EQ True$) )
Set_Property(@Window:'.PUB_REM_WAFERS', 'ENABLED', True$)
Case Otherwise$
Set_Property(@Window:'.PUB_REM_WAFERS', 'ENABLED', False$)
End Case
return
EnableAddButton:
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
PSNo = Xlate('WO_LOG', WONo, 'PS_NO', 'X')
CurrPartNo = Xlate('PROD_SPEC', PSNo, 'CURR_PART_NO', 'X')
TechType = Xlate('PROD_SPEC', PSNo, 'TECH_TYPE', 'X')
CassArray = Get_Property(@Window:'.OLE_EDT_IN_CASS', 'OLE.ARRAY')
WfrCol = CassArray<2>
SlotAvailable = False$
For each WfrID in WfrCol using @VM setting WfrIndex
// Is at least one row empty?
If WfrID EQ '' then SlotAvailable = True$
Until SlotAvailable EQ True$
Next WfrID
Begin Case
Case TechType EQ 'P' ; // and CurrPartNo NE 'U314'
Set_Property(@Window:'.PUB_ADD_WAFERS', 'ENABLED', False$)
Case SlotAvailable EQ True$
Set_Property(@Window:'.PUB_ADD_WAFERS', 'ENABLED', True$)
Case Otherwise$
Set_Property(@Window:'.PUB_ADD_WAFERS', 'ENABLED', False$)
End Case
return
SetupOLEControls:
GoSub SetupCassEditTable
GoSub SetupNCREditTable
return
SetupCassEditTable:
NumCassCols = 7
NumCassRows = 25
CassCtrl = @Window:'.OLE_EDT_IN_CASS'
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
CassDimArray = NumCassCols :@FM: NumCassRows
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)
CassHeaderTitles = 'Slot':@VM:'Inbound':@VM:'Carrier':@VM:'GaN Wfr ID':@VM:'Scribe':@VM:'Grade':@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-":NumCassCols-1:"; All]", 'C':@FM:'L':@FM:'L')
Set_Property(CassCtrl, "OLE.CellAlignment[":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)
// 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)
// 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(CassCtrl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualifier)
// 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(CassCtrl, "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)
// Manually set column widths
ColSize<1> = 45
Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_SLOT:"]", ColSize)
ColSize<1> = 80
Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_WFR_ID:"]", ColSize)
ColSize<1> = 76
Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_CARR_SLOT_ID:"]", ColSize)
ColSize<1> = 100
Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_GAN_WFR_ID:"]", ColSize)
ColSize<1> = 76
Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_SCRIBE:"]", ColSize)
ColSize<1> = 50
Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_GRADE:"]", ColSize)
ColSize<1> = 70
Set_Property(CassCtrl, "OLE.DataColumn[":COL$CASS_WMO_NCR:"]", ColSize)
// Disable scroll bars
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
HeaderColorArray = ''
HeaderColorArray<2> = "{200, 200, 200}"
HeaderColorArray<4> = "{200, 200, 200}"
Set_Property(CassCtrl, "OLE.HeaderColors[All; 1]", HeaderColorArray)
// Color cells
Set_Property(CassCtrl, "OLE.CellColors[All; All]", 'None':@FM:RGB(192,220,192))
// Cell selection style setup
Set_Property(CassCtrl, "OLE.ResetSelPos", False$) ;// Prevent cell selection reset upon lost focus event
CassSelStyleArray = Get_Property(CassCtrl, "OLE.SelectionStyle")
CassSelStyleArray<2,2> = OI_HOT_BLUE$
CassSelStyleArray<3,2> = 'None'
CassSelStyleArray<4> = 'None'
CassSelStyleArray<6> = 'None'
CassSelStyleArray<7> = 'None'
CassSelStyleArray<8> = True$ ;// Keep cell highlighted when table loses focus
Set_Property(CassCtrl, 'OLE.SelectionStyle', CassSelStyleArray)
return
SetupNCREditTable:
NumNCRCols = 9
NumNCRRows = 5
NCRCtrl = @Window:'.OLE_EDT_NCR'
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
NCRDimArray = NumNCRCols :@FM: NumNCRRows
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)
NCRHeaderTitles = 'NCR':@VM:'Status':@VM:'Qty':@VM:'Responsible':@VM:'Stage':@VM:'Loss Desc':@VM
NCRHeaderTitles := '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(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(NCRCtrl, 'QUALIFY_EVENT', 'OLE.OnDblClick', Qualifier)
// 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> = 56
Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_NO:"]", ColSize)
ColSize<1> = 45
Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_STATUS:"]", ColSize)
ColSize<1> = 35
Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_REJ_QTY:"]", ColSize)
ColSize<1> = 90
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<1> = 100
Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_FIN_SIG:"]", ColSize)
ColSize<1> = 100
Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_FIN_SIG_DTM:"]", ColSize)
// 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))
// Set Loss Comments column to autosized so that the table resizes when scrollbars are necessary
ColArray = Get_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_LOSS_COMM:"]")
ColArray<4> = True$
Set_Property(NCRCtrl, "OLE.DataColumn[":COL$NCR_LOSS_COMM:"]", ColArray)
return
FillForm:
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
CassNo = Get_Property(@Window:'.CASS_NO', 'TEXT')
If ( (WONo NE '') and (CassNo NE '') ) then
GoSub FillCassEditTable
GoSub FillNCREditTable
end
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
Database_Services('ActivateRecord', 'WO_MAT', WOMatKey)
CassCtrlArray = ''
CassCtrlArray<COL$CASS_SLOT> = {OUT_SLOT_NO}
CassCtrlArray<COL$CASS_WFR_ID> = {OUT_WFR_ID}
CassCtrlArray<COL$CASS_CARR_SLOT_ID> = {OUT_CARR_SLOT_ID}
CassCtrlArray<COL$CASS_GAN_WFR_ID> = {OUT_GAN_WFR_ID}
CassCtrlArray<COL$CASS_SCRIBE> = {OUT_SCRIBE}
CassCtrlArray<COL$CASS_GRADE> = {OUT_GRADE}
CassCtrlArray<COL$CASS_WMO_NCR> = {OUT_NCR}
For RowIndex = 1 to 25
NCRNo = CassCtrlArray<COL$CASS_WMO_NCR, RowIndex>
WfrID = CassCtrlArray<COL$CASS_WFR_ID, RowIndex>
If ( (NCRNo EQ '') and (WfrID NE '') ) 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_WMO_NCR:";":RowIndex:"]", '')
CheckBoxArray = 'Check Box'
CheckBoxArray<2,1> = True$
Set_Property(CassCtrl, "OLE.CellType[":COL$CASS_WMO_NCR:";":RowIndex:"]", CheckBoxArray)
Set_Property(CassCtrl, "OLE.CellCheckEnabled[":COL$CASS_WMO_NCR:";":RowIndex:"]", True$)
end else
Set_Property(CassCtrl, "OLE.CellType[":COL$CASS_WMO_NCR:";":RowIndex:"]", 'Text')
end
Next RowIndex
Set_Property(CassCtrl, 'OLE.ARRAY', CassCtrlArray)
// Re-enable redraw now that all properties are set
Set_Property(CassCtrl, "OLE.Redraw", True$)
end
return
FillNCREditTable:
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
CassNo = Get_Property(@Window:'.CASS_NO', 'TEXT')
CassCtrl = @Window:".OLE_EDT_IN_CASS"
NCRCtrl = @Window:'.OLE_EDT_NCR'
SearchTable = 'NCR'
SearchString = 'WO_NO' : @VM : WONo : @FM
SearchString := 'OUT_CASS_NO' : @VM : CassNo : @FM
hDictSearchTable = Database_Services('GetTableHandle', 'DICT.' : SearchTable)
NCRNos = ''
If Error_Services('NoError') then
rv = Set_Status(0)
MakeupBoxes = ''
Flag = ''
StatusCode = ''
Btree.Extract(SearchString, SearchTable, hDictSearchTable, NCRNos, '', Flag)
end
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
EnableNCRButton:
CassCtrl = @Window:'.OLE_EDT_IN_CASS'
Checkmarks = Get_Property(CassCtrl, "OLE.CellCheck[":COL$CASS_WMO_NCR:"; All]")
Checksum = Sum(Checkmarks)
ButtonEnabled = False$
If ( Checksum GT 0 ) then ButtonEnabled = True$
* Set_Property(@Window:'.PUB_CREATE_NCR', 'ENABLED', ButtonEnabled)
return
EnableSignButton:
FQASig = Get_Property(@Window:'.CASS_FINAL_SIG', 'TEXT')
CassCtrl = @Window:'.OLE_EDT_IN_CASS'
WfrIDs = Get_Property(CassCtrl, "OLE.ColumnData[":COL$OUT_WFR_ID:"]")
WfrIDs = SRP_Array('Clean', WfrIDs, 'Trim', @VM)
If ( (WfrIDs NE '') and (FQASig EQ '') ) then
ButtonEnabled = True$
end else
ButtonEnabled = False$
end
Set_Property(@Window:'.PUB_SIGN_FQA', 'ENABLED', ButtonEnabled)
return