Постановка задачи
Инструмент
Реализация
Создание кастомных представлений в Notes
Для создания кастомного представления (коллекции) в клиенте 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
Одиночная коллекция
Для создания кастомных представлений непосредственно в админке AF5 необходимо выполнить следующие действия:
- В меню "Структура системы\Инструменты\Управление конфигурациями" создать новую коллекцию. В поле "название" указать наименование коллекции (например, "InputDocs_(vw_cmj_04_288005353535_input)"), в поле "тип" указать collection. Собственно xml коллекции необходимо указать в поле "Черновик". Тело такого xml должно начинаться с элемента <collection... (содержимое файла аналогично тому, что представлено в примере содержимого XML коллекции). После сохранения документа необходимо нажать кнопку "Применить"
- В меню "Структура системы\Инструменты\Загрузка конфигурации GUI" необходимо загрузить файл с метаданными коллекции. Для этого - выбрать тип конфигурации "Бин коллекции", выбрать сам файл и нажать
"Загрузить конфигурацию"
. Содержимое файла аналогично тому, что представлено в примере содержимого XML метаданных коллекции.
- В требуемом дескрипторе выбрать тип поиска "по конфигурации коллекции" и указать наименование коллекции (например, "InputDocs_(vw_cmj_04_288005353535_input)") в поле "Запрос". Затем необходимо выполнить дропкеш, после чего данные из указанной коллекции будут отображаться в веб-клиенте в пункте меню, соответствующем папке, в которой указан данный дескриптор
Массовая загрузка
В Структура системы\Инструменты\Миграция, необходимо указать путь до набора файлов аналогичного path-info.rar, который был получен при выгрузке. Набор содержит
- 0.index - всегда одинаков 0.index
- path-info.meta - генерируется при экспорте
- папка content с xml файлами
- набор csv из 0.index, которые были сгенерированы при экспорте
Нажать на кнопку "Импортировать конфигурацию"
Если нажать "Импорт системных файлов", выгрузка может пройти, но произойдет ошибка деплоя при рестарте