[quote author=Jimboo link=topic=2189.msg6951#msg6951 date=1286245600]
本人刚接触,想了解一下是OpenERP否达到市面上流行的ERP,如易飞、天思、金蝶、用友所具备的一切功能及其稳定性是否可靠!
如果这样,哪对于我们这些ERP实施工程师们将是一个很大的福音!希望大家努力!
[/quote]
就这一点我说点浅薄的意见啊!
市面上流行的ERP,我只接触过用友(我们公司以前用的U8),金蝶(我老婆他们公司用的K3)
OE基本还只是在一个初始阶段,基本的模块还是有的,不过我至今没接触过质检模块。稳定性和可靠性要看你怎么理解了!另外呢,
对于财务报表的实际应用,还有待商榷!
既然你称自己为ERP实施工程师,那你自己就多花点时间研究一下!
我眼中的OE是,不是那么严谨,但是开发比较方便!如果有自己的开发人员,实施配置开发,响应比较快!
lygping
-
OpenERP一是慢,二还需技术支持? -
[已解决]OpenERP 中这个SQL 怎么解读? PostgreSQL 达人勿喷.自问自答!
哈哈 -
Openerp工作机会兴趣是有的,就是机会如何呢?
重庆倒是个不错的地方!
就是有点远了!呵呵 -
求助这段fnct_search代码,帮忙解释一下![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])]
-
求助这段fnct_search代码,帮忙解释一下!这段源代码是 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 -
求助这段fnct_search代码,帮忙解释一下!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.
却没有执行里面的循环! -
求助这段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] -
【牛逼设计】OpenERP销售模块中的库链应用也膜拜一下!
-
OpenERP应用和开发基础(第二版)开班了老肖辛苦了,学习了!
-
[分享] 关于多对象数据导出的实践公司采购需要把一个数据导出到一张表里, 但是这些数据来自不同的Object,想从最后的质检结果里,导出产品名称,PO号,产品的运输单位,以及其他一些信息。
经过shelly的指点,
通过browse 回写,直接用function的方式,把这些数据都抓来! def _getsupplier(self,cr,uid,ids,field_name,arg,context={}):<br /> res={}<br /> <br /> for record in self.browse(cr,uid,ids,context):<br /> res[record.id]=record.orderline_id.order_id.partner_id.name<br /> return res<br /> def _getprice(self,cr,uid,ids,field_name,arg,context={}):<br /> res={}<br /> <br /> for record in self.browse(cr,uid,ids,context):<br /> res[record.id]=record.orderline_id.product_id.standard_price<br /> return res<br /> def _getunitqty(self,cr,uid,ids,field_name,arg,context={}):<br /> res={}<br /> <br /> for record in self.browse(cr,uid,ids,context):<br /> res[record.id]=record.orderline_id.order_id.carrier_id.weight_unit<br /> return res<br /> def _getsappo(self,cr,uid,ids,field_name,arg,context={}):<br /> res={}<br /> <br /> for record in self.browse(cr,uid,ids,context):<br /> res[record.id]=record.orderline_id.order_id.sap_po<br /> return res
添加字段:'suppliers':fields.function(_getsupplier,method=True,type ='char',string ='suppliers'), <br /> 'price':fields.function(_getprice,method=True,type='float',string='Prices'),<br /> 'unitqty':fields.function(_getunitqty,method=True,type='integer',string='Uint qty'),<br /> 'sappo':fields.function(_getsappo,method=True,type ='char',string ='SAP PO'),
然后到了前台,导出的时候,居然找不到这些字段, 后来在xml文件里把它们都添加上,发现就可以找到相对用的字段了!
<br /> <field name="price" string="price" invisible="True"/><br />
因为太多字段来,影响前台显示,而且价格等也不希望被别的组的人看到!
给加上了 invisible="True",就解决了!
这里谢谢 shelly! -
Report 开发求助!终于发现这个问题了!
原来是 name="roquette.coa" 两个都一样了!
修改成两个不同的名字,就可以了!呵呵!
终于OK了!呵呵! -
Report 开发求助!大家好,我设计了两个报表,公用同一个rml文件!
一个指向 stock_tracking,一个指向stock_production_lot.
但是只有stocking_production_lot 的报告,能正确显示数据,
stock_tracking里显示的都是空白!
还请指教一下!
<report auto="False" id="report_roquette_coa_tracking" model="stock.tracking" name="roquette.coa" rml="roquette/report/coa.rml"
string="COAII"/>
<report auto="False" id="report_roquette_coa_prodlot" model="stock.production.lot" name="roquette.coa" rml="roquette/report/coa.rml" string="COAI"/>
这个是view 里的。
class roquette_coa_tracking(report_sxw.rml_parse):
def init(self, cr, uid, name, context):
super(roquette_coa_tracking, self).init(cr, uid, name, context)
self.localcontext.update({
'time': time,
'user': self.pool.get('res.users').browse(cr, uid, uid, context)
})
report_sxw.report_sxw('report.roquette.coa','stock.tracking','addons/roquette/report/coa.rml',parser=roquette_coa_tracking)
class roquette_coa_prodlot(report_sxw.rml_parse):
def init(self, cr, uid, name, context):
super(roquette_coa_prodlot, self).init(cr, uid, name, context)
self.localcontext.update({
'time': time,
'user': self.pool.get('res.users').browse(cr, uid, uid, context)
})
report_sxw.report_sxw('report.roquette.coa','stock.production.lot','addons/roquette/report/coa.rml',parser=roquette_coa_prodlot)
report。py 文件。 -
【请教语法】关于write search 和get谢谢楼上的,
后来我直接在语句里插入一个 if 判断语句,也可以实现功能。 -
求助:' list' object can not be callable大家好,我新建了一个wizard,
主要功能是,从'stock.production.lot',选择一项,读取当前行的数据,然后把这个数据用create方法写到另一个Object里,
但是报错 ' list' object can not be callable
我想错误应该在 pick = picking_obj.browse(cr, uid, data['id'], context) 这一句里,但是不知道应该如何修改!
还请大家帮忙!
def _sample2_create(obj, cr, uid, data, context):
picking_obj=pooler.get_pool(cr.dbname).get('stock.production.lot')
pick = picking_obj.browse(cr, uid, data['id'], context) # 参照 stock/wizard/wizard_invoice_onshipping.py 写的
tracking_id=self.pool.get('stock.tracking').create(cr, uid, {
'orderline_id': pick.orderline_id,
'prodlot_id': pick.id,
# add real batch NO into vichical lot
'realbatch': pick.realbatch,
'serial': ref,
'state': 'wait',
} )
return tracking_id
##########################################################################################################################################
class wizard_stock_sample2_create(wizard.interface):
states = {
'init': {
'actions': [],
'result': {'type': 'action', 'action': [_sample2_create], 'state':'end'}
}
}
wizard_stock_sample2_create('stock.sample2.create') -
【请教语法】关于write search 和getfor 循环是个错误,已经去掉!
关系说明也补充在里面!谢谢楼上啊! -
【请教语法】关于write search 和get说明一下啊:这里是程序的主要代码!
被注释掉的两句是原来的!
剩下的都是后改的!
程序背景: 两个object: 'purchase.order.line' 字段state, prodlot_id
'stock.production.lot' 字段 state
为了实现的目的是:当approve PO的时候,把 'purchase.order.line' 里'state','=', 'complied' 改成 appvoed
同时 把 相应的 'stock.production.lot' 字段 state 也改成 appvoed
这里的对应关系是'purchase.order.line' 的 prodlot_id = 'stock.production.lot' 的id
[glow=red,2,300]但是下面的代码报错 list out of range[/glow]
# 将 POline的状态写成 approve 测试没问题!
pol_ids= self.pool.get('purchase.order.line').search(cr, uid,[( 'state','=', 'complied')] )
self.pool.get('purchase.order.line').write(cr, uid, pol_ids, {'state': 'approved'} )
#将 stock_production_lot 的状态写成 approve,问题就在这里!
#读取 prodlot_id 的值,并赋予 values,但是这里用了POL_IDS ,不知道是否可以这样用!
values= self.pool.get('purchase.order.line').read(cr,uid,pol_ids,['prodlot_id']) [glow=red,2,300] 问题所在[/glow]
#查询 'stock.production.lot' id 等于 'prodlot_id'
lot_id= self.pool.get('stock.production.lot').search(cr, uid,[( 'id','in', 'values')] ) [glow=red,2,300]问题所在[/glow]
# 写数据 。
self.pool.get('stock.production.lot').write(cr, uid, lot_id, {'state': 'approved'} )
#self.pool.get('purchase.order.line').write(cr, uid, [orderline.id], {'state': 'approved'} )
#self.pool.get('stock.production.lot').write(cr, uid, [orderline.prodlot_id.id], {'state': 'approved'} ) -
【请教语法】关于write search 和getfor orderline in purchase.order_line:
self.pool.get('purchase.order.line').write(cr, uid, [orderline.id], {'state': 'approved'} )
这里是我的原来的语句!
转身 8:56:44
直接把所有的都写成了 approved
shelly→水 8:56:44
然后?
转身 8:56:52
我想修改一下!
shelly→水 8:56:56
改成啥?
转身 8:57:11
只把里面state 为 confirm 改成approved
转身 8:57:17
其他的不改
shelly→水 8:57:24
那你要在前面查询. shelly→水 8:58:52
你应该
op_ids = self.pool.get('purchase.order.line').search(cr.uid[('state','=','confirm')]
for op_id in op_ids:
self.pool.get('purchase.order.line').write(cr, uid, op_id, {'state':'confirm'})
shelly→水 8:59:08
先查询出ID. 然后遍历ID 使用write 方法
shelly→水 8:59:13
应该也可以不用遍历.
shelly→水 8:59:26
直接
self.pool.get('purchase.order.line').write(cr, uid, op_ids, {'state':'confirm'})
shelly→水 8:59:34
直接 操作 op_ids 就行了.
转身 8:59:51
我试试看,
转身 9:02:48
老将出马,一个顶三!
转身 9:07:46
谢谢shelly [/sup]
self.pool.get('stock.production.lot').write(cr, uid, [orderline.prodlot_id.id], {'state': 'approved'} )。然后我又有另外一句也需要这么修改!
我按照shelly的方式 依葫芦画瓢,
op_ids=self.pool.get('stock.production.lot').search(cr,uid,[('state','=','cinfirmed)])
self.pool.get('stock.production.lot').write(cr, uid, op_ids, {'state': 'approved'} ).
就不起作用!
我想这里主要的还是因为 [orderline.prodlot_id.id]
因为write的时候,[orderline.prodlot_id.id] ,是把orderline 里面prodlot_id 传输给'stock.production.lot',然后把这条记录的state给改写了!
但是在search 的时候,怎样才能把 orderline 里的 prodlot_id 传输给search呢?
写个SQL 语句,循环一下,还是 有直接的方法呢?
不知道哪位前辈指点一下?
谢谢了先! -
【已经解决】action 的显示问题!跟大家请教一下!
如果想控制 一个action button 的显示, 一般是怎么做的呢?
比如, 一个采购订单, 我里面添加了一个 质检状态字段: 等待质检, 质检通过, 质检未通过。
然后, 我想只有在质检通过的情况下,
purchase approve 这个 按钮才显示, 其他状态不显示。
group是用来控制组的, 这个应该不是组的问题!
请问应该怎么搞呢?
谢谢啊! -
改版后首次报到关键是我找不到我的收藏夹了,我收藏的帖子啊,你们在哪里啊?
-
【求助】库存实现当月出入库汇总已经搞定,主要的问题还是时间控制的问题