pageInfo=#pageInfo# id="#d.contract_id#" status=#pageInfo.status# trackOut="tr" idAttributesOut="id" /> select a.login as creator, a.shortname as creator_shortname, m.login as updater, m.shortname as updater_shortname from contract g left outer join usr a on (g.creator_id=a.usr_id) left outer join usr m on (g.updater_id=m.usr_id) where g.contract_id= Договор #d.contract# [#d.contract_id#]
ID
#d.contract_id#
Номер договора
Дата договора
Контрагент
select c.contragent_id, c.contragent from contragent c order by 2
Создано
#dateFormat(d.dt_created,'YYYY-MM-DD')# #timeFormat(d.dt_created,'HH:MM')# #qDecoration.creator# (#qDecoration.creator_shortname#)       Изменено #dateFormat(d.dt_updated,'YYYY-MM-DD')# #timeFormat(d.dt_updated,'HH:MM')# #qDecoration.updater# (#qDecoration.updater_shortname#)
select s.specification_id ,s.specification ,(select count(*) from specification_item i where i.specification_id=s.specification_id) as item_cnt /*,(select count(*) from specification_version v where v.specification_id=s.specification_id) as version_cnt*/ from specification s where s.contract_id= order by 1

Спецификации (#qSpecification.recordCount#)

Как правило, в договоре 1 спецификация, а ее версии определяются дополнительными соглашениями
Номер спецификации Строк
#specification# #item_cnt#
select a.contract_id ,a.agreement_version ,a.agreement ,a.dt_agreement ,a.is_actual from agreement a where a.contract_id= order by 1

Соглашения (#qAgreement.recordCount#)

Соглашение - это пакет изменений спецификации. Базовое соглашение соответствует исходной спецификации договора (переход от несуществующей спецификации). Остальные - дополнительным соглашениям. Создание базового соглашения надо автоматизировать, но пока вручную.
Номер соглашения (версия) Название Дата Действует
#agreement_version# #agreement# #dateFormat(dt_agreement,'DD.MM.YYYY')#
любопытное последствие использования составного ключа: отпадает желание делать для сущности самостоятельный реестр (может быть, только если есть явная сущность-владелец, как договор для соглашения). Это аналогично отразится на структуре ReST API URL, если вдруг