Нужна помощь в составлении запрос oql


#1

Коллеги, помогите составить запрос, для следующей задачи:
Нам нужно для инвентаризации вывести по каждой организации список компьютеров (PC) с закрепленными за ними контактами (Персонами).
Насколько я понял, можно составить запрос OQL, сохранить его в книге запросов, и использовать по мере необходимости (при инвентаризации)
В OQL запросах к сожалению ничего не понимаю, поэтому готов оплатить данную работу. kde@it-tess.ru


#2

SELECT pc, person FROM PC AS pc
JOIN lnkContactToFunctionalCI AS contacttoci ON contacttoci.functionalci_id = pc.id
JOIN Person AS person ON contacttoci.contact_id = person.id
WHERE pc.organization_name = ‘Название организации’


#3

togoltsova Спасибо Вам огромное !!! Это именно, то что было мне нужно!


#4

на здоровье. : -)


#5

Вижу в DataModel параметр Last update - Date/time (Date and time (year-month-day hh:mm:ss)).
Не могу понять можно ли сделать выборку UserRequest , у которых время прошедшее с Last update больше часа?


#6

Можно. OQL поддерживает необходимые функции для работы с датами. Посмотрите DATE_SUB и DATE_ADD.
Примеры можно тут посмотреть:
https://wiki.openitop.org/doku.php?id=2_3_0:oql:oql_examples#current_week


#7

Новый вопрос. В запросах есть вкладка история. И там видно кто из агентов создал или изменял тикет.
Но как сделать выборку, например все запросы созданные агентом ( а не назначенные на агента)
Или вывести список всех агентов, кто вносил изменения в запрос?


#8

Для этого нужно разобраться в том, как устроена и работает история в iTop.

iTop пишет всю историю в объекты классов CMDBChange и CMDBChangeOp + куча дочерних. На каждое редактирование тикета или КЕ создается один CMDBChange и несколько CMDBChangeOp. Количество и конкретные классы объектов CMDBChangeOp зависят от числа и типа затронутых поле при редактировании.

Например, при одновременном изменении полей Описание и Название тикета будет создан один объект CMDBChange, содержащий дату и автора изменения, и два связанных с ним CMDBChangeOp: CMDBChangeOpSetAttributeText для поля Описание и CMDBChangeOpSetAttributeScalar для поля Название. Из этих объектов берутся данные для истории тикета.

Объекты CMDBChangeOp и CMDBChange можно использовать в OQL как любые другие объекты:

SELECT CMDBChangeOp
JOIN Ticket ON CMDBChangeOp.objkey = Ticket.id
WHERE CMDBChangeOp.objclass = Ticket.finalclass

#9

Всем, привет!

Есть следующие связи в iTop:
Subnet --> Location
Location --> Contact
Location --> Device
Device --> Interfaces --> IP

Финальная задача получить список вида:
Subnet - Location - Contact - Device - LAN IP - WAN IP

Пробую начинать с частей, например:

SELECT ipsubnet FROM IPSubnet AS ipsubnet
JOIN lnkIPSubnetToLocation AS subnettolocation ON subnettolocation.ipsubnet_id = ipsubnet.id
JOIN Location AS location ON subnettolocation.location_id = location.id
WHERE location.name LIKE '%Site-%' AND location.status = 'active'

Но в выводе я вижу только подсети - как получить в данном запросе вывод вида:
Subnet - Location?

Спасибо!


#10

Привет, @eriitguy!
SELECT ipsubnet, location FROM ...?


#11

@vladimir, доброго дня!

Да, вылетело из финального скрипта пока добился его работы.

SELECT ipsubnet, location FROM IPSubnet AS ipsubnet
JOIN lnkIPSubnetToLocation AS subnettolocation ON subnettolocation.ipsubnet_id = ipsubnet.id
JOIN Location AS location ON subnettolocation.location_id = location.id
WHERE location.name LIKE '%Site-%' AND location.status = 'active'

Спасибо за помощь!


#12

Удалось частично создать необходимый запрос. Теперь пробую использовать его - Query Phrasebook.

Похоже, что есть два основных способа использования записей в книге запросов:

  1. Ручное открытие запроса с настройкой необходимых полей и последующим экспортом в Excel.
  2. Импорт в Excel или доступ к результатам запроса по ссылке из браузера.

Первым способом удалось воспользоваться, но есть дополнительные шаги которые можно автоматизировать во втором способе.
Тут пока не удалось разобраться как его настроить. Вопрос возник с полем ‘Fields’

Первой была попытка вставить поля из Excel файла полученного первым способом.
Например так:
location.Name, location.Status, location.Owner organization->Name, location.City, location.Country, person.Full name

Но в результате появляется ошибка:
Error: Wrong field specification 'location.Name': Unknown attribute Name from class Location

Если заменить все заглавные буквы на строчные:
location.Name --> location.name, то работает со всеми полями вроде, кроме тех где есть пробел:

То есть если в ‘Fields’ указать:
location.name, location.status, location.owner organization->name, location.city, location.country, person.full name, person.first name, person.organization->name, person.status, person.location->name, person.email, person.phone

