1

アクティビティ メソッドで 2 つのアクティビティを実行する必要があります。1 つは total_workers フィールドの値を返す必要があります。ただし、そのメソッドをオーバーライドするときに OpenERP で必要な要件であるため、ID も返す必要があります。次に、2 つのものを返す必要があります。これをフォームに実装する方法を教えてください。1 つの戻り値で、これは両方で機能しますが、両方を返す必要があります。

def create(self, cr, uid, values, context=None):
    name = 'CheckRoll No = ' + str(values['checkroll_no']) + ' & Gang No = ' + str(values['gang_no'])
    values.update({'name': name})
    total_tea_workers = 0
    offer_id = super(bpl_work_offer, self).create(cr, uid, values, context=context)
    tea_worker_obj = self.browse(cr, uid, offer_id, context=context) or []
    tea_worker_ids = self.pool.get('bpl.selected.tea.workers.line').search(cr, uid, [('tea_line_worker_id', '=', tea_worker_obj.id)])
    for tea_worker in self.pool.get('bpl.selected.tea.workers.line').browse(cr, uid, tea_worker_ids):
        if tea_worker.is_selected:
            total_tea_workers += 1
    return {'value': {'total_workers': total_tea_workers}}
    return offer_id

編集済み

私はこの方法でそれを整理します.これが他の人に役立つことを願っています:-)

私は自分のフィールドの関数を書きました

def _compute_workers(self, cr, uid, ids, fieldname, arg, context=None):
    total_workers = total_tea_workers = total_rubber_workers = total_sundry_workers = total_other_workers = 0
    res = dict.fromkeys(ids, False) 
    for this in self.browse(cr, uid, ids, context=context):
        tea_worker_ids = self.pool.get('bpl.selected.tea.workers.line').search(cr, uid, [('tea_line_worker_id', '=', this.id)])
        for tea_worker in self.pool.get('bpl.selected.tea.workers.line').browse(cr, uid, tea_worker_ids):
            if tea_worker.is_selected:
                total_tea_workers += 1                
        rubber_worker_ids = self.pool.get('bpl.selected.rubber.workers.line').search(cr, uid, [('rubber_line_worker_id', '=', this.id)])
        for rubber_worker in self.pool.get('bpl.selected.rubber.workers.line').browse(cr, uid, rubber_worker_ids):
            if rubber_worker.is_selected:
                total_rubber_workers += 1                
        sundry_worker_ids = self.pool.get('bpl.selected.sundry.workers.line').search(cr, uid, [('sundry_line_worker_id', '=', this.id)])
        for sundry_worker in self.pool.get('bpl.selected.sundry.workers.line').browse(cr, uid, sundry_worker_ids):
            if sundry_worker.is_selected:
                total_sundry_workers += 1                
        other_worker_ids = self.pool.get('bpl.selected.other.workers.line').search(cr, uid, [('other_line_worker_id', '=', this.id)])
        for other_worker in self.pool.get('bpl.selected.other.workers.line').browse(cr, uid, other_worker_ids):
            if other_worker.is_selected:
                total_other_workers += 1
    total_workers = total_tea_workers + total_rubber_workers + total_sundry_workers + total_other_workers                                                                             
    res[this.id] = total_workers 
    return res

整数フィールドを機能フィールドに変更しました

'total_workers': fields.function(_compute_workers, type="integer", string="Total Workers"),

4

2 に答える 2

3

create()作成されたレコードの ID 以外は何も返さないでください。通常、これは呼び出しの結果を Indeed 経由で親に返すことによって行われますsuper(myclass, self).create(...)

total_workersコードで何を達成しようとしているのかは明確ではありません。が計算フィールドであると想定されている場合total_workers、オーバーライドする必要はまったくありませんcreate。この列を として宣言し、fields.functionそれを計算するコードを対応する関数に入れるだけです。

例えば:

def _compute_workers(self, cr, uid, ids, fieldname, arg, context=None):
    result = dict.fromkeys(ids, False) # default result for each id
    for this in self.browse(cr, uid, ids, context=context):
        # let's assume you have a one2many called worker_ids
        result[this.id] = len(this.worker_ids)
    return result

_columns = {
    'total_workers': fields.function(_compute_workers, type="integer",
                                     string="Total Workers")
}

この時点で、OpenERP API の概要とその使用方法を把握するために、OpenERP 技術メモOpenERP フレームワークのドキュメントをよく確認することをお勧めします :-)

モデルの構造、さまざまなフィールド タイプ、CRUD メソッド、および継承パターンを十分に理解したら、公式モジュールのソース コードをすばやく参照して、達成したいことの例を見つけることができるはずです。これであなたの人生はもっと楽になるはずです!

于 2013-04-29T08:57:55.037 に答える