zoukankan      html  css  js  c++  java
  • Form 中 Block的重新查询

    Form中某些按钮可能调用了Package对表中某些字段进行更新,但是数据库中字段的修改不会马上反映到form的界面上,所以要进行重新查询。

    但是用户可能使用了查询窗口进行查询之后然后再点击按钮动作,如果简单的使用execute_query进行查询的话那么就会把原来的查询条件冲掉。所以这里写了一个公用的包进行查询:

    --
    -- Name: query_block
    -- Purpose: BLOCK重新查询
    --    
    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;
    
      --如果光标不在目标块。则go_block到目标块  
      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; --IF name_in('SYSTEM.CURSOR_BLOCK') <> p_block_name THEN  
      END IF; --IF l_cursor_block <> p_block_name THEN     
    
      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), 'ORDER BY') = 0 THEN   
    
      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; --IF instr(upper(l_last_query), 'WHERE') = 0 THEN  
    
      --得到上一次的查询条件  
      l_where_clause := substr(l_last_query,
                               l_where_anchor + 6,
                               l_order_anchor - l_where_anchor - 5);
    
      fnd_message.debug(l_where_clause);
    
      --设置数据块得查询条件                           
      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一致,如果不一致,那么就goP_Block上,然后获取该BlockLast_Query,由于可能查询带有Order By,所以需要判断是否带有Order By来决定截取的最终位置。

    取得了where条件之后,通过使用set_block_property(p_block_name,default_where,l_where_clause)以及execute_queryblock进行查询,在这之前需要先保存原来的default where,在查询之后将default_where设置为默认的。

    最后将光标定位到原位置。调用的时候输入Block Name,便可以截取到Block的查询条件查询该Block

  • 相关阅读:
    Mybatis学习(2)原始dao开发和使用mapper接口代理开发
    Mybatis学习(1)
    Leetcode | Merge Intervals
    GDB打印STL容器内容
    LeetCode | Max Points on a Line
    最长不减子序列【转】
    LeetCode | Evaluate Reverse Polish Notation
    LeetCode | Word Ladder II
    LeetCode | Valid Number
    LeetCode | Set Matrix Zeroes
  • 原文地址:https://www.cnblogs.com/Cqiang/p/2932045.html
Copyright © 2011-2022 走看看