Конструктор отчетов

Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (33)

просмотр истории страницы
{toc:maxLevel=32}

h21. Описание конструктора отчетов

*Конструктор отчетов* позволяет делать запросы напрямую к БД. Описание ограничений, возможностей и синтаксиса используемого диалекта SQL Вы можете найти в документации Firebird 2.1.
\\ !report_builder_3.png|border=1!

h32. Параметры полей формы

Переменные, отображаемые в виде формы:
В отчётах можно добавить фильтры - выбор информации, например счетов и актов, только за выбранные даты или период дат, отфильтровать по абонентам и тд.

Фильтры подставляют указанные данные в тело отчёта и потом он выполняется.

Фильтры указываются примерно по такой схеме:
{code:lang=sql}':title|type[params]$'{code}
* : - указывает, что это строка с переменной
* title - заголовок, отображаемый на форме
* \| - разделитель заголовка и типа
* type\[params\] - тип с параметрами:
* $ - флаг отмечает обязательную переменную, он обязателен для всех фильтров

Ниже они описаны подробно.

h3. Выбор дат

** date *date* - дата, указывается без параметров, отображает на форме календарь выбора даты

Прмер:
{code}BILL_DATE between ':1-Начало|date$' and ':2-Конец|date$ 23:59:59'{code}
** choices - список

h3. Выбор периодов

*monthchoice* - отобразит список периодов в формате "ММ.ГГГГ месяц_прописью"

Примеры:
* 12 последних месяцев
{code}':Дата Список месяцев|monthchoice$'{code}
* 3 последних месяца
{code}':Дата Список месяцев|monthchoice|3$'{code}
* min и max по полю period_end_date модели financeoperations (можно ещё фильтры вписать, так же как для опции select)
{code}':Дата Список месяцев|monthchoice|period_end_date|select[financeoperations]$'{code}

h3. Список вариантов

*choices* - список, параметры - это элементы списка

Примеры:
{code:lang=sql}Homes.City = ':Город|choices[Москва^]Москва^[Волгоград^]Волгоград]$'
owner_id in (:Администратор|choices[33^]root^[1005^]Василий^[1007,1005^]Василий или Михаил]$)
Abonents.Id = ':Абонент|choices[35^]Михаил^[40^]Володя]$'{code}

h3. Список вариантов из сравочников биллинга

** select *select* - список, построенный на основе модели, подобно работе [API|CarbonBilling:API REST v2.0], параметры содержат модель (обязательно) и фильтры

Примеры:
{code}a.parent_id = ':Группа|select[Abonents,is_folder=1]$'
h.id = ':Заявка|select[HDSK]$'{code}
** Отсутстие параметров запросит строку:

h3. Строка для ввода произвольных данных:

Отсутстие параметров предложет ввести произвольные данные.

{code}
':Введите число$'
{code}
* $ - флаг отмечает обязательную переменную

h32. Выполнение отчёта из консоли

Для того, чтобы запустить выполнение отчета из консоли, необходимо:
У отчета есть несколько опций и пресетов для отчетов [СОРМ3|Интеграция с СОРМ3]

h43. Дополнительные опции запуска
|| Опция || Полный формат || Пример || Описание ||
| -c CHARSET | --charset=CHARSET | -c utf8 | Кодировка вывода, по-умолчанию: cp1251


h43. Пример запуска make_reports с опциями

* Выгрузить отчет #105 в формате, пригодном для [СОРМ от компании "Норси-Транс"|CarbonBilling:Интеграция с СОРМ 3 Яхонт компании НОРСИ-ТРАНС] и кодировке UTF-8:
{code}python /usr/lib/python2.7/site-packages/jobs_worker/jobs_scripts/make_reports.pyc -r 105 -s ";" -q \" -f{code}

h32. Описание полей

К большенсту полей БД существуют описания. Описание всех полей можно получить выполнив команду *sqlexeс "show comments"*, например:
COMMENT ON COLUMN TARIF.PROMISE_PAY_ONLY_THIS_MONTH IS Разрешать подключение обещанного платежа только один раз в текущий месяц;{code}

h32. Особенности SQL в Firebird


h43. UNION (UNION ALL) и ORDER BY

