首页 文章

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

提问于
浏览
0

感谢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 回答

  • 1

    正如Greg指出的那样,从调试中可以看出,您正在使用的进程具有为表格形式设置的范围 . 我没有使用apex_item API而不是向导生成的表格形式创建手动表格形式 .
    向导生成的表格形式有一些很好的支持选项,例如每行验证和触发每行进程的能力,维护绑定变量语法而不必使用全局数组 .
    这是一个很好的发现,我真的忘了它 . 但是,您只能在创建流程期间设置此执行范围 .
    例如:

    Selecting a tabular form during process creation

    选择表格形式将减少可用选项:

    Having selected a tabular form during process creation

    创建流程后,您可以验证流程点 . 表格形式关联的流程将"Tabular Form"属性设置为表格形式区域:

    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

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

相关问题