Erp100论坛's Archiver

herome 发表于 2007-11-25 12:17

关于系统处理请求的流程,主要围绕AD_PROCESS表展开,欢迎交流。

--如何调用process
调用process有两种方法,一个是调用process目录下的class文件,给类继承callout接口,有prepare和doit函数,在prepare中调用getparam方法获取参数,具体的参数值从AD_PROCESS_PARAM定义参数个数和名称。

第二种方法是在AD_PROCESS中不指定CLASS_NAME,而是指定AD_REPORTVIEW,系统则直接调用系统的视图,具体视图名字用AD_TABLE_ID控制
select * from ad_process t where t.ad_process_id=194;
select * from ad_process_para t where t.ad_process_id=194;
select * from ad_element_trl where ad_element_id in(1922,102) ;
select * from ad_process_access where ad_process_id=194;
select * from ad_process_para_trl where ad_process_para_id in(267,260) ;
select * from ad_process where classname is null ;
select * from ad_reportview where ad_reportview_id=146 ;

第二种方法采用存储过程或者VIEW实现,系统从客户端调用ProcessCtl类,来总控是调用哪种类型的PROCESS,同时ISSERVPROCESS决定是运行于SERV还是CLIENT,目前一般是运行于CLIENT的。如果有classname则调用processcall接口类的类实现(processcall是接口类,servcall是抽象类,定义基本的抽象对象,每个调用的class必须继承servcall)servprocess下的callout类;如果是存储过程,则调用dbprocess类,提取数据。如果是report,则再调用ReportCtl类完成报表相关的工作(先根据ReportEngine获取打印格式等信息,在用此引擎调用view显示于屏幕上);

[[i] 本帖最后由 herome 于 2007-12-15 14:31 编辑 [/i]]

pshen 发表于 2007-11-27 14:46

感觉写的有一点点乱。 :)

第一种, Class Process, 就是定义一个class, 必须extend org.compiere.process.SvrProcess 当然,狠一点, implement  org.compiere.process.ProcessCall 应该也是可以的。不是“继承callout接口“,那就成callout了。

我以前些扩展的时候,都是用ProcessCall 的,后来的版本 改用org.compiere.process.SvrProcess了,甚至后来ProcessCall 直接成接口了。

第二种, 用存储过程。这个好,不用build,不用jar,不用重起系统。
以前我们都用它。 不过后来compiere要数据库独立了,不推荐这个了,所以一些公用的功能函数都没了。
这里我放了个例子:
[url]http://bbs.ERP100.com/thread-17510-1-1.html[/url]

第3种, 报表,需要定义ReportView, 但是只有勾了那个IsReport才会出来。
然后,也可以制定报表格式Printformat, 也可以暂时不指定,等报表出来,在修改。

其实,还有第4种, Process也可以是workflow.


以上所有内容,针对Compiere, 在Adempiere是否完全适用,我不肯定。

jet-wang 发表于 2007-12-7 14:44

pshen版主说的很好,我个人还是喜欢把逻辑写在存储过程里面,调用方便,效率也高。
不过要依赖数据库,使用不同到DBMS可能会有兼容性问题。

[[i] 本帖最后由 jet-wang 于 2007-12-7 14:45 编辑 [/i]]

simmson 发表于 2008-2-20 19:41

好精辟的分析,强烈支持

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2007 Comsenz Inc.