Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

求助这段fnct_search代码,帮忙解释一下!



  • [size=18pt]我想对一个function字段进行搜索,经过大家指点,知道了这个方法!只是本人语言基础薄弱!
    想请大家指点一下!

    [code]def _invoice_search(self, cursor, user, obj, name, args): # 这里是定义这个搜索的功能!
            if not len(args):              # args 应该是指我们搜索的时候输入的条件
                return []
            invoice_obj = self.pool.get('account.invoice') # 这里定义了将要搜索用到的 object

            i = 0                                      # 这一段是我不明白的地方!
            while i < len(args):             
                fargs = args[i][0].split('.', 1)
                if len(fargs) > 1:
                    args[i] = (fargs[0], 'in', invoice_obj.search(cursor, user,
                        [(fargs[1], args[i][1], args[i][2])]))
                    i += 1
                    continue
                if isinstance(args[i][2], basestring):
                    res_ids = invoice_obj.name_search(cursor, user, args[i][2], [],
                            args[i][1])
                    args[i] = (args[i][0], 'in', [x[0] for x in res_ids])
                i += 1
            qu1, qu2 = [], []
            for x in args:
                if x[1] != 'in':
                    if (x[2] is False) and (x[1] == '='):
                        qu1.append('(i.id IS NULL)')
                    elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='):
                        qu1.append('(i.id IS NOT NULL)')
                    else:
                        qu1.append('(i.id %s %s)' % (x[1], '%s'))
                        qu2.append(x[2])
                elif x[1] == 'in':
                    if len(x[2]) > 0:
                        qu1.append('(i.id in (%s))' % (','.join(['%s'] * len(x[2]))))
                        qu2 += x[2]
                    else:
                        qu1.append(' (False)')
            if len(qu1):
                qu1 = ' AND' + ' AND'.join(qu1)
            else:
                qu1 = ''
    # 执行搜索语句,从两个 object的表里,搜索 这个ID,其实也就是上面一段产生的 根据输入的 args 产生的结果!
            cursor.execute('SELECT l.id ' <br />                'FROM account_move_line l, account_invoice i ' <br />                'WHERE l.move_id = i.move_id ' + qu1, qu2)
            res = cursor.fetchall()
    # 这里也不太明白!貌似全部返回!
            if not len(res):   
                return [('id', '=', '0')]
            return [('id', 'in', [x[0] for x in res])][/code]


    另外,我要搜索的字段是 一个PO号,类似于 45000122458,虽然看上去是 数字,但是系统定义的类型是 char
    而输入搜索条件的时候,却是4500122这样的数字,恐怕要先把这个数字转换成 字符型!

    先请大家有空的时候,帮忙解释上面的那段语句吧!
    这里先谢谢了![/size][/size]



  • [size=18pt]我想对一个function字段进行搜索,经过大家指点,知道了这个方法!只是本人语言基础薄弱!
    想请大家指点一下!

    [code]def _invoice_search(self, cursor, user, obj, name, args): # 这里是定义这个搜索的功能!
            if not len(args):              # args 应该是指我们搜索的时候输入的条件
                return []
            invoice_obj = self.pool.get('account.invoice') # 这里定义了将要搜索用到的 object

            i = 0                                      # 这一段是我不明白的地方!
            while i < len(args):             
                fargs = args[i][0].split('.', 1)
                if len(fargs) > 1:
                    args[i] = (fargs[0], 'in', invoice_obj.search(cursor, user,
                        [(fargs[1], args[i][1], args[i][2])]))
                    i += 1
                    continue
                if isinstance(args[i][2], basestring):
                    res_ids = invoice_obj.name_search(cursor, user, args[i][2], [],
                            args[i][1])
                    args[i] = (args[i][0], 'in', [x[0] for x in res_ids])
                i += 1
            qu1, qu2 = [], []
            for x in args:
                if x[1] != 'in':
                    if (x[2] is False) and (x[1] == '='):
                        qu1.append('(i.id IS NULL)')
                    elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='):
                        qu1.append('(i.id IS NOT NULL)')
                    else:
                        qu1.append('(i.id %s %s)' % (x[1], '%s'))
                        qu2.append(x[2])
                elif x[1] == 'in':
                    if len(x[2]) > 0:
                        qu1.append('(i.id in (%s))' % (','.join(['%s'] * len(x[2]))))
                        qu2 += x[2]
                    else:
                        qu1.append(' (False)')
            if len(qu1):
                qu1 = ' AND' + ' AND'.join(qu1)
            else:
                qu1 = ''
    # 执行搜索语句,从两个 object的表里,搜索 这个ID,其实也就是上面一段产生的 根据输入的 args 产生的结果!
            cursor.execute('SELECT l.id ' <br />                'FROM account_move_line l, account_invoice i ' <br />                'WHERE l.move_id = i.move_id ' + qu1, qu2)
            res = cursor.fetchall()
    # 这里也不太明白!貌似全部返回!
            if not len(res):   
                return [('id', '=', '0')]
            return [('id', 'in', [x[0] for x in res])][/code]


    另外,我要搜索的字段是 一个PO号,类似于 45000122458,虽然看上去是 数字,但是系统定义的类型是 char
    而输入搜索条件的时候,却是4500122这样的数字,恐怕要先把这个数字转换成 字符型!

    先请大家有空的时候,帮忙解释上面的那段语句吧!
    这里先谢谢了![/size][/size]



  • [code]def _sappo_search(self, cursor, user, obj, name, args):

            if not len(args):

                return []

            sappo_obj = self.pool.get('purchase.order')

            fp = file('ping.txt','a+')

            fp.write(str(args)+'\n')

            fp.close

            i = 0

            while i < len(args):

                fargs = args[i][0].split('.', 1)

                if len(fargs) > 1:

                    args[i] = (fargs[0], 'in', sappo_obj.search(cursor, user,

                        [(fargs[1], args[i][1], args[i][2])]))

                    i += 1

                    continue

                if isinstance(args[i][2], basestring):

                    res_ids = sappo_obj.name_search(cursor, user, args[i][2], [],

                            args[i][1])

                    args[i] = (args[i][0], 'in', [x[0] for x in res_ids])

                i += 1

            qu1, qu2 = [], []

            for x in args:

                if x[1] != 'in':

                    if (x[2] is False) and (x[1] == '='):

                        qu1.append('(i.id IS NULL)')

                    elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='):

                        qu1.append('(i.id IS NOT NULL)')
                 

                    else:

                        qu1.append('(i.id %s %s)' % (x[1], '%s'))

                        qu2.append(x[2])

                elif x[1] == 'in':

                    if len(x[2]) > 0:

                        qu1.append('(i.id in (%s))' % (','.join(['%s'] * len(x[2]))))

                        qu2 += x[2]

                    else:

                        qu1.append(' (False)')

            if len(qu1):

                qu1 = ' AND' + ' AND'.join(qu1)

            else:

                qu1 = ''

            SQL = ('SELECT l.id ' <br />
                    'FROM stock_production_lot l, purchase_order i ' <br />
                    'WHERE l.order_id = i.id ' + qu1, qu2)

            fp = file('pingsql.txt','a+')

            fp.write(str(SQL)+'\n')

            fp.close

           

            cursor.execute('SELECT l.id ' <br />
                    'FROM stock_production_lot l, purchase_order i ' <br />
                    'WHERE l.order_id = i.id ' + qu1, qu2)

            res = cursor.fetchall()

            if not len(res):

                return [('id', '=', '0')]

            return [('id', 'in', [x[0] for x in res])][/code]

    输出的 args如下


    [('sappo', 'ilike', '4500')]

    [('sappo', 'ilike', '4500')]

    [('sappo', 'ilike', '4500')]

    [('sappo', 'ilike', '4500')]

    而得到的SQL语句却没有任何参数得到!

    ('SELECT l.id FROM stock_production_lot l, purchase_order i WHERE l.order_id = i.id  AND (False)', [])

    按道理,'4500'类型应该是  string.
    却没有执行里面的循环!


  • 管理员

    不知道你这段代码来自哪里,但是可以肯定的是这段代码写得非常有问题。你如果能告诉我们这段代码在哪个模块里写在那个类里,对分析代码会有帮助。

    为了让你理解这段代码的意思,你可以试着假设args = [('module1.field1','like', 'something'), ('module2.field2','=', 1)] ,然后代入代码中
    fargs 就是 [module1, field1]或者 [module2, field2]
    再继续下去你应该就能理解这段代码了。

    但是,还是不建议你读这段代码,写得实在不咋的,会把你带坏的 :P



  • 这段源代码是 acount_move_line.py 第284行开始!
    功能是定义了一个fucntion字段,但是function字段搜索功能是要自己创建的!

    我自己也定义了一个function字段,也想创建这个搜索功能!
    args = [('module1.field1','like', 'something'), ('module2.field2','=', 1)] ,您说的这个我明白的!
    但是我遇到做的程序就一直出错!

    不是程序流程的错误!而是字段类型的问题!
    当我把搜索的,module2.field = 1,这里的feild 选择为 int 型的,功能没有问题,可以实现!
    但是如果 feild 为char型的,而不巧的是,我的char 确实一串 45007846这样的数字,就报错了! In types charcter varying and interger cannot be matched



  • 还是你的总体需求, 不被大家了解. 所以不好帮到你.

    1 你改了哪些东西?

    2 你在哪个对象上面添加了 function 字段?

    3 在这个对象的搜索里面, 你希望 从哪些数据中搜索到? 也就是你期望 的结果 是一个什么样的查询?



  • [quote author=mrshelly link=topic=2156.msg6780#msg6780 date=1284083072]
    还是你的总体需求, 不被大家了解. 所以不好帮到你.

    1 你改了哪些东西?

    2 你在哪个对象上面添加了 function 字段?

    3 在这个对象的搜索里面, 你希望 从哪些数据中搜索到? 也就是你期望 的结果 是一个什么样的查询?
    [/quote]

    shelly, 首先谢谢你给的帮助!
    第一个问题, 我的系统已经被改的面目全非, 所以呢,沟通起来有些麻烦!
    第二个问题,function字段,是我从 Purchase order里抽取了一个字段sappo到 stock_tracking.
    第三个问题,在stock_tracking tree上,能够按照sappo搜索 tree.
    其实就是stock_tracking有个function字段 SAPPO
    给他写个search, 可以搜索而已!
    经过反复测试 ,以及 shelly,黑JJ,校长的指导和帮助!
    得到以下的代码!
    虽然得到了结果,不过感觉写的不是很好!
    最重要的是,给我一楼的代码 误导了不少!一直在考虑那些个 frags啊什么的!
    其实中心就是, 根据args 搜索 stock_tracking 的ID, 返回。
    然后 ID就是  strock_tracking 里 order_id 和purchase_order.id ,purchase_order.sap_po ilike args.
    这里我抛弃了 Ilike,直接用了 ~,
    功能是实现了!但是不是很好的一段代码!
    还请大家指正!


    [code]def _sappo_search(self, cursor, user, obj, name, args):
          # fp = file('pingargs.txt','a+')
          # fp.write(str(args)+'\n')
          # fp.close 
            if not len(args):
                return []
       
            qu1, qu2 = [], []
            for x in args:         
                if x[1] == 'ilike':
                    if len(x[2]) > 0:
                        qu1.append(' i.sap_po ~
    ' )
                    qu2 = x[2]
                else:
                        qu1.append(' (False)')
            if len(qu1):
                qu1 = ' AND' + ' AND'.join(qu1)
            else:
                qu1 = ''
            sql =  """ SELECT l.id FROM stock_tracking l, purchase_order i WHERE l.order_id = i.id  %s'%s'""" % (qu1, qu2,)
          # fp = file('pingsql.txt','a+')
          # fp.write(str(sql)+'\n')
          # fp.close 
            cursor.execute(sql)
            res = cursor.fetchall()
            if not len(res):
                return [('id', '=', '0')]
            return [('id', 'in', [x[0] for x in res])][/code]



  • 感谢分享,请校长及shelly及时回复为盼。



  • 严重看不懂... 严重不关注...
    严重事不关已....


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待