跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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. OPENERP 库存管理源码分析(Functional Field 的个人理解)

OPENERP 库存管理源码分析(Functional Field 的个人理解)

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

    Functional FieldA functional field is a field whose value is calculated by a function (ratherthan being stored in the database).
    一个函数(功能)字段是一个被用于函数计算的值(而不是被存储在数据库的表当中的)
    如果想在视图TREE里筛选函数(功能)字段 需要实现[b]fnct_search[/b]的函数
    下面用两部分来分析
    Functional Field 一个是 库存模块内的 stock_production_lot 内的 'stock_available' 字段 是 fields.function类型 意思大概是 在内部类型的库位的有有生产批次的产品个数累计

    [[i] 本帖最后由 leetaizhu 于 2010-3-11 17:51 编辑 [/i]]

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

      就是说 fields.function( ) 第一个参数是计算的逻辑,第二个是筛选的逻辑?

      GoodERP -- Odoo China fork

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

        wjfonhand 说的对 就是这样 第一个参数是计算的逻辑,第二个是筛选的逻辑

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

          function 的字段,为了速度,还是可以保存最新值的

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

            function 的字段,应该不是为了速度,但它确实可以保存最新的值
            function字段我个人感觉它更像数据库中的函数
            比如 我们写一个SQL select s.no,s.name,dbo.f_数据库函数(s.id) from sample as s

            1 条回复 最后回复
            0
            • digitalsatoriD 离线
              digitalsatoriD 离线
              digitalsatori 管理员
              写于 最后由 编辑
              #6

              oldrev的意思是,function字段的存在一般会严重影响程序的运行速度,所以我们也可以在function字段中加入store的属性,这样这个计算出的值是存入数据库的,只在需要的时候再重新运算。

              其中store参数的格式为:store={‘object_name’: (function_name,[‘field_name1’,’field_name2’],priority)}
              是当object_name的field_name1, field_name2 ...发生变化时调用function_name,并将返回的值作为函数字段的对应函数

              另外还有一个multi的属性可以配合function字段以提高其运行效率,详情请参见: shine-it.net/redirect.php?fid=3&tid=842&goto=nextnewset

              【上海先安科技】(tony AT openerp.cn)

              1 条回复 最后回复
              0
              • L 离线
                L 离线
                leetaizhu
                写于 最后由 编辑
                #7

                oldrev的意思 是告诉我 function字段类型的 fnct_inv 的用法 . 太不好意思了 没有仔细看 同时也 谢谢digitalsatori的指导
                基于库存管理 就用 stock_picking类(模块)来简单说明一下吧

                1 条回复 最后回复
                0
                • L 离线
                  L 离线
                  leetaizhu
                  写于 最后由 编辑
                  #8

                  重庆-mrshelly(49812643) 16:38:53
                  使用 Function 字段,基本上可以实现 凭空造数据的功能.
                  重庆-mrshelly(49812643) 16:39:19
                  也可用它来实现把其它数据库的数据表中的数据 整合到OE的对象中来的.

                  1 条回复 最后回复
                  0
                  • mrshellyM 离线
                    mrshellyM 离线
                    mrshelly
                    写于 最后由 编辑
                    #9

                    嗯. 理论上. 只要你的 class 对象里面 实现了
                    def search
                    def search_count
                    def read
                    def write
                    def create
                    def unlink

                    然后 在 read write create 中 有效地处理好你添加的 Function 字段的值就行了.
                    还可以做到, 为系统已有的 Object 添加一个其它地方的数据.

                    比如, 你有一网店系统, 上面有一个商品的上架数量(前提, 你OE的商品与你网店系统的商品ID,有一个关联表)

                    然后 你可以在OE 读商品的时候, 把 上架数 这个字段添加进去, 然后 在 read 里, 在 返回的 res 里. 每条记录,添加一个 上架数 字段, 字段值嘛, 你就可以在 def read 里, 查数据库呀. 调rpc 接口啊. 甚至 读文本文件呀什么的.都可以.

                    这样做了以后, 你就可以在OE中实时查看 对应商品在网店系统中的上架数了.

                    同样, 如果你想在OE中修改,
                    你只需要在 def write 中写一段代码. 得到新的修改的值, 然后 按网店系统的一些接口,或者直接写数据库等方式来更新到外部系统中..

                    还有一些例子. 以前在群里讨论过. 如, 人事系统中.. 人员的照片儿.. 默认的方式是保存在数据库的字段中. 这样一般会造成数据库的冗余与速度问题. 所以, 你可以重写 Image 字段为 Function Field ,然后在 create 方法去保存图片到文件系统中.

                    1 条回复 最后回复
                    0
                    • L 离线
                      L 离线
                      leetaizhu
                      写于 最后由 编辑
                      #10

                      产品链接装箱单的功能 用 温州-老梅 用 related属性 实现很简单

                      下面是用 Functional Field 实现 产品链接装箱单
                      [attach]507[/attach]

                      1 条回复 最后回复
                      0
                      • M 离线
                        M 离线
                        mihi
                        写于 最后由 编辑
                        #11

                        我也贴出我的思路,在stock.picking中添加一个字段
                        from osv import fields, osv
                        class stock_picking(osv.osv):
                        _name = 'stock.picking'
                        _inherit = 'stock.picking'
                        _columns = {
                        'product_ids': fields.related('move_lines','product_id',type="many2many",relation="product.product",string="Product",store=False)
                        }

                        stock_picking()
                        然后在视图中

                        <act_window
                        domain="[('product_ids','=','active_id')]"
                        id="act_picking_product_open"
                        name="Stock Picking"
                        res_model="stock.picking"
                        src_model="product.product"/>

                        1 条回复 最后回复
                        0
                        • L 离线
                          L 离线
                          leetaizhu
                          写于 最后由 编辑
                          #12

                          Sometimes you need to refer the relation of a relation. For example, supposing you have objects: City <- State <- Country, and you need to refer Country in a City, you can define a field as below in the City object:
                          'country_id': fields.related('state_id', 'country_id', type="many2one",
                          relation="module.country",
                          string="Country", store=False)
                          就是当 City <- State <- Country
                          就是想从孙子找爷爷的时候 用 related 哈哈哈

                          1 条回复 最后回复
                          0
                          • M 离线
                            M 离线
                            mihi
                            写于 最后由 编辑
                            #13

                            LTZ研究透彻深入学习!
                            并让我等明白function 字段的强大功能!

                            1 条回复 最后回复
                            0

                            • 登录

                            • 没有帐号? 注册

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