oracle - 如何在查询后保留 block 位置 -oracle 表单

标签 oracle forms oracle10g oracleforms

我有一个带有 data_block 的 oracle 表单,其中显示 25 个项目。

在表单上我有一个滚动条和一个“删除”按钮。当选择数据 block 中的某个项目并按下“删除”按钮时,它会从数据库中删除所选项目,然后执行 data_block 查询。

默认情况下,这会将用户返回到列表顶部。

我正在尝试导航到从列表中删除的记录之前的记录。

这可以使用 GO_RECORD(number) 内置函数 (BIF) 来完成(假设 number 是 :System.cursor_record 的保存值)。

这就是我遇到问题的地方。 GO_RECORD BIF 会将记录置于显示的项目列表的顶部或底部。这可能会导致列表在没有警告的情况下向上移动 20 个项目。

即 例如,正在显示 data_block 中的记录 23 - 47,并且选择了记录 33。 如果删除第 33 条记录,并且我们使用函数 GO_RECORD(32),则显示的记录将为 32-56(实际上将列表向下移动 9 条记录)。

我假设为了避免这种转变,我需要有某种方法来确定记录在显示中的位置(而不是 data_block)。

有人知道这个功能是否存在吗?

或者有人有其他方法可以让我得到相同的结果吗?

最佳答案

首先创建这个过程作为程序单元

            PROCEDURE SYNC_BLOCK
            -----------------------------------------------------------------------*
            --  Synchronizes the display of any scrollable block.
            --  After running an edit that loops through all records, this will
            --  restore the block's display so that the same top record is again
            --  at the top of the block's display.
            --  Blk is the name of the block.
            --  Rec_Num is the desired target current record.
            --  Top_Rec is the original Top Record of the block captured
            --  before the looping process began.
            (BLK      VARCHAR2,
            REC_NUM  NUMBER,
            TOP_REC  NUMBER) IS
            BLK_ID    BLOCK;
            TOP_NEW   PLS_INTEGER;
            REC_N     PLS_INTEGER;
            --
            Procedure Check_success is begin
            If not form_success then
            Raise form_trigger_failure;
            End if;
            End Check_success;
            Procedure Go_Rec(rec_num number) is begin
            Go_Record(Rec_num);
            Check_Success;
            End Go_Rec;
            BEGIN
            BLK_ID := FIND_BLOCK(BLK);
            IF ID_NULL(BLK_ID) THEN
            Message('  U72_GO_REC_SYNC_BLOCK: CANNOT FIND BLOCK '''||BLK||'''');
            Raise Form_trigger_failure;
            END IF;
            IF BLK <> :SYSTEM.CURSOR_BLOCK THEN
            GO_BLOCK(BLK);
            Check_Success;
            END IF;
            IF :SYSTEM.CURSOR_RECORD <> REC_NUM THEN
            GO_REC(REC_NUM);
            END IF;
            -- may need to re-set the display to the rows originally shown
            TOP_NEW := GET_BLOCK_PROPERTY(BLK_ID, TOP_RECORD);
            IF TOP_REC <> TOP_NEW THEN
            IF TOP_REC < TOP_NEW THEN
            IF :SYSTEM.CURSOR_RECORD <> TOP_REC THEN
            GO_REC(TOP_REC);
            END IF;
            ELSE
            REC_N := GET_BLOCK_PROPERTY(BLK_ID, RECORDS_DISPLAYED)
            + TOP_REC - 1;
            IF :SYSTEM.CURSOR_RECORD <> REC_N THEN
            GO_REC(REC_N);
            END IF;
            END IF;
            SYNCHRONIZE;
            -- Found that Sync caused focus change to different block. Fix here.
            IF BLK <> :SYSTEM.CURSOR_BLOCK THEN
            GO_BLOCK(BLK);
            Check_Success;
            END IF;
            IF :SYSTEM.CURSOR_RECORD <> REC_NUM THEN
            GO_REC(REC_NUM);
            END IF;
            END IF;
            -- can't go_rec to NEW record, so need to test here
            IF  :SYSTEM.LAST_RECORD = 'TRUE'
            AND REC_NUM = 1 + :SYSTEM.CURSOR_RECORD THEN
            NEXT_RECORD;
            Check_Success;
            END IF;
            --
            END SYNC_BLOCK;

其次,下面的五行代码完全符合您的要求

xx:=GET_BLOCK_PROPERTY('blk',TOP_RECORD);
xxx:=GET_BLOCK_PROPERTY('blk',CURRENT_RECORD );
go_block('blk');
execute_query();
SYNC_BLOCK('blk',xxx,xx);

如果您需要更多信息,请随时与我联系

关于oracle - 如何在查询后保留 block 位置 -oracle 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198217/

相关文章:

java - 用于 Hibernate 和 Oracle 的 ID 生成器 (Spring MVC)

forms - Rails 4 欢迎向导,如何更正此代码以使其适用于 Rails 4?

ASP.Net VB DropDownList 第一个值始终被选中

java - 平面文件下载并保存在数据库中

node.js - 使用 knex js 执行过程时出现错误

oracle - 如何测试程序或 oracle 函数?

database - 在存储过程中动态填充 Oracle 游标

c - Informix 到 Oracle : Dealing with Fetching Null Values

oracle - PL/SQL 在 IN CLAUSE 中使用 VARRAY

ruby-on-rails - 通过表单提交数据后如何防止重定向