Дерево страниц

Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
toc
Статусstatus
Свойства страницыinfo
icon
false
colourYellow
title
В работе
Автор
Комментарий
панель

На этой странице:

Постановка задачи

Разработать представление для отображения документов, в котором будет присутствовать фильтрация, сортировка по колонкам.

Image Removed
Подсказка
iconfalse

Инструмент

: Палитра XML

Реализация
Свойства страницы

Создание основы

В основу входит:

  1. Написание SQL-запроса (Кастомная коллекция)
  2. Описание метаданных (Кастомная коллекция)
  3. Связь колонок с данными SQL-запроса (Дескриптор)
  4. Связь навигационной панели на полученную таблицу (Представление)

Кастомная коллекция

Кастомная коллекция представляет собой набор 2-х файлов:

Блок кода
languagexml
titleв одном из которых описывается SQL-запрос, кол-во возвращаемых записей, фильтрация
<collection name="SO_(vw_cmj_all_deps)" idField="id"> <prototype> <![CDATA[
Статус

Статус
colourGreen
titleГОТОВО

РазделПредставления
Комментарий

панель
titleРеализация

Оглавление

панель
titleРезультат

Image Added

Image Added

Image Added



Создание представления

SQL-запрос

Примечание

Список обязательных колонок, если по записи нужно потом получить объект (документ, заявку, справочник и т.д.): id, created_date, updated_date, Module, self_1, self_2, self_3.

Получение данных:

  1. Системные поля прописаны в таблицах и их можно найти в разделе 4.1. Схема данных AF5/CM6.
  2. Настраиваемые поля хранятся в таблицах tn_field и tn_field_<тип данных> (string, date, datetime, decimal и т.д.)

    Блок кода
    languagesql
    titleЗапрос на получение значения из настаиваемого поля status
    linenumberstrue
    collapsetrue
    select tfs."value" as v
            from 
SELECT
  1. tn_field
            join 
  1. tn_field_string tfs 
s.id, s.created_date,
  1. on tn_field.access_object_id = tfs.id
            where tn_field."owner" 
ss_module_org.Module,
  1. = rkkbase.id
            and tn_field.owner_type = 
s
  1. rkkbase.
self
  1. id_
1,
  1. type
            
s.self_2, s.self_3, s.orgsystem_id, s.fullName, s.gorf, cast (s.departmenttype as int) as deptype FROM ( SELECT so_department.id, so_unit.created_date,
  1. and tn_field.cmjfield = 'status') as statusWPRequest
  2. Поля из комплексного справочника хранятся в таблицах classifier_compleх, clscom_tag, cls_typeComp

    Блок кода
    languagesql
    titleЗапрос на получение значения из поля valueCountry комплексного справочника Офис (схема ComplectClassifierOffice)
    linenumberstrue
    collapsetrue
    SELECT title FROM classifier_complex WHERE classifier_complex.id = (
    					SELECT
    						complex1.id
    						FROM
    							clscom_tag tag1
    					left join clscom_to_tag to_tag1 on to_tag1.tag = tag1.id
    					left join classifier_complex complex1 on complex1.id = to_tag1.classifier
    					left join cls_typeComp typecom1 on typecom1.id = complex1.owner
    							WHERE (
    								tag1.schema = 'ComplectClassifierOffice' and typecom1.alias = 'valueCountry' and tag1.id = tag.id
    								))
    								) as OfficeCountry

Кастомная коллекция

Кастомная коллекция представляет собой набор 2-х файлов:

Блок кода
languagexml
titleXML коллекции. Описывается SQL-запрос, кол-во возвращаемых записей, фильтрация, поиск
linenumberstrue
collapsetrue
<collection name="WorkplaceRequests_(vw_cmj_all)" idField="id" replace="runtime">
    <prototype>
        <![CDATA[
       '<id>' as self_1,
        SELECT
       ':' as self_2,
               '</>' as self_3id,
               so_department.HierRoot  as orgsystemcreated_iddate,
               fullName   updated_date,
                getisolated(so_department.id) as gorfModule,
               CASE
   self_1,
               WHEN so_department.departmenttype = 'ГО: ГОЛОВНОЙ ОФИС' then '0' self_2,
                  WHEN so_department.departmenttype = 'РФ: РЕГИОНАЛЬНЫЙ ФИЛИАЛ' then '1'
self_3,
                  typeRequest,
				  statusWPRequest,
				  stage,
  WHEN so_department.departmenttype = 'Р: РУКОВОДСТВО' then '2'
          regNumber,
        WHEN so_department.departmenttype = 'Д: ДЕПАРТАМЕНТ' then '3'
    rNumber,
              WHEN so_department.departmenttype = 'ЕСЦ: ЕСЦ' then '4'
   numberWOTags,
				  wpInitiator,
				  term,
                WHEN so_department.departmenttype = 'У: УПРАВЛЕНИЕ' then '5'
 finishtime,
                  wpEmployee,
      WHEN so_department.departmenttype = 'С: СЛУЖБА' then '6'
      wpEmpDepartment,
            WHEN so_department.departmenttype = 'О: ОТДЕЛ' then '7'wpEmpHierDepatment,
                  WHEN so_department.departmenttype = 'Г: ГРУППА' then '8'
wpEmpGoingToWork,
                  wpMovingDate,
      WHEN so_department.departmenttype = 'ДО: ДОПОЛНИТЕЛЬНЫЙ ОФИС' then '9'
     wpInitBranch,
             WHEN so_department.departmenttype = 'ОО: ОПЕРАЦИОННЫЙ ОФИС' then '10'
 wpOffice,
                  wpTypeOffice,
    WHEN so_department.departmenttype = 'КО: КРЕДИТНЫЙ ОФИС' then '11'
       wpInitOrganization,
           WHEN so_department.departmenttype = 'ОКВКУ: ОПЕРАЦИОННАЯ КАССА ВНЕ КАССОВОГОwpInitiatorDepartment,
 УЗЛА' then '12'
               wpLocality,
   ELSE '13'
              wpCountry,
 END    as departmenttype
            FROMwpArea,
                 SO_Department so_department
 wpFloor,
                natural join so_unitwpRoomNumber,
               natural  join so_structureunitwpCode
               inner join so_beard beard on beard.id = so_structureunit.beard and beard.id_type = so_structureunit.beard_type
FROM (
                     WHERE
  select
	rkkbase.id,
    rkkbase.created_date,
    rkkbase.updated_date,
     so_department.accessRedirect is null
rkkbase.module           ) s
         ::from-clause
         WHERE
     AS Module,
    '<id>'  1 = 1
            ::where-clause          
           ]]>
   </prototype>
   <filter name="MODULE">AS self_1,
    ':'  <reference placeholder="from-clause">
         <![CDATA[
                   join SS_ModuleOrg ss_module_org on ss_module_org.Organization = orgsystem_id
         AS self_2,
     ]]>
'</>'      </reference>
      <criteria placeholder="where-clause">
         <![CDATA[
                   ss_module_org.Module = {0}
 AS self_3,
    rkkbase."type"         ]]>
      </criteria>
   </filter>
   <filter name="fullName_partial">
      <criteria placeholder="where-clause">
         <![CDATA[AS typeRequest,
    (select tfs."value" as v
        lower(s.fullName) like ('%' || lower({0}) || '%')from tn_field
        join tn_field_string tfs      ]]>
on tn_field.access_object_id = tfs.id
        </criteria>
   </filter>where tn_field."owner" = rkkbase.id
   <filter name="gorf_partial">
    and  <criteria placeholder="where-clause">tn_field.owner_type = rkkbase.id_type
         <![CDATA[
    and tn_field.cmjfield = 'status') as statusWPRequest,
    (select tfs."value" as v
    lower(s.gorf) like ('%' || lower({0}) || '%') from tn_field
        join tn_field_string tfs on tn_field.access_object_id = tfs.id
  ]]>
      </criteria>
   </filter>where tn_field."owner" = rkkbase.id
   <filter name="CQSEARCH">
    and  <criteria placeholder="where-clause">tn_field.owner_type = rkkbase.id_type
         <![CDATA[
                    lower(s.fullName) like ('%' || lower({0})and tn_field.cmjfield = 'stage') as stage,
   '<regNumberPrefix>' || coalesce(rkk.prjnumprist, '') || '</>' || '<regNumberCounter#Number>' || coalesce(cast(rkk.prjnumcounter as varchar), '') || '</>' || '%<regNumberSuffix>')
 || coalesce(rkk.prjnumfin , '') || '</>' as regNumber,
   rkk.prjnumcounter as rNumber,
   coalesce(rkk.prjnumprist,  ]]>
      </criteria>
   </filter>
</collection>
Блок кода
languagexml
titleв другом описывается сортировка по умолчанию, категоризация, специфичные колонки
linenumberstrue
collapsetrue
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" default-lazy-init="true">
   <bean id="SO_(vw_cmj_all_deps)Metadata" class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.CollectionMetadataNew" p:searchArea="so_departments_search_uicoll">
      <constructor-arg>'') || coalesce(cast(rkk.prjnumcounter as VARCHAR), '') || coalesce(rkk.prjnumfin, '') as numberWOTags,
	(select
		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
    	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
    	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
        from tn_field
        join tn_field_string tfs on tn_field.access_object_id = tfs.id
        where tn_field."owner" = rkkbase.id
         <list value-type="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field">and tn_field.owner_type = rkkbase.id_type
        and  tn_field.cmjfield  <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="self">= 'wpInitiator') as wpInitiator,
	(select tfs."value" as v
        from tn_field
        join tn_field_datetime tfs  <property name="virtualField">on tn_field.access_object_id = tfs.id
        where tn_field."owner" = rkkbase.id
       <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.BuildVirtualField"> and tn_field.owner_type = rkkbase.id_type
        and tn_field.cmjfield = 'plannedfinishtime') as term,
	(select tfs."value"       <property name="realFields">as v
        from tn_field
        join tn_field_datetime tfs on tn_field.access_object_id =  <list>tfs.id
             where tn_field."owner" = rkkbase.id
        and tn_field.owner_type = rkkbase.id_type
    <value>self_1</value>
    and tn_field.cmjfield = 'finishtime') as finishtime,
	(select tfs."value" as v
        from tn_field
      <value>Module</value>
  join tn_field_beard tfs on tn_field.access_object_id = tfs.id
        where tn_field."owner" = rkkbase.id
        <value>self_2</value>
  and tn_field.owner_type = rkkbase.id_type
        and tn_field.cmjfield = 'assignee') as assignee,
	(select
		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
    	|| ':'  <value>ID</value>
     || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
    	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) ||       '</>', '<id></><shortName></>') as v
    <value>created_date</value>
    from tn_field
        join tn_field_string tfs on tn_field.access_object_id = tfs.id
        where <value>self_3</value>tn_field."owner" = rkkbase.id
         and tn_field.owner_type = rkkbase.id_type
        and tn_field.cmjfield = 'wpEmployee') as </list>wpEmployee,
    (select date(tfs."value") as v
        from tn_field
     </property>
   join tn_field_dateonly tfs on tn_field.access_object_id = tfs.id
            <property name="pattern" value="<id>([0-9]{16}):([0-9A-F]{32})</>" />where tn_field."owner" = rkkbase.id
        and tn_field.owner_type = rkkbase.id_type
        and tn_field.cmjfield <property name="separator" value="" />= 'wpEmpGoingToWork') as wpEmpGoingToWork,
    (select date(tfs."value") as v
        from tn_field
        join tn_field_dateonly tfs  <property name="emptySeparator" value="true" />on tn_field.access_object_id = tfs.id
        where tn_field."owner" = rkkbase.id
       </bean>
 and tn_field.owner_type = rkkbase.id_type
        and tn_field.cmjfield  </property>
            </bean>= 'wpMovingDate') as wpMovingDate,
	(select
		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
    	|| ':'       <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="beard">|| substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
    	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
 <property name="virtualField">
      from tn_field
        join tn_field_string tfs <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.BeardVirtualField">on tn_field.access_object_id = tfs.id
        where tn_field."owner" = rkkbase.id
        and  <property name="realFields">
 tn_field.owner_type = rkkbase.id_type
        and tn_field.cmjfield = 'wpEmpDepartment') as wpEmpDepartment,
    (select
		tfs."value"  as    <list>v
        from tn_field
        join tn_field_string tfs on tn_field.access_object_id = tfs.id
    <value>Module</value>
    where tn_field."owner" = rkkbase.id
        and tn_field.owner_type = rkkbase.id_type
        and <value>self_2</value>
                           <value>ID</value>
               tn_field.cmjfield = 'wpEmpHierDepatment') as wpEmpHierDepatment,
	(select
		coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)')
    	|| ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>'
    	|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v
        from    <value>created_date</value>tn_field
        join  tn_field_string tfs on tn_field.access_object_id = tfs.id
         </list>
  where tn_field."owner" = rkkbase.id
        and tn_field.owner_type = rkkbase.id_type
        </property>
        and tn_field.cmjfield = 'wpInitBranch') as wpInitBranch,
	(select tfs."value" as v
          </bean>from tn_field
        join tn_field_string tfs     </property>on tn_field.access_object_id = tfs.id
        where tn_field."owner"   </bean>= rkkbase.id
            <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="depType" p:sortOrder="ASCENDING" />and tn_field.owner_type = rkkbase.id_type
        and tn_field.cmjfield = 'wpOffice') <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="fullName" p:filter="fullName" p:sortOrder="ASCENDING" />as wpOffice,
	(select tfs."value" as v
         </list>
from tn_field
       </constructor-arg>
 join  </bean>
</beans>
Раскрыть
titleв другом описывается сортировка по умолчанию, категоризация, специфичные колонки
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
tn_field_string tfs on tn_field.access_object_id = tfs.id xmlns:p="http://www.springframework.org/schema/p"
where tn_field."owner" = rkkbase.id xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
and tn_field.owner_type = xsi:schemaLocation="http://www.springframework.org/schema/beans
rkkbase.id_type http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"
default-lazy-init="true">

<bean id="SO_(vw_cmj_all_deps)Metadata"
class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.CollectionMetadataNew" p:searchArea="so_departments_search_uicoll">
<constructor-arg>
and tn_field.cmjfield = 'wpTypeOffice') as wpTypeOffice, (select coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)') || ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>' || substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v from tn_field <list value-type="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field">
join tn_field_string tfs on tn_field.access_object_id = tfs.id <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="self">
where tn_field."owner" = rkkbase.id and tn_field.owner_type = rkkbase.id_type and <propertytn_field.cmjfield name="virtualField">
<bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.BuildVirtualField">
= 'wpInitOrganization') as wpInitOrganization, (select coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)') || ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>' || substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v from tn_field <property name="realFields">
join tn_field_string tfs on tn_field.access_object_id = tfs.id where tn_field."owner" = rkkbase.id and <list>
tn_field.owner_type = rkkbase.id_type and tn_field.cmjfield = 'wpInitDepartment') as wpInitiatorDepartment, (select tfs."value" as v from tn_field join <value>self_1</value>
tn_field_string tfs on tn_field.access_object_id = tfs.id where tn_field."owner" = rkkbase.id and tn_field.owner_type = rkkbase.id_type <value>Module</value>
and tn_field.cmjfield = 'wpLocality') as wpLocality, (select tfs."value" as v from tn_field join tn_field_string tfs <value>self_2</value>
on tn_field.access_object_id = tfs.id where tn_field."owner" = rkkbase.id and tn_field.owner_type = rkkbase.id_type and tn_field.cmjfield = <value>ID</value>
'wpCountry') as wpCountry, (select coalesce('<id>' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'%(.*)') || ':' || substring(substring(substring(substring(tfs."value", '%(.*)'), '%(.*)'), '%(.*)'),'(.*)%') || '</><shortName>' <value>created_date</value>
|| substr(tfs."value", 1, strpos(tfs."value", '%') - 1) || '</>', '<id></><shortName></>') as v from tn_field join tn_field_string tfs on tn_field.access_object_id = tfs.id where <value>self_3</value>
tn_field."owner" = rkkbase.id and tn_field.owner_type = rkkbase.id_type and tn_field.cmjfield = 'wpArea') as wpArea, (select tfs."value" as v </list>
from tn_field join tn_field_string tfs on tn_field.access_object_id = tfs.id where tn_field."owner" </property>
= rkkbase.id and tn_field.owner_type = rkkbase.id_type and tn_field.cmjfield <property name="pattern" value="&lt;id&gt;([0-9]{16}):([0-9A-F]{32})&lt;/&gt;" />
= 'wpFloor') as wpFloor, (select tfs."value" as v from tn_field join tn_field_string tfs on tn_field.access_object_id = tfs.id <property name="separator" value=""/>
where tn_field."owner" = rkkbase.id and tn_field.owner_type = rkkbase.id_type and tn_field.cmjfield = 'wpRoomNumber') as <property name="emptySeparator" value="true"/>
wpRoomNumber, (select tfs."value" as v from tn_field join tn_field_string tfs </bean>
on tn_field.access_object_id = tfs.id where tn_field."owner" = rkkbase.id </property>
and tn_field.owner_type = rkkbase.id_type and tn_field.cmjfield = 'wpRMCode') as wpCode FROM </bean>F_DP_Intrkk internalrkk
<bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="beard">
JOIN f_dp_rkk rkk ON rkk.id = internalrkk.id <property name="virtualField">
JOIN f_dp_rkkbase rkkbase ON rkkbase.id = rkk.id <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.BeardVirtualField">
JOIN F_DP_Intrkk_Executor executor ON executor.owner = internalrkk.id <property name="realFields">
JOIN so_beard beard ON beard.id = executor.executor WHERE rkkbase.isdeleted <> <list>1 AND rkk.regnumcnt IS NULL ) s WHERE stage
NOT IN ('Перемещена в архив') AND 1 = 1 <value>Module</value>
::where-clause <value>self_2</value>
]]> <value>ID</value>
prototype> <counting-prototype> <![CDATA[ <value>created_date</value> SELECT COUNT(1) FROM ( SELECT rkkbase.id FROM F_DP_Intrkk internalrkk JOIN f_dp_rkk rkk ON rkk.id = internalrkk.id
JOIN f_dp_rkkbase rkkbase ON rkkbase.id = rkk.id </list>
JOIN F_DP_Intrkk_Executor executor ON executor.owner = internalrkk.id </property>
JOIN so_beard beard ON beard.id </bean>
</property>
= executor.executor WHERE rkkbase.isdeleted <> 1 AND rkk.regnumcnt IS NULL ) s WHERE stage NOT IN ('Перемещена в архив') </bean>
AND 1 = 1 <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="depType" p:sortOrder="ASCENDING" />
:where-clause ]]> <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="fullName" p:filter="fullName" p:sortOrder="ASCENDING" />
</counting-prototype> <filter name="MODULE"> <criteria placeholder="where-clause"> </list>
![CDATA[ </constructor-arg>
Module </bean>
</beans>
Примечание

Названия корневого bean должно строиться из названия collection и префикса Metadata. Пример: SO_(vw_cmj_all_deps)Metadata

Дескриптор

Действия
= {0}
                ]]>
        </criteria>
    </filter>
    <filter name="self">
        <criteria placeholder="where-clause"><![CDATA[ Module = {0} and id = {1} ]]></criteria>
    </filter>
    <filter name="created_date">
        <criteria placeholder="where-clause">
            <![CDATA[
                   cast(created_date as date) = cast({0} as date)
                ]]>
        </criteria>
    </filter>
    <filter name="rNumber">
        <criteria placeholder="where-clause"><![CDATA[ rNumber = {0} ]]></criteria>
    </filter>
    <filter name="rNumber_partial">
        <criteria placeholder="where-clause"><![CDATA[ rNumber iLIKE ('%'||{0}||'%') ]]></criteria>
    </filter>
    <filter name="rNumber_L">
        <criteria placeholder="where-clause"><![CDATA[ rNumber < {0} ]]></criteria>
    </filter>
    <filter name="rNumber_GE">
        <criteria placeholder="where-clause"><![CDATA[ rNumber >= {0} ]]></criteria>
    </filter>
    <filter name="rNumber_Partial">
        <criteria placeholder="where-clause"><![CDATA[ rNumber LIKE {0} ]]></criteria>
    </filter>
    <filter name="regNumber">
        <criteria placeholder="where-clause"><![CDATA[ regNumber = {0} ]]></criteria>
    </filter>
    <filter name="regNumber_partial">
        <criteria placeholder="where-clause"><![CDATA[ numberWOTags iLIKE ('%'||{0}||'%') ]]></criteria>
    </filter>
    <filter name="typeRequest">
        <criteria placeholder="where-clause">
            <![CDATA[
                    typeRequest = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="typeRequest_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                typeRequest ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpInitiator">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpInitiator = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpInitiator_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpInitiator ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="stage">
        <criteria placeholder="where-clause">
            <![CDATA[
                    stage = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="stage_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                stage ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="statusWPRequest">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpStatus = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="statusWPRequest_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                statusWPRequest ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="term_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                  cast(term as date) = cast({0} as date)
            ]]>
        </criteria>
    </filter>
    <filter name="finishtime_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                 cast(finishtime as date) = cast({0} as date)
            ]]>
        </criteria>
    </filter>
    <filter name="wpEmpGoingToWork_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                  cast(wpEmpGoingToWork as date) = cast({0} as date)
            ]]>
        </criteria>
    </filter>
    <filter name="wpMovingDate">
        <criteria placeholder="where-clause">
            <![CDATA[
                    (wpMovingDate >= ({0})::timestamp and
					 wpMovingDate < (({0})::timestamp + interval '1 day'))
                ]]>
        </criteria>
    </filter>
    <filter name="assignee">
        <criteria placeholder="where-clause">
            <![CDATA[
                    assignee = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="assignee_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                assignee ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpEmployee">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpEmployee = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpEmployee_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpEmployee ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpEmpDepartment">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpEmpDepartment = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpEmpDepartment_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpEmpDepartment ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpInitBranch">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpInitBranch = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpInitBranch_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpInitBranch ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpInitiatorDepartment">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpInitiatorDepartment = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpInitiatorDepartment_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpInitiatorDepartment ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpLocality">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpLocality = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpLocality_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpLocality ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpCountry">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpCountry = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpCountry_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpCountry ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpArea">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpArea = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpArea_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpArea ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="wpFloor">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpFloor = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpRoomNumber">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpRoomNumber = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpCode">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpCode = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpEmpHierDepatment">
        <criteria placeholder="where-clause">
            <![CDATA[
                    wpEmpHierDepatment = {0}
                ]]>
        </criteria>
    </filter>
    <filter name="wpEmpHierDepatment_partial">
        <criteria placeholder="where-clause">
            <![CDATA[
                wpEmpHierDepatment ilike '%'||{0}||'%'
            ]]>
        </criteria>
    </filter>
    <filter name="BeforeDate">
        <criteria placeholder="where-clause">
            <![CDATA[
                updated_date < {0}
            ]]>
        </criteria>
    </filter>
</collection> 
Блок кода
languagexml
titleXML метаданных коллекции. Описывается сортировка по умолчанию, категоризация, специфичные колонки
linenumberstrue
collapsetrue
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" default-lazy-init="true">

	<bean id="WorkplaceRequests_(vw_cmj_all)Metadata"
          class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.CollectionMetadataNew" p:caseSensitiveFieldNames="true">
          <constructor-arg>
            <list value-type="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field">
                <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="self">
                    <property name="virtualField">
                        <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.BuildVirtualField">
                             <property name="realFields">
                                 <list>
                                    <value>self_1</value>
                                	<value>Module</value>
                                    <value>self_2</value>
                                    <value>ID</value>
                                    <value>created_date</value>
                                    <value>self_3</value>
                                  </list>
                             </property>
							 <property name="pattern" value="<id>([0-9]{16}):([0-9A-F]{32})</>" />
                             <property name="separator" value=""/>
                             <property name="emptySeparator" value="true"/>
	                    </bean>
                    </property>
                </bean>         
            </list>
        </constructor-arg>        
    </bean>
</beans>
Примечание

Названия корневого bean должно строиться из названия collection и префикса Metadata. Пример: WorkplaceRequests_(vw_cmj_all)Metadata


Тип элемента коллекции

Описывает тип колонки и её название

Идентификатор колонки должен совпадать с названием колонки, возвращаемой в SQL-запросе кастомной коллекции.

Блок кода
languagexml
titleПример. Типов элемента
linenumberstrue
collapsetrue
<?xml version='1.0' encoding='UTF-8'?>
<catalog xmlns="http://www.intertrust.ru/schema/palette/cat-ui">
  <column name="finishtime" subject="${catalog.column.finishtime.subject:Дата исполнения}" extends="datetime">
    <meta>
      <documentation>Фактический срок исполнения</documentation>
    </meta>
  </column>
  <column name="NumberWPRequest" subject="${catalog.column.NumberWPRequest.subject:Номер}" extends="string">
    <meta>
      <documentation>Номер</documentation>
    </meta>
  </column>
  <column name="NumberWPRequestOneline" subject="${catalog.column.NumberWPRequestOneline.subject:Номер заявки}" extends="string">
    <meta>
      <documentation>Номер заявки</documentation>
    </meta>
  </column>
  <column name="statusWPRequest" subject="${catalog.column.statusWPRequest.subject:Статус документа}" extends="string">
    <meta>
      <documentation>Статус</documentation>
    </meta>
  </column>
  <column name="term" subject="${catalog.column.term.subject:Срок исполнения по регламенту}" extends="datetime">
    <meta>
      <documentation>Срок исполнения по регламенту</documentation>
    </meta>
  </column>
  <complex-column name="wpEmpDepartment" subject="${catalog.column.wpEmpDepartment.subject:СП Работника по заявке}" extends="vcard">
    <meta>
      <documentation>СП Работника по заявке</documentation>
    </meta>
    <column-ref ref="shortName"/>
    <column-ref ref="id"/>
    <column-ref ref="hint"/>
  </complex-column>
  <complex-column name="wpEmployee" subject="${catalog.column.wpEmployee.subject:Работник по заявке}" extends="vcard">
    <meta>
      <documentation>Работник по заявке</documentation>
    </meta>
    <column-ref ref="shortName"/>
    <column-ref ref="id"/>
    <column-ref ref="hint"/>
  </complex-column>
  <complex-column name="wpInitBranch" subject="${catalog.column.wpInitBranch.subject:Филиал/ ГО}" extends="vcard">
    <meta>
      <documentation>Филиал/ ГО</documentation>
    </meta>
    <column-ref ref="shortName"/>
    <column-ref ref="id"/>
    <column-ref ref="hint"/>
  </complex-column>
  <complex-column name="wpInitiatorDepartment" subject="${catalog.column.wpInitiatorDepartment.subject:СП инициатора}" extends="vcard">
    <meta>
      <documentation>СП инициатора</documentation>
    </meta>
    <column-ref ref="shortName"/>
    <column-ref ref="id"/>
    <column-ref ref="hint"/>
  </complex-column>
  <complex-column name="wpInitOrganization" subject="${wp.Organization:Организация}" extends="vcard">
    <meta>
      <documentation>Организация</documentation>
    </meta>
    <column-ref ref="shortName"/>
    <column-ref ref="id"/>
    <column-ref ref="hint"/>
  </complex-column>
  <complex-column name="wpArea" subject="${wp.Area:Зона СП}" extends="vcard">
    <meta>
      <documentation>Зона СП</documentation>
    </meta>
    <column-ref ref="shortName"/>
    <column-ref ref="id"/>
    <column-ref ref="hint"/>
  </complex-column>
  <complex-column name="wpInitiator" subject="${wp.Inititator:Инициатор}" extends="vcard">
    <meta>
      <documentation>Инициатор</documentation>
    </meta>
    <column-ref ref="shortName"/>
    <column-ref ref="id"/>
    <column-ref ref="hint"/>
  </complex-column>
  <column name="wpOffice" subject="${wp.Office:Офис}" extends="string"/>
  <column name="wpTypeOffice" subject="${wp.TypeOffice:Тип офиса}" extends="string"/>
  <column name="wpLocality" subject="${wp.Locality:Город}" extends="string"/>
  <column name="wpCountry" subject="${wp.Country:Страна}" extends="string"/>
  <column name="wpFloor" subject="${wp.Floor:Этаж}" extends="string"/>
  <column name="wpRoomNumber" subject="${wp.RoomNumber:Номер кабинета}" extends="string"/>
  <column name="wpCode" subject="${wp.Code:Код РМ}" extends="string"/>
  <column name="wpEmpGoingToWork" subject="${wp.GoingToWork:Дата выхода}" extends="datetime"/>
  <column name="wpMovingDate" subject="${wp.wpMovingDate:Дата переезда}" extends="datetime"/>
  <column name="wpEmpHierDepatment" subject="${wp.wpEmpHierDepatment:Подразделение}" extends="string"/>
</catalog>


Дескриптор

Дескриптор решает следующие задачи:

  1. Связывает колонки с табличными данными
  2. Управляет колонками: категоризация, сортировка, фильтрация, скрытие, важность и т.д.
  3. Определяет по какому алгоритму будут отображаться данные в Web-клиенте, с помощью builder
  4. Связывает с модулем
  5. Подключает кастомные кнопки
Блок кода
languagexml
titleПример. Дескриптора
linenumberstrue
collapsetrue
<?xml version='1.0' encoding='UTF-8'?>
<catalog xmlns="http://www.intertrust.ru/schema/palette/cat-ui">
  <custom-descriptor ident="WorkplaceRequests" view="WorkplaceRequests_(vw_cmj_all)" id="wp-request-all-docs-af5" name="Заявки на организацию РМ - Все" style="default">
    <builder name="ru.intertrust.cm_sochi.srv.uicollections.UiBuilder">
      <config>
        <view-complex-classif level-select="all"/>
      </config>
    </builder>
    <table>
      <columns>
        <column-ref ref="self" important="true"/>
        <column-ref ref="created_date" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="typeRequest" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="regNumber" sort-asc="true" sort-desc="true" filter="true"/>
        <column-ref ref="wpInitBranch" sort-asc="true" sort-desc="true" important="true" filter="true"/>
        <column-ref ref="wpInitiator" sort-asc="true" sort-desc="true" important="true" filter="true"/>
        <column-ref ref="wpInitiatorDepartment" sort-asc="true" sort-desc="true" important="true" filter="true"/>
        <column-ref ref="wpEmployee" sort-asc="true" sort-desc="true" important="true" filter="true"/>
        <column-ref ref="wpEmpDepartment" sort-asc="true" sort-desc="true" important="true" filter="true"/>
        <column-ref ref="wpEmpHierDepatment" sort-desc="true" sort-asc="true" filter="true" invisible-default="true"/>
        <column-ref ref="stage" sort-asc="true" sort-desc="true" important="true" filter="true"/>
        <column-ref ref="statusWPRequest" filter="true" sort-asc="true" sort-desc="true" important="true"/>
        <column-ref ref="term" sort-asc="true" sort-desc="true" important="true" filter="true"/>
        <column-ref ref="finishtime" sort-asc="true" sort-desc="true" important="true" filter="true"/>
        <column-ref ref="wpArea" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpCode" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpCountry" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpInitOrganization"  sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpFloor" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpLocality" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpRoomNumber" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpTypeOffice" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpOffice" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpEmpGoingToWork" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
        <column-ref ref="wpMovingDate" sort-asc="true" sort-desc="true" filter="true" invisible-default="true"/>
      </columns>
    </table>
    <custom-actions schema-ref="RkkReadersCollection"/>
  </custom-descriptor>
</catalog>


Представление

Представление связывает дескриптор с навигационной панелью.

Блок кода
languagexml
titleПример. Представления
linenumberstrue
collapsetrue
  <view parent-ref="request" id="workplace-requests" name="${catalog.view.workplace_requests.name:Заявки на ОРМ}" position="10">
    <pagename name="Заявки на ОРМ"/>
    <descriptor-ref ref="wp-request-all-docs-af5"/>
    <source>
      <module ident="WorkplaceRequests"/>
    </source>
  </view>

Инструменты отладки

Кастомные коллекции

Отлаживать кастомные коллекции можно через Управление конфигурациями. Данный раздел находится в админ-клиенте AF5 в Структуре Системы.

С помощью фильтров ищется нужная коллекция, открывается на редактирование, на вкладку Черновик вносится код xml-коллекции, сохраняется.

Image Added

Далее выделяется данная коллекция и нажимается кнопка "Применить черновик"

Image Added

Изменения применяются без dropcache

Дескрипторы и представления

Дескрипторы и представления отлаживать удобнее, через заливу Палитры XML, но возможность сделать через админку AF5 есть.

Нужно перейти в раздел Структура системы\Каталог\Папки и Структура системы\Каталог\Дескрипторы

Image Added