Я не понимаю нормальную польскую нотацию (NPN или PN). Как построить сложный домен в Odoo?
Может ли кто-нибудь перевести следующую польскую нотацию на свой SQL-аналог:
['|', '&', ('is_company','=', True),('parent_id', '=', False),('company_name', '!=', False),('company_name', '!=', '')]
Мое предположение:
is_company = True OR parent_id = False AND company_name <> False AND company_name <> ''
Я не мог понять концепцию этой записи, как бы я ни пытался ее понять. Пожалуйста помоги.
ОБНОВИТЬ
Я пытался расширить обозначение выше, чтобы быть:
((is_company = True AND parent_id = False) OR company_name <> False) AND company_name <> '' AND customer_type_id <> False
1 ответ
Я полностью согласен с вами, каждый раз, когда мне приходится создавать сложную область, используя такую польскую нотацию, мне приходится ломать голову, чтобы управлять ею.
Я думаю, что домен, который вы ищете, это:
['&', '|', '&', ('is_company', '=', True), ('parent_id', '=', False), ('company_name', '!=', False), '&', ('company_name', '!=', ''), ('customer_type_id', '!=', False)]
Я создал метод для получения этих сложных доменов, и он работает:
Сначала я пишу письмо вместо каждого условия:
A => is_company = True => ('is_company', '=', True)
B => parent_id = False => ('parent_id', '=', False)
C => company_name <> False => ('company_name', '!=', False)
D => company_name <> '' => ('company_name', '!=', '')
E => customer_type_id <> False => ('customer_type_id', '!=', False)
Затем создайте нужное вам выражение, используя только буквы и стандартные операторы, забудьте о польской нотации и условиях:
Step 0. => ((A and B) or C) and D and E
Затем сгруппируйте операции, которые вы должны выполнить первыми (не обращайте внимания на отсутствующие операторы на данный момент):
Step 1. => ((A and B) or C) and D and E
Step 2. => (AB or C) and D and E
Step 3. => ABC and D and E
Step 4. => ABC and DE
Теперь у нас есть только оператор, давайте начнем его декомпозицию (и переместим оператор влево от каждой пары условий), следуя в обратном порядке, в котором вы сгруппировали операции (например, с шага 3 до 4 вы сгруппировали DE, так что теперь, с шага 4 до 3, разложим DE и переместим его оператор влево):
Step 4. => and ABC DE
Step 3. => and ABC and D E
Step 2. => and or AB C and D E
Step 1. => and or and A B C and D E
Теперь измените операторы и добавьте запятые, кавычки и скобки:
['&', '|', '&', A, B, C, '&', D, E]
Наконец, замените буквы условиями, и там у вас есть свой домен. Было бы лучше объяснить это лицом к лицу, но, возможно, вы смогли понять все.
Примечание: я не удаляю
&
операторы (несмотря на то, что вы их не пишете, Odoo должен принимать их по умолчанию), потому что мой опыт таков, что с самыми большими доменами, если бы я не писал&
домен не работал. Я предполагаю, что это произошло, когда было много вложенных условий, но я советую всегда писать их.