跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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 无法做到动态更新明细表的下拉列表选择项

OpenERP 无法做到动态更新明细表的下拉列表选择项

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

    看过很多官方模块,都没有一个例子能解决当父表的某个字段更新时,明细表的下拉列表中的选择项进行相应的变化。例如,开采购订单时,在父表选择好供应商后,在订单明细表选择产品时,希望列出的产品都是与父表对应供应商能提供的产品。或者在销售模块中,当我按订单行开发票时,在父表选择好关联订单后,产品一栏中应该只显示该关联订单明细中的产品,而不是显示所有产品。看过官方的编程手册,似乎没有什么办法能解决此类问题。但现实工作中,如果明细行中的下拉列表不能与父表中的相应字段进行联动,用户很容易出错。

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

      楼主看得不仔细啊。addons里这种玩法太多了,最直观的就是:在订单视图(VIEW)的product_id字段上加一个

      contex=“{'partner_id':parent.partner_id}" 
      

      (销售订单上默认好象已经有了)
      然后覆写product对象上的search方法,根据context中的partner_id也就是订单主表上的partner, 和‘product.supplierinfo'对象中的产品与供应商的关系过滤出该供应商所供货的产品,吧结果放到search方法的domain中,即可。

         

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

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

        我只想回复说:"能"
        只是你不会玩...

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

          😄

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

            感谢 digitalsatori 详细回复。按照这个思路,在订单明细列表中试验成功。谢谢!

            在没有在本论坛发问之前就下结论说不能,实在惭愧。不过本人确实没有在 addons 代码中找到类似的用法。

            而且到现在也没弄明白为什么在明细表中按下向下箭头时能触发 product 的 search 方法,而将明细表中的 product 换成

            另一个自定义的表后,按下向下箭头时却不能触发该自定义表的 search 方法。

            另外,经过不懈努力,在github 中找到一个对应的模块,能解决供应商限定产品的问题:
            https://github.com/eoconsulting/purchase_supplier

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

              感谢各位指点,此问题已经完满解决。答案就在按下每个下拉列表的向下箭头时,会自动调用对应表的 name_search 方法,在此方法里还可以调用 search 方法,当然也可以不调用。如果不调用 search 方法,就没有必要去覆写它。完整的示例就是上条回复提到的:https://github.com/eoconsulting/purchase_supplier

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

                很不错的问题,谢谢楼主分享,赶紧动手试试

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

                  @Kenny 你提到的那个模块好象写得不对啊,这个模块能实现你的要求? 而且这个模块的写法基本上可以说是写OpenERP模块的反面教材。

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

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

                    @digitalsatori  这个模块覆写了product 的 name_search 方法,并且用 partner_id 来限定下拉列表中的值,能解决选择问题,但其中大量直接使用 SQL 语句,我并不提倡。

                    我在这里举这个示例,只是想说明用户在下拉列表中选择前系统会自动调用 name_search 方法,在name_search中再显式调用search方法。
                    因为我一开始没有注意到在下拉列表中输入时,系统会调用 name_search方法,我以为是调用search方法,其实是在选择下拉列表中“搜索更多...“时系统才会自动调用search方法。

                    我的代码没有示例中这么复杂(我的代码是解决一个类似问题,并不是由供应商限定产品选择问题),只有如下几句:
                        def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100):
                            if not args:
                                args = []
                            if name:
                                ids = set()
                                ids = self.search(cr, user, args + [('name',operator,name)], limit=(limit and (limit-len(ids)) or False) , context=context)
                            else:
                                ids = self.search(cr, user, args, limit=limit, context=context)
                               
                            result = self.name_get(cr, user, ids, context=context)
                            return result
                        def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
                            if context is None:
                                context = {}
                            if context and context.get('order_id', False):
                                args.append((('order_id', '=', context['order_id'])))
                            return super(purchase_order_line, self).search(cr, uid, args, offset=offset, limit=limit, order=order, context=context, count=False)

                    问题就解决。当然还可以更完美一些。

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

                      这样是否比较简单: [检测到链接无效,已移除]

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

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

                        @digitalsatori 确实很简洁、优雅,佩服!

                        国外论坛也有很多人问到这个问题,但我没有发现很好的答案。改天我把你这个转国外论坛去,可以吗?

                        fabien 本人也回答过这个问题,但很简短,老外看完后也一样找不到答案。一个老帖子:<br / http://forum.openerp.com/forum/topic9131.html br />
                        fabien 的回答是这样的:
                        Search, in the technical documentation for:
                        * domain (to apply on the product_id of the purchae order line)
                        * name_search (to apply on the supplier list on product form)

                        By using both, it should do the trick.

                        这个答案对懂的人一看就明白,对不懂的人还是不懂。

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

                          name_search 对记录搜索的实现最后还是要用到对象的search方法,简单的说name_search就是用来实现模糊查询的方法。比如在product模块里的name_search, 你输入了一个查询字串,OpenERP先去根据“产品编码”搜索,如果搜不到,再把你的字串当条码搜索,还搜不到,再去跟产品编码部分匹配,等等(你完全可以自定义这个name_search方法来适应你自己模糊查询的要求)

                          欢迎转载

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

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

                            就是你说的意思。

                            我这里强调name_search的调用是当用户在下拉列表中输入字符或按下向下箭头时,由系统自动调用的,而 search 方法是当用户从列表中选择”搜索更多...“链接后系统才调用。这个问题困惑我几天才找到答案。我一开始以为当用户在下拉列表中输入时,系统就会调用 search 方法,实际上不是,需要在 name_search 中显式调用 search 方法才行。

                            1 条回复 最后回复
                            0

                            • 登录

                            • 没有帐号? 注册

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