Добавление столбцов в таблицы вывода результатов поиска

Здравствуйте!
Возможно ли вообще изменение таблицы результатов поиска?


(На картинке есть System Solution - это копия класса Application Solution,созданная в другом расширении)

Ситуация следующая.

Было создано расширение, которое позволяет прилинкованному к Functional CI контакту задать один из трех типов контакта: owner, maintainer, backup maintainer.
image

<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.1">
  <constants>
  </constants>
  <classes>
    <class id="lnkContactToFunctionalCI">
<!--,searchable added for test-->
      <properties>
        <category>bizmodel,searchable</category>
      </properties>
      <fields>
	<field id="Contact_type" xsi:type="AttributeEnum" _delta="define">
          <sort_type>rank</sort_type>
          <values>
            <value id="owner">
              <code>owner</code>
              <rank>30</rank>
            </value>
            <value id="maintainer">
              <code>maintainer</code>
              <rank>20</rank>
            </value>
            <value id="backup_maintainer">
              <code>backup_maintainer</code>
              <rank>10</rank>
            </value>
          </values>
          <sql>contact_type</sql>
          <default_value>owner</default_value>
          <is_null_allowed>true</is_null_allowed>
          <display_style>list</display_style>
        </field>
      </fields>
      <presentation>
        <details _delta="redefine">
          <items>
            <item id="contact_id">
              <rank>10</rank>
            </item>
            <item id="functionalci_id">
              <rank>20</rank>
            </item>
            <item id="Contact_type">
              <rank>30</rank>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="Contact_type">
              <rank>30</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="Contact_type">
              <rank>30</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
<!--Add contacts_list to FCI between presentation tags for test search results-->
    <class id="FunctionalCI">
      <presentation>
        <search>
          <items>
            <item id="contacts_list">
              <rank>50</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="contacts_list">
              <rank>50</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
  </classes>
  <menus>
  </menus>
  <user_rights>
    <groups>
    </groups>
    <profiles>
    </profiles>
  </user_rights>
</itop_design>

Задача состоит в том, чтобы быстро увидеть трех этих людей на каждый Functional CI.
Было бы здорово добавить в таблицу результатов поиска три соответствующих столбца: owner, maintainer и backup maintainer, но мои попытки не выдают ни ошибок, ни результатов.
Посоветуйте, пожалуйста, каким образом решить задачу.
Возможно нужно дополнительные классы создавать типа lnkContactTypeToFunctional CI, но мне не понятно какие типы аттрибутов использовать в случае, когда нужно слинковать value класса lnkContactToFunctionalCI.
Или подскажите какими OQL запросами можно сформировать табличку в дашбордах.
В общем , буду благодарна за совет, за какое-то более оптимальное решение.

Добрый день.
Вы добавили поле “Contact_type” к классу “lnkContactToFunctionalCI”, а на первом скриншоте у вас поиск выполняется по классу “FunctionalCI”. Думаю, поэтому у вас там не выводится нужный результат.

Попробуйте что-то вот такое:

SELECT f, p, l.Contact_type
FROM FunctionalCI AS f
JOIN lnkContactToFunctionalCI AS l ON l.functionalci_id = f.id
JOIN Person AS p ON l.contact_id = p.id

По идее, должно сработать, но проверить не могу, т.к. у меня нет дополнительного поля в нужном классе)

1 лайк

Есть идеи как добавить, например, 1 столбец контактов в таблицу этого поиска? :thinking:

Поле то такое есть у Functional CI.
datamodel.itop-config-mgmt.xml

<class id="FunctionalCI" _delta="define">
<field id="contacts_list" xsi:type="AttributeLinkedSetIndirect" _delta="define">
  <linked_class>lnkContactToFunctionalCI</linked_class>
  <ext_key_to_me>functionalci_id</ext_key_to_me>
  <count_min>0</count_min>
  <count_max>0</count_max>
  <ext_key_to_remote>contact_id</ext_key_to_remote>
  <duplicates/>
</field>

У меня идей нет. Я думаю, что дело в xsi:type=“AttributeLinkedSetIndirect” - все поля с таким типом не выводятся в списке. Но подтверждения этому я в wiki не нашел, поэтому забил и использую OQL для своего запроса, просто сделал Shortcut на таблицу с результатом запроса (у меня суть попроще - отображать пользователя, который привязан к компу).
Но я не очень опытный ещё, так что может кто-то и подскажет решение. Ну или может вы найдёте и поделитесь)

1 лайк
  1. Результат любого поиска в айтопе это результат выполнения OQL-запросов по сути. OQL это Object Query Language, то есть язык для выбора объектов, и результат такого запроса это список объектов, в котором атрибуты объектов представлены столбцами. Средствами OQL-запроса ограничить список возвращаемых столбцов нельзя.
  2. Чтобы добавить поле объекта в представление списка, это поле должно быть скалярным (иметь строковое представление). Поля AttributeLinkedSetIndirect такими не являются, потому в списках не выводятся. До недавнего времени такие поля даже в представлении свойств выводились только отдельной вкладкой, но в 3.1 в этом направлении появились улучшения (https://manage-wiki.openitop.org/doku.php?id=3_1_0:release:whats_new#nn_like_tagset).
  3. На мой взгляд самое простое и правильно решение предложил @Vladislav_Trvld. Нужно для каждой роли сделать AttibuteExternalKey внутри FunctionalCI. То есть у вас будет три дополнительных поля: owner_id, maintainer_id, backup_maintainer_id, которые можно будет использовать в поиске как условие, выводить в таблицу, строить графики и тп. Кроме того, полагаю, по бизнес-логике вы не хотите заиметь нескольких владельцев в одной и той же КЕ, и AttibuteExternalKey такую возможность исключает полностью.
1 лайк