Шаблоны RTF (СУБД MS SQL) |
Пред. Начало След. |
Шаблоны RTF применяются для вывода отчетов в программах MS WORD, LibreOffice Writer и им подобных. Описание шаблона см далее в параграфе "Структура шаблона RTF". Ознакомится с примерами RTF шаблонов можно в меню "Менеджер шаблонов", см шаблоны : sqr_8np11.rtf и rep_reestr_sogl_rtf_corr2_ecp.rtf .
Памятка по шаблонам RTF Примеры оформления вывода переменных :
суммы [dbo.xstr(s_kr,'0.00')] или [dbo.xstr(s_kr, '0 0,##')] , где s_kr - имя числовой переменной, зависит от печатаемого отчета/документа; второй аргумент - формат числа, он определяет: наличие разделителя разрядов, количество знаков в дробной части, разделитель дробной части - неполный аналог форматов ячеек MS Excel). Примеры форматов: '0' - целое число, '0.00' - число с двумя знаками после запятой, вывод дробной части в любом случае: 1234.50 выведет как "1234.50", а 1234.00 выведет как "1234.00". '#' - целое число; '#.##' - число с двумя знаками после запятой, вывод только ненулевой дробной части: 1234.50 выведет как "1234.5", а 1234.00 выведет как "1234". '0 0,##' - число, разделитель разрядов пробел, разделитель копеек запятая, после запятой два разряда, вывод ненулевой дробной части: 1234.45 выведет как "1 234,45" , а 1234.00 выведет как "1 234" . '0 0=0' - число, разделитель разрядов пробел, разделитель копеек знак "=", после запятой один разряд, вывод дробной части в любом случае: 1234.56 выведет как "1 234=5" , а 1234.00 выведет как "1 234=0" .
итоги [dbo.xstr(sum(s_kr),'0.00')]
дата [dbo.date_to_str(date_b,1,0)] , где date_b - имя переменной содержащей дату, зависит от печатаемого отчета/документа; 1 - год 4 цифры (0 - 2 цифры), 0 - месяц числом (1 - месяц словом, 2 - всю дату прописью). за [dbo.date_to_str(CONVERT(datetime, '#@dDate2#', 104), 1, 1)] - результат: за 07 марта 2019 . Здесь @dDate2 - это дата конца периода отчета.
Пример вывода только года [right(dbo.date_to_str(max(date_begin),1,0),4)] .
реквизиты [number] , [max(cdiv)] или [isnull(max(cdiv),'-')] или [max(left(cdiv,2))] , где cdiv, - имя переменной (например код БК) , зависит от печатаемого отчета/документа.
настройка #User_FIO# или [dbo.date_to_str('#dDate#',1,0)] , где User_FIO, dDate - имена переменных со значениями настроек, см описание доступных настроек.
число (целое) прописью [dbo.m_int_propis(sum(s_kr),1,0,'')] , где s_kr число (переменная), которое надо вывести прописью; 1 - род (1-мужской, 2-женский, 3-средний); 0 - склонение (0-сколько "два", 1-какой "второй", 2-какого "второго", 3-скольких "двух"); '' - единицы измерения, необязательный параметр (для рублей например: 'рубль,рубля,рублей,рублев,1') . Число ноль не прописывается - возвращается пусто. сумма (рубли) прописью [dbo.m_num_to_str(sum(s_kr), 1)] , где s_kr число (переменная), которое надо вывести прописью в рублях; 1 - учитывать падеж копеек (0 - не учитывать, всегда будет "...копеек"). Пример [dbo.m_num_to_str(28.60, 1)] - Двадцать восемь рублей 60 копеек.
Примеры формул [dbo.m_int_propis(83472358,1,0,'')] - восемьдесят три миллиона четыреста семьдест две тысячи триста пятьдесят восемь; [dbo.m_int_propis(65,2,1,'')] годовщина - шестьдесят пятая годовщина; [dbo.m_int_propis(2010,1,2,'')] года - две тысячи десятого года; [dbo.m_int_propis(222,1,1,'рубль,рубля,рублей,рублев,1')] товар - двухсот двадцати двухрублевый товар; [dbo.m_int_propis(34,1,0,'год,года,лет,летн,1')] - тридцать четыре года; [dbo.m_int_propis(34,1,1,'год,года,лет,летн,1')] - тридцати четырехлетный; [dbo.m_int_propis(11,1,0,'рубль,рубля,рублей,рублев,1')] и ещё [dbo.m_int_propis(1,2,0,'копейка,копейки,копеек,копеечн,1')] - одиннадцать рублей и ещё одна копейка. [CASE when sum(s_kr)=0 THEN 'ноль' ELSE [dbo.m_int_propis(sum(s_kr),1,0,'')] END] - обработка нуля, чтоб выводилось не пустое значение.
Примеры формул в RTF шаблоне: [dbo.xstr(sum(floor(sum_y00)), '0 0')] ([replace(replace(dbo.m_num_to_str(sum(sum_y00),0),' 00 копеек',''),' руб',') руб')] Результат: для sum_y00=123.00 : 123 (Сто двадцать три) рубля , для sum_y00=123.67 : 123 (Сто двадцать три) рубля 67 копеек .
[dbo.xstr(sum(floor(sum_y00)), '0 0')] ([replace(replace(dbo.m_num_to_str(sum(sum_y00),0),' хх копеек',''),' руб',') руб')] Результат: для sum_y00=123.00 : 123 (Сто двадцать три) рубля 00 копеек , для sum_y00=123.67 : 123 (Сто двадцать три) рубля 67 копеек .
[dbo.xstr(sum(sum_y00), '0 0,00')] рублей ([dbo.m_num_to_str(sum(sum_y00),0)]) Результат: для sum_y00=123.00 : 123,00 рублей (Сто двадцать три рубля 00 копеек) , для sum_y00=123.67 : 123,67 рублей (Сто двадцать три рубля 67 копеек).
[select dbo.xstr(sum_y00, '0 0,##') + ' (' + lower(replace(replace(dbo.m_num_to_str(sum_y00, 1), ' 00 копеек',''), ' руб', ') руб'))] Результат: для sum_ba_y00=123.00 : 123 (сто двадцать три) рубля , для sum_ba_y00=123.67 : 123,67 (сто двадцать три) рубля 67 копеек .
[select dbo.xstr(sum_y00, '0 0,##') + ' (' + lower(replace(replace(dbo.m_num_to_str(sum_y00, 1), ' хх копеек',''), ' руб', ') руб'))] Результат: для sum_ba_y00=123.00 : 123 (сто двадцать три) рубля 00 копеек , для sum_ba_y00=123.67 : 123,67 (сто двадцать три) рубля 67 копеек .
вычисление [dbo.xstr(round(sum(s_kr)*100/sum(s_br),2), '0,##')] - в данном примере вычисление % исполнения росписи (s_kr*100/s_br).
функции
Пример вывода переменной name_act в родительском падеже с заменой слова "района" на "МО": <func>ПАДЕЖ("[max(REPLACE(dbo.dq(name_act) ,'района', 'МО'))]";1)</func>
<func>ПАДЕЖ("[dbo.dq(max(name_act2))]";5)</func> [case when isnull(max(name_act3),'')='' then ' ' else ', ' end] <func>ПАДЕЖ("[dbo.dq(max(name_act3))]";5)</func>
[dbo.rtf_replace(case when isnull(dbo.GetElement(dbo.find_ecp(max(dopuk),1,'2.3.9'), '|', 1),'')='' then ' ' else ' '+char(13)+char(10) end)]
[CASE WHEN sum(summ_ba)=0 THEN '-' ELSE dbo.xstr(sum(summ_ba), '0 0,##') END]
Пример [dbo.GetElement('|'+dops, '|', 2)] - вывод второго значения из переменной dops, при этом разделителем значений является символ "|", а в переменной dops первый символ не является разделителем (поэтому "|"+ ). Для dops='1а|2б|3в|4г|5д|6е|7ё|' вернет значение 2б. Пример [dbo.GetElement(dops, '|', 3)] - тот же вывод второго значения из переменной dops, без добавления разделителя в начало текста. Для dops='1а|2б|3в|4г|5д|6е|7ё|' вернет значение 2б.
Пример : для содержимого переменной dopuk "2.5|Белый белый снег.#4.5|И на Марсе будут яблони цвести.#4.7|а синева розовая." выражение dbo.find_ecp(max(dopuk),1,'4.5') - вернет значение "#4.5|И на Марсе будут яблони цвести." , а выражение [dbo.rtf_replace(dbo.GetElement(dbo.find_ecp(max(dopuk),1,'4.5'), '|', 1))] - вернет значение "И на Марсе будут яблони цвести.".
ЭЦП
Пример вывода отдельных реквизитов ЭП: [dbo.GetElement(dbo.find_ecp(max(ecp),5,1), '|', 2)] - дата наложения ЭП 1 уровня в виде ЧЧ.ММ.ГГГГ ЧЧ:ММ:СС , например 22.11.2021 11:33:48 , где 5,1 - вывод реквизита ЭП 1 уровня; '|',2 - признак вывода даты наложения ЭП. [Left(dbo.GetElement(dbo.find_ecp(max(ecp),2,'Иванов'), '|', 2),10)] - дата наложения ЭП сертификатом, выданным Иванову, в виде ЧЧ.ММ.ГГГГ, например 22.11.2021 , где 2,"Иванов" - вывод реквизита ЭП выданной Иванову; '|',2 - признак вывода даты наложения ЭП. [Left(dbo.GetElement(dbo.find_ecp(max(ecp),10,'grbs01'), '|', 2),10)] - дата наложения ЭП подписанной определенным логином в виде ЧЧ.ММ.ГГГГ, например 22.11.2021 , где 10,"grbs01" - вывод реквизита ЭП наложенной логином grbs01 (или содержащем текст "grbs01"); '|', 2 - признак вывода даты наложения ЭП. [dbo.GetElement(dbo.find_ecp(max(ecp),5,1), '|', 0)] - должность подписанта из сертификата, например директор , где 5,1 - вывод реквизита ЭП 1 уровня; '|',0 - признак вывода должности полписанта ЭП.
Когда следует использовать max/sum , а когда просто скобки [ ] . Если данные выводятся без построчной детализации (один текст наподобие договора), то любые переменные надо выводить через функцию max() для текстовых реквизитов и sum() для денежных/суммовых значений. Например, печатается документ и для всего отчета номер документа является константой от строки не зависящей, тем не менее для вывода номера документа в заголовке отчета вместо [number] следует написать [max(number)]. Аналогично для сумм: в блоке <detail> можно написать [s_kr], а в остальных блоках только в виде [sum(s_kr)] .
Образец шаблона RTF:
<report01 srctable="#cSrcDataTable#"; add_order="fio,name"> <group01_link field="link"> Размер Субсидии, предоставляемой из бюджета области бюджету <func>ПАДЕЖ("[dbo.dq(max(oktmo2_n))]";2)</func> в соответствии с настоящим Соглашением, составляет в 2018 году [dbo.xstr(sum(summ_sub_rur), '0 0,##')] ([dbo.m_int_propis(sum(summ_sub_rur),1,0,'')]) рублей .
по кодам классификации расходов: код главного распорядителя [max(cdep)], раздел [max(left(cdiv,2))], подраздел [max(right(cdiv,2))], целевая статья [max(ctgt)], вид расходов [max(cexp)] в рамках подпрограммы ...
Исполнитель #User_FIO# . </group01_link> </report01>
Структура шаблона RTF
Блок <report_N srctable="..."; add_where="..."; add_order="..."> … </report_N>
<report srctable="#cSrcDataTable#">
Описывает источник данных, дополнителные подключаемые таблицы, условия и сортировка данных, также можно указать параметры группировки и отображения. Обязательный блок - переменные считаются только внутри этого блока, вне блока выражения вида [s_kr] воспринимаются как текст. _N – постфикс блока report, должно быть уникально (число или текст, можно не указывать, если отчет один). srctable – обязательный параметр, здесь указывается таблица-источник данных. Для универсальности можно использовать значение #cSrcDataTable# (значение имени таблицы из настроек). Источником данных может быть и выборка c алиасом, например: (select … ) t . add_from – дополнительные таблицы в предложение from … add_where – дополнительные таблицы в предложение where … add_order – дополнительные таблицы в предложение order by … field – поле для группировки данных. when – условие печати блока.
Блок <group_N_X field="..."; when="..."> …</group_N_X>
<group_cdep field="cdep"; when="sum(summa)>0">
Указываются параметры группировки и отображения, аналог блока "Шапка группы" в Excel шаблонах. Данный блок может отсутствовать в отчете. _N – постфикс блока report. Указывает на принадлежность блока группировки к конкретному блоку report. _X – должно быть уникально в пределах блока report (число или текст, можно не указывать, если группа одна). field – имя поля для группировки данных. Можно указать только одно поле. Если группировка требуется по нескольким полям, то следует создать несколько группировок подряд. when – условие печати блока.
Блок <detail_N when="...">…<detail_N>
<detail when=" summa>0">
Можно указать параметры отображения, аналог блока "Детализации" в Excel шаблонах. Данный блок может отсутствовать в отчете. _N – постфикс блока report . Указывает на принадлежность блока детализации к конкретному блоку report. when – условие печати блока .
Пример шаблона для печати документа "Плана ФХД"
Структура шаблона RTF "Отчет в отчете"
Во всех блоках отчета можно использовать вложение нового блока <report_N …> … </report_N>, содержащего свои блоки информации. Последовательные отчеты, пример:
Вложенные отчеты, пример:
В этом примере для вложенного отчета <report_2> в качестве источника данных использовалась выборка с условием where cdep=’[cdep]’ , где [cdep] – это значение ведомства из внешнего отчета <report_1>. Постфиксы (_N) вложенного отчета и его групп не должны пересекаться с постфиксами других блоков <report_N …> … </report_N>.
Использование вложенных отчетов на больших объемах (в случае, когда внутренние отчеты сильно размножаются) нецелесообразно, так как отчеты формируются начиная в самого внешнего к внутренним, последовательно, и на самом внутреннем отчете, вместо того чтобы создавать один отчет, возможно придется создавать тысячи отчетов, что обязательно скажется на быстродействии не лучшим образом. Лучше заменять вложенные отчеты на один отчет с использованием дополнительных групп, разбитию отчета на разделы и т.п.
|