Иногда и такое нужно. Как пример -- есть окно с несколькими гридами на основе записей меморидатасет. Записей много -- поэтому у клиента возникает необходимость их быстро искать.
Сам фильтр сложно реализовать(потому что при закрытии, как известно, меморидатасет очищается. тем более, если функционал сложный, то при "собирании заново" тратится время на проверку всех условий и т.п.), но можно сделать иначе: просто выделять нужные записи.

Как это работает -- ищет по полям, где содержится слово, введенное в поле (то есть, принцип тот же, что и в обычном поиске, тип поиска можно поменять в системных настройках) -- и выделяет найденные записи. При нажатии на "крестик"(то есть "убираем" быстрый поиск) оно снимает выделение.

Этот код можно добавить прямо в скрипт scr_BaseMemDSGridArea, а в окошке wnd_BaseMemDSGridArea прописать на гриде события grdDataOnQuickFilter (запуск быстрого фильтра) и grdDataOnClearFilter (снятие быстрого фильтра).
Еще момент -- код "ориентируется" на поле ID в мемори датасете, поэтому, если у Вас такого поля нет, то нужно или добавить его, или соответствующе изменять функции.

//-------- quick filter  --------------

function grdDataOnQuickFilter(DataGrid, DataField, Value, QuickFilterLikeType, DoFilter, DoQuickFilter) {
        DataGrid.DisableEvents();  //debugger;
        var QuickFilterLikeType = GetSystemParameterValueEx('QuickFilterLikeType');            
        LastSearchRecordID = LocateOnSearchRecord(DataGrid, dlData.Dataset,DataField.Name,Value,QuickFilterLikeType);
        DataGrid.EnableEvents();
        if (!!LastSearchRecordID) {
                if (dlData.Dataset('ID') != LastSearchRecordID) {
                        DataGrid.UnSelectRow(dlData.Dataset('ID'));
                }
        } else {
            DataGrid.UnSelectRow(dlData.Dataset('ID'));
        }
}



function LocateOnSearchRecord(Grid, DS, DataFieldName, DataFieldValue, FilterType) {
        //debugger;
        var Count = DS.RecordsCount;
        if (!Count) {
                return;
        }      
        var SelectedIDsCount = Grid.SelectedIDs.Count;
        if (!!SelectedIDsCount) {
                Grid = UnSelectSelectedIDs(Grid);
        } else {    
                 Grid.UnSelectRow(DS('ID'));
        }
        DS.GotoFirst();
        var SearchArray = new Array();
        for (var i = 0; i Count; i++) {
                if (IsSearchValueInCurrentDSRecord(DS,DataFieldName,DataFieldValue, FilterType)) {
                         SearchArray.push(DS('ID'));
                }
                DS.GotoNext(); 
        }
        var LastSearchRecordID = null;
        if (!!SearchArray.length) {
                SelectSearchRecords(Grid, SearchArray);
                LastSearchRecordID = SearchArray[SearchArray.length - 1];
        }
        return LastSearchRecordID;
}

function  UnSelectSelectedIDs(Grid) {           //
        var Count = Grid.SelectedIDs.Count;
        var SelectedIDs  =  GetArrayByCollection(Grid.SelectedIDs);
        for (var i=0; i Count; i++) {
                Grid.UnSelectRow(SelectedIDs[i]);
        }
        return  Grid;
}
function IsSearchValueInCurrentDSRecord(DS,DataFieldName,DataFieldValue, FilterType) {   //debugger;
        var CurrentDataFieldValue = DS(DataFieldName);
        CurrentDataFieldValue = CurrentDataFieldValue.toString();
        DataFieldValue = DataFieldValue.toString();
        var Result = false;
        switch (FilterType.toString()) {
                case qfltEqual:
                        Result = (CurrentDataFieldValue == DataFieldValue);     //поле равно значению
                break;         
                case qfltDefault:
                case qfltContain:
                        Result = (CurrentDataFieldValue.indexOf(DataFieldValue) != -1);  //значение содержится в поле
                break;
                case qfltStartsWith:
                        Result = (CurrentDataFieldValue.substr(0,DataFieldValue.length) == DataFieldValue);  //поле начинается со значения
                break;          
                case qfltEndsWith:
                        Result = (CurrentDataFieldValue.substr(CurrentDataFieldValue.length-DataFieldValue.length+1, DataFieldValue.length) == DataFieldValue);  //поле заканчивается значением
                break;
        }
        return Result;
}

function SelectSearchRecords(Grid, SearchArray) {
        for (var i=0; i SearchArray.length; i++) {
                Grid.SelectRow(SearchArray[i]);
        }
}

function grdDataOnClearFilter(DataGrid) {
        DataGrid.DisableEvents();
        UnSelectSelectedIDs(DataGrid)  ;
        DataGrid.EnableEvents();
}

Нравится

Поделиться

0 комментариев
Показать все комментарии

Коллеги, возможно ли в реальном времени рисовать графики? Конкретная ситуация. Есть Memory Dataset, формируется динамически. В нём итоговые значения по временным отрезкам (периодам). Эти отрезки я могу задать в любой момент. Собственно хотелось бы увидеть эти значения на графике со шкалой времени. Скажите, в каком направлении идти?

Нравится

1 комментарий

Добрый день!
Для прорисовки графика, Вы можете воспользоваться функцией function DrawGraphByDataset(Dataset, Graph, FieldXName, FieldYName, GraphType, GraphName, edtGraphPreview), код которой прописан в сервисе scr_GraphUtils
Посмотрите как она реализована и вызывается.

Приятной работы!

Показать все комментарии