OData. Фильтр по guid + еще какое-то условие
Задача: через 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...
Каким должен быть запрос, чтобы, помимо известного гуид, наложить другие условия?.....
Предположил, что запрос, проверяющий что организация в нашем договоре пуста, будет вида:
.../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...
Каким должен быть запрос, чтобы, помимо известного гуид, наложить другие условия?.....
Найденные решения
(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
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
А что должен вернуть, как не весь договор? Может быть вы хотите определенные поля?
Тогда Select и через запятую перечислить нужные поля
.../odata/standard.odata/Catalog_ДоговорыКонтрагентов(guid'59873b45-91a3-11e9-8db6-f38a2508e13e')?$select=Ref_Key,Code,Description &$format=json
Облом - вернулся весь договор.
А что должен вернуть, как не весь договор? Может быть вы хотите определенные поля?
Тогда Select и через запятую перечислить нужные поля
.../odata/standard.odata/Catalog_ДоговорыКонтрагентов(guid'59873b45-91a3-11e9-8db6-f38a2508e13e')?$select=Ref_Key,Code,Description &$format=json
(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": []
}
(я использую это как признак того, что, по переданному ранее из Документооборота в ЕРП заказу поставщику, еще не создано никакое приобретение товаров).
Понятно, что с договором я могу выкрутится - просто получить договор (убрать фильтр из запроса, оставить только гуид сущности) и смотреть какой там гуид организации, или какая сумма, в результате.
Но интересует все же - почему, если в запросе задан гуид сущности, возвращаемый результат не зависит от фильтра. Точнее, зависит - порядком полей - это вообще непонятно по какой логике.....
А что должен вернуть, как не весь договор?
Когда условие фильтра не выполнено, я ожидал нечто вроде такого в ответе:
{
"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) по идее так и должно быть. Раз запросили уже объект, то он и вернется. Просто $filter используется не по назначению.
Правильно использовать $filter нужно так:
Тогда отрабатывает именно фильтр.
Правильно использовать $filter нужно так:
.../odata/standard.odata/Catalog_ДоговорыКонтрагентов?$filter=Ref_Key eq guid'59873b45-91a3-11e9-8db6-f38a2508e13e'
Тогда отрабатывает именно фильтр.
(1) Ну последовательность полей в json всегда рандомная, насколько я понимаю.
Вы какой хотите результат получить, если, например, организация заполнена? Или если не заполнена?
Вы же можете каждый раз просто по гуиду получать договор и уже разбирая ответ выяснять, заполнена организация или нет. Ну или получить список договоров с незаполненными организациями.
Ну а если задача одно только поле "Организация" получить по гуиду, это select как верно уже ответили.
Вы какой хотите результат получить, если, например, организация заполнена? Или если не заполнена?
Вы же можете каждый раз просто по гуиду получать договор и уже разбирая ответ выяснять, заполнена организация или нет. Ну или получить список договоров с незаполненными организациями.
Ну а если задача одно только поле "Организация" получить по гуиду, это select как верно уже ответили.
(8)
так - выдает:
Я недавно тут уже плакался, что желтые документацию писать не умеют - на ИТС жуткая ересь на эту тему.
Оказывается, даже для НЕ составного реквизита (Организация) надо употреблять cast! Т.е., вот так прокатит:
Правда, вернет опять весь объект-договор!
(Кстати, спасибо за подсказку насчет Ref_Key - я пытался юзать "Ref" (для реквизитов-то мы _Key отбрасываем, пишем "Организация", а не "Организация_Key")... где-то что-то недочитал).
а так
так - выдает:
"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")... где-то что-то недочитал).
(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
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот