Доброго времени суток!
Сталкиваюсь с 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
Для чего служит тот или иной отчет и в каких случаях какой вид отчета выбирать для разработки.
Нравится
здравствуйте, Ринат!
получить ИД записи договора в самой карточке можна так:
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.
но по своему опыту скажу, что лучше все скрипты, доработки, отчеты тестировать из клиента, а не через администратор, потому что в последнем случае не всегда срабатывает так, как надо (сталкивалась не раз).
Добрый день, Ринат!
А зачем Вы пытаетесь запустить функцию из скрипта?
Вы же работаете с отчетом, Ольга правильно говорит, визуальные формы, передаваемые атрибуты окон тестировать лучше в клиенте.