Oracle Apex流程以表格形式发送多封电子邮件

时间:2014-01-31 13:53:03

标签: oracle plsql oracle-apex

感谢Tom我能够解决我的初始问题,我现在能够以表格形式发送自动电子邮件以查看已检查的行,我现在唯一的问题是它发送了一封电子邮件多长时间检查复选框。

如果您勾选一行,它会发送一封电子邮件,但如果您勾选2行(或更多行),则会每次发送两封电子邮件,三次发送3行。

我正在使用标准的ApplyMRU流程更新行,并使用单独的流程发送电子邮件。

流程如下。

我知道我在这里遗漏了什么,有什么想法吗?

DECLARE  
l_checked_row  NUMBER;
l_id           NUMBER;
lc_message     VARCHAR2 (4000);
l_pkey         NUMBER;
l_r_reqs       reqs%ROWTYPE; 
BEGIN  
FOR i IN 1..apex_application.g_f01.count 
LOOP  
l_checked_row := apex_application.g_f01(i);
-- assuming that array F02 maps to column PKEY from table REQS
l_pkey        := apex_application.g_f02(l_checked_row);

-- get details required for creating the mail body
-- It's generally easier to just fetch the row instead of having to 
-- define variables to cover every field you need.
SELECT *  
  INTO l_r_reqs
  FROM reqs  
 WHERE pkey = l_pkey;  
-- Dont forget that select into may generate no_data_found or too_many_rows !

lc_message :=               'Date Written   :'         || l_r_reqs.date_wrote   || CHR (10);  
lc_message := lc_message || 'Sales          :'         || l_r_reqs.sales        || CHR (10);  
lc_message := lc_message || 'Client         :'         || l_r_reqs.client       || CHR (10);  
lc_message := lc_message || 'Position       :'         || l_r_reqs.job          || CHR (10);  
lc_message := lc_message || 'Who Covered       :'      || l_r_reqs.who          || CHR (10);  
lc_message := lc_message || 'Date Covered           :' || l_r_reqs.date_covered || CHR (10);  
l_id := APEX_MAIL.SEND(  
      p_to     => 'TESTER@TEST.com',  
      p_from   => 'DO_NOT_REPLY@REQS',  
      p_subj   =>    ''  
                  || l_r_reqs.who  
                  || ' Has Covered '  
                  || l_r_reqs.job  
                  || ' at '  
                  || l_r_reqs.client  
                  || CHR (10),  
      p_body   => lc_message);        
-- avoid commits unless ab-so-lu-te-ly necessary. Apex implicit commits can make the flow hard enough to
-- understand as it is.
END LOOP;

apex_mail.push_queue ();
END;

这是我从APEX调试中得到的结果。

会话状态:保存“P14_SALES” - 保存相同的值:“Ian Kimmett” 进程 - 指向:ON_SUBMIT_BEFORE_COMPUTATION 分支点:计算前 处理点:AFTER_SUBMIT 选项卡:为选项卡请求执行分支 分支点:验证前 验证: 执行基本和预定义的验证: 执行自定义验证: 分支点:处理前 进程 - 指向:AFTER_SUBMIT ...处理“ApplyMRU” - 输入:MULTI_ROW_UPDATE ...处理“ApplyMRD” - 输入:MULTI_ROW_DELETE ......跳过,因为条件或授权评估为FALSE ...进程“SEND_MAIL” - 输入:PLSQL ......处理第1行 ...执行声明:开始DECLARE l_checked_row NUMBER; l_id NUMBER; lc_message VARCHAR2(4000); l_pkey NUMBER; l_r_reqs reqs%ROWTYPE;开始为i IN 1..apex_application.g_f01.count LOOP l_checked_row:= apex_application.g_f01(i); l_pkey:= apex_application.g_f02(l_checked_row); SELECT * INTO l_r_reqs FROM reqs WHERE pkey = l_pkey; lc_message:='写日期:'|| l_r_reqs.date_wrote || CHR(10); lc_message:= lc_message || '销售:'|| l_r_reqs.sales || CHR(10); lc_message:= lc_message || '客户:'|| l_r_reqs.client || CHR(10); lc_message:= lc_message || '位置:'|| l_r_reqs.job || CHR(10); lc_message:= lc_message || '谁涵盖:'|| l_r_reqs.who || CHR(10); lc_message:= lc_message || '涵盖日期:'|| l_r_reqs.date_covered || CHR〜 ......处理第2行 ...执行声明:开始DECLARE l_checked_row NUMBER; l_id NUMBER; lc_message VARCHAR2(4000); l_pkey NUMBER; l_r_reqs reqs%ROWTYPE;开始为i IN 1..apex_application.g_f01.count LOOP l_checked_row:= apex_application.g_f01(i); l_pkey:= apex_application.g_f02(l_checked_row); SELECT * INTO l_r_reqs FROM reqs WHERE pkey = l_pkey; lc_message:='写日期:'|| l_r_reqs.date_wrote || CHR(10); lc_message:= lc_message || '销售:'|| l_r_reqs.sales || CHR(10); lc_message:= lc_message || '客户:'|| l_r_reqs.client || CHR(10); lc_message:= lc_message || '位置:'|| l_r_reqs.job || CHR(10); lc_message:= lc_message || '谁涵盖:'|| l_r_reqs.who || CHR(10); lc_message:= lc_message || '涵盖日期:'|| l_r_reqs.date_covered || CHR〜 分支点:处理后 ...评估分支:“AFTER_PROCESSING”类型:REDIRECT_URL按钮:(无按钮)条件:(无条件) 重定向到f?p = 950:14:0 ::::: 停止检测到APEX引擎 停止检测到APEX引擎 最后提交

