感谢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引擎 最后提交
答案 0 :(得分:1)
正如Greg指出的那样,从调试中可以看出,您正在使用的进程具有表格形式的范围设置。我之前的问题中没有想到这一点,因为我主要使用apex_item API而不是向导生成的表格形式创建手动表格形式。
向导生成的表格形式有一些很好的支持选项,例如每行验证和每行触发一个进程的能力,维护绑定变量语法而不必使用全局数组。
这是一个很好的发现,我真的忘了它。但是,您只能在创建流程期间设置此执行范围
例如:
选择表格形式将减少可用选项:
创建流程后,您可以验证流程点。表格形式关联过程将“表格形式”属性设置为表格形式区域:
然而,常规流程根本没有这个属性:
因此,使用表格形式关联过程中的上述代码,您将为每个选中的行触发此代码,从而获得您描述的结果。
但是,尽管如此,您实际上可以选择调整代码,使其在表格形式行上下文中触发,或创建新进程而不将其与表格形式相关联(并保留该代码)。
为了完整起见,您可以通过以下方式设置代码以针对每一行触发:
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”。这只是将过程创建为正常页面过程。