2014-01-31 68 views
0

感謝湯姆我能得到我最初的問題解決了,我現在能夠有一個表格的形式自動發送出去的電子郵件託運的行,唯一的問題我現在已經是它發送了一個電子郵件副本,多少次複選框被選中。多封郵件出去甲骨文的Apex過程

如果你檢查過一行時,它發出一個電子郵件,但如果你檢查過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  => '[email protected]', 
     p_from => '[email protected]', 
     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」 - 保存相同的值:「伊恩Kimmett」 過程 - 點:ON_SUBMIT_BEFORE_COMPUTATION 分支點:AFTER_SUBMIT 標籤:進行分支的標籤請求 分支點:計算 過程點之前在驗證 驗證: 執行基本和預定義的驗證: 執行自定義驗證: 分支點:處理 程序之前 - 點:AFTER_SUBMIT ...進程 「ApplyMRU」 - 類型:MULTI_ROW_UPDATE ...進程 「ApplyMRD」 - 類型:MULTI_ROW_DELETE ......跳過,因爲條件或授權評估結果爲FALSE ...進程「SEND_MAIL」 - 類型:PLSQL ......進程行1 ...執行語句:begin 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); 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; BEGIN FOR 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

這是頁面上唯一的過程嗎? – Tom

+0

只要這樣以及ApplyMRU和ApplyMRD進程,就不會使用ApplyMRD,因爲我們不希望它們刪除請求。 – greg

+0

我誠實地看到沒有理由爲什麼它會這樣做。你可以請嘗試通過放入一些'apex_debug.message(...)'行來進行調試嗎?我無法想象這個循環是這樣做的,但嘿。當我運行一個解構的作品時,我沒有問題,但我也沒有發送郵件。 – Tom

回答

1

正如格雷格指出並如可以從調試中可以看出,要使用的過程具有範圍爲以表格形式設置。在你之前的問題中我沒有想到這一點,因爲我大多堅持用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  => '[email protected]', 
      p_from => '[email protected]', 
      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; 

它可能更容易閱讀和維護這種方式呢!雖然我不得不說,知道陣列遲早會派上用場:)

+0

只是改變了處理代碼的測試程序,這裏是我得到的結果... ORA-06502:PL/SQL:數字或值錯誤:字符數轉換錯誤(第1行) 對於一個變通方法現在,我在頁面模板中添加了一些代碼,只允許他們一次選擇一行。 不完美,但短期內解決了問題。 – greg

+0

變量l_checked_row的類型必須是'VARCHAR2(1)'而不是'NUMBER'。還編輯了這個。 – Tom

1

最簡單的方法是創建一個進程創建一個進程,而不是選擇'Tabluar Form'。這只是創建正常頁面過程的過程。