python
  • openerp
  • postgresql-8.4
  • 2013-08-12 2 views 4 likes 
    4

    OpenERP 7 목록보기에서 상태 값 정렬을 초안에 표시하고 할당 및 취소를 현재 Asc 또는 Desc에 표시하고 싶습니다. 하지만 제 경우에는 주문서 초안을 정렬하고 상태를 할당하고 취소해야합니다. 상기 질의 정렬 선택 값 파이썬OpenERP 7.0 목록보기에서 선택하여

    _order = ("CASE WHEN state='draft' THEN 0", 
          "WHEN state = 'assigned' THEN 1", 
          "ELSE 2 END, date desc") 
    

    인가

    select state, date from object_name 
    ORDER BY CASE WHEN state = 'draft' THEN 0 
           WHEN state = 'assigned' THEN 1 
           WHEN state = 'cancel' THEN 2 
           ELSE 3 
    END, date desc 
    

    상기 SQL 코드 -는 SQL 예 파이썬 파일

    의 순서로 코드를 적용에 근거 pg_admin에서 작동하지만 파이썬 코드에서 아래 오류를 보여줍니다.

    Invalid "order" specified. A valid "order" specification is a comma-separated 
    list of valid field names (optionally followed by asc/desc for the direction) 
    

    선택 값에 따라 정렬 순서 OpenERP에서 적용하는 방법은 무엇입니까? 재정의 검색 방법도 동일한 sql 쿼리를 적용했지만 동일한 문제를 보여줍니다.

    답변

    0

    가능한 해결책은 파이썬 함수에서 쿼리 자체를 실행하는 것입니다. 그런 다음 액션이나 다른 메소드에서 해당 함수를 호출 할 수 있습니다. 예 :

    def _my_custom_search(self, cr, uid, object_name, context=None): 
        sql_req = """ 
    select id, state, date from %s 
    ORDER BY CASE WHEN state = 'draft' THEN 0 
           WHEN state = 'assigned' THEN 1 
           WHEN state = 'cancel' THEN 2 
           ELSE 3 
    END, date desc""" %(object_name,) 
    
        cr.execute(sql_req) 
        res = cr.fetchall() 
        return res 
    

    주문할 필드 외에 ID 필드를 선택해야합니다. 또 다른 가능성은보기에서 기본 필터를 변경하는 것입니다. Adding default filter on tree view

    +0

    답장을 보내 주셔서 감사합니다. Mike 시도해 보겠습니다. – ankita

    0

    다른 해결 방법은 상태를 기준으로 정렬하고 필드에 상태의 순서를 변경하는 것입니다 :

    'state': fields.selection([('draft','Draft'),('assigned','Assigned'), ('cancel','Cancelled'),('other' .... 
    ... 
    _order = "state, date desc" 
    

    또는 새 기능 필드 (예 : sort_priority)를 만들고 유사한 기능을 사용할 수 있습니다 우선 순위에 값을 할당 한 다음 해당 필드로 정렬하십시오.

    2

    상태가 변경 될 때 함수를로드하는 store 특성을 사용하여 기능 필드를 생성 해보십시오. 당신이 독일어를 읽을 수있는 경우 예를

    def _get_state(cr, uid, ids,field_name, context=None): 
        res={} 
        for obj in self.browse(cr, uid, ids, context): 
         res[obj.id] = (obj.state=='draft' and 0) or (obj.state=='assigned' and 1) or (obj.state=='cancel' and 2) or 3 
        return res 
    
    _columns = { 
    current_state_num: fields.function(_get_state,string='Current state',type='integer',store={'your.current.model.name':(lambda cr, uid, ids, context:ids,['state'],20)}) 
    } 
    _order = "current_state_num,date desc" 
    
    0

    에 대한 는 this blog post 우수한 솔루션을 제공합니다. 다음은이를 수정 한 버전입니다.

    class some_table(osv.Model): 
        _name = 'some.table' 
        _columns = { 
         ... 
         ... 
         'state' : field.selection(...), 
         ... 
         ... 
    
        def _generate_order_by(self, order_spec, query): 
         "correctly orders state field if state is in query" 
         order_by = super(some_table, self)._generate_order_by(order_spec, query) 
         if order_spec and 'state ' in order_spec: 
          state_column = self._columns['state'] 
          state_order = 'CASE ' 
          for i, state in enumerate(state_column.selection): 
           state_order += "WHEN %s.state='%s' THEN %i " % (self._table, state[0], i) 
          state_order += 'END ' 
          order_by = order_by.replace('"%s"."state" ' % self._table, state_order) 
         return order_by 
    
    관련 문제