您的位置:首页 > 其它

Compiere预警开发文档

2007-11-16 08:59 302 查看
[align=center]Compiere预警开发文档[/align]
作者:胡海龙
日期:20071114
[align=center]第一篇:compiere预警的配置[/align]
[align=center][/align]
  Compiere的预警配置不需写java代码,只需在预警(alert)窗口写sql语句配置即可,当然,如果需要修改邮件的格式,则需要修改java源代码。
  预警配置有三个窗口,分别是:预警(alert)窗口,预警处理器(processor)窗口,时间表(schedule)窗口,下面分别介绍这三个窗口。

一, 预警(alert)窗口:

预警页签:
Valid字段:如果不勾选,则不会处理此预警。当运行alert rule页签的sql语句出错后,会设置不勾选此字段。
  Alert processor字段是必填的,所以需在预警处理器(processor)窗口建有记录,用来记录下一次预警的时间,和多久运行一次预警(在时间表窗口实现)等。
  Alert subject字段:这里的文字会作为邮件的主题及邮件的第一行。
  Alert message字段:这里的文字会作为邮件正文的第一行。
  
预警规则页签:
  Valid字段:如果不勾选,则不会处理此预警。当运行此页签的sql语句出错后,会设置不勾选此字段。
  Sql select字段:用来设置sql语句的select部分,select关键字不写。
  Sql from字段:用来设置sql语句的from部分,from关键字不写。
Sql where字段:用来设置sql语句的where部分,where关键字不写。
最后,会自动加上table字段设置的表的ad_client_id为当前client。

预警接收者页签:
  User/contact字段:预警邮件的接收者。
  Role字段:此角色的所用user都会收到预警邮件,此字段可为空。

二, 预警处理器(processor)窗口:

Processor页签:
  Schedule字段:关联到时间表(schedule)窗口,用来设置多长时间运行一次预警。
  Days to keep log字段:预警记录保存多长时间。
  Date last run字段:预警最后一次运行的时间。
  Date next run字段:预警下一次运行的时间。

Log页签:
  记录预警每次运行的一些信息,超过在processor页签设置的保存时间,会自动删除。

三, 时间表(schedule)窗口:

Schedule页签:
  Schedule type字段:选时间表的类型。
  Frequency type字段:时间单位,可设天,小时,分钟等。
  Frequency字段:设置时间数量。如上图就是周一到周五每30分钟预警一次。

[align=center]第二篇:预警邮件格式修改[/align]
[align=center] [/align]
  本篇主要讲如何将预警邮件格式从默认格式改为html的table格式。

默认格式:
  默认格式为按顺序排列,从数据库读出的结果集,每条记录的每个列值都占用一行,每行前面都有列名,记录之间用一行“------------------”分隔,如下:
[align=left]------------------[/align]
[align=left]DOCUMENTNO = POO0706270006[/align]
[align=left]VENDOR = paul.cheng[/align]
[align=left]MRQ = null[/align]
[align=left]OVERTIME = 3154[/align]
[align=left]------------------[/align]
[align=left]DOCUMENTNO = POO0710241018[/align]
[align=left]VENDOR = 新城新特药(新城医疗器械)有限公司[/align]
[align=left]MRQ = null[/align]
[align=left]OVERTIME = 314[/align]

html的table格式:
  如下:

  
