OData. Фильтр по guid + еще какое-то условие

1. e-9 60 19.06.19 00:50 Сейчас в теме
Задача: через REST-интерфейс, из одной базы проверить в другой (зная гуид объекта) - заполнена ли в договоре Организация.

Предположил, что запрос, проверяющий что организация в нашем договоре пуста, будет вида:
.../odata/standard.odata/Catalog_ДоговорыКонтрагентов(guid'59873b45-91a3-11e9-8db6-f38a2508e13e')?$filter=cast(Организация, 'Catalog_Организации') eq guid'00000000-0000-0000-0000-000000000000'&$format=json

Облом - вернулся весь договор.

Ради интереса попробовал заменить eq на ne - тоже вернулся весь договор! Причем, с другой последовательностью полей в json-ответе.....

Предположил, что проблема в том, что Организация - ссылка. Пробую для примитивного типа - проверяю, не равна ли нулю сумма договора:
.../odata/standard.odata/Catalog_ДоговорыКонтрагентов(guid'59873b45-91a3-11e9-8db6-f38a2508e13e')?$filter=Сумма ne 0&$format=json

Тот же эффект: фильтр игнорируется, договор возвращается весь, независимо от ne/eq...

Каким должен быть запрос, чтобы, помимо известного гуид, наложить другие условия?.....
Найденные решения
10. spacecraft 20.06.19 10:53 Сейчас в теме
(9)
Правда, вернет опять весь объект-договор!

Конечно вернет весь договор, но только если Организация не заполнена.
Если нужны другие условия, нужно формировать соответствующий фильтр.

Если нужно не возвращать при незаполненной организации, то может такой фильтр подойдет?
...Catalog_ДоговорыКонтрагентов/?$filter=Ref_Key eq guid'59873b45-91a3-11e9-8db6-f38a2508e13e' and cast(Организация, 'Catalog_Организации') ne eq guid'00000000-0000-0000-0000-000000000000'&$format=json
user1114234; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tusv 212 19.06.19 01:16 Сейчас в теме
(1)
Облом - вернулся весь договор.

А что должен вернуть, как не весь договор? Может быть вы хотите определенные поля?
Тогда Select и через запятую перечислить нужные поля
.../odata/standard.odata/Catalog_ДоговорыКонтрагентов(guid'59873b45-91a3-11e9-8db6-f38a2508e13e')?$select=Ref_Key,Code,Description &$format=json
3. e-9 60 19.06.19 07:49 Сейчас в теме
(2)
А что должен вернуть, как не весь договор?

Когда условие фильтра не выполнено, я ожидал нечто вроде такого в ответе:
{
"odata.metadata": "http://localhost/erpup_test/odata/standard.odata/$metadata#Catalog_ДоговорыКонтрагентов",
"value": []
}

У меня есть другой запрос - в котором НЕ участвует гуид сущности:
.../odata/standard.odata/Document_ПриобретениеТоваровУслуг?$filter=cast(ЗаказПоставщику, 'Document_ЗаказПоставщику') eq guid'мойгуидзаказапоставщику' and Posted eq true
так вот он - когда фильтр не находит ничего - возвращает как раз:
{
"odata.metadata": "http://localhost/erpup_test/odata/standard.odata/$metadata#Document_ПриобретениеТоваровУслуг",
"value": []
}
(я использую это как признак того, что, по переданному ранее из Документооборота в ЕРП заказу поставщику, еще не создано никакое приобретение товаров).

Понятно, что с договором я могу выкрутится - просто получить договор (убрать фильтр из запроса, оставить только гуид сущности) и смотреть какой там гуид организации, или какая сумма, в результате.

Но интересует все же - почему, если в запросе задан гуид сущности, возвращаемый результат не зависит от фильтра. Точнее, зависит - порядком полей - это вообще непонятно по какой логике.....
6. Marliiin 19.06.19 17:14 Сейчас в теме
(3) Да, забавно) Я и не замечал

После "?$filter"= можно вообще написать любую околесицу мусорную через eq, все равно выдаст объект по гуиду.
Хоть ?$filter=ацуацу%20eq%мывмвмвмывмвымывмы
7. spacecraft 19.06.19 18:40 Сейчас в теме
(6) по идее так и должно быть. Раз запросили уже объект, то он и вернется. Просто $filter используется не по назначению.
Правильно использовать $filter нужно так:
.../odata/standard.odata/Catalog_ДоговорыКонтрагентов?$filter=Ref_Key eq guid'59873b45-91a3-11e9-8db6-f38a2508e13e'

Тогда отрабатывает именно фильтр.
4. Marliiin 19.06.19 09:26 Сейчас в теме
(1) Ну последовательность полей в json всегда рандомная, насколько я понимаю.

Вы какой хотите результат получить, если, например, организация заполнена? Или если не заполнена?

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


Ну а если задача одно только поле "Организация" получить по гуиду, это select как верно уже ответили.
5. пользователь 19.06.19 14:21
Сообщение было скрыто модератором.
...
8. spacecraft 19.06.19 18:58 Сейчас в теме
(1) а так:
.../odata/standard.odata/Catalog_ДоговорыКонтрагентов/?$filter=Ref_Key eq guid'59873b45-91a3-11e9-8db6-f38a2508e13e' and Организация eq guid'00000000-0000-0000-0000-000000000000'&$format=json 
9. e-9 60 20.06.19 10:03 Сейчас в теме
(8)
а так

так - выдает:
"value": "{(4, 85)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля\n неограниченной длины и поля несовместимых типов.\n( ( sourceAlias.Ref ) = ( &fc_param0 ) ) AND ( ( sourceAlias.Организация ) <<?>>= ( &fc_param1 ) )"


Я недавно тут уже плакался, что желтые документацию писать не умеют - на ИТС жуткая ересь на эту тему.
Оказывается, даже для НЕ составного реквизита (Организация) надо употреблять cast! Т.е., вот так прокатит:

...Catalog_ДоговорыКонтрагентов/?$filter=Ref_Key eq guid'59873b45-91a3-11e9-8db6-f38a2508e13e' and cast(Организация, 'Catalog_Организации') eq guid'00000000-0000-0000-0000-000000000000'&$format=json


Правда, вернет опять весь объект-договор!

(Кстати, спасибо за подсказку насчет Ref_Key - я пытался юзать "Ref" (для реквизитов-то мы _Key отбрасываем, пишем "Организация", а не "Организация_Key")... где-то что-то недочитал).
10. spacecraft 20.06.19 10:53 Сейчас в теме
(9)
Правда, вернет опять весь объект-договор!

Конечно вернет весь договор, но только если Организация не заполнена.
Если нужны другие условия, нужно формировать соответствующий фильтр.

Если нужно не возвращать при незаполненной организации, то может такой фильтр подойдет?
...Catalog_ДоговорыКонтрагентов/?$filter=Ref_Key eq guid'59873b45-91a3-11e9-8db6-f38a2508e13e' and cast(Организация, 'Catalog_Организации') ne eq guid'00000000-0000-0000-0000-000000000000'&$format=json
user1114234; +1 Ответить
11. e-9 60 20.06.19 11:04 Сейчас в теме
(10)
Конечно

а блин) не вгляделся, что там "eq"
да, с "ne" вместо "eq" - то что надо, в ответе пустое value
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот