`

Form中Block的重新查询

Go 
阅读更多

Form中某些按钮可能调用了Package对表中某些字段进行更新,但是数据库中字段的修改不会马上反映到form的界面上,所以要进行重新查询,但是用户可能使用了查询窗口进行查询之后然后再点击按钮动作,如果简单的使用execute_query进行查询的话那么就会把原来的查询条件冲掉。所以这里写了一个公用的包进行查询:

 

procedure query_block(p_block_name varchar2)
is
  l_cursor_block     varchar2(50);
  l_cursor_record    number;
  l_cursor_item      varchar2(50);
  l_trigger_record   number;
  l_default_where    varchar2(1000);
  l_last_query       varchar2(2000);
  l_where_anchor     number;
  l_order_anchor     number;
  l_where_clause     varchar2(1000);
  l_message_level    number;

begin
  l_cursor_item    := name_in(‘SYSTEM.CURSOR_ITEM’);
  l_cursor_record  := name_in(‘SYSTEM.CURSOR_RECORD’);
  l_cursor_block   := name_in(‘SYSTEM.CURSOR_BLOCK’);
  l_trigger_record := l_cursor_record;
  l_message_level  := :system.message_level;
  if l_cursor_block <> p_block_name then
     l_trigger_record := get_block_property(p_block_name, CURRENT_RECORD);
     go_block(p_block_name);
       if name_in(‘SYSTEM.CURSOR_BLOCK’) <> p_block_name then
         fnd_message.debug(‘DEVELOPER ERROR: To select records ‘||
                          ‘in another block, you must be able to navigate.’);
         raise FORM_TRIGGER_FAILURE;
       end if;
  end if;
  l_default_where := get_block_property(p_block_name, DEFAULT_WHERE);
  l_last_query    := get_block_property(p_block_name, LAST_QUERY);               
  //检查是否有Order By语句
  if instr(upper(l_last_query), ‘ORDER BY’) = 0 then
    l_order_anchor := length(l_last_query);
  else
    l_order_anchor := instr(upper(l_last_query), ‘ORDER BY’) – 1;
  end if;

  if instr(upper(l_last_query), ‘WHERE’) = 0 then
    l_where_anchor := l_order_anchor – 5;
  else
    l_where_anchor := instr(upper(l_last_query), ‘WHERE’) + 1;
  end if; 
  l_where_clause  := substr(l_last_query, l_where_anchor+6, l_order_anchor-l_where_anchor-5);       
 

  set_block_property(p_block_name,default_where,l_where_clause);
  :system.message_level := 25;
  execute_query;
  :system.message_level := l_message_level;
  set_block_property(p_block_name,default_where,l_default_where);
  go_block(p_block_name);
  go_record(l_trigger_record);

  go_block(l_cursor_block);
  go_record(l_cursor_record);
  go_item(l_cursor_item);

end query_block;

程序首先保存当前的block,record以及Item使得在执行完之后光标依然停留在原位置而不会跳来挑去。之后判断当前所在的Block是否和参数传进来的P_Block一致,如果不一致,那么就go到P_Block上,然后获取该Block的Last_Query,由于可能查询带有Order By,所以需要判断是否带有Order By来决定截取的最终位置。取得了where条件之后,通过使用set_block_property(p_block_name,default_where,l_where_clause)以及execute_query对block进行查询,在这之前需要先保存原来的default where,在查询之后将default_where设置为默认的。最后讲光标定位到原位置。

调用的时候输入Block Name,便可以截取到Block的查询条件查询该Block。

分享到:
评论

相关推荐

    Oracle Form 触发器的执行顺序

    Oracle Form 是 Oracle E-Business Suite R12 中的一个功能强大且灵活的开发工具,用于创建复杂的商业应用程序。其中,触发器(Trigger)是一种非常重要的组件,它可以根据不同的事件来触发相应的操作。 Oracle ...

    FORM 开发中FOLDER(文件夹)的使用

    FORM 开发中的 FOLDER(文件夹)功能详解 在 Oracle FormBuilder 中,FOLDER(文件夹)功能是一个非常重要的组件,它能够帮助开发者快速地创建和管理文件夹结构。在这个教程中,我们将详细地介绍 FOLDER 功能的开发...

    Oracle EBS Form开发小技巧汇总

    1. **Form 中的 Block 重新查询**: 当用户更改了某个字段的值时,可能需要更新与之关联的其他数据。通过触发器在适当的时候调用 `DO_BLOCK('BLOCK_NAME', 'REFRESH')` 可以实现对特定 Block 的重新查询,以确保...

    ORACLE_FORM开发实战

    - **查询 FORM**:在查询 FORM 中可以添加按钮,通过编程方式设置查询条件并执行查询。 - 新建一个块并加入一个框架。 - 加入数据项和按钮,编写代码实现动态查询功能。 - ```plsql GO_BLOCK('LZHTEST001'); ...

    FORM开发FOLDER参考实例

    在Oracle Forms开发中,"FORM开发FOLDER参考实例"是一个教程,旨在帮助开发者实现类似Oracle标准Folder的功能。这个过程涉及到创建新的Form,添加必要的对象,调整触发器和程序单元,以及集成Oracle标准Form中的组件...

    Oracle EBS Form 开发帮助文档

    - 如果Form中有多个Data Block,可以创建它们之间的关系以实现数据交互,这可以通过“Create Relationship”完成。 4. **Layout Wizard**: - Layout Wizard用于定义数据如何在Canvas上显示,你可以选择显示在哪...

    漂亮的form表单-漂亮的form表单

    在网页设计中,表单(Form)是用户与网站交互的重要元素,用于收集用户输入的信息。"漂亮的form表单"这个主题关注的是如何创建既美观又功能强大的表单,以提高用户体验并提升网站的整体视觉效果。下面将详细介绍关于...

    Oracle Form自动生成序号

    - 说明: 该标记用于避免在查询期间执行W-C-R(WHEN-CHANGED-READ-ONLY)操作。当`Lines`块的W-C-R触发器结束时,需重置该标记。 - **参数名称**: `max_line_num` - 类型: 数字 - 长度: 30 - 初始值: `0` - ...

    oracle form folder功能步骤

    在 Form 的 Console Window 中,设置 MY_FOLDER 为 Form 的 First Navigation Data Block。同时,设置 Window 的 Primary Canvas 为 MY_FOLDER,Block MY_FOLDER 的 Query Data Source Name 为 XXIN_BRAND_TYPE_V,...

    Form开发小技巧.pdf

    如果需要,提交请求后还可以重新查询Block。 2. **非数据库字段查询处理**:当希望过滤掉某些特定记录,如不显示供应商A时,通常会考虑修改Block的默认WHERE条件。然而,直接使用set_block_property设置DEFAULT_...

    oracle form 学习资料

    这种绑定可以通过“Data Block”来实现,Data Block是表单中用于显示和操作数据库记录的一个容器。 3. **触发器与事件处理**:触发器是Form Builder中的一个重要概念,它们在特定事件发生时执行。例如,WHEN-NEW-...

    FormBuilder介绍培训资料.pptx

    都要指定 Property Class Name 作法相同, 但不同的 Object 选不同的 Class Data Block 较重要的 Property Data 是否可查询 查询 Data 的 Where 及 Order by 可写在此处 是否可新增/删除/修改 Data Windows Name 建议...

    ORACLE_FORM_开发实战

    3. **按钮与代码的加入**:为了实现查询功能,需要在Form中加入按钮,并编写相应的代码,如`GO_BLOCK`, `SET_BLOCK_PROPERTY`, `EXECUTE_QUERY`等,用于执行查询逻辑。 ### 三、多画布操作 在复杂的应用场景下,...

    FormValidation验证源代码

    FormValidation通过自定义事件、回调函数和插件系统,使开发者能够轻松地集成验证功能到现有的项目中。 FormValidation的核心特性包括: 1. **多种验证规则**:内置了众多预定义的验证规则,例如邮箱、电话号码、...

    form_report开发经验

    - **Forms与Reports的协作**:一个Form可以调用Report,比如在Form中执行查询后生成报表。反之,Report也可以打开或更新Form中的数据。 - **Web发布**:Oracle EBS支持将Forms和Reports发布到Web,以适应互联网...

    form builder内置函数说明

    `commit_form`函数确保表单中的数据被保存到数据库中,是数据持久化的关键步骤。 #### 二十四、Convert Other Value - 转换值 `convert_other_value`函数用于转换下拉列表、圆形单选按钮组或复选框的值,使其符合...

    FORM个性化经典实例:添加菜单项

    FORM个性化是Oracle EBS R12中引入的一项强大功能,它允许用户在不修改原有FORM源代码的情况下,定制化修改FORM的标准功能。这一特性对于保持系统的稳定性和简化升级过程具有重要意义,因为个性化代码独立存储于...

Global site tag (gtag.js) - Google Analytics