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

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

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

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

Mrp-operations 的workflow没有写入DB



  • 我在install mrp-operations之后,发现里面的按钮,还有workflow都不起作用。Debug之后,发现是workflow根本就没有写入DB,在wkf_instance表里查不到mrp.production.workcenter.line这个记录。

    有高手知道是什么原因吗?是不是这个module的继承有问题?



  • wkf_instance 中, 理论上应该是当业务产生后, 才会有数据.

    要确认工作流是否OK. 你应该看  wkf 以及 wkf_activxxx 表里, 如果对应工作流的节点数据库里有了. 那就意味着安装成功了.



  • 多谢高人指点,active是创建成功的,从instance的字面含义,我也猜想是需要根据实际业务产生数据。
    但当我在work order列表里点击'start_working'按钮的时候,什么反应也没有,Debug进去,就发现是去check instance这个表里有没有数据,没有的话,就退出了,所以很奇怪。



  • 那你debug 的时候, 如果有遇到代码 trg_create(.... 那就生成了. 如果没有. 那就是代码有问题.

    重点看看  modify_production_order_state 这个方法 里的
    trg_validate 部分代码.

    如果你的数据未 trg_validate 对应的工作流. ,那意味着, 你相关的数据未就绪.



  • 版主大人,我又跟踪了几遍,把mrp_operations这个模块反复升级了几次,发现在trg_create的时候,传入的res_type和res_id是wizard的,而不是具体的某个模块的。从trg_create的代码逻辑上看,这个函数应该是负责创建wkf_instance里的对象的,这样的话,传入的res_type和res_id就应该是当前升级的这个模块的。
    我也尝试了装载其他的一些模块,看看传入的值,发现都是一样:wizard,这让我很困惑,如果是这样的话,那wkf_instance表里的那些值是什么时候创建的呢?
    多谢!



  • 参阅: addons\mrp\mrp.py

    中  mrp.procurement 对象的  action_produce_assign_product 方法.

    触发  produce 动作, 应该就可以有 实例生成了.



  • 多谢版主大人。
    再多问一点菜鸟问题,我一直认为实例是在安装或者升级的时候创建的,并且只创建一次。如果是在某个动作触发时做的话,那是不是每次触发这个动作的时候,都要创建一次实例?从创建的代码逻辑里看,好像没有检测实例是否存在。
    不知道是不是这样子呢?



  • 好象是, 你每创建一个 mrp.producxxx 的对象, 就会有一个工作流实例创建.  (即, 一个工作流开始时, 会有一个 实例创建. 然后 这个工作流结束后, 这个实例也就被删除了.



  • 版主大人,我在openobject-developer里找到这样的说法:

    If your buttons do not seem to be doing anything, one of the following two things are likely:
    1. The record you are working on does not have a Workflow Instance record associated with it (it was probably
    created before you defined your workflow)

    2. You have not set the “osv” field correctly in your workflow XML file

    我遇到的情况非常像第一种问题,但可惜的是没有任何解决的建议,我现在还是苦于无法下手解决,因为无法确定到底是什么时候创建的instance record,也就无法确定到底创建的时候出了什么问题。



  • [quote author=maths369 link=topic=2261.msg7328#msg7328 date=1293669981]
    版主大人,我在openobject-developer里找到这样的说法:

    If your buttons do not seem to be doing anything, one of the following two things are likely:
    1. The record you are working on does not have a Workflow Instance record associated with it (it was probably
    created before you defined your workflow)

    2. You have not set the “osv” field correctly in your workflow XML file

    我遇到的情况非常像第一种问题,但可惜的是没有任何解决的建议,我现在还是苦于无法下手解决,因为无法确定到底是什么时候创建的instance record,也就无法确定到底创建的时候出了什么问题。
    [/quote]

    你不确定, 我帮你确定了...你不相信, 我有什么办法? 你再研究一年半载的OE, 你再回头看你这贴吧.



  • 😶
    版主教训得有理,还是要自己研究透才行。

    不是不相信,只是我发现几乎我找到的所有的版本,这个模块都有同样的问题,甚至我今天在OE官方的Demo网站上发现了相同的错误。我认为既然这么常见,可能有人已经发现了原因。

    不过,还是自己研究透比较好。



  • 哎,,, 别一口一个版主哎...  版主就是打扫垃圾贴的...

    我也还在学习OE好不好...



  • 呵呵!太谦虚了,你回答了这么多问题……

    大家一起学习……



  • 经过Debug,我发现workflow的流程是这样的:
    1. 当某个模块安装时,如果它的workflow的on_create状态是True,那么,就会将这个模块的workflow添加进wkf表,并把相关的activity和transition写进相应的表。
    2. 当这个模块创建相关数据记录时,将会触发创建instance的方法,并在wkf_instance表中添加记录,用res_id把实际数据记录和workflow的记录链接在一起,相当于对于一条实际的记录,有一个workflow的实例创建,还含有一个状态:active/complete。complete的话,就说明已经完成了。
    3. 当实际的事件触发workflow的时候,会先去根据当前数据记录的res_id和res_type(数据模块名)去wkf_instance表中查询是否有相应的实例记录,如果有,并且状态是active,就会创建实际的workflow步骤实例,并执行相关步骤。

    之前我遇到的问题就是wkf_instance表中与实际数据记录对应的实例没有写入,所以每次查询的时候都找不到,也就不能执行相关的workflow。我用create方法强行执行了一遍创建数据记录之后,发现问题解决了。



  • 嗯. 所以说, 这个 instance 就是你的业务数据创建时生成的. 至于为什么你的业务数据create 时, 没有生成对应的 wkf_instance 就要仔细地查查原因了.

    没有跑过生产类的东西. 你可以再试着创建新的业务数据.. 再看看 wkf_instance 有没有生成对应的记录. 如果还是没有. 就得继续跟踪下去.. 应该有其它的地方的操作会导致 业务数据的 create.. 从而生成对应的 wkf_instance.. 我觉得你可能还是不熟悉OE业务逻辑操作而引起的(或者说是OE Bug).



  • 没错,我现在也越来越有这种感觉,很大可能性应该是我不熟悉业务导致的某些必须的数据没有创建,从而影响了instance的创建。继续跟踪整理中……