2017-08-04 116 views
1

我試圖做的條件: A或(B和C)Odoo多重條件

我的代碼:

<field name="x" attrs="{'readonly': ['|',('state','!=', 'ok'), (('state', '=', 'fine'), ('participate_process', '=', False))]}" > 

我從網上JS錯誤:

Error: unknown field state,=,to_approve_second domain ["|",["state","!=","ok"],[["state","=","fine"],["participate_process","=",false]]] 

另外我試了另一種方式:

<field name="x" attrs="{'readonly': ['|', '&amp;', ('state','!=', 'ok'), ('state', '=', 'fine'), ('participate_process', '=', False)]}" > 

但它不起作用..

這些多域名有什麼問題?

回答

2

你好fueggit,

的OpenERP使用的域名過濾波蘭式。

首先你應該明白什麼是波蘭語法。您可以在維基百科中找到關於波蘭語標記的詳細信息。 http://en.wikipedia.org/wiki/Polish_notation

關於你的問題

(A OR B) AND (C OR D OR E) 
應該

轉換爲波蘭記號作爲

AND OR A B OR OR C D E 

,應該由算法來解決以下順序[]表示操作

AND [OR A B] OR OR C D E   Result of [OR A B] is F 

AND F OR [OR C D] E    Result of [OR C D] is G 

AND F [OR G E]     Result of [OR G E] is H 

[AND F H] 

它從開始左。 「

」如果在找到兩個操作數之前找到另一個操作符,則將舊操作符置於一邊,直到解析該新操作符。此過程迭代直到操作符解決爲止,這最終必須發生,因爲必須有一個操作數比在一個完整的語句中有操作符。「從維基百科文章。

,你還可以在運營商使用的,而不是用OR運算符像

['&',('field2', 'in', ['A', 'B']),('state', 'in', ['open', 'closed', 'draft'])] 

解決方案寫三個獨立的元組

<field name="x" attrs="{'readonly': [('participate_process', '=', False),'|',('state','!=', 'ok'),('state', '=', 'fine')]}" > 

OR

<field name="x" attrs="{'readonly': ['&',('participate_process', '=', False),'|',('state','!=', 'ok'),('state', '=', 'fine')]}" > 

我希望我的回答是很有幫助的。
如果有任何查詢請這麼評論。

+0

你好fueggit,檢查我的答案,如果幫助完整,所以接受答案。 –

+0

你好,我的解決方案是一樣的,是的? ('state','=','fine'),'|',('state' ,'!=','ok')]}「>只是語法有點不同。 – fueggit

+0

也是如此,但使用波蘭語表示法......

0

我發現了決定:

<field name="x" attrs="{'readonly': [('participate_process', '=', False), ('state', '=', 'fine'), '|', ('state','!=', 'ok')]}" > 
1

它應該是:

<field name="x" attrs="{'readonly': ['|', ('state', '=', 'ok'), '&amp;', ('state', '=', 'fine'), ('participate_process','=', False)]}" > 
1

你也應該這樣寫,

<field name="x" attrs="{'readonly': [('participate_process', '=', False), '|', ('state', '=', 'fine'), ('state','!=', 'ok')]}" > 

將被轉換成這樣。

Where participate_process = False and 
(state = 'fine' or state != 'ok')