跳到主要內容

FND_REQUEST.SUBMIT_REQUEST的用法說明(提交Request)

FND_REQUEST.SUBMIT_REQUEST函數是用來送出一個Request,傳回一個NUMBER的值。
如果成功,會傳回Request ID的值,失敗則傳回0。

此函數一共有105個參數,前五個參數是定義fnd_request.submit_request自己,
後面的參數則是定義要傳給Concurrent Request的值。而第五個參數要特別注意,
false表示立刻提交,不要被參數名稱給誤導。
如下圖,第六個參數開始設定的值,會依序把值傳給Concurrent Program Parameters

注意:
1、Package使用只需要傳遞需要的參數個數,它會自帶結束的預設值。
2、form則要寫滿105個參數,而且參數結束之後要用一個chr(0)來表示結束。
3、在Toad、PL/SQL Developer、SQL puls等工具內使用,必須初始化global variables。
   也就是利用fnd_global.apps_initialize函數來初始化
4、如果提交Request時,一直傳回0,則檢查是否有初始化環境
5、傳給Concurrent Request的參數個數與定義,可以查詢Request的定義,如下圖:

語法:
Request_id := fnd_request.submit_request(
                  application CHAR, --模組
                  program CHAR,      --應用程式
                  description CHAR,   --說明(可省略)
                  start_time CHAR,    --RUN 時間(可省略)
                  sub_request BOOLEAN, --是否立刻送出Request
                  argument1 CHAR,   --傳給Request的參數1
                  argument2 CHAR,   --傳給Request的參數1
                  argument3 CHAR,   --傳給Request的參數1
                  ....(略)
                  argument100 CHAR);
       
Parameters are as follows:

application - Short name of the application associated with the concurrent
request to be submitted.

program - Short name of the concurrent program (not the executable)
for which the request should be submitted.

description - Description of the request that is displayed in the Concurrent
Requests form. (Optional.)

start_time - Time at which the request should start running, formatted as
HH24:MI or HH24:MI:SS (Optional.)

sub_request - Set to TRUE if the request is submitted from another request
and  should be treated as a sub-request.

argument1...100 - Arguments for the concurrent request; up to 100
arguments are permitted. If submitted from Oracle Forms,
you must specify all 100 arguments.


一、查application(模組)與program(應用程式)名稱的方法
       
方法一:由ERP介面查詢(查Import Items)

由下圖可以得知Short Name就是我們要的Program
位置:「Application Developer」->「Concurrent」->「Program」

依上圖的Application可以找到Short Name,就是我們要的application
位置:「Application Developer」->「Application」->「Register」
   
方法二:執行下列SQL查詢(查Import Item)
SELECT DISTINCT
       fa.APPLICATION_SHORT_NAME, --application(模組)
       fat.APPLICATION_NAME,
       fcp.CONCURRENT_PROGRAM_NAME, --program(應用程式)
       fcpt.USER_CONCURRENT_PROGRAM_NAME,
       fcpT.DESCRIPTION,
       fcpt.LANGUAGE
  FROM fnd_application_tl fat,
       fnd_application fa,
       fnd_concurrent_programs_tl fcpt,
       fnd_concurrent_programs fcp,
       fnd_executables fe
WHERE fat.APPLICATION_ID = fa.APPLICATION_ID
       AND fat.LANGUAGE = fcpt.LANGUAGE
       AND fa.APPLICATION_ID = fcp.APPLICATION_ID
       AND fcpt.CONCURRENT_PROGRAM_ID = fcp.CONCURRENT_PROGRAM_ID
       AND fcp.executable_id = fe.executable_id
       AND fcpt.USER_CONCURRENT_PROGRAM_NAME='Import Items'; --報表名稱
   
   
二、範例,Import Item(mtl_system_items_interface)

1、在Forms內使用

//在Forms中,初始化可以用GLOBAL變數代入
APPS.FND_GLOBAL.apps_initialize(
    user_id =>APPS.FND_GLOBAL.user_id,
    resp_id =>APPS.FND_GLOBAL.resp_id,
    resp_appl_id =>APPS.FND_GLOBAL.resp_appl_id) ;
   
//定義完變數後必須以CHR(0)來表示參數已結束,但是仍然要填滿105個  
v_request_id := fnd_request.submit_request(
    'INV',
     'INCOIN',
     '',
     '',
     FALSE,
    84 ,'1','1','1','1',set_process_id,'2',CHR(0),
     '','','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','');

2、在Package中使用

//初始化參數只能由SQL中查詢
SELECT user_id
  INTO l_num_user_id
  FROM applsys.fnd_user
  WHERE user_name ='AA123'; --帳號
       
SELECT responsibility_id
   INTO l_num_resp_id
   FROM apps.fnd_responsibility_vl
   WHERE responsibility_name ='Inventory'; --Responsibility Name
       