то возникает такая ошибка:
Error: Wrong field specification ' location.owner organization->name': Unknown attribute owner organization from class Location

Согласно документации:

The field “Fields” allows to restrict this output to the given list of fields (by passing a comma separated list of field codes).

Вопрос получается в том какие значения полей можно указывать в поле ‘Fileds’?

Спасибо!


#13

Возник ещё вопрос по OQL.

Возвращаясь к примеру выше, со связями:

Subnet --> Location
Location --> Contact
Location --> Device
Device --> Interfaces
Interfaces --> IP
IP --> IP Contact

Если при таких связях мы выводим в отчёт:
Subnet --> Location --> Contact --> Device --> Interface (wan) --> IP --> IP Contact
То отсеиваются те Subnet --> Location --> Contact --> Device, у которых нет связей Device --> Interface и соответственно IP привязанного к Interface.

Можно ли в рамках запроса не отсеивать устройства у которых нет Interface но у которых есть Management IP, а вывести их в отчёт?

SELECT ipsubnet, location, person, physicaldevice, physicalinterface, ipaddress, contact
FROM IPSubnet AS ipsubnet
JOIN lnkIPSubnetToLocation AS subnettolocation ON subnettolocation.ipsubnet_id = ipsubnet.id
JOIN Location AS location ON subnettolocation.location_id = location.id
JOIN Person AS person ON person.location_id = location.id
JOIN PhysicalDevice AS physicaldevice ON physicaldevice.location_id = location.id
JOIN PhysicalInterface AS physicalinterface ON physicalinterface.connectableci_id = physicaldevice.id
JOIN lnkIPInterfaceToIPAddress AS ipinterfacetoipaddress ON ipinterfacetoipaddress.ipinterface_id = physicalinterface.id
JOIN IPAddress AS ipaddress ON ipinterfacetoipaddress.ipaddress_id = ipaddress.id
JOIN lnkContactToIPObject AS lnkcontacttoipobject ON lnkcontacttoipobject.ipobject_id = ipaddress.id
JOIN Contact AS contact ON lnkcontacttoipobject.contact_id = contact.id
WHERE location.name LIKE '%Site-%' AND location.status = 'active' AND person.status = 'active' AND person.function = 'Site Manager' AND physicaldevice.finalclass = 'NetworkDevice' AND physicalinterface.name NOT LIKE '%wan%' AND contact.status = 'active'

Спасибо!


#14

Те, которые перечислены в модели данных для выгружаемого класса объектов. Модель данных можно посмотреть в инструментах администратора.

В общем случае – нет, для этого нужен OUTER JOIN, чего OQL не умеет, так как оперирует объектами целиком, а не таблицами и столбцами. Частично может помочь объединение двух запросов через UNION, но в этом случае в обоих селектах должен совпадать список выбираемых объектов.


#15

Владимир, спасибо! Удалось разобраться с полями.

Вопрос с объёдинением запросов пока ещё не совсем ясен. Например такой запрос:

SELECT datacenterdevice
FROM DatacenterDevice AS datacenterdevice
JOIN PhysicalInterface AS physicalinterface ON physicalinterface.connectableci_id = datacenterdevice.id
WHERE datacenterdevice.location_name LIKE '%Site-%' AND datacenterdevice.finalclass = 'NetworkDevice'
UNION
SELECT datacenterdevice
FROM DatacenterDevice AS datacenterdevice
WHERE datacenterdevice.location_name LIKE '%Site-%' AND datacenterdevice.finalclass = 'NetworkDevice'

Выдаёт устройства во всех расположениях - как и требуется.

Вы пишите, что необходимо совпадение выбираемых объектов по всем выборкам, но если указать:

SELECT datacenterdevice, physicalinterface

в обеих выборках, то запрос вернёт ошибку, так как во втором случае убран дополнительный JOIN применение которого приводит к исключению части устройств. Необходимо же, что бы для второго запроса он лишь вернул пустые значения для устройств где нет связи datacenterdevice --> physicalinterface.

Есть ли такая возможность или может нужно действовать иначе?

Спасибо!


#16

По этому я и говорю “частично”. Проверить, что на устроство не ссылается ни один интерфейс средствами OQL нельзя, как нельзя вернуть пустые значения.

Что в конечном итоге вы хотите получить?


#17

Отчёт в который будут включены устройства где указаны и где не указаны интерфейсы. Думал может неверно составлен запрос.

Если пустые значения не возвращаются, то получается, что необходимо писать отдельный запрос на случай где такой связи нет, а затем комбинировать результаты с учётом разных полей.

Спасибо за консультацию, Владимир!


#18

Не подскажете, как составить запрос:
Для дашборда требуется отобразить userrequest’s, которые не назначены на команду текущего агента (используется модуль “назначить на команду”) и на текущего агента.

Есть запрос, который отображает заявки, направленные на мою команду:
SELECT UserRequest JOIN Team ON UserRequest.team_id = Team.id JOIN lnkPersonToTeam AS L ON L.team_id = Team.id WHERE L.person_id = :current_contact_id AND UserRequest.status NOT IN ("resolved", "closed") AND agent_id = 0

Но нужно, чтобы отображались все другие заявки, кроме этих.