[align=center]采购单编号[/align]
[align=center]供应商[/align]
[align=center]申购单编号[/align]
[align=center]已逾时_小时[/align]
[align=center]POO0710121012[/align]
[align=center]江门市联兴高频设备有限公司[/align]
[align=center]MRQ0710120002[/align]
[align=center]645[/align]
[align=center]POO0710111031[/align]
[align=center]江门市联兴高频设备有限公司[/align]
[align=center]MRQ0709290005[/align]
[align=center]663[/align]
[align=center]POO0710231028[/align]
[align=center]东莞市建文彩印工艺有限公司[/align]
[align=center]MRQ0710230001[/align]
[align=center]353[/align]
修改预警邮件格式,需修改AlertProcessor.java类的二个方法:
一,修改ListSqlSelect方法如下:(整个方法)
[align=left] private String listSqlSelect (String sql, String trxName) throws Exception[/align]
[align=left] {[/align]
[align=left] StringBuffer result = new StringBuffer();[/align]
[align=left] PreparedStatement pstmt = null;[/align]
[align=left] Exception error = null;[/align]
[align=left] [/align]
[align=left] /**startaddbyhuhailong20071107*/[/align]
[align=left] int line = 1;[/align]
[align=left] result.append("<table border=/"1/" cellspacing=/"0/" cellpadding=/"0/">");[/align]
[align=left] /**endaddbyhuhailong20071107*/[/align]
[align=left] [/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] pstmt = DB.prepareStatement (sql, trxName);[/align]
[align=left] ResultSet rs = pstmt.executeQuery ();[/align]
[align=left] ResultSetMetaData meta = rs.getMetaData();[/align]
[align=left] while (rs.next ())[/align]
[align=left] {[/align]
[align=left] /**startcommentbyhuhailong20071107*/[/align]
[align=left] //result.append("------------------").append(Env.NL);[/align]
[align=left] /**endcommentbyhuhailong20071107*/ [/align]
[align=left] /**startaddbyhuhailong20071107*/[/align]
[align=left] if (line == 1) { // 加上表头:[/align]
[align=left] for (int col = 1; col <= meta.getColumnCount(); col++)[/align]
[align=left] {[/align]
[align=left] if (col == 1) { [/align]
[align=left] result.append("<tr bordercolor=/"#ffffff/" border=/"1/" align=/"center/" ");[/align]
[align=left] result.append("style=/"FONT-SIZE: 12px;color:white;FONT-Weight:bold/">");[/align]
[align=left] }[/align]
[align=left] result.append("<td bgcolor=/"black/">"+meta.getColumnLabel(col)+"</td>");[/align]
[align=left] if (col == meta.getColumnCount())[/align]
[align=left] result.append("</tr>"); [/align]
[align=left] } [/align]
[align=left] }[/align]
[align=left] /**endaddbyhuhailong20071107*/[/align]
[align=left] [/align]
[align=left] for (int col = 1; col <= meta.getColumnCount(); col++)[/align]
[align=left] { // 加上记录的所有列值。[/align]
[align=left] /**startaddbyhuhailong20071107*/ [/align]
[align=left] String td_value = " ";[/align]
[align=left] if (rs.getString(col) != null)[/align]
[align=left] td_value = rs.getString(col); [/align]
[align=left] if (col == 1) {[/align]
[align=left] result.append("<tr border=/"1/" align=/"center/" ");[/align]
[align=left] result.append("style=/"FONT-SIZE: 12px;color:#002200/">");[/align]
[align=left] }[/align]
[align=left] result.append("<td>" + td_value + "</td>");[/align]
[align=left] if (col == meta.getColumnCount())[/align]
[align=left] result.append("</tr>"); [/align]
[align=left] /**endaddbyhuhailong20071107*/ [/align]
[align=left] /**startcommentbyhuhailong20071107*/[/align]
[align=left] //result.append(meta.getColumnLabel(col)).append(" = ");[/align]
[align=left] //result.append(rs.getString(col));[/align]
[align=left] //result.append(Env.NL);[/align]
[align=left] /**endcommentbyhuhailong20071107*/ [/align]
[align=left] } // for all columns[/align]
[align=left] /**startaddbyhuhailong20071107*/[/align]
[align=left] line = line + 1;[/align]
[align=left] /**endaddbyhuhailong20071107*/[/align]
[align=left] } // end while loop[/align]
[align=left] [/align]
[align=left] /**startaddbyhuhailong20071107*/[/align]
[align=left] result.append("</table>");[/align]
[align=left] /**endaddbyhuhailong20071107*/[/align]
[align=left] [/align]
[align=left] if (result.length() == 0)[/align]
[align=left] log.fine("No rows selected");[/align]
[align=left] rs.close ();[/align]
[align=left] pstmt.close ();[/align]
[align=left] pstmt = null;[/align]
[align=left] }[/align]
[align=left] catch (Exception e)[/align]
[align=left] {[/align]
[align=left] log.log(Level.SEVERE, sql, e);[/align]
[align=left] error = e;[/align]
[align=left] }[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] if (pstmt != null)[/align]
[align=left] pstmt.close ();[/align]
[align=left] pstmt = null;[/align]
[align=left] }[/align]
[align=left] catch (Exception e)[/align]
[align=left] {[/align]
[align=left] pstmt = null;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // Error occured[/align]
[align=left] if (error != null)[/align]
[align=left] thrownew Exception ("(" + sql + ") " + Env.NL + error.getLocalizedMessage());[/align]
[align=left] [/align]
[align=left] return result.toString();[/align]
} // listSqlSelect

二,修改processAlert方法如下:(部分代码)
[align=left] StringBuffer message = new StringBuffer(alert.getAlertMessage()).append(Env.NL);[/align]
[align=left] /**startaddbyhuhailong20071107*/[/align]
[align=left] StringBuffer sb_rule = new StringBuffer("");[/align]
[align=left] /**endaddbyhuhailong20071107*/[/align]
[align=left]  /********************************************************************/[/align]
[align=left]  String text = listSqlSelect(sql, trxName);[/align]
[align=left] if (text != null && text.length() > 0)[/align]
[align=left] {[/align]
[align=left] message.append(text); [/align]
[align=left] processed = true;[/align]
[align=left] /**startaddbyhuhailong20071107*/[/align]
[align=left] sb_rule.append(text);[/align]
[align=left] /**endaddbyhuhailong20071107*/[/align]
[align=left] }[/align]
[align=left]  /*********************************************************************/[/align]
[align=left]  for (int i = 0; i < recipients.length; i++)[/align]
[align=left] {[/align]
[align=left] /**startaddbyhuhailong20071107*/ [/align]
[align=left] if (sb_rule.toString().equals("")) { [/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] /**endaddbyhuhailong20071107*/[/align]
[align=left] MAlertRecipient recipient = recipients[i];[/align]
[align=left] [/align]
[align=left]代码修改结束。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=center]第三篇:Alert RuleSql设置[/align]
[align=center][/align]
本篇主要以几个实例讲述如何在预警(alert)窗口的“预警规则”页签设置sql语句。

第一个例子:
申购单即将超过需求日期(即需求日前一天),但还未下采购订单,请通知阿妹,阿仙及Kevin。
  Sql SELECT设置如下:
  mr.documentno AS 申购单编号, mr.daterequired AS 需求日期
  Table设置为m_requisition表。
  Sql FROM设置如下:
  m_requisition mr
  Sql WHERE设置如下:
  NOT EXISTS (SELECT * FROM c_rfqmatch match
WHERE match.m_requisition_id = mr.m_requisition_id AND match.c_order_id > 0)
AND FLOOR(SYSDATE – mr.daterequired) = 1
AND mr.docstatus = ‘CO’

第二个例子:
  采购订单单价审批的时间距上次事件发生时间已经超过了 2小时,将采购订单警告 Kevin及Roxy
  Sql SELECT设置如下:
  o.documentno AS 采购单编号,
(SELECT name FROM c_bpartner WHERE c_bpartner_id = o.c_bpartner_id) AS 供应商,
getMulti_Requisition(o.c_order_id) AS 申购单编号,
ROUND(TO_NUMBER(SYSDATE-wf.created)*24) AS 已逾时_小时  
Table设置为ad_wf_activity表。
  Sql FROM设置如下:
  ad_wf_activity wf INNER JOIN ad_table ON (ad_table.ad_table_id = wf.ad_table_id)
INNER JOIN ad_wf_node ON (ad_wf_node.ad_wf_node_id = wf.ad_wf_node_id)
INNER JOIN c_order o ON (o.c_order_id = wf.record_id AND o.ad_client_id = wf.ad_client_id)
  Sql WHERE设置如下:
ad_wf_node.value = '订单单价审批' AND ad_table.tablename = 'C_Order'
AND wf.wfstate = 'OS' AND ROUND(TO_NUMBER(SYSDATE-wf.created)*24) >= 2

Oracle的getMulti_Requisition函数代码如下:
create or replace function getMulti_Requisition(pc_order_id in number)
return varchar2
is
cursor rfqmatch
is
select distinct mr.documentno
from c_rfqmatch match, m_requisition mr
where match.ad_client_id=mr.ad_client_id and match.m_requisition_id=mr.m_requisition_id
and match.c_order_id = pc_order_id
;
reqname varchar2(300);

begin
reqname := null;
for mreq in rfqmatch loop
if reqname is not null then
reqname := reqname || ',' || mreq.documentno;
end if;
if reqname is null then
reqname := mreq.documentno;
end if ;
end loop;
return reqname;
exception
when others then
return '';
end getMulti_Requisition;

第三个例子:
  采购订单金额审批的时间距上次事件发生时间已经超过了 2小时,将采购订单警告 Kevin及Roxy
  Sql SELECT设置如下:
  同第二例。
Table设置为ad_wf_activity表。
  Sql FROM设置如下:
  同第二例。
  Sql WHERE设置如下:
  ad_wf_node.value in ('50K <=金额 <100K','金额<50K','金额>=100K')
AND ad_table.tablename = 'C_Order' AND wf.wfstate = 'OS'
AND ROUND(TO_NUMBER(SYSDATE-wf.created)*24) >= 2

第四个例子:
  仓库在采购订单指定的日期中,还未到货,列出采购订单给Marcus
  Sql SELECT设置如下:
  documentno AS 采购单编号,
substr(to_char(datepromised,'yyyy-mm-dd'),0,10) AS 承诺日期,
substr(to_char(dateordered,'yyyy-mm-dd'),0,10) AS 交付开始日,
(SELECT name FROM c_bpartner WHERE c_bpartner_id = c_order.c_bpartner_id) AS 供应商,
(SELECT name FROM c_bpartner_location WHERE c_bpartner_location_id = c_order.c_bpartner_location_id)
AS 供应商地址,
tel AS 电话,
(SELECT name FROM ad_user WHERE ad_user_id = c_order.ad_user_id) AS 联系人,
fax AS 传真
  Table设置为c_order表。
  Sql FROM设置如下:
  c_order
  Sql WHERE设置如下:
c_order.docstatus IN ('DR','IP') AND SYSDATE > c_order.datepromised
AND c_order.c_doctypetarget_id IN (SELECT c_doctype_id FROM c_doctype
WHERE c_doctype.docbasetype IN ('SOO','POO') AND c_doctype.issotrx='N'
AND c_doctype.ad_client_id = c_order.ad_client_id)
AND NOT EXISTS (SELECT * FROM m_inout WHERE m_inout.c_order_id = c_order.c_order_id
AND m_inout.c_doctype_id = 1000013)

结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: