Печатная форма

Доброго времени суток!

Сталкиваюсь с Terrasoft впервые, только начинаю изучать.
Нужно разработать печатные формы. Для примера взял карточку договора
Вопрос такой.

В договорах есть отчет "Карточка договора".

Как вывести отчет из самой карточки договора?

Сделал кнопку "печать" в карточке, определил событие OnClik - btnPrintOnClick

function btnPrintOnClick(Control) {
PrintForms();
}

function PrintForms() {
нужно получить отчет, передать в него параметр, это номер договора, или же текущий объект
затем вывести на печать
}

нашел кое что на форуме, в мануале вот что получилось

function PrintForms() {
var vSelectQuery = Services.GetNewItemByUSI("sq_ReportContractCard");
var vPrimarySelect = GetSelectQueryPrimarySelect("vSelectQuery");
EnableAllFilters(vPrimarySelect.Filters, false);
EnableFilter(vPrimarySelect.Filters, 'ContractNumber', true);

ValueContractNumber = ??????????
SetParameterValue(vSelectQuery.Parameters, ''ContractNumber'', ValueContractNumber);

var vReport = Services.GetNewItemByUSI("fr_ReportContractCard");
}

Если я правильно мыслю то как получить значение ValueContractNumber, номер текущего договора с которого выполняется печать...
и как сказать отчету чтобы он вывел данные на основании этого запроса, и соответственно вывести отчет?

P.S. Можно объяснить какой принцип работы отчетов Word, Excel, FastReport
Для чего служит тот или иной отчет и в каких случаях какой вид отчета выбирать для разработки.

Нравится

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

здравствуйте, Ринат!
получить ИД записи договора в самой карточке можна так:

var Dataset = dlData.Dataset;
var ContractID = Dataset('ID');

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

if (Dataset.State==dstInsert) {//dstInsert -- датасет в режиме "вставки", то есть запись новая
  Dataset.Post(); //сохраняем данные. но тут могуть быть нюансы (больше прописано на кнопке "ок"
  Dataset.Edit(); //снова переводим датасет в режим редактирования
}

кстати, в Вашем коде -- сначала нужно подставить параметр, а потом уже включать фильтр:

var ValueContractNumber = Dataset('ContractNumber');//??????????
SetParameterValue(vSelectQuery.Parameters, ''ContractNumber'', ValueContractNumber);
EnableFilter(vPrimarySelect.Filters, 'ContractNumber', true);

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

Ольга, спасибо за развернутый и очень качественный ответ! :smile:

Спасибо Ольга!
Уже есть некоторое представление, но ещё есть много вопросов)))

объясните пожалуйста для чего мы получаем SelectQuery, dataset и fast report

какая последовательность в данной ситуации должна быть и куда передавать параметры

var vSelectQuery = Services.GetNewItemByUSI('sq_ReportContractCard');
var vPrimarySelect = GetSelectQueryPrimarySelect('vSelectQuery');
var vReport = Services.GetNewItemByUSI("fr_ReportContractCard");

возможно есть метод в котором нужно указать допустим (var vReport, параметры)
и он выведет отчет на экран

я понимаю так.
сначала получаем SelectQuery, передаем параметры, выполняем запрос
результат передаем в dataset и выводим отчет с передачей в него dataset?

Все верно Ринат! Вызывая отчет из произвольного места, нужно инициализировать экземпляры объектов SelectQuery и Dataset. И передать их в объект FastReport. Для это необходимо проделывать все описанные выше манипуляции с обращением к данным и их фильтрацией.

В теме http://www.community.terrasoft.ua/forum/topic/8284 впринципе то что надо

только параметр накладывается не на запрос а на датасет что кажется даже и правильно?

function PrintContract() {

var Dataset = dlData.Dataset;
var ContractID = Dataset('ID');

var Report = Services.GetNewItemByUSI('fr_ReportContractCard');
var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
var ReportDataset = Services.GetNewItemByUSI('ds_ReportContractCard');
SetAttribute(ReportPreviewer, 'Report', Report);
ApplyDatasetFilter(ReportDataset, 'ID', ContractID, true);
ReportPreviewer.Build();
ReportPreviewer.Prepare();
ReportPreviewerComponent.DatasetByUSI('ds_ReportContractCard') = ReportDataset;

//wnd_ContractEdit

}

При нажатии на "Печать" запускается отладчик, при попытке отладить код и нажатии F9 в wnd_ContractEditScript появляется ошибка "Метод Main не существует"

Что за метод? И почему может не исполняться отчет?

проверила Ваш код только что у себя.
1) в запросе отчета (sq_ReportContractCard) нету фильтра по ID-- поэтому если у Вас его тоже нет, то нужно предварительно его создать
2) датасет "обозначить" надо перед построением отчета, а не после:
у Вас:

"Ринат Исхаков" написал:

ReportPreviewer.Build();
ReportPreviewer.Prepare();
ReportPreviewerComponent.DatasetByUSI('ds_ReportContractCard') = ReportDataset;


надо:

ReportPreviewerComponent.DatasetByUSI('ds_ReportContractCard') = ReportDataset;
ReportPreviewer.Build();
ReportPreviewer.Prepare();

насчет

"Ринат Исхаков" написал:

При нажатии на "Печать" запускается отладчик, при попытке отладить код и нажатии F9 в wnd_ContractEditScript появляется ошибка "Метод Main не существует"

Что за метод?


то могу предположить, что F9 Вы нажимаете в Администраторе -- поэтому оно ищет функцию Main(), чтобы ее выполнить (пример -- тот же ГрепСерч)
для тестирования кнопки запускайте клиент, открывайте карточку и т.д. Да, по 100 раз перезапускать Террасофт, чтоб найти одну ошибку или отладить скрипт -- "весело" и не всегда удобно, но мы все через это проходили :smile:

Добрый день!
Для отладки незаменимый инструмент - MS Visual Studio :wink:

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

Большое спасибо Ольга, всё получилось!

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

"Исхаков Ринат Ильдарович" написал:т.е. чтобы она запустилась надо разместить в данном скрипте функцию main()???

да, нужно прописать эту функцию, например:

function Main() {
  //код
}

потом F9.

но по своему опыту скажу, что лучше все скрипты, доработки, отчеты тестировать из клиента, а не через администратор, потому что в последнем случае не всегда срабатывает так, как надо (сталкивалась не раз).

Добрый день, Ринат!
А зачем Вы пытаетесь запустить функцию из скрипта?
Вы же работаете с отчетом, Ольга правильно говорит, визуальные формы, передаваемые атрибуты окон тестировать лучше в клиенте.

Хорошо, понял, спасибо!

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