SELECT application_id
   INTO l_num_resp_appl_id
   FROM applsys.fnd_application
   WHERE application_short_name = 'INV'; --application name

fnd_global.apps_initialize (user_id => l_num_user_id,
                            resp_id => l_num_resp_id,
                            resp_appl_id => l_num_resp_appl_id
                            );

//只需填入需要個數的參數,會自動帶入結束符號。                                
v_request_id:=Fnd_Request.submit_request (
    application   => 'INV',
    Program       => 'INCOIN',
    description   => '',
    start_time    => '',
    sub_request   => FALSE,
    argument1     => 84,
    argument2     => 1,          
    argument3     => 1,
    argument4     => 1,
    argument5     => 1,  -- Delete processed Record
    argument6     => 5000,  -- Set Process id                  
    argument7     => 2   -- Create/Update item
     );
   

三、查詢Request執行狀態的函數

主要是用Fnd_concurrent.wait_for_ruqest函數來得知目前Request執行的狀態。

Fnd_concurrent.wait_for_request會傳回Boolean值,主要參數如下:
function FND_CONCURRENT.WAIT_FOR_REQUEST
    (request_id IN number default NULL, --Request ID
     interval IN number default 60, --檢查的時間間隔
     max_wait IN number default 0, --最大等待時間
     phase OUT varchar2,
     status OUT varchar2,
     dev_phase OUT varchar2,
     dev_status OUT varchar2,
     message OUT varchar2 ) ;
return boolean;


例如:
l_request_status := Fnd_Concurrent.Wait_For_Request(
    l_request_id,
    5,
    0,
    l_phase,
    l_status,
    l_dev_phase,
    l_dev_status,
    l_message);

IF l_request_status THEN
    IF l_dev_status = 'NORMAL' THEN
        NULL;
    ELSE
        Fnd_Message.Debug('Request執行失敗:'||l_dev_status);
        RETURN;
    END IF;
  ELSE
    Fnd_Message.Debug('Request執行失敗');
    RETURN;
END IF;

這個網誌中的熱門文章

Line如何換行

在電腦版的Line輸入文字時,遇到需要換行的情形時,我都是用記事本先寫好再複製上去,這樣就可以有換行的效果,可是這樣的做法好像失去Line的便利性。 於是查了一下,原來有一個設定可以指定Enter換行,而不是發訊息出去。 完成設定之後,要發送訊息就改用Alt+Enter,而Enter就可以換行了。

在Windows下,利用tasklist與taskkill來刪除Process

Windows7 / Windows8 kill process Linux下要刪除某個程序通常會使用 ps 配合 kill 來刪除程序。 例如:ps -ef |grep [PROCESS NAME]       kill -9 [PID] 在Windows下,通常是開啟工作管理員來強制結束應用程式,但是如果要寫成Script,就必須改為命令式。 TASKLIST [/S system [/U username [/P [password]]]]          [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]           TASKKILL [/S system [/U username [/P [password]]]]          { [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]           (Tasklist:查詢Process ; Taskkill:刪除Process)           例如要刪除已開啟的記事本(notepad): 1、查詢記事本的Process訊息     C:\> tasklist |find /i "notepad.exe"     notepad.exe      6092 Console     1     5,832 K 2、由上得知記事本的PID為6092     C:\> taskkill /f /PID 6092     成功:處理程序 PID 6092 已經終止了。     taskkill使用的參數     /f:指定此參數可強制終止處理程序     /PID:指定要終止之處理程序的 PID      3、也可以直接以程式名稱刪除     C:\ taskkill /f /im notepad.exe     成功:處理程序 "notepad.exe" <PID 6092> 已經終止了      下面是我自己測試的Script,可以刪除多個相同的程式,例如同時開啟了三個記事本: @echo off for /f &quo

Win 10 工作排程無法執行bat批次檔

利用Win 10的工作排程器來設定每日自動執行的批次檔,單獨執行批次檔沒問題,但是放在排程上就是無法執行。 後來試了幾種網路上提供的方式,其注意的事項如下: 1、在「安全性選項」選擇「只有使用者登入時才執行」並取消「以最高權限執行」。 2、在「設定」中選擇「Windows 10」 3、批次檔內的執行檔需以完整的路徑執行,或設定PATH路徑。 3、批次檔中如果帶有中文的路徑,則文字編碼類型必需是ANSI碼,       我的批次檔一開始就是UTF-8碼,但是單獨執行沒有問題,排程上就是有問題,       最後在批次檔中加入暫停指令pause才發現的。 4、如果想選擇「不論使用者登入與否均執行」,則在「設定」必須選擇「Windows Server 2003、Windows XP或Windows 2000」,    但是上述的選項只有在新增工作程程時才會出現,原有的工作排程是不會有此選項