Compiere预警开发文档

本文档详细介绍了Compiere系统的预警配置流程,包括预警窗口、处理器窗口和时间表窗口的具体操作方法,并提供了预警邮件格式从默认文本到HTML表格格式的修改指南,同时通过具体案例演示了SQL语句的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
Compiere预警开发文档
作者:胡海龙
日期:20071114
第一篇: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分钟预警一次。
 
 
 
第二篇:预警邮件格式修改
 
  本篇主要讲如何将预警邮件格式从默认格式改为htmltable格式。
 
默认格式:
  默认格式为按顺序排列,从数据库读出的结果集,每条记录的每个列值都占用一行,每行前面都有列名,记录之间用一行“------------------”分隔,如下:
------------------
DOCUMENTNO = POO0706270006
VENDOR = paul.cheng
MRQ = null
OVERTIME = 3154
------------------
DOCUMENTNO = POO0710241018
VENDOR = 新城新特药(新城医疗器械)有限公司
MRQ = null
OVERTIME = 314
 
htmltable格式:
  如下:
 
  
采购单编号
供应商
申购单编号
已逾时_小时
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 RuleSql设置
 
本篇主要以几个实例讲述如何在预警(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小时,将采购订单警告 KevinRoxy
  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
 
OraclegetMulti_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小时,将采购订单警告 KevinRoxy
  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)
 
 
结束。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值