求助这段fnct_search代码,帮忙解释一下!
- 
[size=18pt]我想对一个function字段进行搜索,经过大家指点,知道了这个方法!只是本人语言基础薄弱! 
 想请大家指点一下!def _invoice_search(self, cursor, user, obj, name, args): # 这里是定义这个搜索的功能!<br />        if not len(args):              # args 应该是指我们搜索的时候输入的条件<br />            return []<br />        invoice_obj = self.pool.get('account.invoice') # 这里定义了将要搜索用到的 object<br /><br />        i = 0                                      # 这一段是我不明白的地方!<br />        while i < len(args):              <br />            fargs = args[i][0].split('.', 1)<br />            if len(fargs) > 1:<br />                args[i] = (fargs[0], 'in', invoice_obj.search(cursor, user,<br />                    [(fargs[1], args[i][1], args[i][2])]))<br />                i += 1<br />                continue<br />            if isinstance(args[i][2], basestring):<br />                res_ids = invoice_obj.name_search(cursor, user, args[i][2], [],<br />                        args[i][1])<br />                args[i] = (args[i][0], 'in', [x[0] for x in res_ids])<br />            i += 1<br />        qu1, qu2 = [], []<br />        for x in args:<br />            if x[1] != 'in':<br />                if (x[2] is False) and (x[1] == '='):<br />                    qu1.append('(i.id IS NULL)')<br />                elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='):<br />                    qu1.append('(i.id IS NOT NULL)')<br />                else:<br />                    qu1.append('(i.id %s %s)' % (x[1], '%s'))<br />                    qu2.append(x[2])<br />            elif x[1] == 'in':<br />                if len(x[2]) > 0:<br />                    qu1.append('(i.id in (%s))' % (','.join(['%s'] * len(x[2]))))<br />                    qu2 += x[2]<br />                else:<br />                    qu1.append(' (False)')<br />        if len(qu1):<br />            qu1 = ' AND' + ' AND'.join(qu1)<br />        else:<br />            qu1 = ''<br /># 执行搜索语句,从两个 object的表里,搜索 这个ID,其实也就是上面一段产生的 根据输入的 args 产生的结果!<br />        cursor.execute('SELECT l.id ' \<br />                'FROM account_move_line l, account_invoice i ' \<br />                'WHERE l.move_id = i.move_id ' + qu1, qu2)<br />        res = cursor.fetchall()<br /># 这里也不太明白!貌似全部返回!<br />        if not len(res):    <br />            return [('id', '=', '0')]<br />        return [('id', 'in', [x[0] for x in res])]
 另外,我要搜索的字段是 一个PO号,类似于 45000122458,虽然看上去是 数字,但是系统定义的类型是 char
 而输入搜索条件的时候,却是4500122这样的数字,恐怕要先把这个数字转换成 字符型!
 先请大家有空的时候,帮忙解释上面的那段语句吧!
 这里先谢谢了![/size][/size]
- 
def _sappo_search(self, cursor, user, obj, name, args):<br /><br />        if not len(args):<br /><br />            return []<br /><br />        sappo_obj = self.pool.get('purchase.order')<br /><br />        fp = file('ping.txt','a+')<br /><br />        fp.write(str(args)+'\n')<br /><br />        fp.close<br /><br />        i = 0<br /><br />        while i < len(args):<br /><br />            fargs = args[i][0].split('.', 1)<br /><br />            if len(fargs) > 1:<br /><br />                args[i] = (fargs[0], 'in', sappo_obj.search(cursor, user,<br /><br />                    [(fargs[1], args[i][1], args[i][2])]))<br /><br />                i += 1<br /><br />                continue<br /><br />            if isinstance(args[i][2], basestring):<br /><br />                res_ids = sappo_obj.name_search(cursor, user, args[i][2], [],<br /><br />                        args[i][1])<br /><br />                args[i] = (args[i][0], 'in', [x[0] for x in res_ids])<br /><br />            i += 1<br /><br />        qu1, qu2 = [], []<br /><br />        for x in args:<br /><br />            if x[1] != 'in':<br /><br />                if (x[2] is False) and (x[1] == '='):<br /><br />                    qu1.append('(i.id IS NULL)')<br /><br />                elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='):<br /><br />                    qu1.append('(i.id IS NOT NULL)')<br />              <br /><br />                else:<br /><br />                    qu1.append('(i.id %s %s)' % (x[1], '%s'))<br /><br />                    qu2.append(x[2])<br /><br />            elif x[1] == 'in':<br /><br />                if len(x[2]) > 0:<br /><br />                    qu1.append('(i.id in (%s))' % (','.join(['%s'] * len(x[2]))))<br /><br />                    qu2 += x[2]<br /><br />                else:<br /><br />                    qu1.append(' (False)')<br /><br />        if len(qu1):<br /><br />            qu1 = ' AND' + ' AND'.join(qu1)<br /><br />        else:<br /><br />            qu1 = ''<br /><br />        SQL = ('SELECT l.id ' \<br /><br />                'FROM stock_production_lot l, purchase_order i ' \<br /><br />                'WHERE l.order_id = i.id ' + qu1, qu2)<br /><br />        fp = file('pingsql.txt','a+')<br /><br />        fp.write(str(SQL)+'\n')<br /><br />        fp.close<br /><br />        <br /><br />        cursor.execute('SELECT l.id ' \<br /><br />                'FROM stock_production_lot l, purchase_order i ' \<br /><br />                'WHERE l.order_id = i.id ' + qu1, qu2)<br /><br />        res = cursor.fetchall()<br /><br />        if not len(res):<br /><br />            return [('id', '=', '0')]<br /><br />        return [('id', 'in', [x[0] for x in res])]
 输出的 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]
 再继续下去你应该就能理解这段代码了。
 但是,还是不建议你读这段代码,写得实在不咋的,会把你带坏的 
- 
这段源代码是 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
- 
[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,直接用了 ~*,
 功能是实现了!但是不是很好的一段代码!
 还请大家指正!def _sappo_search(self, cursor, user, obj, name, args):<br />      # fp = file('pingargs.txt','a+')<br />      # fp.write(str(args)+'\n')<br />      # fp.close  <br />        if not len(args):<br />            return []<br />    <br />        qu1, qu2 = [], []<br />        for x in args:          <br />            if x[1] == 'ilike':<br />                if len(x[2]) > 0:<br />                    qu1.append(' i.sap_po ~*' )<br />                qu2 = x[2]<br />            else:<br />                    qu1.append(' (False)')<br />        if len(qu1):<br />            qu1 = ' AND' + ' AND'.join(qu1)<br />        else:<br />            qu1 = ''<br />        sql =  """ SELECT l.id FROM stock_tracking l, purchase_order i WHERE l.order_id = i.id  %s'%s'""" % (qu1, qu2,) <br />      # fp = file('pingsql.txt','a+')<br />      # fp.write(str(sql)+'\n')<br />      # fp.close  <br />        cursor.execute(sql)<br />        res = cursor.fetchall()<br />        if not len(res):<br />            return [('id', '=', '0')]<br />        return [('id', 'in', [x[0] for x in res])]


