Доброго времени суток!
Интересует вопрос, как добавить дополнительное поле в окно фильтрации в fastreport и реализовать распечатку сообщения из этого поля в отчете? И реализуемо ли это вообще?

Нравится

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

Здравствуйте, Илья.

Если Вы имеете в виду базовую фильтрацию отчета, то Вы можете использовать в качестве фильтра любое поле, которое есть в датасетах, привязанных к отчету.

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

Что Вы подразумеваете под распечаткой сообщения из этого поля?

Требуется именно, взять значение поля из карточки фильтрации и распечатать его в отчете.
Это возможно сделать?

Посмотрите прикрепленный файл (взято из этого блога)
sozdat_svoe_okno_filtracii_dlya_otcheta_2.doc

Илья, подробный пример есть в файле, который предоставил Александр.

Спасибо!
Еще такой вопрос:
как в этом же окошке использовать стандартные фильтры для отчета?

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

Ага, а есть пример реализации такого окна?

Есть пример реализации, описанный Александром выше. По аналогии Вы создаете и остальные поля.

Там нет стандартного фильтра.
Требуется добавить именно стандартный фильтр для отчета.
Который формируется в конструкторе отчетов.

Илья, здравствуйте.

Опишу еще раз.

Есть стандартное окно фильтрации. Вы можете добавить в него дополнительные условия фильтрации в самом отчете:

[URL=http://fastpic.ru/][IMG]http://i66.fastpic.ru/big/2014/0715/35/5d69282b…]

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

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

Добрый день.
Помогите разобраться с проблемой.

Есть раздел, у раздела есть деталь. Одно из полей детали - справочник. При редактировании детали необходимо осуществлять фильтрацию элементов справочника в зависимости от значений двух полей раздела.

Фильтрацию в справочнике я реализовал, передачу параметров из скрипта окна редактирования детали в датасет справочника тоже. Осталось решить такую проблему: из скрипта редактирования детали получить доступ к значениям двух полей той записи раздела, для которой открыта деталь.

Раздел самописный (называется Чеки - Drafts). Деталь раздела - товары в чеке (ItemsInDraft).
Справочник, который фильтруем - номенклатуры товаров. Его необходимо фильтровать по двум параметрам записи раздела - организации (Org) и спд (BuName)

Мой код в скрипте wnd_ItemsInDraftEditScript

function edtNomenameOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
    var Dataset = LookupDataControl.DataField.LookupDataset;
    var SelectQuery = Dataset.SelectQuery;
 // в этих двух строчках я пытался получить нужные мне значения, но BaseGridArea.WorkspaceDataset - null
//var OrgID = GetFieldValueFromDisabledField(BaseGridArea.WorkspaceDataset, 'Org');
//var BuNameID = GetFieldValueFromDisabledField(BaseGridArea.WorkspaceDataset, 'BuName');
    SetParameterValue(SelectQuery.Parameters, 'Org', OrgID);
    SetParameterValue(SelectQuery.Parameters, 'BuName', BuNameID);
}

Нравится

4 комментария

Что-то типо этого

var OrgID = GetDatasetFieldValueByID('ds_Drafts', dlData('DraftsID'), 'Org');
var BuNameID = GetDatasetFieldValueByID('ds_Drafts', dlData('DraftsID'), 'BuName');

где 'ds_Drafts' - USI раздела Чеки
dlData - название датасета в карточке редактирования товаров в чеке
'DraftsID' - поле, связывающее товары в чеке с чеком

Мой код выглядит так

var OrgID = GetDatasetFieldValueByID('ds_SDrafts', dlData('SDraftsID'), 'Org');
var BuNameID = GetDatasetFieldValueByID('ds_SDrafts', dlData('SDraftsID'), 'BuName');

Выдает ошибку 438 "Объект не поддерживает это свойство или метод".

Попробуйте поменять так:

var OrgID = GetDatasetFieldValueByID('ds_SDrafts', dlData.Dataset('SDraftsID'), 'Org');
var BuNameID = GetDatasetFieldValueByID('ds_SDrafts', dlData.Dataset('SDraftsID'), 'BuName');

И корректно ли в переменную OrgID получать поле Org ? Может надо получать поля OrgID и BuNameID соответственно?

Спасибо, последний вариант заработал.

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

Мне необоходимо после создания задачи скопировать в нее продукты с документа. Я решил это сделать на событие OnAfterExecute задачи и чтобы не делать копирование каждый раз после вызова элемента задачи использую параметры:
ProductsWhereCopied - булевый, значение по-умолчанию false

Вот примерный код того, как я делаю:

