Домен поиска: несколько условий в odoo - PullRequest
2 голосов
/ 06 января 2020

Как преобразовать это выражение: ((A & B) | (C & D)) | ((E & F) | (G & H)) в синтаксисе домена OpenERP

PostgreSQL запрос:

SELECT
  *
FROM
   calendar_event
WHERE
  (
    (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime) or
    (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
  ) or (
    ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') or
    ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')
  )

Я пытаюсь сделать так, но это не правильно, где я не прав, пожалуйста?

   inParams1.push([
         "|",
         "&",
         ["start_datetime", "<",  '2020-01-07 09:00:00'],
         ['2020-01-07 09:00:00', "<=", "stop_datetime"],
         "&",
         ["start_datetime", "<=", '2020-01-07 11:00:00'],
         ['2020-01-07 11:00:00', "<=", "stop_datetime"],

         "|",
         "&",
         ['2020-01-07 09:00:00', "<=", " start_datetime"],
         ["start_datetime", "<=",'2020-01-07 11:00:00'],
         "&",
         ['2020-01-07 09:00:00', "<=",  "stop_datetime"],
     ["stop_datetime", "<=",'2020-01-07 11:00:00']
]);

Пожалуйста, мне нужна ваша помощь, у меня много дней работы, и я не могу найти решение: (

Ответы [ 2 ]

1 голос
/ 06 января 2020

Вы усложнили фильтр по скобкам:

(
    (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime) or
    (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
  ) or (
    ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') or
    ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')
  )

То же самое, что и это:

    (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime)
     or
    (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
    or 
    ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') 
    or
    ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')

Так что попробуйте это:

    [    '|'
         "&",
         ["start_datetime", "<",  '2020-01-07 09:00:00'],
         ["stop_datetime", ">=", '2020-01-07 09:00:00'],
         '|',
         "&",
         ["start_datetime", "<=", '2020-01-07 11:00:00'],
         ["stop_datetime", ">=", '2020-01-07 11:00:00'],
         '|',
         "&",
         ["start_datetime", ">=", '2020-01-07 09:00:00'],
         ["start_datetime", "<=",'2020-01-07 11:00:00'],
         "&",
         ["stop_datetime", ">=",  '2020-01-07 09:00:00'],
         ["stop_datetime", "<=",'2020-01-07 11:00:00']
     ] 

позвольте мне знать, если это не работает для вас.

0 голосов
/ 07 января 2020

Я считаю этот ответ очень полезным для сложной области. { ссылка }

В соответствии с этим ответом вы можете использовать odoo.osv.expression.

In [6]: from odoo.osv.expression import AND,OR                                                                                                                                     

In [7]: a,b,c,d,e,f,g,h = ([("field_" + x, "=", "value_" + x)] for x in "ABCDEFGH")                                                                                                

In [8]: OR([OR([AND([a,b]),AND([c,d])]),OR([AND([e,f]),AND([g,h])])])                                                                                                              
Out[8]: 
['|',
 '|',
 '&',
 ('field_A', '=', 'value_A'),
 ('field_B', '=', 'value_B'),
 '&',
 ('field_C', '=', 'value_C'),
 ('field_D', '=', 'value_D'),
 '|',
 '&',
 ('field_E', '=', 'value_E'),
 ('field_F', '=', 'value_F'),
 '&',
 ('field_G', '=', 'value_G'),
 ('field_H', '=', 'value_H')]
...