感谢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 回答
正如Greg指出的那样,从调试中可以看出,您正在使用的进程具有为表格形式设置的范围 . 我没有使用apex_item API而不是向导生成的表格形式创建手动表格形式 .
向导生成的表格形式有一些很好的支持选项,例如每行验证和触发每行进程的能力,维护绑定变量语法而不必使用全局数组 .
这是一个很好的发现,我真的忘了它 . 但是,您只能在创建流程期间设置此执行范围 .
例如:
选择表格形式将减少可用选项:
创建流程后,您可以验证流程点 . 表格形式关联的流程将"Tabular Form"属性设置为表格形式区域:
然而,常规流程根本没有这个属性:
因此,使用表格形式关联过程中的上述代码,您将为每个选中的行触发此代码,从而获得您描述的结果 .
但是,尽管如此,您实际上可以选择调整代码,使其在表格形式行上下文中触发,或创建新进程而不将其与表格形式相关联(并保留该代码) .
为了完整起见,您可以设置代码来为每个人设置代码行:
以这种方式阅读和维护它可能更容易!虽然我不得不说,了解阵列迟早会派上用场:)
最简单的方法是创建一个创建流程的流程,而不是选择“Tabluar Form” . 这只是将过程创建为正常页面过程 .