function Action1OnAfterExecute(ActionItem, IsComplete) {
 // Получаем ID созданной задачи
 var TaskID = WFGetParamValue(ActionItem, 'TaskID');   
 if (!IsEmptyGUID(TaskID)) {
  // Проверяем были ли скопированы в этот документ продукты ранее
   var ProductsWhereCopied = WFGetParamsMapItemValue(ActionItem,'ProductsWhereCopied');
  // Сразу после создания задачи переносим в нее продукты с документа заявки
   if (ProductsWhereCopied == false) { 
    var ParentDiagram = ActionItem.ParentItems.ParentDiagram;
    // Получаем ID документа созданного ранее
    var DocumentID = WFGetParamValue(ParentDiagram, 'DocumentID');
    // Копируем продукты с документа в задачу
    CopyOfferingsFromDocumentToTask(DocumentID, TaskID);
    // Устанавливаем признак того, что на деталь "Продукты" были скопированы
    // продукты
    WFSetParamsMapItemValue(ActionItem, 'ProductsWhereCopied', true);                  
   }   
 }
}

Загвоздка в том, что когда я повторно запускаю элемент БП "Задача", почему-то значение параметра ProductsWhereCopied остается старым, то есть false, и происходит повторное копирование продуктов.

Есть подозрение, что на событие OnExecute можно менять значение параметров и оно будет запоминаться, а на событие OnAfterExecute оно не запоминается, так как, возможно, таблица tbl_WorkflowItem уже закрыта.

Подскажите как можно сделать так, чтобы этот параметр запоминался в БД?

Нравится

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

Попробуйте сохранять значение в параметр диаграммы, а не элемента. Если таких элементов несколько и они не выполняются параллельно, можно после завершения каждого из них опять устанавливать параметру значение false.

Например:

function Action1OnAfterExecute(ActionItem, IsComplete) {
 var ParentDiagram = GetDiagramByItem(ActionItem);
 // Получаем ID созданной задачи
 var TaskID = WFGetParamValue(ActionItem, 'TaskID');    
 if (!IsEmptyGUID(TaskID)) {
  // Проверяем были ли скопированы в этот документ продукты ранее
   var ProductsWhereCopied = WFGetParamValue(ParentDiagram,'ProductsWhereCopied');
  // Сразу после создания задачи переносим в нее продукты с документа заявки
   if (ProductsWhereCopied == false) {  
    // Получаем ID документа созданного ранее
    var DocumentID = WFGetParamValue(ParentDiagram, 'DocumentID');
    // Копируем продукты с документа в задачу
    CopyOfferingsFromDocumentToTask(DocumentID, TaskID);
    // Устанавливаем признак того, что на деталь "Продукты" были скопированы
    // продукты
    WFSetParamValue(ParentDiagram, 'ProductsWhereCopied', true);                   
   }    
 }
 if (IsComplete) {
    WFSetParamValue(ParentDiagram, 'ProductsWhereCopied', false);
 }
}

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

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

Здравствуйте. Подскажите пожалуйста как реализовать. Задача такая... Есть отчет, который работает через фильтр с вызовом окна. (отчет для всех записей)
Как мне передать при открытии окошка уже по умолчанию заполненные поля для контрагента на котором стоит курсор?
Например, чтобы в данном примере поле Клиент было заполнено значением "Теплогазсистем-сервис" ....

Нравится

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

Так можно достучатся до ID выбранной в реестре записи:

var GridDataset = BaseWorkspace.Grid.SelectedIDs;
var AccountID = GridDataset.CommaText;

--
www.it-sfera.com.ua

Или dlAccounts.Dataset('ID') для поля "Клиент".

Не выйдет. Отчет вызывается из меню действия и окошко не является дочерним для этой формы так что
BaseWorkspace = undefined

Зависит от того, как запускается отчет.
Если отчет подключен через раздел "Отчеты" с указанием собственной формы фильтрации, то он запускается стандартным обработчиком, и надо модифицировать его (чтобы он "пробрасывал" выделенный ИД записи в форму фильтрации).

Лабитек
Центр разработки приложений

Понятно, что undefined
Передайте атрибутом, как в этом примере:
http://community.terrasoft.ua/blogs/2694

--
www.it-sfera.com.ua

"Валерий Андрусик" написал: как запускается отчет.

собственная форма фильтрации, отчет прописан в Отчетах, а не на форме wnd_AccountsWorkspace

[quote="Виталий Ковалишин aka samael"]Передайте атрибутом, как в этом примере:
http://community.terrasoft.ua/blogs/2694[/quote]

