Compiere预警开发文档
作者:胡海龙
日期:2007年11月14日
第一篇:compiere预警的配置
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分钟预警一次。
第二篇:预警邮件格式修改
本篇主要讲如何将预警邮件格式从默认格式改为html的table格式。
默认格式:
默认格式为按顺序排列,从数据库读出的结果集,每条记录的每个列值都占用一行,每行前面都有列名,记录之间用一行“------------------”分隔,如下:
------------------
DOCUMENTNO = POO0706270006
VENDOR = paul.cheng
MRQ = null
OVERTIME = 3154
------------------
DOCUMENTNO = POO0710241018
VENDOR = 新城新特药(新城医疗器械)有限公司
MRQ = null
OVERTIME = 314
html的table格式:
如下:
采购单编号
|
供应商
|
申购单编号
|
已逾时_小时
|
POO0710121012
|
江门市联兴高频设备有限公司
|
MRQ0710120002
|
645
|
POO0710111031
|
江门市联兴高频设备有限公司
|
MRQ0709290005
|
663
|
POO0710231028
|
东莞市建文彩印工艺有限公司
|
MRQ0710230001
|
353
|
修改预警邮件格式,需修改AlertProcessor.java类的二个方法:
一,修改ListSqlSelect方法如下:(整个方法)
private String listSqlSelect (String sql, String trxName) throws Exception
{
StringBuffer result = new StringBuffer();
PreparedStatement pstmt = null;
Exception error = null;
/**startaddbyhuhailong20071107*/
int line = 1;
result.append("<table border=/"1/" cellspacing=/"0/" cellpadding=/"0/">");
/**endaddbyhuhailong20071107*/
try
{
pstmt = DB.prepareStatement (sql, trxName);
ResultSet rs = pstmt.executeQuery ();
ResultSetMetaData meta = rs.getMetaData();
while (rs.next ())
{
/**startcommentbyhuhailong20071107*/
//result.append("------------------").append(Env.NL);
/**endcommentbyhuhailong20071107*/
/**startaddbyhuhailong20071107*/
if (line == 1) { // 加上表头:
for (int col = 1; col <= meta.getColumnCount(); col++)
{
if (col == 1) {
result.append("<tr bordercolor=/"#ffffff/" border=/"1/" align=/"center/" ");
result.append("style=/"FONT-SIZE: 12px;color:white;FONT-Weight:bold/">");
}
result.append("<td bgcolor=/"black/">"+meta.getColumnLabel(col)+"</td>");
if (col == meta.getColumnCount())
result.append("</tr>");
}
}
/**endaddbyhuhailong20071107*/
for (int col = 1; col <= meta.getColumnCount(); col++)
{ // 加上记录的所有列值。
/**startaddbyhuhailong20071107*/
String td_value = " ";
if (rs.getString(col) != null)
td_value = rs.getString(col);
if (col == 1) {
result.append("<tr border=/"1/" align=/"center/" ");
result.append("style=/"FONT-SIZE: 12px;color:#002200/">");
}
result.append("<td>" + td_value + "</td>");
if (col == meta.getColumnCount())
result.append("</tr>");
/**endaddbyhuhailong20071107*/
/**startcommentbyhuhailong20071107*/
//result.append(meta.getColumnLabel(col)).append(" = ");
//result.append(rs.getString(col));
//result.append(Env.NL);
/**endcommentbyhuhailong20071107*/
} // for all columns
/**startaddbyhuhailong20071107*/
line = line + 1;
/**endaddbyhuhailong20071107*/
} // end while loop
/**startaddbyhuhailong20071107*/
result.append("</table>");
/**endaddbyhuhailong20071107*/
if (result.length() == 0)
log.fine("No rows selected");
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
log.log(Level.SEVERE, sql, e);
error = e;
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
// Error occured
if (error != null)
thrownew Exception ("(" + sql + ") " + Env.NL + error.getLocalizedMessage());
return result.toString();
} // listSqlSelect
二,修改processAlert方法如下:(部分代码)
StringBuffer message = new StringBuffer(alert.getAlertMessage()).append(Env.NL);
/**startaddbyhuhailong20071107*/
StringBuffer sb_rule = new StringBuffer("");
/**endaddbyhuhailong20071107*/
/********************************************************************/
String text = listSqlSelect(sql, trxName);
if (text != null && text.length() > 0)
{
message.append(text);
processed = true;
/**startaddbyhuhailong20071107*/
sb_rule.append(text);
/**endaddbyhuhailong20071107*/
}
/*********************************************************************/
for (int i = 0; i < recipients.length; i++)
{
/**startaddbyhuhailong20071107*/
if (sb_rule.toString().equals("")) {
break;
}
/**endaddbyhuhailong20071107*/
MAlertRecipient recipient = recipients[i];
代码修改结束。
第三篇:Alert Rule的Sql设置
本篇主要以几个实例讲述如何在预警(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;
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)
结束。