Добрый день! Иногда сталкиваемся с просьбой клиентов не выводить пустой отчет, т.е. его предпросмотр. В случае, когда у отчета "своя" форма фильтрации - все просто, т.е. мы получаем готовый набор данных, анализируем его и выводим сообщение, если это нужно. Но что делать, когда используется базовая форма фильтрации?
Для решения данной проблемы в скрипте scr_BaseFastReportPreviewScript можно изменить функцию ProcessNotify:
function ProcessNotify(ASender, AMessage) {
if (AMessage == MSG_OK) {
AddFilterStringsToReport(ASender, frpMain.Report);
/* Проверка, пуст ли набор данных. Если Да - не показывать Preview отчета */
if ((Assigned(ASender)) &&
(ASender.Name == 'wnd_ReportFilters') &&
(Assigned(ASender.NonVisualComponents)) &&
(ASender.NonVisualComponents.Count > 0)) {
var Components = ASender.NonVisualComponents;
var Count = Components.Count;
var Component;
var Dataset;
var DatasetsCount = 0;
var EmptyDatasetsCount = 0;
for (var i = 0; i Count; i++) {
Component = Components.Items(0);
if (Component.TypeCode == 'DatasetLink') {
Dataset = Component.Dataset;
if (Assigned(Dataset)) {
DatasetsCount++;
Dataset.Open();
if (Dataset.IsEmptyPage) {
EmptyDatasetsCount++;
}
Dataset.Close();
}
}
}
if (DatasetsCount == EmptyDatasetsCount) {
ShowWarningDialog("Набор данных пуст.");
return;
}
}
Self.Show();
} else
if (AMessage == MSG_CANCEL){
Self.Close();
}
}
if (AMessage == MSG_OK) {
AddFilterStringsToReport(ASender, frpMain.Report);
/* Проверка, пуст ли набор данных. Если Да - не показывать Preview отчета */
if ((Assigned(ASender)) &&
(ASender.Name == 'wnd_ReportFilters') &&
(Assigned(ASender.NonVisualComponents)) &&
(ASender.NonVisualComponents.Count > 0)) {
var Components = ASender.NonVisualComponents;
var Count = Components.Count;
var Component;
var Dataset;
var DatasetsCount = 0;
var EmptyDatasetsCount = 0;
for (var i = 0; i Count; i++) {
Component = Components.Items(0);
if (Component.TypeCode == 'DatasetLink') {
Dataset = Component.Dataset;
if (Assigned(Dataset)) {
DatasetsCount++;
Dataset.Open();
if (Dataset.IsEmptyPage) {
EmptyDatasetsCount++;
}
Dataset.Close();
}
}
}
if (DatasetsCount == EmptyDatasetsCount) {
ShowWarningDialog("Набор данных пуст.");
return;
}
}
Self.Show();
} else
if (AMessage == MSG_CANCEL){
Self.Close();
}
}
Как видно из кода, мы можем просто анализировать отфильтрованный датасет, получая его из формы фильтрации.
Прим.: Возможно, у кого то есть другое, более изящное решение - милости прошу в комментарии.
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать