跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 库存明细报表的实现

库存明细报表的实现

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
7 帖子 5 发布者 6.4k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Q 离线
    Q 离线
    qdfulee
    写于 最后由 编辑
    #1

    OE当前的功能里,查询库存要么是所有产品所有库位一张表,要么是一个产品在不同库位的数量分布,无法在一张表上实现多个产品多个库位的明细。
    于是就有了如下的代码:

    # -*- coding: utf-8 -*-<br />from openerp.osv import osv,fields<br />from lxml import etree<br />from openerp import tools<br /><br /><br />class product_product(osv.osv):<br />&nbsp; &nbsp; _inherit = &quot;product.product&quot;<br /><br />&nbsp; &nbsp; def fields_view_get(self, cr, uid, view_id=None, view_type=&#039;form&#039;, context=None, toolbar=False, submenu=False):<br />&nbsp; &nbsp; &nbsp; &nbsp; res = super(product_product, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)<br />&nbsp; &nbsp; &nbsp; &nbsp; if context.get(&#039;inventory_list&#039;) == True and view_type == &#039;tree&#039;:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loc_obj = self.pool.get(&#039;stock.location&#039;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; locations = loc_obj.browse(cr, uid, loc_obj.search(cr, uid, [(&#039;child_ids&#039;, &#039;=&#039;, False), (&#039;usage&#039;, &#039;=&#039;, &#039;internal&#039;)]))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; view = etree.fromstring(res&#91;&#039;arch&#039;])<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fields_list = res&#91;&#039;fields&#039;]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for location in locations:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fields_list[tools.ustr(location.id)+&#039;-real&#039;] = {&#039;type&#039;: &#039;float&#039;, &#039;string&#039;: location.name+&#039;-实际库存&#039;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fields_list[tools.ustr(location.id)+&#039;-virtual&#039;] = {&#039;type&#039;: &#039;float&#039;, &#039;string&#039;: location.name+&#039;-账面库存&#039;}<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; etree.SubElement(view, &#039;field&#039;, {&#039;name&#039;: tools.ustr(location.id)+&#039;-real&#039;})<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; etree.SubElement(view, &#039;field&#039;, {&#039;name&#039;: tools.ustr(location.id)+&#039;-virtual&#039;})<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res&#91;&#039;arch&#039;] = etree.tostring(view)<br />&nbsp; &nbsp; &nbsp; &nbsp; return res<br /><br />&nbsp; &nbsp; def read(self, cr, uid, ids, fields=None, context=None, load=&#039;_classic_read&#039;):<br />&nbsp; &nbsp; &nbsp; &nbsp; result = super(product_product, self).read(cr, uid, ids, fields=fields, context=context)<br />&nbsp; &nbsp; &nbsp; &nbsp; if context.get(&#039;inventory_list&#039;) == True:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; locations = &#91;]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for field in fields:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s = field.split(&#039;-&#039;)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if len(s) == 2:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if s[1] == &#039;real&#039;:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; locations.append(int(s[0]))<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = 0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for id in ids:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for location in locations:<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context&#91;&#039;location&#039;] = location<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; val = super(product_product, self).read(cr, uid, id, &#91;&#039;qty_available&#039;, &#039;virtual_available&#039;], context, )<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result[i][tools.ustr(location)+&#039;-real&#039;] = val&#91;&#039;qty_available&#039;]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result[i][tools.ustr(location)+&#039;-virtual&#039;] = val&#91;&#039;virtual_available&#039;]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i += 1<br />&nbsp; &nbsp; &nbsp; &nbsp; return result
    



    实现的效果附件


    1 条回复 最后回复
    0
    • C 离线
      C 离线
      ccdos
      写于 最后由 编辑
      #2

      谢谢分享,

      又学了一招

      1 条回复 最后回复
      0
      • N 离线
        N 离线
        nmglyy
        写于 最后由 编辑
        #3

        这个是怎么用啊。。没看懂

        1 条回复 最后回复
        0
        • Q 离线
          Q 离线
          qq342406169
          写于 最后由 编辑
          #4

          能否讲解下怎么用呢

          1 条回复 最后回复
          0
          • Q 离线
            Q 离线
            qdfulee
            写于 最后由 编辑
            #5

            后台代码在附件中。说明下,前台显示的二级表头不是我做的,不能上传,见谅。
            目前这个版本的效率不高,希望高手能优化下。

            模块设计思路:

            1、库存明细表是通过 fields_view_get 动态生成的。
            2、不同库位的库存根据系统stock里product.product 中的字段 qty_available,virtual_available 读出。这两个字段的值是依据context里不同库位读出。我是通过这个功能循环产品id和库位id读出的。(这个方法挺笨的)
            3、功能入口通过向导进入。向导生成的菜单如下图:
            [attachimg=2]

            如果安装出错,可能需要把 product.py里 fields_view_get()中下几句代码:
            etree.SubElement(view, 'field', {'name': tools.ustr(location.id)+'-real', 'th_string':location.name, 'colspan':'2'})
            etree.SubElement(view, 'field', {'name': tools.ustr(location.id)+'-virtual','colspan':'1'})
            etree.SubElement(view, 'field', {'name': 'qty_available', 'string': u'实际库存', 'th_string': u'汇总', 'colspan':'2'})
            etree.SubElement(view, 'field', {'name': 'virtual_available', 'string': u'账面库存', 'colspan':'1'})
            中的'th_string' 和'colspan' 标签去掉。

            1 条回复 最后回复
            0
            • 3 离线
              3 离线
              387912318
              写于 最后由 编辑
              #6

              感谢分享!

              1 条回复 最后回复
              0

              • 登录

              • 没有帐号? 注册

              • 登录或注册以进行搜索。
              • 第一个帖子
                最后一个帖子
              0
              • 版块
              • 标签
              • 热门
              • 用户
              • 群组