Шаблоны 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).

функции

  • **ПАДЕЖ**("[dbo.dq(max(oktmo_n))]";2)
  • ПАДЕЖ("[dbo.dq(max(oktmo_n))]";2)

Пример вывода переменной name_act в родительском падеже с заменой слова "района" на "МО":
<func>ПАДЕЖ("[max(REPLACE(dbo.dq(name_act) ,'района', 'МО'))]";1)</func>

  • [CASE WHEN name='xxx' THEN yyy ELSE zzz END] - вывод значения по условию. Например:
    • вывод запятой, если следующая за ней переменная имеет не пустое значение: ПАДЕЖ(" [dbo.dq(max(name_act2))]";5) [case when isnull(max(name_act3),'')='' then ' ' else ', ' end]ПАДЕЖ("[dbo.dq(max(name_act3))]";5)
    • вывод запятой и перенос строки, если следующая за ней переменная имеет не пустое
      значение: [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.lower_first(corr_n)] - вывода с маленькой буквы независимо какая первая,
  • [dbo.upper_first(corr_n)] - вывода с большой буквы независимо какая первая.
  • GetElement(':1:2:3:4:5:6:7:', ':', 4) - применяется для получения значения нужного элемента из строчного выражения с разделителем (типа ЭЦП и т.п.), причём разделитель должен быть в начале и конце выражения и его значение задается во втором параметре; в третьем параметре - номер требуемого элемента. В общем случае возвращает значение элемента, стоящего после разделителя с заданным номером.
    Пример [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б.
  • rtf_replace(<текст>) - преобразование текста в rtf формат для сохранения форматирования (отступы, перенос строк и т.п.). См пример ниже для функции find_ecp() .
  • find_ecp(max(dopuk),1,'4.5') - выборка блока из структурированного строчного выражения с разделителями "#" (блок) и "|" (элементы в блоке). Где 1, '4.5' - поиск блока с конкретным значением ("4.5") определенного элемента (№ 1) в блоке. Используя функцию GetElement() можно выделить нужный элемент в найденном блоке.Пример : для содержимого переменной 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.get_one_ecp(max(ecp),1)]
  • #stamp_paste: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)]. Аналогично для сумм: в блоке можно написать [s_kr], а в остальных блоках только в виде [sum(s_kr)] .

Образец шаблона RTF:

<report01 srctable="#cSrcDataTable#"; add_order="fio,name">

Размер Субсидии, предоставляемой из бюджета области бюджету ПАДЕЖ("[dbo.dq(max(oktmo2_n))]";2) в соответствии с настоящим Соглашением, составляет в 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# .

Структура шаблона RTF

otc_shablon_rtf_struct_2group

Блок <report_N srctable="..."; add_where="..."; add_order="..."> …

<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_cdep field="cdep"; when="sum(summa)>0">

Указываются параметры группировки и отображения, аналог блока "Шапка группы" в Excel шаблонах. Данный блок может отсутствовать в отчете.

_N – постфикс блока report. Указывает на принадлежность блока группировки к конкретному блоку report.

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

field – имя поля для группировки данных. Можно указать только одно поле. Если группировка требуется по нескольким полям, то следует создать несколько группировок подряд.

when – условие печати блока.

Блок

<detail when=" summa>0">

Можно указать параметры отображения, аналог блока "Детализации" в Excel шаблонах. Данный блок может отсутствовать в отчете.

_N – постфикс блока report . Указывает на принадлежность блока детализации к конкретному блоку report.

when – условие печати блока .

Пример шаблона для печати документа "Плана ФХД"

otc_shablon_rtf_pfhd

Структура шаблона RTF "Отчет в отчете"

Во всех блоках отчета можно использовать вложение нового блока <report_N …> … , содержащего свои блоки информации.

Последовательные отчеты, пример:

otc_shablon_rtf_struct_2in1p

Вложенные отчеты, пример:

otc_shablon_rtf_struct_2in1

В этом примере для вложенного отчета в качестве источника данных использовалась выборка с условием where cdep=’[cdep]’ , где [cdep] – это значение ведомства из внешнего отчета .

Постфиксы (_N) вложенного отчета и его групп не должны пересекаться с постфиксами других блоков <report_N …> … .

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