Для создания кастомного представления (коллекции) в клиенте Notes необходимо открыть БД Каталог, перейти в представление "~Админ CMJ/Конфигурации коллекций" и нажать на кнопку "Новая конфигурация коллекции". В открывшейся форме необходимо указать название коллекции (например, "InputDocs_(vw_cmj_04_288005353535_input)"), вложить в поле "XML коллекции" файл, содержащий непосредственно запрос для формирования коллекции (аналогичный тому, что указывается в sochi в файлах с наименованиями вида "col-....xml"), а в поле "XML метаданных коллекции" - файл, содержащий метаданные коллекции (аналогичный тому, что указывается в sochi в файлах с наименованиями вида "ctx-col-....xml"), и сохранить документ.
Замечание: только первый файл, находящийся в поле "XML коллекции", а также только первый файл в поле "XML метаданных коллекции" будут переданы в соответствующие таблицы AF5 для формирования доступных кастомных представлений.
Пример содержимого XML коллекции:
<collection name="InputDocs_(vw_cmj_02_input)" idField="id" replace="runtime"> <prototype> <![CDATA[ SELECT id, Module, created_date, hasAttachments, templateName, reqType, self_1, self_2, self_3, correspondentAuthor, Subject FROM ( SELECT rkkbase.id, rkkbase.module AS Module, rkkbase.created_date, rkkbase.type AS reqType, (SELECT coalesce(max(a), cast(0 AS SMALLINT)) FROM ( SELECT cast(1 AS SMALLINT) a FROM f_ContentFiles_Rkk CF WHERE CF.f_dp_rkkbase = imputrkkT.id UNION SELECT cast(1 AS SMALLINT) FROM f_ContentRichText_Rkk CRT WHERE CRT.f_dp_rkkbase = imputrkkT.id UNION SELECT cast(1 AS SMALLINT) FROM f_VerifyImage_Rkk VI WHERE VI.f_dp_rkk = imputrkkT.id ) t ) AS hasAttachments, rkkT.Name AS templateName, '<id>' AS self_1, ':' AS self_2, '</>' AS self_3, (SELECT coalesce( string_agg( '<id>' || coalesce( nullif(substring(corr.cmjunid, 33, 48) || ':' || substring(corr.cmjunid, 1, 32), ':') , '' ) || '</><shortName>' || coalesce( nullif(corr.orig_shortname, '') , '' ) || '</>' , ',' ) , '<id></><shortName></>' ) FROM F_DP_InputRkkT_Author imputrkkTAuthor LEFT JOIN SO_Beard corr ON corr.id = imputrkkTAuthor.Author WHERE imputrkkTAuthor.Owner = imputrkkT.id) AS correspondentAuthor, rkkbase.subject AS Subject FROM F_DP_InputRkkT imputrkkT JOIN F_DP_RkkTemplate rkkT ON rkkT.id = imputrkkT.id JOIN F_DP_RkkBase rkkbase ON rkkbase.id = rkkT.id WHERE rkkbase.isdeleted <> 1 ) s WHERE 1 = 1 ::where-clause ]]> </prototype> <counting-prototype> <![CDATA[ SELECT COUNT(1) FROM ( SELECT rkkbase.id, rkkbase.module AS Module, rkkbase.created_date, (SELECT coalesce(max(a), cast(0 AS SMALLINT)) FROM ( SELECT cast(1 AS SMALLINT) a FROM f_ContentFiles_Rkk CF WHERE CF.f_dp_rkkbase = imputrkkT.id UNION SELECT cast(1 AS SMALLINT) FROM f_ContentRichText_Rkk CRT WHERE CRT.f_dp_rkkbase = imputrkkT.id UNION SELECT cast(1 AS SMALLINT) FROM f_VerifyImage_Rkk VI WHERE VI.f_dp_rkk = imputrkkT.id ) t ) AS hasAttachments, rkkT.Name AS templateName, rkkbase.type AS reqType, (SELECT coalesce( string_agg( '<id>' || coalesce( nullif(substring(corr.cmjunid, 33, 48) || ':' || substring(corr.cmjunid, 1, 32), ':') , '' ) || '</><shortName>' || coalesce( nullif(corr.orig_shortname, '') , '' ) || '</>' , ',') , '<id></><shortName></>' ) FROM F_DP_InputRkkT_Author imputrkkTAuthor LEFT JOIN SO_Beard corr ON corr.id = imputrkkTAuthor.Author WHERE imputrkkTAuthor.Owner = imputrkkT.id) AS correspondentAuthor, rkkbase.subject AS Subject FROM F_DP_InputRkkT imputrkkT JOIN F_DP_RkkTemplate rkkT ON rkkT.id = imputrkkT.id JOIN F_DP_RkkBase rkkbase ON rkkbase.id = rkkT.id WHERE rkkbase.isdeleted <> 1 ) s WHERE 1 = 1 ::where-clause ]]> </counting-prototype> <filter name="MODULE"> <criteria placeholder="where-clause"> <![CDATA[ Module = {0} ]]> </criteria> </filter> <filter name="hasAttachments"> <criteria placeholder="where-clause"> <![CDATA[ hasAttachments = {0} ]]> </criteria> </filter> <filter name="templateName"> <criteria placeholder="where-clause"> <![CDATA[ templateName = {0} ]]> </criteria> </filter> <filter name="self"> <criteria placeholder="where-clause"> <![CDATA[ Module = {0} and id = {1} ]]> </criteria> </filter> <filter name="reqType"> <criteria placeholder="where-clause"> <![CDATA[ reqType = {0} ]]> </criteria> </filter> <filter name="correspondentAuthor"> <criteria placeholder="where-clause"> <![CDATA[ correspondentAuthor = {0} ]]> </criteria> </filter> <filter name="correspondentAuthor_partial"> <criteria placeholder="where-clause"> <![CDATA[ correspondentAuthor ilike '%'||{0}||'%' ]]> </criteria> </filter> <filter name="Subject"> <criteria placeholder="where-clause"> <![CDATA[ Subject = {0} ]]> </criteria> </filter> </collection> |
Пример содержимого XML коллекции:
Пример содержимого XML метаданных коллекции:
<?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"> <bean id="InputDocs_(vw_cmj_04_2880053535351_input)Metadata" class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.CollectionMetadataNew" p:caseSensitiveFieldNames="true" p:searchArea="InputDocs_uicoll"> <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> <!--<bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="regPlace" p:filter="regPlace" p:sortOrder="ASCENDING" p:categorized="true"/>--> <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="linkedDoc"> <property name="virtualField"> <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.MultiValuedVirtualField" p:realFields="linkedDoc" p:elementSeparator=";"/> </property> </bean> <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="rNumber" p:filter="rNumber" p:sortOrder="DESCENDING"/> <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.Field" p:name="docDate"> <property name="virtualField"> <bean class="ru.intertrust.cm_sochi.srv.connector.sochi.collections.InputOutDateVirtualField" p:realFields="docDate"/> </property> </bean> </list> </constructor-arg> </bean> </beans> |
Далее необходимо в конкретном дескрипторе выбрать ранее созданную конфигурацию коллекции. Для этого необходимо открыть требуемый дескриптор, выбрать тип поиска - "по конфигурации коллекции" и по кнопке "выбрать" в поле "Представление БД" выбрать интересующую конфигурацию коллекции. Файлы конфигураций коллекции будут переданы в необходимые таблицы в AF5 при экспорте БД Каталог.
Для создания кастомных представлений непосредственно в админке AF5 необходимо выполнить следующие действия:
В Структура системы\Инструменты\Миграция, необходимо указать путь до набора файлов аналогичного path-info.rar, который был получен при выгрузке. Набор содержит
Нажать на кнопку "Импортировать конфигурацию"
Если нажать "Импорт системных файлов", выгрузка может пройти, но произойдет ошибка деплоя при рестарте