h6. В Firebird Order By должен быть последним оператором, сортируя всю выборку, например:
Список символов можно посмотреть в [Википедии|https://en.wikipedia.org/wiki/Whitespace_character], в примере использован символ U+2003 "em space"

h43. Особенность сортировки числовых значений
В примере выше выборка будет отсортирована как текстовая. То есть порядок чисел будет: *1,10,100,2,20,200*. Что бы отсортировать выборку как числа нужно убрать строковые константы в полях и заменить их на значение *null*. Тогда результат будет такой: *1,2,10,20,100,200*.
{code} select
{code}

h3. Полезные функции в Firebird
h2. Процедуры Carbon Soft

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

h3. Получение списка вложенных групп и абонентов в дереве групп

h4. GLN_RECURSIVE_GROUP_WALK

Принимает: GR_ID - ID группы
Возвращает: GROUP_ID - ID запрошенной группы и всех её подгрупп

h4. GLN_RECURSIVE_ABONENTS_GET

Принимает: GROUP_ID - ID группы
Возвращает: ABONENT_ID - ID абонентов в указанной группе и всех её подгруппах

h4. Примеры запросов

{code}SELECT group_id FROM GLN_RECURSIVE_GROUP_WALK(1)
SELECT abonent_id FROM GLN_RECURSIVE_ABONENTS_GET(1){code}

h2. Полезные функции в Firebird

h4. iif
Функция *iif* аналогична опратору сравнения if then else.
Удалённые абонеты будут выведены с пометкой *Удалён*, дейсвующие без отметки.

h3. Получение списка вложенных групп и абонентов в дереве групп
h2. Примеры отчётов


h4. GLN_RECURSIVE_GROUP_WALK

Принимает: GR_ID - ID группы
Возвращает: GROUP_ID - ID запрошенной группы и всех её подгрупп

h4. GLN_RECURSIVE_ABONENTS_GET

Принимает: GROUP_ID - ID группы
Возвращает: ABONENT_ID - ID абонентов в указанной группе и всех её подгруппах

h4. Примеры запросов

{code}SELECT group_id FROM GLN_RECURSIVE_GROUP_WALK(1)
SELECT abonent_id FROM GLN_RECURSIVE_ABONENTS_GET(1){code}

h2. Примеры

# h5. Список абонентов, подключенных к NAS с ip 172.16.0.6 в формате id, фио, номер телефона
{code}
1
{code}
# h5. Отчёт по абонентам заключивших договор за период
Отчёт покажет абонентов заключивших договор в выбранном периоде, в воде будут номер договора, ФИО, дата договора, текущий тариф и текущий баланс.
{code}
select
a.contract_number "Номер договора",
a.name "Название/ФИО",
cast(a.create_date as date) "Дата договора",
t.name "Тариф",
round((AA.OSTATOK + AA.DEBIT - AA.CREDIT) / cast((select CONST_VALUE
from VPN_CONST
where CONST_ID = 1) as numeric(18,5)), 2) "Текущий баланс"
from
abonents a
join
tarif t
on a.tarif_id=t.id
join
admin_accounts aa
on a.account_id=aa.id
where
extract(month from a.CREATE_DATE)=extract(month from cast(':Дата в виде месяца|monthchoice|create_date|select[abonents,id__gt=1000,deleted=0,parent_id__gt=1000,is_folder=0]$' as date))
and extract(year from a.CREATE_DATE)=extract(year from cast(':Дата в виде месяца|monthchoice|create_date|select[abonents,id__gt=1000,deleted=0,parent_id__gt=1000,is_folder=0]$' as date))
and a.id>=1000
and a.deleted=0
and a.parent_id>=1000
and a.is_folder=0
{code}
# h5. Отчёт по начислениям по видам услуг за выбранный период
Отчёт покажет начисления по видам услуг за выбранный период
В case можно добавить собственную логику постороения отчёта в зависимости от натсроек услуг; в примере ниже:
* услуги с типом стандартный будут посчитаны как "разовые" или "прочие" в зависимости от типа списания
* все услути касающиеся интернет-трафика (форсаж, пакет МБ и тд) будут отражены просто как "трафик"
{code}
select
c.year_number*100+c.month_number "Период",
case
when ut.id=0 and u.usluga_abon_type_id=1 then 'Разовые услуги' --'Стандартный'
when ut.id=0 and u.usluga_abon_type_id<>1 then 'Прочие услуги' --'Стандартный'
when ut.id=1 then 'Интернет' --'Турбокнопка'
when ut.id=3 then 'Интернет' --'Бонусный трафик'
when ut.id=4 then 'Интернет' --'Форсаж'
when ut.id=2 then 'Прочие услуги' --'Подписка'
when ut.id=6 then 'Интернет' --'Пакет МБ'
when ut.id=5 then 'IP телефония'
when ut.id=7 then 'IP телевидение'
when ut.id=8 then 'Абонентская плата'
when ut.id=9 then 'Интернет' --'Трафик'
when ut.id=10 then 'Скидка\Наценка'
when ut.id=11 then 'Обещанный платеж'
when ut.id=12 then 'Пакет услуг'
when ut.id=13 then 'Системные услуги'
when ut.id=14 then 'Прочие услуги' --'Счетчик'
end "Тип услуг",
round(sum(c.summ),2) "Сумма"
from
counters c
join
usluga u
on c.usluga_id=u.id
join
usluga_type ut
on u.system_type=ut.id
where
c.summ<>0
and cast(c.year_number || '-' || c.month_number || '-01' as date)
between cast(':1-С периода|monthchoice|6$' as date)
and cast(':2-По период|monthchoice|bill_date|select[ArchAccountStack,storno=0]$' as date)
group by
1,2
order by
:3-Сортировать по|choices[1,2^]Месяцу^[2,1^]Типу услуг]$
{code}
h2. Решение проблем