2014-10-17 3 views
1

문제점은 다음과 같습니다.Oracle Forms : 선택한 레코드를 반복 할 때만

두 테이블의 관련 데이터를 쿼리하여 FROM_clause를 기반으로 데이터 블록을 작성했습니다. 동일한 데이터 블록에서 데이터베이스가 아닌 항목으로 행을 선택하는 확인란이 있습니다. 사용자가 버튼을 누르면 해당 레코드의 특정 정보가 표에 삽입됩니다.

현재 모든 레코드를 반복하면서 삽입을 수행하는 것에 따라이 행의 확인란이 활성화되어 있는지 확인합니다. 데이터 블록에 몇 개의 행만 표시되거나 사용자가 목록의 맨 위에 일부 행을 선택한 경우 모두 잘 작동합니다. (내 루프는 FIRST_RECORD에서 LAST_RECORD까지 또는 삽입 작업의 양이 선택된 행의 양과 같아 질 때까지 반복합니다.)

그러나 대부분의 경우 데이터 블록에는 수천 개의 레코드가 표시됩니다. 사용자가 레코드의 끝에있는 일부 레코드를 선택하면 (레코드 # 8000처럼) 내 루프는 (쓸모없이) 수천 개의 레코드를 반복하여 몇 개의 행을 삽입합니다. 그것은 많은 시간이 소요되며 단지 불필요합니다.

나는 기록 선택되는하지만 그 단지 반복하는 것,

가 어떻게 루프를 만들 수 있습니다 오라클 폼 빌더 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; 
에 저장되어있는 선택된 행을 통해 루프

관련 문제