Коллеги, помогите составить запрос, для следующей задачи:
Нам нужно для инвентаризации вывести по каждой организации список компьютеров (PC) с закрепленными за ними контактами (Персонами).
Насколько я понял, можно составить запрос OQL, сохранить его в книге запросов, и использовать по мере необходимости (при инвентаризации)
В OQL запросах к сожалению ничего не понимаю, поэтому готов оплатить данную работу. kde@it-tess.ru
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 = ‘Название организации’
togoltsova Спасибо Вам огромное !!! Это именно, то что было мне нужно!
на здоровье. : -)
Вижу в DataModel параметр Last update - Date/time (Date and time (year-month-day hh:mm:ss)).
Не могу понять можно ли сделать выборку UserRequest , у которых время прошедшее с Last update больше часа?
Можно. OQL поддерживает необходимые функции для работы с датами. Посмотрите DATE_SUB
и DATE_ADD
.
Примеры можно тут посмотреть:
https://wiki.openitop.org/doku.php?id=2_3_0:oql:oql_examples#current_week
Новый вопрос. В запросах есть вкладка история. И там видно кто из агентов создал или изменял тикет.
Но как сделать выборку, например все запросы созданные агентом ( а не назначенные на агента)
Или вывести список всех агентов, кто вносил изменения в запрос?
Для этого нужно разобраться в том, как устроена и работает история в 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
Всем, привет!
Есть следующие связи в 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?
Спасибо!
@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'
Спасибо за помощь!
Удалось частично создать необходимый запрос. Теперь пробую использовать его - Query Phrasebook.
Похоже, что есть два основных способа использования записей в книге запросов:
- Ручное открытие запроса с настройкой необходимых полей и последующим экспортом в Excel.
- Импорт в 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’?
Спасибо!
Возник ещё вопрос по 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'
Спасибо!
Те, которые перечислены в модели данных для выгружаемого класса объектов. Модель данных можно посмотреть в инструментах администратора.
В общем случае – нет, для этого нужен OUTER JOIN, чего OQL не умеет, так как оперирует объектами целиком, а не таблицами и столбцами. Частично может помочь объединение двух запросов через UNION
, но в этом случае в обоих селектах должен совпадать список выбираемых объектов.
Владимир, спасибо! Удалось разобраться с полями.
Вопрос с объёдинением запросов пока ещё не совсем ясен. Например такой запрос:
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
.
Есть ли такая возможность или может нужно действовать иначе?
Спасибо!
По этому я и говорю “частично”. Проверить, что на устроство не ссылается ни один интерфейс средствами OQL нельзя, как нельзя вернуть пустые значения.
Что в конечном итоге вы хотите получить?
Отчёт в который будут включены устройства где указаны и где не указаны интерфейсы. Думал может неверно составлен запрос.
Если пустые значения не возвращаются, то получается, что необходимо писать отдельный запрос на случай где такой связи нет, а затем комбинировать результаты с учётом разных полей.
Спасибо за консультацию, Владимир!
Не подскажете, как составить запрос:
Для дашборда требуется отобразить 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
Но нужно, чтобы отображались все другие заявки, кроме этих.