2014-06-12 53 views
1

在Oracle APEX v4.2.2中,我有一個簡單的經典報告,它具有作爲第一列的複選框f50附加到表的ID列,允許用戶檢查所有或特定的行並從報告/表中刪除這些記錄。如何在使用Ajax的Oracle APEX經典報告中刪除選定的複選框行

一個例子報告可能是這樣的:

ID  Col2 Col3 Col4 
---------------------------- 
1  10  20  30 
2  5  8  9 
3  92  88  12 
4  1  2  44 
5  95  77  88 

我以後的要求是,我想,而不必提交整個執行這整個檢查的ID和消除這些記錄進行的過程頁面,但如果可能的話,希望通過AJAX方法使用apex.process.server來完成。

UPDATE:剛上這一要求多一點的背景基礎上,我試圖鉤住這個apex.process.server複選框ID的報告,即:

ID報告中報告上述屬性欄標題的外觀像這樣:

<input type="checkbox" label="Select Code" onclick="$f_CheckFirstColumn(this)" /> 

鑽孔向下進入下HTML表達這個ID列是:

<input type="checkbox" #ID# value="#ID#" name="f50" id="f50_#ROWNUM#"/> 

地區來源:

SELECT A.ID, 
     A.REQ_NO COL2, 
     A.CODE_ID||apex_item.hidden(20, A.CODE_ID)||apex_item.hidden(30, A.ID) COL3, 
     GROUP_VALUE COL4 
FROM MY_TABLE A 
WHERE A.REQ_NO = :REQ_NO 

我相信序有APEX存儲陣列apex_application.g_f50.count的ID內的值被刪除,需要提交的頁面。

使用apex.process.server,它們在檢查時是否可以作爲Javascript數組傳遞給隨需應變進程,然後使用這些ID執行所需的刪除操作?

有關如何通過AJAX實現上述任何幫助意味着(根本不刷新頁面)將不勝感激。

謝謝。

回答

1

鑑於這種查詢報告

select 
"EMPNO", 
"ENAME", 
apex_item.checkbox2(2, 0) check1, 
apex_item.checkbox2(3, 0) check2, 
apex_item.checkbox2(4, 0) check3 
from EMP 

隨着EMPNO設置爲「隱藏」 - 所以它會產生附加到最後一列一個隱藏的輸入項。

要更新某個記錄,您需要一個PK和一個值來更新行。這就是爲什麼我使用EMPNO。我將把它傳遞給按需過程。

function selectorToArray(pSelector){ 
    function getVal(pNd){ 
    switch (pNd.nodeName) { 
     case "INPUT": 
     switch (pNd.type) { 
      case "checkbox": 
      return $(pNd).prop("checked"); 
      break; 
      default: 
      return $(pNd).val(); 
     }; 
     break; 
     default: 
     return $(pNd).val() 
    }; 
    }; 

    var lArray = []; 
    $(pSelector).each(function(){ 
    lArray.push(getVal(this)); 
    }); 
    return lArray; 
}; 

功能selectorToArray將用於給定的選擇的值取到一個數組並獲得值。正如你可能知道,你可以通過值與x01, x02, ...的過程,但也有數組:f01, f02,... 用下面的代碼,你可以通過發送值到按需過程:

function sendCheckboxes(){ 
    var lf01 = [], lf02 = [], lf03 = [], lf04 = []; 
    lf01 = selectorToArray("input[name=f01]"); 
    lf02 = selectorToArray("input[name=f02]"); 
    lf03 = selectorToArray("input[name=f03]"); 
    lf04 = selectorToArray("input[name=f04]"); 

    apex.server.process("PROCESS_CHECKBOXES", {f01: lf01, f02: lf02, f03: lf03, f04: lf04}); 
}; 

您可以使用這些就像你否則會:環比他們:

DECLARE 
    l_pk VARCHAR2(30); 
    l_check1 VARCHAR2(30); 
    l_check2 VARCHAR2(30); 
    l_check3 VARCHAR2(30); 
BEGIN 
    -- f01: PK 
    -- f02: checkbox values column1 
    FOR i IN 1..apex_application.g_f01.count 
    LOOP 
    l_pk := apex_application.g_f01(i); 
    l_check1 := apex_application.g_f02(i); 
    l_check2 := apex_application.g_f03(i); 
    l_check3 := apex_application.g_f04(i); 
    apex_debug.message('Record with PK '||l_pk||': check1? '||NVL(l_check1, 'NO')||': check2? '||NVL(l_check2, 'NO')||': check3? '||NVL(l_check3, 'NO')); 
    END LOOP; 
END; 

在你的代碼中,有3個數組:f20f30f50f30包含行PK值,而f50用於複選框。
不要被陣列命名所迷惑。 Apex本身使用f ##陣列進行提交,這足夠了。而您的名稱爲f50的物品確實會在頁面提交中排列在g_f50。 然而,你也可以使用數組f01f20(不要認爲它達到50)的Ajax調用!它們是變量x01-x20的一個很好的補充! 當使用數組向您的進程發送大量值時,我認爲不僅僅是發送一個PK值數組,並且與位置匹配的值數組進行交互,這非常有用。當你使用沒有分頁的報表時,這不是很有價值,但仍然是。通過分頁,這個想法是,你不知道剛剛與哪些數據進行了交互。在100條記錄中,共有10行。在這10行中,有6個被渲染,並且僅提交了5個。哪些被選中,哪些不被選中。知道哪些5被檢查並不意味着你知道未檢查的。
但是,如果包含PK列,則始終有10行,您可以清楚地標識哪些記錄已被選中或未選中。例如,您的報告中的10條記錄將(=應該!)表示將10個值與PK值放在一個數組中(例如l_f01),另外10個值放在另一個數組中(例如l_f02),例如檢查指示符。因此,將這些內容傳遞到按需過程時,您將可以可靠地循環訪問數組f01,並使用當前用於f01的索引變量從數組中獲取選中或未選中的指示符。

說白了說,你建立2個陣列,這種價值組:

f01 - IDs | f02 - checkeds 
----------|--------------- 
4520  | false 
4521  | true 
4527  | false 
4561  | true 
4578  | true 
+0

你好Tom,感謝您的解決方案,但遺憾的是仍然遇到的問題與我有什麼的那一刻,並試圖以適應你的反饋到我的代碼。基於此,我已經更新了我上面的原始帖子,以包含我正在使用的陣列的更多信息,即針對ID和其他陣列的f50。我試圖將你的代碼加入到我的代碼中,但我認爲這個問題試圖找出你的PROCESS_CHECKS按需過程,確切地說選擇了哪些ID。根據我的更新,您是否能夠查看我需要從您的哪些更改,以便檢索已檢查的ID。 – tonyf

+0

嗨湯姆,感謝您的更新的答案,但對不起,仍然試圖瞭解這一點,B/C我使用f30和f50非ajax數組,而不是說,f01和f02 ajax數組,這是我沒有看到任何檢查值進入我的ondemand過程?我需要使用f01和f02慣例來達到我想要實現的目標嗎?謝謝。 – tonyf

+0

是的Tony,你可以用來發送數組到數據庫的數組僅限於20個數組,從f01到f20。這意味着,您需要從DOM中的名稱爲f30的元素收集數據,將它們存儲在JavaScript中的數組中,然後將該數組提供給您可以在按需過程中使用的其中一個數組。請記住,用於正常頁面提交的數組與按需無關。雖然不同的陣列可能會讓你失望,但它們根本不相關。 apex.server。過程文檔:「(例如,您可以設置標量參數x01 - x10和數組f01 - f20)。」 – Tom