COMPILE FUNCTION Ndw_Master_Calib_List_Events(CtrlEntId, Event, @PARAMS) /* Commuter module for MASTER_CALIB_LIST (Calibration List) dialog window 02/09/2010 - John C. Henry, J.C. Henry & Co., Inc. 01/10/2024 - DJS - Converted commuter module from MASTER_CALIB_LIST */ #pragma precomp SRP_PreCompiler #Window NDW_MASTER_CALIB_LIST Declare Subroutine Center_Window, ErrMsg, obj_AppWindow, Post_Event, Set_Property, End_Dialog, Send_Event, Send_Message Declare Subroutine obj_Notes, Security_Err_Msg, End_Window, Forward_Event, Start_Window, Create_Note, SRP_EditTable_Manager Declare Subroutine SRP_Fastarray_Release, SRP_Fastarray, Memory_Services, Database_Services Declare Function Get_Property, Get_Status, Dialog_Box, Popup, Printer_Select, obj_Install, Set_Printer, SRP_Fastarray_Create Declare Function Send_Message, Msg, Security_Check, MemberOf, Get_Printer, Calibration_Services, SRP_Array, SRP_Fastarray Declare Function SRP_Trim, Database_Services // Control Name equates Equ EquipmentTable$ To @Window : '.OLE_EDT_EQUIPMENT' Equ NistTable$ To @Window : '.OLE_EDT_NIST' $Insert EVENT_SETUP $Insert MSG_EQUATES $Insert APPCOLORS $Insert LSL_USERS_EQU $Insert SECURITY_RIGHTS_EQU $Insert CALIB_LIST_EQUATES $Insert POPUP_EQUATES $Insert LOGICAL $Insert QUOTE_SIGS_EQU $Insert RLIST_EQUATES $Insert OIPRINT_EQUATES $Insert USER_CONFIG_EQUATES Equ HIDDEN$ TO 32 Equ COL$CL_NO TO 1 ; // int Equ COL$DEPT TO 2 ; // string Equ COL$EQ_INSTRUMENT TO 3 ; // string Equ COL$EQ_SN TO 4 ; // string Equ COL$EQ_LOC TO 5 ; // string Equ COL$EQ_CAL_INT TO 6 ; // int Equ COL$EQ_INT_EXT TO 7 ; // string Equ COL$EQ_LAST_CAL TO 8 ; // date Equ COL$EQ_NEXT_CAL TO 9 ; // date Equ COL$NIST_STANDARD TO 3 ; // string Equ COL$NIST_TSN TO 4 ; // string Equ COL$NIST_LOC TO 5 ; // string Equ COL$NIST_CAL_INT TO 6 ; // int Equ COL$NIST_INT_EXT TO 7 ; // string Equ COL$NIST_LAST_CAL TO 8 ; // date Equ COL$NIST_NEXT_CAL TO 9 ; // date ErrTitle = 'Error in NDW_MASTER_CALIB_LIST_EVENTS routine' ErrorMsg = '' // 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 IF ErrorMsg NE '' THEN ErrMsg(ErrTitle:@SVM:ErrorMsg) END Return EventFlow else EVENT_CONTINUE$ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Events //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Event WINDOW.CREATE(CreateParam) obj_Appwindow('Create',@WINDOW) IF MemberOf (@USER4, 'CALIBRATION') ELSE Message = 'You do not have the proper security to enter the Master Calibration List...' Message = 'H' Void = Msg( '', Message ) Post_Event(@Window, 'CLOSE') END CalEngSigners = XLATE( 'CONFIG', 'QUOTE_SIGS', PSNPreProdSigs$, 'X' ) LOCATE @USER4 IN CalEngSigners USING @VM SETTING DUM THEN IsCalEng = TRUE$ END ELSE Set_Property(@WINDOW:'.PRINT)','VISIBLE',FALSE$) IsCalEng = FALSE$ END GoSub SetupOLEControls end event Event WINDOW.CLOSE(CancelFlag) GoSub SaveUserFilters Open 'CONFIG' to ConfigTable then Unlock ConfigTable, 'MASTER_CALIB_LIST' else Null * may not have locked if user does not have proper security end end else Void = msg( '', 'Unable to open CONFIG table' ) end Memory_Services('RemoveKey', 'Cell_Size') End_Dialog(@WINDOW,'') end event Event PUB_CANCEL.CLICK() Send_Event(@Window, 'CLOSE') end event Event PRINT_EQUIP_LIST.CLICK() Title = '':@VM:'' PageInfo = .25:@FM:1.5:@FM:.25:@FM:0.6 PageSetup = 1 ;* Landscape PrintSetup = '' PrintSetup<1,1> = '2' ;* Preview Normal PrintSetup<1,2> = '5' ;* Show Print and PDF, hide Print Setup PrintSetup<1,3> = '0' ;* Show the printing window PDFParms = 'Printing PDF Document':@FM: '' :@FM:'':@FM: '' PrintPath = Printer_Select('') ;* Select printer without changing default printer stat = Set_Printer("INIT",PDFParms,Title,PageInfo,PageSetup,PrintSetup,PrintPath) font = 'Arial' font<2> = '12' font<3> = 'L' font<4> = '1' ;* Bold stat = Set_Printer( 'FONT', font ); *send the Font to the printer stat = set_Printer('FONTHEADFOOT',font) Header = @VM:'MASTER CALIBRATION LIST' Header<2> = @VM:"for Equipment as of 'D'" Header<3> = '' Header<4> = @VM:'All items must be calibrated by approved calibration suppliers.' Header<5> = ' ' Header<6> = ' ' stat = Set_Printer( 'HEADER', header ) Location = -0.15:@FM:-1.150:@FM:1.57:@FM:1 stat = Set_Printer('BMP',obj_Install('Get_Prop','ColorBMP'),Location, 0,1) colData = Get_Property(EquipmentTable$, 'OLE.ARRAY') colData = Insert(colData, 6, 0, 0, '':@FM:'') colData = SRP_Array('Rotate', colData, @FM, @VM) colHead = Get_Property(EquipmentTable$, 'OLE.TitleList') colHead = Insert(colHead, 0, 6, 0, 'Equip. Class':@VM:'Cal/PM Class') colFmt = '^+720' colFmt<1,2> = '+720' colFmt<1,3> = '^+1800' colFmt<1,4> = '^+2160' colFmt<1,5> = '^+1440' colFmt<1,6> = '^+1440' colFmt<1,7> = '^+1080' colFmt<1,8> = '^+1440' colFmt<1,9> = '^+1440' colFmt<1,10> = '^+1440' colFmt<1,11> = '^+1440' font<2> = 10 font<4> = 1 ;* Bold stat = Set_Printer('FONT',font,'100') stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL) font<4> = 0 If Unassigned(fontSpacing) then fontSpacing = '' stat = Set_Printer('FONT',font,fontSpacing) stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7) stat = Set_Printer('TERM',1 ) end event Event PRINT_NIST_LIST.CLICK() FileName = '' Title = '':@VM:'' PageInfo = .25:@FM:1.5:@FM:.25:@FM:0.6 PageSetup = 1 ;* Landscape PrintSetup = '' PrintSetup<1,1> = '2' ;* Preview Normal PrintSetup<1,2> = '5' ;* Show Print and PDF, hide Print Setup PrintSetup<1,3> = '0' ;* Show the printing window PDFParms = 'Printing PDF Document':@FM: '' :@FM: 6 :@FM: '' PrintPath = Printer_Select('') ;* Select printer without changing default printer stat = Set_Printer("INIT",PDFParms,Title,PageInfo,PageSetup,PrintSetup,PrintPath) font = 'Arial' font<2> = '12' font<3> = 'L' font<4> = '1' ;* Bold stat = Set_Printer( 'FONT', font ); *send the Font to the printer stat = set_Printer('FONTHEADFOOT',font) Header = @VM:'MASTER CALIBRATION LIST' Header<2> = @VM:"for NIST / Primary Standards as of 'D'" Header<3> = '' Header<4> = @VM:'All items must be calibrated by approved' Header<5> = @VM:'calibration suppliers as outlined in the Critical Materials List' Header<6> = ' ' stat = Set_Printer( 'HEADER', header ) Location = -0.15:@FM:-1.150:@FM:1.57:@FM:1 stat = Set_Printer('BMP',obj_Install('Get_Prop','ColorBMP'),Location, 0,1) colData = Get_Property(NistTable$, 'OLE.LIST') colHead = Get_Property(NistTable$, 'OLE.TitleList') colFmt = '^+720' colFmt<1,2> = '+1440' colFmt<1,3> = '^+1800' colFmt<1,4> = '^+2160' colFmt<1,5> = '^+2160' colFmt<1,6> = '^+1440' colFmt<1,7> = '^+1440' colFmt<1,8> = '^+1440' colFmt<1,9> = '^+1440' font<2> = 10 font<4> = 1 ;* Bold stat = Set_Printer('FONT',font,'100') stat = Set_Printer('ADDTABLE',colFmt,colHead,'',LTGREY$,'',0,TB_ALL) font<4> = 0 stat = Set_Printer('FONT',font,fontSpacing) stat = Set_Printer('ADDTABLE',colFmt,'',colData,LTGREY$,'',0,7) stat = Set_Printer('TERM',1 ) end event Event NEW_EQUIPMENT.CLICK() GoSub NewEquipment end event Event NEW_NIST.CLICK() GoSub NewNIST end event Event OLE_EDT_EQUIPMENT.OnDblClick(Cell, Point, Button, Shift, Ctrl) Row = Field(Cell, ';', 2) RowData = Get_Property(EquipmentTable$, "OLE.RecordData[":Row:"]") CLNo = RowData<0, 1> obj_AppWindow('ViewRelated','CALIB_LIST':@RM:CLNo) end event Event OLE_EDT_NIST.OnDblClick(Cell, Point, Button, Shift, Ctrl) Row = Field(Cell, ';', 2) RowData = Get_Property(NistTable$, "OLE.RecordData[":Row:"]") CLNo = RowData<0, 1> obj_AppWindow('ViewRelated','CALIB_LIST':@RM:CLNo) end event Event WINDOW.OMNIEVENT(Message, Param1, Param2, Param3, Param4) GoSub LoadSearchData end event Event OLE_EDT_EQUIPMENT.OnHeaderClick(Cell, Point, Button, Shift, Ctrl) Set_Property(EquipmentTable$, 'OLE.Redraw', False$) FilterOptions = '' CellxPos = Cell[1, ';'] CellyPos = Cell[Col2() + 1, ';'] // Remove 1 cell position due to the hidden header column CellSize = Send_Message(EquipmentTable$, "OLE.GetCellRect", (CellxPos - 1) : ';' CellyPos) Memory_Services('SetValue', 'Cell_Size', CellSize) If Button EQ 'Left' then Header = Get_Property(EquipmentTable$, 'HeaderText[' : Cell : ']') ColumnPos = CellxPos - 1 FilterArray = Get_Property(@Window, '@EQUIPMENT_FILTER_ARRAY_':ColumnPos) // Build filter options based on the results of all other selected filters GoSub GetEquipmentFilterData EquipmentList = SRP_Array('Rotate', EquipmentList, @FM, @VM) Column = EquipmentList Blanks = False$ Locate "" in Column using @VM setting Dummy then Blanks = True$ CleanCol = SRP_Array('Clean', Column, 'TrimAndMakeUnique', @VM) Begin Case Case ( (ColumnPos EQ 1) or (ColumnPos EQ 6) ) // Numerical sort CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingNumbers', @VM) Case ( (ColumnPos EQ 8) or (ColumnPos EQ 9) ) // Date sort CleanCol = IConv(CleanCol, 'D') CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingNumbers', @VM) CleanCol = OConv(CleanCol, 'D4/') Case Otherwise$ // String sort CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingText', @VM) End Case If Blanks then CleanCol <0, -1> = '(Blanks)' SelFilterArray = Get_Property(@Window, '@EQUIPMENT_SEL_FILTER_ARRAY_':ColumnPos) // Build selected filter array from full selected filter list SelectedFilterItems = '' NewFilterArray = '' For each Value in CleanCol using @VM Locate Value in FilterArray using @VM setting vPos then SelectedFilterItems<0, -1> = SelFilterArray<0, vPos> end Next Value FilterArray = CleanCol FormattedFilterArray = '' // Build filter list in SRP Tree Control format For Each Filter in FilterArray using @VM setting vPos FormattedFilterArray := 1 : @SVM : vPos : @SVM : Filter : @SVM : @SVM : @SVM : @SVM : @SVM : @SVM : @SVM : @SVM : 'Left' : @SVM : @VM Next FilterArray // Call the Tree_Filter Window and place it under the column header. Pass in Tree Control formatted list SelectedFilterItems = Dialog_Box('NDW_TREE_SORT_FILTER', @Window, FormattedFilterArray:@FM:SelectedFilterItems) If SelectedFilterItems NE 'Cancel' then FullFilterArray = Get_Property(@Window, '@EQUIPMENT_FILTER_ARRAY_':ColumnPos) For each Filter in FilterArray using @VM setting fPos Locate Filter in FullFilterArray using @VM setting vPos then SelFilterArray<0, vPos> = SelectedFilterItems<0, fPos> end Next Filter Set_Property(@Window, '@EQUIPMENT_SEL_FILTER_ARRAY_':ColumnPos, SelFilterArray) GoSub ApplyEquipmentFilters GoSub SaveUserFilters end end Set_Property(EquipmentTable$, 'OLE.Redraw', True$) end event Event OLE_EDT_NIST.OnHeaderClick(Cell, Point, Button, Shift, Ctrl) Set_Property(NistTable$, 'OLE.Redraw', False$) FilterOptions = '' CellxPos = Cell[1, ';'] CellyPos = Cell[Col2() + 1, ';'] // Remove 1 cell position due to the hidden header column CellSize = Send_Message(NistTable$, "OLE.GetCellRect", (CellxPos - 1) : ';' CellyPos) Memory_Services('SetValue', 'Cell_Size', CellSize) If Button EQ 'Left' then Header = Get_Property(NistTable$, 'HeaderText[' : Cell : ']') ColumnPos = CellxPos - 1 FilterArray = Get_Property(@Window, '@NIST_FILTER_ARRAY_':ColumnPos) // Build filter options based on the results of all other selected filters GoSub GetNistFilterData NistList = SRP_Array('Rotate', NistList, @FM, @VM) Column = NistList Blanks = False$ Locate "" in Column using @VM setting Dummy then Blanks = True$ CleanCol = SRP_Array('Clean', Column, 'TrimAndMakeUnique', @VM) Begin Case Case ( (ColumnPos EQ 1) or (ColumnPos EQ 6) ) // Numerical sort CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingNumbers', @VM) Case ( (ColumnPos EQ 8) or (ColumnPos EQ 9) ) // Date sort CleanCol = IConv(CleanCol, 'D') CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingNumbers', @VM) CleanCol = OConv(CleanCol, 'D4/') Case Otherwise$ // String sort CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingText', @VM) End Case If Blanks then CleanCol <0, -1> = '(Blanks)' SelFilterArray = Get_Property(@Window, '@NIST_SEL_FILTER_ARRAY_':ColumnPos) // Build selected filter array from full selected filter list SelectedFilterItems = '' NewFilterArray = '' For each Value in CleanCol using @VM Locate Value in FilterArray using @VM setting vPos then SelectedFilterItems<0, -1> = SelFilterArray<0, vPos> end Next Value FilterArray = CleanCol FormattedFilterArray = '' // Build filter list in SRP Tree Control format For Each Filter in FilterArray using @VM setting vPos FormattedFilterArray := 1 : @SVM : vPos : @SVM : Filter : @SVM : @SVM : @SVM : @SVM : @SVM : @SVM : @SVM : @SVM : 'Left' : @SVM : @VM Next FilterArray // Call the Tree_Filter Window and place it under the column header. Pass in Tree Control formatted list SelectedFilterItems = Dialog_Box('NDW_TREE_SORT_FILTER', @Window, FormattedFilterArray:@FM:SelectedFilterItems) If SelectedFilterItems NE 'Cancel' then FullFilterArray = Get_Property(@Window, '@NIST_FILTER_ARRAY_':ColumnPos) For each Filter in FilterArray using @VM setting fPos Locate Filter in FullFilterArray using @VM setting vPos then SelFilterArray<0, vPos> = SelectedFilterItems<0, fPos> end Next Filter Set_Property(@Window, '@NIST_SEL_FILTER_ARRAY_':ColumnPos, SelFilterArray) GoSub ApplyNistFilters GoSub SaveUserFilters end end Set_Property(NistTable$, 'OLE.Redraw', True$) end event Event PUB_TEST.CLICK() GoSub SaveUserFilters end event //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// NewEquipment: NewNIST: thisFormWindowUp = Get_Property('CALIB_LIST','VISIBLE') ;* Returns 0 = hidden, 1 = visible, 2 = minimized, 3 = maximized If Unassigned(thisFormParms) then thisFormParms = '' IF thisFormWindowUp = '' THEN Start_Window('CALIB_LIST',@WINDOW,thisFormParms) ;* Put up the card window - added thisFormParms 3/22/2010 JCH IF thisFormWindowUp = 2 THEN Set_Property('CALIB_LIST','VISIBLE',9) ;* Restore the window if minimized IF Get_Property('CALIB_LIST','SAVEWARN') THEN Set_Property('CALIB_LIST','@SKIP_CARD_RETURN',1) ;* This stops the Return behavior Send_Event('CALIB_LIST','CLEAR') ;* Clear anything existing (prompts for save first) END Send_Event('CALIB_LIST.NEW_ITEM','CLICK') RETURN SetupOLEControls: // Setup Equipment OLE Edit Table ArrayDimension = 9 : @FM : 50 TitleList = 'CL No ' : @VM TitleList := 'Dept' : @VM TitleList := 'Instrument ' : @VM TitleList := 'S/N ' : @VM TitleList := 'Location / Status ' : @VM TitleList := 'Interval ' : @VM ColumnWidths = '60' : @FM : '50' : @FM : '287' : @FM : '80' : @FM : '140' : @FM : '70' : @FM ColumnAlignments = 'C' : @FM : 'C' : @FM : 'L' : @FM : 'L' : @FM : 'L' : @FM : 'C' : @FM TitleList := 'Cal Loc' : @VM : 'Last Cal ' : @VM : 'Next Cal ' ColumnWidths := '60' : @FM : '70' : @FM : '70' ColumnAlignments := 'C' : @FM : 'C' : @FM : 'C' VirtualPos = '' RowsAsColumns = '' CellsAsFields = '' ClearFill = '' OIEditTable = '' SRP_EditTable_Manager('Setup1', EquipmentTable$, ArrayDimension, TitleList, ColumnWidths, ColumnAlignments, VirtualPos, RowsAsColumns, CellsAsFields, ClearFill, OIEditTable) Set_Property(EquipmentTable$, 'OLE.SelectionStyle', 'Black' : @VM : OI_HOT_BLUE$ : ' L=70' : @FM : 'Black' : @VM : OI_HOT_BLUE$) ; // Automatically highlight the current row with one color and highlight the current row with another color. Set_Property(EquipmentTable$, 'OLE.HeaderFont[All; All]', 'Segoe UI' : @SVM : 8) Set_Property(EquipmentTable$, 'OLE.CellFont[All; All]', 'Segoe UI' : @SVM : 8) Set_Property(EquipmentTable$, 'OLE.HeaderColumn[1]', '' : @FM : False$ : @FM : False$ : @FM) Set_Property(EquipmentTable$, 'OLE.CellProtection[ALL; All]', 'SEL') Set_Property(EquipmentTable$, 'OLE.NewRowCount', 0) Set_Property(EquipmentTable$, 'OLE.HeaderRow[ALL]', '' : @FM : '' : @FM : False$ : @FM) Set_Property(EquipmentTable$, 'OLE.DataColumn[ALL]', '' : @FM : '' : @FM : False$ : @FM) Set_Property(EquipmentTable$, 'OLE.DataRow[ALL]', '' : @FM : '' : @FM : False$ : @FM) Set_Property(EquipmentTable$, 'OLE.HeaderColors[All; All]', 'Auto' : @FM : 'None' : @FM : 'None' : @FM : OI_HOT_BLUE$ : @FM : False$) Set_Property(EquipmentTable$, 'OLE.ResetSelPos', False$) HeaderAlignArray = 'Center':@FM:'Left':@FM:'Right' Set_Property(EquipmentTable$, "OLE.HeaderAlignment[All; 1]", HeaderAlignArray) Set_Property(EquipmentTable$, 'OLE.AllowDeletions', False$) Set_Property(EquipmentTable$, 'OLE.AllowInserts', False$) ImageList = '.\BMPS\calib_table.bmp' ImageList<2> = 2 ImageList<3> = 'Auto' Set_Property(EquipmentTable$, 'OLE.ImageList', ImageList) // Qualify OLE events that we want to intercept Qualifier = '' Qualifier<1> = True$ Qualifier<4> = False$ ; * process synchronously (i.e. immediately) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.AfterUpdate', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.OnClick', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.OnButtonClick', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.PosChanged', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.OnComboClicked', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.OnHeaderClick', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.AfterUpdate', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', Qualifier) Send_Message(EquipmentTable$, 'QUALIFY_EVENT', 'OLE.OnDblClick', Qualifier) //NIST Standard // Setup Nist OLE Edit Table ArrayDimension = 9 : @FM : 50 TitleList = 'CL No ' : @VM TitleList := 'Dept' : @VM TitleList := 'NIST Standard ' : @VM TitleList := 'S/N ' : @VM TitleList := 'Location / Status ' : @VM TitleList := 'Interval ' : @VM ColumnWidths = '60' : @FM : '50' : @FM : '287' : @FM : '80' : @FM : '140' : @FM : '70' : @FM ColumnAlignments = 'C' : @FM : 'C' : @FM : 'L' : @FM : 'L' : @FM : 'L' : @FM : 'C' : @FM TitleList := 'Cal Loc' : @VM : 'Last Cal ' : @VM : 'Next Cal ' ColumnWidths := '60' : @FM : '70' : @FM : '70' ColumnAlignments := 'C' : @FM : 'C' : @FM : 'C' VirtualPos = '' RowsAsColumns = '' CellsAsFields = '' ClearFill = '' OIEditTable = '' SRP_EditTable_Manager('Setup1', NistTable$, ArrayDimension, TitleList, ColumnWidths, ColumnAlignments, VirtualPos, RowsAsColumns, CellsAsFields, ClearFill, OIEditTable) Set_Property(NistTable$, 'OLE.SelectionStyle', 'Black' : @VM : OI_HOT_BLUE$ : ' L=70' : @FM : 'Black' : @VM : OI_HOT_BLUE$) ; // Automatically highlight the current row with one color and highlight the current row with another color. Set_Property(NistTable$, 'OLE.HeaderFont[All; All]', 'Segoe UI' : @SVM : 8) Set_Property(NistTable$, 'OLE.CellFont[All; All]', 'Segoe UI' : @SVM : 8) Set_Property(NistTable$, 'OLE.HeaderColumn[1]', '' : @FM : False$ : @FM : False$ : @FM) Set_Property(NistTable$, 'OLE.CellProtection[ALL; All]', 'SEL') Set_Property(NistTable$, 'OLE.NewRowCount', 0) Set_Property(NistTable$, 'OLE.HeaderRow[ALL]', '' : @FM : '' : @FM : False$ : @FM) Set_Property(NistTable$, 'OLE.DataColumn[ALL]', '' : @FM : '' : @FM : False$ : @FM) Set_Property(NistTable$, 'OLE.DataRow[ALL]', '' : @FM : '' : @FM : False$ : @FM) Set_Property(NistTable$, 'OLE.HeaderColors[All; All]', 'Auto' : @FM : 'None' : @FM : 'None' : @FM : OI_HOT_BLUE$ : @FM : False$) Set_Property(NistTable$, 'OLE.ResetSelPos', False$) HeaderAlignArray = 'Center':@FM:'Left':@FM:'Right' Set_Property(NistTable$, "OLE.HeaderAlignment[All; 1]", HeaderAlignArray) Set_Property(NistTable$, 'OLE.AllowDeletions', False$) Set_Property(NistTable$, 'OLE.AllowInserts', False$) ImageList = '.\BMPS\calib_table.bmp' ImageList<2> = 2 ImageList<3> = 'Auto' Set_Property(NistTable$, 'OLE.ImageList', ImageList) // Qualify OLE events that we want to intercept Qualifier = '' Qualifier<1> = True$ Qualifier<4> = False$ ; * process synchronously (i.e. immediately) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.AfterUpdate', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.OnClick', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.OnButtonClick', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.PosChanged', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.OnComboClicked', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.OnHeaderClick', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.AfterUpdate', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.OnContextMenuClick', Qualifier) Send_Message(NistTable$, 'QUALIFY_EVENT', 'OLE.OnDblClick', Qualifier) GoSub LoadSearchData return LoadSearchData: Set_Property(EquipmentTable$, 'OLE.Redraw', False$) Set_Property(NistTable$, 'OLE.Redraw', False$) EquipmentList = Calibration_Services('GetCalibListData', 'Equipment') NistList = Calibration_Services('GetCalibListData', 'NIST') NumRows = DCount(EquipmentList, @FM) + 1 ArrayDimension = 9 : @FM : NumRows Set_Property(EquipmentTable$, 'OLE.LIST', EquipmentList) NumRows = DCount(NistList, @FM) + 1 ArrayDimension = 9 : @FM : NumRows Set_Property(NistTable$, 'OLE.LIST', NistList) // Save the full lists to user defined properties for later reference by filters Set_Property(@Window, '@MASTER_EQUIPMENT_LIST', EquipmentList) Set_Property(@Window, '@MASTER_NIST_LIST', NistList) GoSub BuildEquipmentFilterLists GoSub ApplyEquipmentFilters GoSub ColorEquipmentTable GoSub BuildNistFilterLists GoSub ApplyNistFilters GoSub ColorNistTable Set_Property(EquipmentTable$, 'OLE.Redraw', True$) Set_Property(NistTable$, 'OLE.Redraw', True$) return BuildEquipmentFilterLists: UserConfigRec = Database_Services('ReadDataRow', 'USER_CONFIG', @User4:'*':@Window) UserConfigProps = UserConfigRec UserConfigVals = UserConfigRec EquipmentList = Get_Property(@Window, '@MASTER_EQUIPMENT_LIST') EquipmentList = SRP_Array('Rotate', EquipmentList, @FM, @VM) For each Column in EquipmentList using @FM setting fPos Blanks = False$ Locate "" in Column using @VM setting Dummy then Blanks = True$ CleanCol = SRP_Array('Clean', Column, 'TrimAndMakeUnique', @VM) Begin Case Case ( (fPos EQ 1) or (fPos EQ 6) ) // Numerical sort CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingNumbers', @VM) Case ( (fPos EQ 8) or (fPos EQ 9) ) // Date sort CleanCol = IConv(CleanCol, 'D') CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingNumbers', @VM) CleanCol = OConv(CleanCol, 'D4/') Case Otherwise$ // String sort CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingText', @VM) End Case If Blanks then CleanCol <0, -1> = '(Blanks)' NumVals = DCount(CleanCol, @VM) SelFilterArray = Str(True$:@VM, NumVals) SelFilterArray = Delete(SelFilterArray, 0, NumVals + 1, 0) // Merge user preferences with any new filter values UserFilterVals = '' UserSelFilters = '' Locate '@EQUIPMENT_FILTER_ARRAY_':fPos in UserConfigProps using @VM setting vPos then UserFilterVals = UserConfigVals<0, vPos> end Locate '@EQUIPMENT_SEL_FILTER_ARRAY_':fPos in UserConfigProps using @VM setting vPos then UserSelFilters = UserConfigVals<0, vPos> end If UserFilterVals NE '' then For each UserFilterVal in UserFilterVals using @SVM setting svPos Locate UserFilterVal in CleanCol using @VM setting cPos then SelFilterArray<0, cPos> = UserSelFilters<0, 0, svPos> end Next UserFilterVal end Set_Property(@Window, '@EQUIPMENT_FILTER_ARRAY_':fPos, CleanCol) Set_Property(@Window, '@EQUIPMENT_SEL_FILTER_ARRAY_':fPos, SelFilterArray) Next Column return BuildNistFilterLists: UserConfigRec = Database_Services('ReadDataRow', 'USER_CONFIG', @User4:'*':@Window) UserConfigProps = UserConfigRec UserConfigVals = UserConfigRec NistList = Get_Property(@Window, '@MASTER_NIST_LIST') NistList = SRP_Array('Rotate', NistList, @FM, @VM) For each Column in NistList using @FM setting fPos Blanks = False$ Locate "" in Column using @VM setting Dummy then Blanks = True$ CleanCol = SRP_Array('Clean', Column, 'TrimAndMakeUnique', @VM) Begin Case Case ( (fPos EQ 1) or (fPos EQ 6) ) // Numerical sort CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingNumbers', @VM) Case ( (fPos EQ 8) or (fPos EQ 9) ) // Date sort CleanCol = IConv(CleanCol, 'D') CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingNumbers', @VM) CleanCol = OConv(CleanCol, 'D4/') Case Otherwise$ // String sort CleanCol = SRP_Array('SortSimpleList', CleanCol, 'AscendingText', @VM) End Case If Blanks then CleanCol <0, -1> = '(Blanks)' NumVals = DCount(CleanCol, @VM) SelFilterArray = Str(True$:@VM, NumVals) SelFilterArray = Delete(SelFilterArray, 0, NumVals + 1, 0) // Merge user preferences with any new filter values UserFilterVals = '' UserSelFilters = '' Locate '@NIST_FILTER_ARRAY_':fPos in UserConfigProps using @VM setting vPos then UserFilterVals = UserConfigVals<0, vPos> end Locate '@NIST_SEL_FILTER_ARRAY_':fPos in UserConfigProps using @VM setting vPos then UserSelFilters = UserConfigVals<0, vPos> end If UserFilterVals NE '' then For each UserFilterVal in UserFilterVals using @SVM setting svPos Locate UserFilterVal in CleanCol using @VM setting cPos then SelFilterArray<0, cPos> = UserSelFilters<0, 0, svPos> end Next UserFilterVal end Set_Property(@Window, '@NIST_FILTER_ARRAY_':fPos, CleanCol) Set_Property(@Window, '@NIST_SEL_FILTER_ARRAY_':fPos, SelFilterArray) Next Column return ColorEquipmentTable: Today = Date() TableData = Get_Property(EquipmentTable$, 'OLE.LIST') For each Row in TableData using @FM setting RowPos CLNo = Row<0, COL$CL_NO> NextCalDt = XLATE('CALIB_LIST', CLNo, 'NEXT_CAL_DT', 'X') BEGIN CASE CASE Row<0, COL$EQ_LOC>[1,14] = 'Out of Service' ; LineColor = LTGREY$ CASE NextCalDt = '' ; LineColor = WHITE$ CASE Row<0, COL$EQ_LOC>[1,19] = 'Out for Calibration' ; LineColor = ORANGE$ CASE (Today GT NextCalDt) ; LineColor = RED$ CASE (NextCalDt - Today) LE 15 ; LineColor = YELLOW$ CASE Otherwise$ ; LineColor = GREEN$ END CASE ColorArray = Get_Property(EquipmentTable$, 'OLE.CellColors[All; ':RowPos:']') ColorArray<2> = LineColor Set_Property(EquipmentTable$, 'OLE.CellColors[All; ':RowPos:']', ColorArray) Next Row return ColorNistTable: Today = Date() TableData = Get_Property(NistTable$, 'OLE.LIST') For each Row in TableData using @FM setting RowPos CLNo = Row<0, COL$CL_NO> NextCalDt = XLATE('CALIB_LIST', CLNo, 'NEXT_CAL_DT', 'X') BEGIN CASE CASE Row<0, COL$EQ_LOC>[1,14] = 'Out of Service' ; LineColor = LTGREY$ CASE NextCalDt = '' ; LineColor = WHITE$ CASE Row<0, COL$EQ_LOC>[1,19] = 'Out for Calibration' ; LineColor = ORANGE$ CASE (Today GT NextCalDt) ; LineColor = RED$ CASE (NextCalDt - Today) LE 15 ; LineColor = YELLOW$ CASE Otherwise$ ; LineColor = GREEN$ END CASE ColorArray = Get_Property(NistTable$, 'OLE.CellColors[All; ':RowPos:']') ColorArray<2> = LineColor Set_Property(NistTable$, 'OLE.CellColors[All; ':RowPos:']', ColorArray) Next Row return GetEquipmentFilterData: // Get available data with all other filters applied, but not with the current column filters applied. Cols = 'CL_NO,DEPT,EQ_DESC,EQ_SN,EQ_LOC,CAL_INTERVAL,CAL_LOC,LAST_CAL_DT,NEXT_CAL_DT' Swap ',' with @VM in Cols SelectStr = 'SELECT CALIB_LIST ' // Check column filter lists 1 - 9 for selected filters and apply them. For ColIndex = 1 to 9 // Ignore current column filters If ColIndex NE ColumnPos then FilterList = Get_Property(@Window, '@EQUIPMENT_FILTER_ARRAY_':ColIndex) SelFilterList = Get_Property(@Window, '@EQUIPMENT_SEL_FILTER_ARRAY_':ColIndex) For each SelFilter in SelFilterList using @VM setting vPos If SelFilter EQ 0 then If FilterList<0, vPos> NE '(Blanks)' then FormatVal = FilterList<0, vPos> end else FormatVal = '' end If Index(FormatVal, '"', 1) then SelectStr := "WITH ":Cols<0, ColIndex>:" NE '":FormatVal:"' AND " end else SelectStr := 'WITH ':Cols<0, ColIndex>:' NE "':FormatVal:'" AND ' end end Next SelFilter end Next ColIndex If SelectStr[-1, -5] EQ ' DNA ' then SelectStr[-1, -5] = '' RList(SelectStr, TARGET_ACTIVELIST$, '', '', '') ErrCode = '' If Not(Get_Status(ErrCode)) then EquipmentList = Calibration_Services('GetCalibListData', 'Equipment', True$) end return GetNistFilterData: // Get available data with all other filters applied, but not with the current column filters applied. Cols = 'CL_NO,DEPT,STD_DESC,STD_SN,STD_LOC,CAL_INTERVAL,CAL_LOC,LAST_CAL_DT,NEXT_CAL_DT' Swap ',' with @VM in Cols SelectStr = 'SELECT CALIB_LIST ' // Check column filter lists 1 - 9 for selected filters and apply them. For ColIndex = 1 to 9 // Ignore current column filters If ColIndex NE ColumnPos then FilterList = Get_Property(@Window, '@NIST_FILTER_ARRAY_':ColIndex) SelFilterList = Get_Property(@Window, '@NIST_SEL_FILTER_ARRAY_':ColIndex) For each SelFilter in SelFilterList using @VM setting vPos If SelFilter EQ 0 then If FilterList<0, vPos> NE '(Blanks)' then FormatVal = FilterList<0, vPos> end else FormatVal = '' end If Index(FormatVal, '"', 1) then SelectStr := "WITH ":Cols<0, ColIndex>:" NE '":FormatVal:"' AND " end else SelectStr := 'WITH ':Cols<0, ColIndex>:' NE "':FormatVal:'" AND ' end end Next SelFilter end Next ColIndex If SelectStr[-1, -5] EQ ' DNA ' then SelectStr[-1, -5] = '' RList(SelectStr, TARGET_ACTIVELIST$, '', '', '') ErrCode = '' If Not(Get_Status(ErrCode)) then NistList = Calibration_Services('GetCalibListData', 'NIST', True$) end return ApplyEquipmentFilters: Cols = 'CL_NO,DEPT,EQ_DESC,EQ_SN,EQ_LOC,CAL_INTERVAL,CAL_LOC,LAST_CAL_DT,NEXT_CAL_DT' Swap ',' with @VM in Cols SelectStr = 'SELECT CALIB_LIST ' // Check column filter lists 1 - 9 for selected filters and apply them. For ColIndex = 1 to 9 FilterList = Get_Property(@Window, '@EQUIPMENT_FILTER_ARRAY_':ColIndex) SelFilterList = Get_Property(@Window, '@EQUIPMENT_SEL_FILTER_ARRAY_':ColIndex) For each SelFilter in SelFilterList using @VM setting vPos If SelFilter EQ 0 then If FilterList<0, vPos> NE '(Blanks)' then FormatVal = FilterList<0, vPos> end else FormatVal = '' end If Index(FormatVal, '"', 1) then SelectStr := "WITH ":Cols<0, ColIndex>:" NE '":FormatVal:"' AND " end else SelectStr := 'WITH ':Cols<0, ColIndex>:' NE "':FormatVal:'" AND ' end end Next SelFilter Next ColIndex If SelectStr[-1, -5] EQ ' DNA ' then SelectStr[-1, -5] = '' RList(SelectStr, TARGET_ACTIVELIST$, '', '', '') ErrCode = '' If Not(Get_Status(ErrCode)) then EquipmentList = Calibration_Services('GetCalibListData', 'Equipment', True$) Set_Property(EquipmentTable$, 'OLE.LIST', EquipmentList) GoSub ColorEquipmentTable GoSub UpdateEquipmentHeaders end return ApplyNistFilters: Cols = 'CL_NO,DEPT,STD_DESC,STD_SN,STD_LOC,CAL_INTERVAL,CAL_LOC,LAST_CAL_DT,NEXT_CAL_DT' Swap ',' with @VM in Cols SelectStr = 'SELECT CALIB_LIST ' // Check column filter lists 1 - 9 for selected filters and apply them. For ColIndex = 1 to 9 FilterList = Get_Property(@Window, '@NIST_FILTER_ARRAY_':ColIndex) SelFilterList = Get_Property(@Window, '@NIST_SEL_FILTER_ARRAY_':ColIndex) For each SelFilter in SelFilterList using @VM setting vPos If SelFilter EQ 0 then If FilterList<0, vPos> NE '(Blanks)' then FormatVal = FilterList<0, vPos> end else FormatVal = '' end If Index(FormatVal, '"', 1) then SelectStr := "WITH ":Cols<0, ColIndex>:" NE '":FormatVal:"' AND " end else SelectStr := 'WITH ':Cols<0, ColIndex>:' NE "':FormatVal:'" AND ' end end Next SelFilter Next ColIndex If SelectStr[-1, -5] EQ ' DNA ' then SelectStr[-1, -5] = '' RList(SelectStr, TARGET_ACTIVELIST$, '', '', '') ErrCode = '' If Not(Get_Status(ErrCode)) then NistList = Calibration_Services('GetCalibListData', 'NIST', True$) Set_Property(NistTable$, 'OLE.LIST', NistList) GoSub ColorNistTable GoSub UpdateNistHeaders end return SaveUserFilters: UserConfigRec = Database_Services('ReadDataRow', 'USER_CONFIG', @User4:'*':@Window) UserConfigProps = UserConfigRec UserConfigVals = UserConfigRec For ColumnPos = 1 to 9 EquipFilterVals = Get_Property(@Window, '@EQUIPMENT_FILTER_ARRAY_':ColumnPos) SelEquipVals = Get_Property(@Window, '@EQUIPMENT_SEL_FILTER_ARRAY_':ColumnPos) NistFilterVals = Get_Property(@Window, '@NIST_FILTER_ARRAY_':ColumnPos) SelNistVals = Get_Property(@Window, '@NIST_SEL_FILTER_ARRAY_':ColumnPos) Swap @VM with @SVM in EquipFilterVals Swap @VM with @SVM in SelEquipVals Swap @VM with @SVM in NistFilterVals Swap @VM with @SVM in SelNistVals Property = '@EQUIPMENT_FILTER_ARRAY_':ColumnPos Locate Property in UserConfigProps using @VM setting PropVpos else PropVpos = -1 end UserConfigProps<0, PropVpos> = Property UserConfigVals<0, PropVpos> = EquipFilterVals Property = '@EQUIPMENT_SEL_FILTER_ARRAY_':ColumnPos Locate Property in UserConfigProps using @VM setting PropVpos else PropVpos = -1 end UserConfigProps<0, PropVpos> = Property UserConfigVals<0, PropVpos> = SelEquipVals Property = '@NIST_FILTER_ARRAY_':ColumnPos Locate Property in UserConfigProps using @VM setting PropVpos else PropVpos = -1 end UserConfigProps<0, PropVpos> = Property UserConfigVals<0, PropVpos> = NistFilterVals Property = '@NIST_SEL_FILTER_ARRAY_':ColumnPos Locate Property in UserConfigProps using @VM setting PropVpos else PropVpos = -1 end UserConfigProps<0, PropVpos> = Property UserConfigVals<0, PropVpos> = SelNistVals Next ColumnPos UserConfigRec = UserConfigProps UserConfigRec = UserConfigVals Database_Services('WriteDataRow', 'USER_CONFIG', @User4:'*':@Window, UserConfigRec) return UpdateEquipmentHeaders: For Column = 1 to 9 FilterVals = Get_Property(@Window, '@EQUIPMENT_FILTER_ARRAY_':Column) SelFilters = Get_Property(@Window, '@EQUIPMENT_SEL_FILTER_ARRAY_':Column) NumFilters = DCount(FilterVals, @VM) NumSelFilters = Sum(SelFilters) If NumFilters NE NumSelFilters then Set_Property(EquipmentTable$, "OLE.HeaderImage[":Column + 1:"; 1]", 2) end else Set_Property(EquipmentTable$, "OLE.HeaderImage[":Column + 1:"; 1]", 1) end Next Column return UpdateNistHeaders: For Column = 1 to 9 FilterVals = Get_Property(@Window, '@NIST_FILTER_ARRAY_':Column) SelFilters = Get_Property(@Window, '@NIST_SEL_FILTER_ARRAY_':Column) NumFilters = DCount(FilterVals, @VM) NumSelFilters = Sum(SelFilters) If NumFilters NE NumSelFilters then Set_Property(NistTable$, "OLE.HeaderImage[":Column + 1:"; 1]", 2) end else Set_Property(NistTable$, "OLE.HeaderImage[":Column + 1:"; 1]", 1) end Next Column return