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

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

Ключ

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

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

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

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

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

Инструмент

: Палитра XML

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

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

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

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

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

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

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

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

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

Дескриптор

Действия
    and tn_field.cmjfield = 'wpRoomNumber') as wpRoomNumber,
	(select tfs."value" as v
        from tn_field
        join 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
        and tn_field.cmjfield = 'wpRMCode') as wpCode
	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
                  JOIN F_DP_Intrkk_Executor executor ON executor.owner = internalrkk.id
                  JOIN so_beard beard ON beard.id = executor.executor
         WHERE rkkbase.isdeleted <> 1
           AND rkk.regnumcnt IS NULL
		   ) s
                WHERE stage NOT IN ('Перемещена в архив')
                AND 1 = 1
                    ::where-clause
            ]]>
    </prototype>
    <counting-prototype>
        <![CDATA[
            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
                  JOIN F_DP_Intrkk_Executor executor ON executor.owner = internalrkk.id
                  JOIN so_beard beard ON beard.id = executor.executor
				WHERE rkkbase.isdeleted <> 1 AND rkk.regnumcnt IS NULL
			) s
			WHERE stage NOT IN ('Перемещена в архив')
                AND 1 = 1
            ::where-clause
            ]]>
    </counting-prototype>
    <filter name="MODULE">
        <criteria placeholder="where-clause">
            <![CDATA[
                    Module = {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