Form个性化--调用自定义程序库

现在我们来看另外一个内置类型--调用自定义程序库。自定义程序库,即Oracle提供的Custom.pll库,当我们使用调用自定义程序库时,Form默认执行的是custom.event()过程,而参数,便是我们传进去的变元了。实际上,custom.pll还有更强大的作用,大家有兴趣可以下载附件中的文档看一下。

言归正传,回到原来的话题,依然是创建菜单项按钮提交请求,使用custom.pll来实现。刚才已经介绍了调用了自定义程序库的执行机制,那么接下来,就是在custom.pll中添加代码啦,首先,从服务器$AU_TOP/resources目录下载custom.pll文件,使用form builder打开文件,和编辑其他package一样,编写代码:


procedure event(event_name varchar2) is
  form_name      varchar2(30) := name_in('system.current_form');
  block_name     varchar2(30) := name_in('system.cursor_block');
begin
  if event_name = 'CALL_CUSTOM_EVENT' then
    if (form_name = 'APXINWKB' and block_name = 'INV_SUM_FOLDER') then
      declare
        l_group_name     varchar2(60) := block_name||'_MULTI';
        l_rec_group_id    recordgroup;
        l_curr_rec_num   number;
        l_num_records    number;
        l_invoice_id_str   varchar2(2000);
        l_curr_record      number;
        l_success            boolean;
        l_request_number           number;
        e_check_error_exception exception;
      begin
      -- 获取选中的invoice
      l_rec_group_id := find_group(block_name||'_MULTI');
     
      if not id_null(l_rec_group_id) then
        l_num_records := get_group_row_count(find_group(l_group_name));
       
        if l_num_records > 0 then
          l_invoice_id_str := null;
          -- 对选中的记录进行循环
          for i in 1..l_num_records loop
            l_curr_rec_num := get_group_number_cell(l_group_name||'.REC_NUM',i);
            go_record(l_curr_rec_num);
            -- 组合invoice id作为请求参数
            if l_invoice_id_str is null then
              l_invoice_id_str := name_in(block_name||'.INVOICE_ID');
            else
              l_invoice_id_str := l_invoice_id_str||','||name_in(block_name||'.INVOICE_ID');
            end if;
          end loop;

          if l_invoice_id_str is not null then
            l_invoice_id_str := '('||l_invoice_id_str||')';
            -- 加载模板
            l_success := fnd_request.add_layout('XXBG','XXBGREQP','zh','CN','PDF');
            if l_success then
              -- 设置请求的业务实体
              fnd_request.set_org_id(l_org_id);
              -- 提交打印付款申请请求
              l_request_number :=
                     fnd_request.submit_request(
                            'XXBG',
                            'XXBGREQP',
                            '',
                            '',
                            FALSE,
                            l_invoice_id_str,
                            CHR(0), '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '',
                            '', '', '', '', '', '', '', '', '', '');
             
              if l_request_number = 0 then
                fnd_message.retrieve;
                fnd_message.error;
              else
                if app_form.quietcommit then
                  fnd_message.set_name('SQLGL','GL_REQUEST_SUBMITTED');
                  fnd_message.set_TOKEN('REQUEST_ID', to_char(l_request_number), FALSE);
                  fnd_message.show;
                end if;
                -- 弹出请求窗口
                fnd_function.execute( function_name => 'FND_FNDRSRUN',
                       open_flag   => 'Y',
                       session_flag  => 'Y',
                       other_params  => 'DODT_REQ_ID="'||TO_CHAR(l_request_number)||'"');
              end if;
            end if;
          end if;
          go_record(l_curr_record);
        else
          fnd_message.set_name('', 'Please select one record');
          raise e_check_error_exception;
        end if;
      end if;
      exception
        when e_check_error_exception then
          fnd_message.error;
          raise form_trigger_failure;
      end;
    end if;
  end if;
end event;

由于我使用了app_form.quietcommit过程,所以,要把appcore库添加到custom下面才可以使用。

完成后上传custom.pll到服务器目录,使用

11i: f60gen module_type=LIBRARY module=CUSTOM userid=apps/apps

R12:frmcmp_batch module_type=LIBRARY module=CUSTOM userid=apps/apps 编译pll文件,退出应用重新登陆,效果就出来了。本程序在R12环境测试过。

你可能感兴趣的:(exception,session,服务器,Module,null,library)