У вас там явно в менюшке есть действие -> .....
А у меня отчет->.... И этот отчет висит в списке отчетов в вдминке и явно в менюшке отчетов не фигурирует. Так что в каком месте создавать передачу параметра не пойму. :(

Как удалить пред камент?? :(

"Парфенов Евгений" написал:У вас там явно в менюшке есть действие -> .....
А у меня отчет->.... И этот отчет висит в списке отчетов в вдминке и явно в менюшке отчетов не фигурирует. Так что в каком месте создавать передачу параметра не пойму. :(

Создайте действие в amiReports и отправьте атрибуты в окно фильтрации. С окна фильтрации и запускайте отчет имея параметры для фильтрации записей.

Можно в окне фильтрации получить ID текущей записи открытого раздела.

Connector.Attributes('MainWindow').ComponentsByName('wndWorkspace').Window.ComponentsByName('dlAccounts').Dataset('ID')

но только если Вы точно уверены, что открыт раздел "Контрагенты". Но такое решение мне лично не очень нравится.

Да, спасибо. Разобрался уже. Пришлось просто явно добавить пункт в менюшке отчетов...

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

Добрый день! Подскажите пожалуйста как передать параметр при вызове стандартного отчета? Т.к. по умолчанию фильтрация идет по полю ID выделенной в реестре записи. Например стандартный запрос для отчета (счет с НДС)выводящий все продукты связанные с выделенным счетом имеет вид:

SELECT
        [Offering].[Name] AS [Offering],
        [tbl_OfferingInInvoice].[CustomOffering] AS [CustomOffering],
        [tbl_OfferingInInvoice].[Quantity] AS [Quantity],
        [tbl_OfferingInInvoice].[Price] AS [Price],
        [tbl_OfferingInInvoice].[Amount] AS [Amount],
        [tbl_OfferingInInvoice].[BasicAmount] AS [BasicAmount],
        [tbl_OfferingInInvoice].[BasicDiscountAmount] AS [BasicDiscountAmount],
        [tbl_OfferingInInvoice].[BasicPrice] AS [BasicPrice],
        [tbl_OfferingInInvoice].[BasicTaxAmount] AS [BasicTaxAmount],
        [tbl_OfferingInInvoice].[TaxAmount] AS [TaxAmount],
        [Tax].[Name] AS [Tax],
        [Unit].[Name] AS [Unit]
FROM
        [dbo].[tbl_OfferingInInvoice] AS [tbl_OfferingInInvoice]
LEFT OUTER JOIN
        [dbo].[tbl_Offering] AS [Offering] ON [Offering].[ID] = [tbl_OfferingInInvoice].[OfferingID]
LEFT OUTER JOIN
        [dbo].[tbl_Tax] AS [Tax] ON [Tax].[ID] = [tbl_OfferingInInvoice].[TaxID]
LEFT OUTER JOIN
        [dbo].[tbl_Unit] AS [Unit] ON [Unit].[ID] = [tbl_OfferingInInvoice].[UnitID]
WHERE([tbl_OfferingInInvoice].[InvoiceID] = :ID)

А как например передать параметр DocumentID, т.е. к счету привязан документ(в карточке редактирования счета заполнено поле "Документ") и требуется вызвать все продукты связанные с этим документом. Т.е. есть 5 счетов в карточке которых указан один и тот-же документ, список продуктов в каждом счете одинаков( в каждом содержиться продукт A, B и С в различных кол-вах, необходимо получить отчет по общему кол-ву A, B и C)

Нравится

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

Здравствуйте, Сергей!

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

Что бы это реализовать необходимо:

- запустить Террасофт Администратор;
- найти запрос на выборку [sq_OfferingInInvoice];
- проверить есть ли в запросе подключение к таблице [tbl_InvoiceDocument] по полю ID, если нет — необходимо добавить;
- проверить есть ли фильтр [DocumentID];
- добавить фильтр типа […Name];
- сохранить изменения;
- перейти к источнику данных [ds_OfferingInInvoice] и добавить в нем поле типа справочник.
- сохранить изменения;
- в дереве сервисов найти и открыть на редактирование сервис Fast Report для данного отчета;
- в данном сервисе нажать на кнопку «Установить фильтры»;
- в появившейся форме фильтрации нажать на ссылку, чтобы добавить новое условие фильтрации по ранее созданному полю;
- сохранить изменения.

P.S. Убедитесь, что у данного отчета указа тип фильтрации [Для всех записей].

Terrasoft Support Team

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

Добрый день! Подскажите пожалуйста как запустить exe файл с параметром.
Есть exe файл, написанный на Delphi.
вызывается он из скрипта следующим образом

  var ID = Dataset.Values('ID');
  System.OpenFile('D:\\Project1.exe', fatRead);

Необходимо передать в exe файл параметр ID.
Заранее спасибо!

Нравится

2 комментария

Добрый день.
Спасибо за Ваш вопрос.

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

var objShell = new ActiveXObject('Wscript.Shell');
var Result = objShell.Run('%comspec% /c \"%D:\\Project1.exe <PARAMETERS> \""');

Добрый день! Спасибо! Вот так получилось:

 var Dataset = BaseWorkspace.GridDataset;
 var ID = Dataset.Values('ID'); // например тут ID=df7822
 var objShell = new ActiveXObject('Wscript.Shell');
 objShell.Run("D:\\Project1.exe " + ID);
Показать все комментарии