2 个答案:

答案 0 :(得分:1)

正如Greg指出的那样,从调试中可以看出,您正在使用的进程具有表格形式的范围设置。我之前的问题中没有想到这一点,因为我主要使用apex_item API而不是向导生成的表格形式创建手动表格形式。
向导生成的表格形式有一些很好的支持选项,例如每行验证和每行触发一个进程的能力,维护绑定变量语法而不必使用全局数组。
这是一个很好的发现,我真的忘了它。但是,您只能在创建流程期间设置此执行范围 例如:
Selecting a tabular form during process creation
选择表格形式将减少可用选项:
Having selected a tabular form during process creation

创建流程后,您可以验证流程点。表格形式关联过程将“表格形式”属性设置为表格形式区域:
The scope of a process set to tabular form once created

然而,常规流程根本没有这个属性:
A regular process does not have this property set

因此,使用表格形式关联过程中的上述代码,您将为每个选中的行触发此代码,从而获得您描述的结果。
但是,尽管如此,您实际上可以选择调整代码,使其在表格形式行上下文中触发,或创建新进程而不将其与表格形式相关联(并保留该代码)。

为了完整起见,您可以通过以下方式设置代码以针对每一行触发:

DECLARE  
  l_checked_row  VARCHAR2(1);
  l_id           NUMBER;
  lc_message     VARCHAR2 (4000);
  l_pkey         NUMBER;
  l_r_reqs       reqs%ROWTYPE; 
BEGIN 
  l_checked_row := :APEX$ROW_SELECTOR; -- X if checked
  l_pkey        := :REQ_ID; -- the column name holding the PK. Not the label you assigned it, but the actual column name or alias from the report!

  IF l_checked_row = 'X' 
  THEN
    -- get details required for creating the mail body
    -- It's generally easier to just fetch the row instead of having to 
    -- define variables to cover every field you need.
    SELECT *  
      INTO l_r_reqs
      FROM reqs  
     WHERE pkey = l_pkey;  
    -- Dont forget that select into may generate no_data_found or too_many_rows !

    lc_message :=               'Date Written   :'         || l_r_reqs.date_wrote   || CHR (10);  
    lc_message := lc_message || 'Sales          :'         || l_r_reqs.sales        || CHR (10);  
    lc_message := lc_message || 'Client         :'         || l_r_reqs.client       || CHR (10);  
    lc_message := lc_message || 'Position       :'         || l_r_reqs.job          || CHR (10);  
    lc_message := lc_message || 'Who Covered       :'      || l_r_reqs.who          || CHR (10);  
    lc_message := lc_message || 'Date Covered           :' || l_r_reqs.date_covered || CHR (10);  

    l_id := APEX_MAIL.SEND(  
          p_to     => 'TESTER@TEST.com',  
          p_from   => 'DO_NOT_REPLY@REQS',  
          p_subj   =>    ''  
                      || l_r_reqs.who  
                      || ' Has Covered '  
                      || l_r_reqs.job  
                      || ' at '  
                      || l_r_reqs.client  
                      || CHR (10),  
          p_body   => lc_message);        

    -- although pushing the queue for each mail sent is not advised you can do it for immediate effect 
    apex_mail.push_queue ();
  END IF;
END;

以这种方式阅读和维护它可能更容易!虽然我不得不说,了解阵列迟早会派上用场:)

答案 1 :(得分:1)

最简单的方法是创建一个创建流程的流程,而不是选择“Tabluar Form”。这只是将过程创建为正常页面过程。