Запрос выполняется более одного раза.

Создал отчет. Два параметра в запросе всегда одни и те же. Два параметра изменяются - это период "Дата с" и "Дата по".
Окно для выбора периода собственное. Вот такой код:

обработчик кнопки "Ok"

 var Report = Services.GetNewItemByUSI('fr_ServicesOnPeriodReport');
        var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
        var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
        var ReportDataset = Services.GetNewItemByUSI('ds_ServicesOnPeriod');
        ApplyDatasetFilter(ReportDataset, 'DueDateROBeg', BegDate.Value, true);
        ApplyDatasetFilter(ReportDataset, 'DueDateROEnd', EndDate.Value, true);
        ReportDataset.Open();
        SetAttribute(ReportPreviewer, 'Report', Report);
        ReportPreviewer.Build();
        ReportPreviewer.Prepare();
       
        Report.Attributes('BegDate')  = BegDate.Value;
        Report.Attributes('EndDate')  = EndDate.Value;
        var CurrentDate = new Date();
        CurrentDate = CurrentDate.getVarDate();
        Report.Attributes('CurDate')  = CurrentDate;
       
        ReportPreviewer.WindowState = wsMaximized;
        ReportPreviewerComponent.DatasetByComponentName('ds_ServicesOnPeriod') = ReportDataset;
        ReportDataset.Close();
        Self.Close()

Просматриваю профайлером, какой запрос выполняется. Первый раз (на методе ReportDataset.Open()) отрабатывает нормально. Но дальше запрос начинает выполняться с отключенными параметрами DueDateROBeg и DueDateROEnd. Соответственно выполняется он сначала для TOP 40, потом - TOP 80 и т.д.
С чего это он вдруг так нехорошо поступает?
версия 3.0.2.244

Нравится

13 комментариев

Вроде разобрался.
В строке:

ReportPreviewerComponent.DatasetByComponentName('ds_ServicesOnPeriod') = ReportDataset;

заменил ds_ServicesOnPeriod на TSDataset1 (название компонента в самом отчете).

SSV, здравствуйте.

Все верно, ведь Вы здесь обращаетесь к компоненту отчета, а не к самому сервису конфигурации.

а вот в другом отчете так не получается...
всё сделано абсолютно аналогично, только другие сервисы датасета и отчета... если на всех фильтрах поставить галочки (т.е. фильтры всегда включены), то получается нормальный отчет, а если галочки сняты, то запрос выполняется без фильтров, хотя значения им присваиваются:

ApplyDatasetFilter(ReportDataset, 'StartDateRO' ,BegDate.Value, true); 
ApplyDatasetFilter(ReportDataset, 'DueDateRO', EndDate.Value, true);  	
ApplyDatasetFilter(ReportDataset, 'UrFaceIDParam', ur, true);

Здравствуйте, SSV.
Есть предположение, что Вы включаете фильтры не в том экземпляра датасета (т.е в абсолютно новом, а не том, который используется в отчете).

И этот код лучше переписать так:

        var Report = Services.GetNewItemByUSI('fr_ServicesOnPeriodReport'); 
        var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview'); 
        var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer'); 
        var ReportDataset = Services.GetNewItemByUSI('ds_ServicesOnPeriod'); 
        ApplyDatasetFilter(ReportDataset, 'DueDateROBeg', BegDate.Value, true);
        ApplyDatasetFilter(ReportDataset, 'DueDateROEnd', EndDate.Value, true);
 
        Report.Attributes('BegDate')  = BegDate.Value;
        Report.Attributes('EndDate')  = EndDate.Value;
        var CurrentDate = new Date();
        CurrentDate = CurrentDate.getVarDate();
        Report.Attributes('CurDate')  = CurrentDate;
 
        ReportPreviewer.WindowState = wsMaximized;
        ReportPreviewerComponent.DatasetByComponentName('TSDataSet') = ReportDataset;
 
        SetAttribute(ReportPreviewer, 'Report', Report);
        ReportPreviewer.Build(); 
        ReportPreviewer.Prepare();
 
 
        Self.Close()

"Олейник Дмитрий" написал:
Есть предположение, что Вы включаете фильтры не в том экземпляра датасета

это врядли...
посмотрел, как реализованы другие отчеты (реализованы не мной), получается, что фильтры в селектах, которые используются для отчетов, всегда должны быть включены по умолчанию?

"неладно что-то в Датском королевстве"...
простой код:

case '5':
	var DSHouses = Services.GetNewItemByUSI('ds_Houses'); 
	ApplyDatasetFilter(DSHouses, 'PostalCode', Dataset.Values('ZIP') , true); 
	DSHouses.Open();
break;

запрос даже в профайлере не отображается, т.е. он как бы вообще не выполняется, хотя в дэбаггере DSHouses.RecordsCount имеет вполне определенное значение, но неправильно, как будто запрос выполнился без фильтра...

дальше, в той же функции:

var DSHouses = Services.GetNewItemByUSI('ds_Houses');
ApplyDatasetFilter(DSHouses, 'AOGUID1', DSAdObj.Values('AOGUID') , true)
DSHouses.Open();

как видно - используется другой фильтр, запрос отрабатывает...
в чем может быть проблема?
PS датасет ds_Houses построен на основе представления, могут ли в этом случае быть какие-то подводные камни?
хотя второй участок кода ведь работает...

Здравствуйте!

Уточните, пожалуйста, параметр фильтра называется так же, как сам фильтр или иначе?

Кроме того, не вполне понятна ситуация с профайлером: он может не показывать запрос в случае, если в нем настроена фильтрация либо же скрипт просто не входит в case 5

Да, параметр называется точно так же, как и фильтр (а разве это имеет значение?). В case 5 входит, я под дэбаггером смотрю...

В данном случае сложно что-то сказать наощупь, хотелось бы провести отладку непосредственно на базе.

В случае, если у Вас есть возможность предоставить резервную копию базы данных либо удаленное подключение для тестирования, направьте, пожалуйста, запрос на support@terrasoft.ru

а если такой возможности нет, то останусь один на один с проблемой?

Если такой возможности нет, тогда будем искать другие, более медленные и сложные пути :) Например, выгрузка сервисов конфигурации - таблиц, из которых запрос берет данные, самого запроса, датасета и отчета. Для диагностики и устранения сбоя нужно как-то воспроизвести его на нашей стороне и отладиться.

Хорошо бы еще выяснить, какая у Вас версия базы данных и какой продукт был развернут изначально.

версию я указал в самом начале, или нужно что-то еще?
и "Например, выгрузка сервисов конфигурации" - так например, или можно выгрузить и это поможет? того, что вы перечислили, будет достаточно?

Вы указали версию бинарных файлов, мне нужно, как минимум, знать еще версию базы данных. Они могут различаться, и в Вашем случае различаются - сборка 3.0.2.244 одна из самых новых, тогда как версия базы данных для MSSQL последняя была 3.0.2.68. Между версиями БД могут меняться скрипты конфигурации, хранимые процедуры и триггеры и т.д.

Это важно для того, чтобы мы могли развернуть конфигурацию, максимально близкую к Вашей.

Давайте попробуем поступить следующим образом: Вами будут предоставлены запрошенные сервисы, я попробую их развернуть на последнем имеющемся бэкапе. Если не удастся воспроизвести, буду запрашивать дополнительную информацию для диагностики.

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