求助这段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])]