Определение параметров через макросы

Добрый День.
Проблема состоит в том, что при создании запроса с помощью мастера(не имеет значения), нету такой колонки как "Текущий пользователь"(ее просто не существует в таблице).Но при построении отчета нужно в поле "User" добавлять имя "Текущего пользователя"...Где-то на форуме я читал что такое возможно сделать макросом через Коннектор, но автор не расписал как...если кто то знает как можно определять какие то основные поля через макросы, то прошу вашей помощи...
Версия Террасофта - 3_4

Нравится

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

Вашу задачу можно реализовать используя отчет FastReport. Для этого, в датасет который используется для построения MasterDetail добавьте вычисляемое поле CurrentUser, например. На событие этого датасета "OnDatasetCalcFields" реализуйте функцию, котороая будет помещать в поле CurrentUser значение Connector.CurrentUser.ContactName:

Dataset.Values('CurrentUser') = Connector.CurrentUser.ContactName;

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

а если обязательно делать через Ворд?то никак?хммм а есть ли возможность в таблице создать колонку новую и там определять текущего пользователя?если да то каким образом?какой скрипт писать?

Егор, нужно добавить статическое поле типа Строка Unicode в таблицу раздела, из которого вызывается такой отчет. К примеру, пусть это будет раздел "Договора" и мы хотим в печатную форму договора вставить имя сотрудника, печатающего договор.

После того, как добавите строковое поле CurrentUser в сервисы tbl_Contract, sq_Contract и ds_Contract, измените и запрос данных, который производит выборку для отчета - это запрос Договор. Добавьте в него поле CurrentUser в основную деталь. У меня получилось так: Договор.Current User. Соответсвенно макрос для подстановки в шаблон WORD (в моем случае): <#Договор.Current User>

Затем определите уникальный ID интересующего Вас отчет, я это сделал в SQL Management Studio простым запросом:  select * from tbl_Report where name = 'Печатная форма договора' (sq_Report требует дополнительных параметров, а создавать новый сервис запроса мне было лень :smile:). В используемой мною конфигурации, для отчета "Печатная форма договора" ID оказался равным "{288C8C1D-3722-434A-B010-92101BB1BEC7}".

Вооружившись этим знанием я пошел в сервис Common\Window Templates\BaseWorkspace\scr_BaseWorkspace, нашел там фнкцию function amiReportsOnPrepare(ActionMenuItem) и в цикл for (var i = 0; i < RootMenuItem.Count; i++) после var MenuIsVisible = true; вставил свое условие:

  if (MenuItem.Tag == '{288C8C1D-3722-434A-B010-92101BB1BEC7}') {	 //debugger;		
      		var ContractDataset = Services.GetNewItemByUSI('ds_Contract');
      		ApplyDatasetFilter(ContractDataset, 'ID', BaseWorkspace.GridDataset('ID'),true);
      		  ContractDataset.DisableEvents();
	          ContractDataset.Open();
      		  ContractDataset.Edit();
      		  ContractDataset.Values('CurrentUser') = Connector.CurrentUser.ContactName;
      		  ContractDataset.Post();
      		  ContractDataset.Close();
      		  ContractDataset.EnableEvents();
		}

Суть работы такова: при нажатии на контрол "Отчеты", система отрисовывает выпадающее меню со списком отчетов, закрепленных за данным разделом. Дойдя до нашего "Печатная форма договора" она открывает датасет выделенного в реестре записей договора и вписывает в поле CurrentUser его таблицы tbl_Contract имя текущего пользователя.

Возможно сюда еще нужно будет добавить проверку на наличие датасета Договора. Т.к. если по фильтру раздела не будет ни одной записи договра в реестре, на нашей логике может произойти "свал". Добавить внутрь условия if () {} конструкцию try() catch(e).

Успехов и приятной работы!

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