2014-10-17 47 views
1

我的問題是這樣的:的Oracle Forms:只有通過選定的記錄迭代

我具有基於FROM_clause一個數據塊,從兩個表中查詢相關數據。在同一個數據塊中,我有一個複選框來選擇行,作爲非數據庫項目。當用戶按下按鈕時,它會將這些記錄中的某些信息插入到表格中。

目前我正在循環所有記錄,檢查該行的複選框是否已激活,具體取決於執行插入操作。如果數據塊只顯示幾行,或者用戶只是在列表頂部選擇了一些行,那麼這一切都可以正常工作。 (我的循環從FIRST_RECORD迭代到LAST_RECORD,或者直到插入操作的數量等於所選行的數量。

但是在大多數情況下,數據塊會顯示幾千條記錄。如果用戶現在選擇列表末尾的某些行(如記錄#8000),我的循環將(無用地)遍歷數千條記錄以插入幾行。這需要很多時間,而且沒有必要。

我與Oracle表格Builder 11g第

我怎樣才能創建一個循環的工作,雖然選擇了記錄,這將只迭代? 任何提示或代碼示例,將不勝感激!

回答

0

通常,如果一個塊可能包含多於幾十條記錄,我將盡可能避免在記錄上循環。在過去,我通過兩種方式解決了這個問題 - 選擇哪一個適合你。

  1. 存放在GTT的複選框值,然後查詢GTT

    創建全局臨時表,並立足於該GTT的複選框。當用戶點擊按鈕時,讓按鈕觸發POST值到表中;那麼你可以對GTT執行一個SQL查詢來查找選定的值。

  2. 存儲在數組中所選擇的行,則通過陣列

    環添加觸發器的複選框,以便每當它被選中還是未選中,與相關記錄編號的記錄被添加或刪除來自PL/SQL數組。然後你可以遍歷這個數組,這比在記錄塊中導航要快得多。

1

爲了幫助其他可能面臨類似問題的人,我想發佈我的解決方案。 我在我的研究過程中發現我鬆散地基於我的實施this tutorial

我創造了WHEN_NEW_FORM_INSTANCE觸發一個RecordGroup並添加我需要存儲所有列:

declare 
    rg_name varchar2(40) := 'SELECTED'; 
    rg_id recordgroup; 
    gc_id groupcolumn; 

begin 
    /* Make sure the record group does not already exist. */ 
    rg_id := find_group(rg_name); 
    /* If it does not exist, create it and add the 
    ** necessary columns to it. */ 
    if id_null(rg_id) then 
    rg_id := create_group(rg_name); 
    /* Add columns to the record group */ 
    gc_id := add_group_column(rg_id, 'Barcode', number_column); 
    gc_id := add_group_column(..); 

    end if; 

然後,我改變了我的WHEN_CHECKBOX_CHANGED添加或取決於複選框的值的RecordGroup刪除行。

declare 
    row_no  number; 
    rg_id  recordgroup := find_group('SELECTED'); 
    gc_id  groupcolumn; 
    total_rows number; 
    barcode number; 

begin 
    total_rows := get_group_row_count(rg_id); 
    if :block.checkbox = 1 then 
    /* Add selected row to the RecordGroup */ 
    add_group_row(rg_id, end_of_group); 
    set_group_number_cell('SELECTED.BARCODE', 
          total_rows + 1, 
          :block.number_item); 
    else 
    /* Find selected row in RecordGroup and remove it */ 
    for i in 1 .. total_rows loop 
     barcode := get_group_number_cell('SELECTED.BARCODE', i); 
     if :block.number_item = barcode then 
     row_no := i; 
     exit; 
     end if; 
    end loop; 

    delete_group_row('SELECTED', row_no); 
    end if; 
end; 

而且在我WHEN_BUTTON_PRESSED觸發它只能通過選定行,這是存儲在RecordGroup

declare 
    selected number; 
    row_no number; 
begin 
    .. 
    selected := get_group_row_count('SELECTED'); 
    for j in 1 .. selected loop 
    begin 
     barcode := get_group_number_cell('SELECTED.BARCODE', j); 
     .. 
     insert into (..); 
     commit; 
    exception 
     when others then 
     error_logging(..); 
    end; 
    end if; 
    delete_group_row('SELECTED', all_rows); 
    .. 
end; 
循環