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

 

функции

<func>ПАДЕЖ("[dbo.dq(max(oktmo_n))]";2)</func> , где число от 1 до 6 задает падеж слова/предложения, указанного в переменной oktmo_n (в данном примере - наименования территории). См так же "Справочник склонений".

 

odbo.dq(...) - применяется для обработки переменных, в которых может содержаться символ двойной кавычки <">, иначе функция ПАДЕЖ() сработает некорректно и испортит полученный отчет.

 

Пример вывода переменной name_act в родительском падеже с заменой слова "района" на "МО":

<func>ПАДЕЖ("[max(REPLACE(dbo.dq(name_act) ,'района', 'МО'))]";1)</func>  

 

 

[CASE WHEN name='xxx' THEN yyy ELSE zzz END] - вывод значения по условию. Например:
oвывод запятой, если следующая за ней переменная имеет не пустое значение:

<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>

 

oвывод запятой и перенос строки, если следующая за ней переменная имеет не пустое значение:

[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)]

 

oвывод тире вместо нулевых сумм:

[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ё|' вернет значение .

Пример [dbo.GetElement(dops, '|', 3)] - тот же вывод второго значения из переменной dops, без добавления разделителя в начало текста. Для dops='1а|2б|3в|4г|5д|6е|7ё|' вернет значение .

 

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))] - вернет значение "И на Марсе будут яблони цвести.".

 

ЭЦП

<ep>[dbo.get_one_ecp(max(ecp),1)]</ep> - штамп ЭП 1 уровня.
<ep>#stamp_paste:5;1</ep> - обозначение места (позиции) для вывода штампа ЭП 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

 

otc_shablon_rtf_struct_2group

 

 

Блок <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 – условие печати блока .

 

 

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

 

otc_shablon_rtf_pfhd

 

 

 

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

 

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

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

otc_shablon_rtf_struct_2in1p

 

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

otc_shablon_rtf_struct_2in1

 

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

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

 

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