六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 584|回复: 0

Form开发积累的常用代码

[复制链接]

升级  38%

27

主题

27

主题

27

主题

秀才

Rank: 2

积分
107
 楼主| 发表于 2013-1-29 22:33:38 | 显示全部楼层 |阅读模式
获取当前窗口

GET_VIEW_PROPERTY(GET_ITEM_PROPERTY(:SYSTEM.CURSOR_ITEM, ITEM_CANVAS),WINDOW_NAME)
设置金额显示格式

PROCEDURE FORMAT_PRICE(EVENT VARCHAR2) IS
BEGIN
  IF (EVENT IN ('WHEN-VALIDATE-ITEM','POST-QUERY'))
THEN
APP_ITEM_PROPERTY.SET_PROPERTY('LINES.SUGGESTED_PRICE',FORMAT_MASK,      FND_CURRENCY.GET_FORMAT_MASK(:ORDERS.CURRENCY_CODE,GET_ITEM_PROPERTY('LINES.SUGGESTED_PRICE',MAX_LENGTH)));
    APP_ITEM_PROPERTY.SET_PROPERTY('LINES.TOTAL_PRICE',FORMAT_MASK,      FND_CURRENCY.GET_FORMAT_MASK(:ORDERS.CURRENCY_CODE,GET_ITEM_PROPERTY('LINES.TOTAL_PRICE',MAX_LENGTH)));
  ELSE
        FND_MESSAGE.DEBUG('Invalid event passed to lines.format_price '||EVENT);
  END IF;
END FORMAT_PRICE;
获取帐户帐套,帐户CODE相关信息

 
      /*=====================================
      ** PROCEDURE:     pre_form
      **=====================================*/
      procedure pre_form is
       
            cursor sob_cur(sob_id number) is
       SELECT sob.set_of_books_id,
                          sob.currency_code,
                          sob.chart_of_accounts_id
                    FROM gl_sets_of_books sob
                   WHERE sob.set_of_books_id = sob_id ;
           
            l_coa_id    number;
            l_sob_id  number;
            l_currency_code varchar2(15);
            l_org_id    number;
            l_order_num_mode varchar2(10);
      begin
       
     
       -- Set of Books ID
        l_sob_id := fnd_profile.value('GL_SET_OF_BKS_ID');
       
        -- org id
        l_org_id := fnd_profile.value('ORG_ID');
       if (l_org_id is null) then
          fnd_message.set_name('FND', 'PROFILES-CANNOT READ');
          fnd_message.set_token('OPTION', 'ORG_ID');
          fnd_message.error;
          raise form_trigger_failure;
       end if;
      
       open sob_cur(l_sob_id) ;
       fetch sob_cur into l_sob_id, l_currency_code,l_coa_id;
       close sob_cur;
       :parameter.currency_code := l_currency_code ;
      
      
       l_order_num_mode := fnd_profile.value('TRN_PO_ORDER_NUM_TYPE_036');
      
       -- Stash values away for future reference
   --  :parameter.org_id := to_number(l_org_id);
       --:parameter.set_of_books_id := to_number(l_sob_id);
      
       :parameter.chart_of_accounts_id := to_number(l_coa_id);
    :parameter.order_number_mode := l_order_num_mode;
           
            -- set amount mask
            set_amount_mask;
      end pre_form;    
     
procedure set_amount_mask is
      begin      
            -------------------------------------
            -- setup amount field's format mask
            -- ----------------------------------          
            set_item_property('HEADERS.TOTAL_AMOUNT',FORMAT_MASK,
                        fnd_currency.get_format_mask(
                        :parameter.currency_code,
                  get_item_property('HEADERS.TOTAL_AMOUNT', MAX_LENGTH)));
           
            set_item_property('LINES.LINE_AMOUNT',FORMAT_MASK,
                        fnd_currency.get_format_mask(
                        :parameter.currency_code,
                        get_item_property('LINES.LINE_AMOUNT', MAX_LENGTH)));
                                   
      end set_amount_mask;
     
动态提交请求

APPS.FND_REQUEST.SUBMIT_REQUEST
(
APPLICATION IN VARCHAR2 DEFAULT NULL,
PROGRAM IN VARCHAR2 DEFAULT NULL,
DESCRIPTION IN VARCHAR2 DEFAULT NULL,
START_TIME IN VARCHAR2 DEFAULT NULL,
SUB_REQUEST IN BOOLEAN DEFAULT FALSE,
chr(0),'','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','', '','','','','','','','','','',
'','','','','','','','','','', '','','','','','','','','','',
'','','','','','','','','','', '','','','','','','','','','',
'','','','','','','','','','', '','','','','','','','','',''
)
RETURN NUMBER;
状态判断

get_block_property('headers',status)
:System.Mode
GET_VIEW_PROPERTY(GET_ITEM_PROPERTY(:SYSTEM.CURSOR_ITEM, ITEM_CANVAS),WINDOW_NAME
Get_Block_Property( 'LINES_PROMPT', PREVIOUSBLOCK)
GET_RECORD_PROPERTY(:SYSTEM.CURSOR_RECORD,'SHOPPEDAYOVERTB_V',Status );  --:SYSTEM.RECORD_STATUS ;
键弹性域定义和更新

定义
fnd_key_flex.define(
BLOCK=>'Items',
FIELD=>'EXPENSE_ACCID_DSP',
APPL_SHORT_NAME=>'SQLGL',
CODE=>'GL#',
ID=>'EXPENSE_CCID',
REQUIRED=>'Y',
USEDBFLDS=>'N',
updateable=>'',
VALIDATE=> 'FULL',
VRULE=> '\\nSUMMARY_FLAG\\nI\\nAPPL=SQLGL;NAME=GL_NO_PARENT_SEGMENT_ALLOWED\\nN',
NUM=>':PARAMETER.CHART_OF_ACCOUNTS_ID');
Form中执行SQL语句
sql1:=' TRUNCATE TABLE cfnd_matrix_cells';
 forms_ddl(sql1);   
 更新
 procedure update_definition(
    block           varchar2,
    field           varchar2,
    enabled         varchar2 default '$FFLEX_DEFAULT$',
    validate        varchar2 default '$FFLEX_DEFAULT$',
    vdate           varchar2 default '$FFLEX_DEFAULT$',
    displayable     varchar2 default '$FFLEX_DEFAULT$',
    insertable      varchar2 default '$FFLEX_DEFAULT$',
    updateable      varchar2 default '$FFLEX_DEFAULT$',
    vrule           varchar2 default '$FFLEX_DEFAULT$',
    copy            varchar2 default '$FFLEX_DEFAULT$',
    derived         varchar2 default '$FFLEX_DEFAULT$',
    valatt          varchar2 default '$FFLEX_DEFAULT$',
    title           varchar2 default '$FFLEX_DEFAULT$',
    required        varchar2 default '$FFLEX_DEFAULT$',
    autopick        varchar2 default '$FFLEX_DEFAULT$',
    autocombpick    varchar2 default '$FFLEX_DEFAULT$',
    usedbflds       varchar2 default '$FFLEX_DEFAULT$',
    allownulls      varchar2 default '$FFLEX_DEFAULT$',
    data_set        varchar2 default '$FFLEX_DEFAULT$',
    column          varchar2 default '$FFLEX_DEFAULT$',
    where_clause    varchar2 default '$FFLEX_DEFAULT$',
    query_security  varchar2 default '$FFLEX_DEFAULT$',
    qbe_in          varchar2 default '$FFLEX_DEFAULT$',
    read_only       varchar2 default '$FFLEX_DEFAULT$',
    dinsert         varchar2 default '$FFLEX_DEFAULT$',
    longlist        varchar2 default '$FFLEX_DEFAULT$',
    no_combmsg      varchar2 default '$FFLEX_DEFAULT$',
    lock_flag       varchar2 default '$FFLEX_DEFAULT$',
    combqp_where    varchar2 default '$FFLEX_DEFAULT$',
    derive_always   varchar2 default '$FFLEX_DEFAULT$',
    help            varchar2 default '$FFLEX_DEFAULT$',
    default_mode    varchar2 default '$FFLEX_DEFAULT$',
    where_clause_msg VARCHAR2 DEFAULT '$FFLEX_DEFAULT$')
使用该方法更新相应的属性即可。
Form中导入数据

 
DECLARE
  access_id     NUMBER;
  l_server_url  VARCHAR2(100);
  l_parameters  VARCHAR2(100);
  button_choice INTEGER;
  l_file_id     VARCHAR2(100);
  l_gfm_id      INTEGER;
BEGIN
  IF :file.import_type IS NULL OR :file.template_name IS NULL THEN
    fnd_message.set_string('请先输入完整数据.');
    fnd_message.show;
    RAISE form_trigger_failure;
  END IF;
  access_id := fnd_gfm.authorize(NULL);
  -- BUG 2589587 FND File Upload form is not displayed consistently
  -- in the correct language - now using fnd_function.execute to enforce
  -- ICX security and NLS issues.   
  fnd_profile.get('APPS_WEB_AGENT',
                  l_server_url);
  l_parameters := 'access_id=' || access_id || ' l_server_url=' || l_server_url;
  fnd_function.EXECUTE(function_name => 'FND_FNDFLUPL',
                       open_flag     => 'Y',
                       session_flag  => 'Y',
                       other_params  => l_parameters);
  -- Display a modal message for user to indicate file upload
  -- is completed.
  fnd_message.set_name('FND',
                       'ATCHMT-FILE-UPLOAD-COMPLETE');
 
  button_choice := fnd_message.question(button1     => 'YES',
                                        button2     => NULL,
                                        button3     => 'NO',
                                        default_btn => 1,
                                        cancel_btn  => 3,
                                        icon        => 'question');
  IF (button_choice = 3) THEN
    NULL;
  ELSIF (button_choice = 1) THEN
    DELETE FROM cfnd_matrix_cells;
    COMMIT;
    l_file_id := '';
    copy(l_file_id,
         'document_header.file_name_display');
    l_gfm_id := fnd_gfm.get_file_id(access_id);
    IF l_gfm_id IS NOT NULL THEN
      copy(to_char(l_gfm_id),
           'document_header.media_id');
   
      SELECT decode(instr(file_name,
                          '/'),
                    0,
                    file_name,
                    substr(file_name,
                           instr(file_name,
                                 '/') + 1))
        INTO l_file_id
        FROM fnd_lobs
       WHERE file_id = l_gfm_id;
      IF l_file_id IS NOT NULL THEN
        :file.filename := l_file_id;
        SELECT cfnd_matrix_cells_s1.NEXTVAL
          INTO :file.working_id
          FROM dual;
        cfnd_upl_pkg.extract_blob(l_gfm_id,
                                  :file.file_cs,
                                  chr(:file.delimiter),
                                  :file.working_id);
        go_item('CFND_MATRIX_CELLS.LINE_NO');
        clear_block(no_validate);
        execute_query;
        DELETE FROM fnd_lobs
         WHERE file_id = l_gfm_id;
        forms_ddl('commit');
     
        forms_ddl('commit');
      END IF;
    END IF;
  END IF;
END;
 
FORM中获取光标所在的TAB页面

1. 在Form级触发器中添加触发WHEN-TAB-PAGE-CHANGED
            2. 在此触发器中写如下代码:
      DECLARE
            canvas_id   VARCHAR2(30);                  --标签页ID
      BEGIN
            canvas_id := GET_CANVAS_PROPERTY('标签画布名', topmost_tab_page);
            IF canvas_id='标签页1'  then go_block('块1');end if;
            IF canvas_id='标签页2'  then go_block('块2');end if;
            IF canvas_id='标签页3'  then go_block('块3');end if;
            execute_query;
      END;
设置时间

DECLARE
    timer_id Timer;
    one_minute NUMBER(5) := 60000;
BEGIN
    timer_id := CREATE_TIMER('emp_timer', one_minute, REPEAT|NO_REPEAT);
END;
生成Editer框

DECLARE
  ed_id  Editor;
  status BOOLEAN;
BEGIN
  ed_id:=Find_Editor('edit_name'); ---由'edit_name'导航器定义
 
  IF NOT Id_Null(ed_id) THEN
     Show_Editor(ed_id, NULL, :block_name.item_name, status);
  ELSE
     Message('Editor "Happy_Edit_Window" not found');
     RAISE Form_Trigger_Failure;
  END IF;
END;
动态产生一个'LOV'框

DECLARE
  lv_id  LOV;
  status BOOLEAN;
BEGIN
      lv_id := Find_LOV('lov_name');   ---'lov_name' 由导航器定义 
--  IF Id_Null(lv_id) THEN
--     lv_id := Find_LOV('lov_name1'); ---'lov_name1' 由导航器定义
--  END IF;
  status := Show_LOV(lv_id,10,20);
END;
打开form上标准菜单 

app_menu.set_prop('EDIT.SELECT_ALL', ENABLED, PROPERTY_ON);
app_menu.set_prop('EDIT.DESELECT_ALL', ENABLED, PROPERTY_ON);
在相应层次建立出发器即可;
From 中Item代码格式Format

A typical item handler looks like this:
procedure ITEM_NAME(event VARCHAR2) IS
IF (event = ’WHEN–VALIDATE–ITEM’) THEN
–– validate the item
ELSIF (event = ’INIT’) THEN
–– initialize this dependent item
ELSIF (event in (’PRE–RECORD’, ’POST–QUERY’)) THEN
–– etc.
ELSE fnd_message.debug(’Invalid event passed to item_name: ’ ||
EVENT);
END IF;
END ITEM_NAME;
 
取关键性弹性域帐户描述的方法

declare
  -- Boolean parameters are translated from/to integers:
  -- 0/1/null <--> false/true/null
  result boolean;
begin
  -- Call the function
  result := fnd_flex_keyval.validate_ccid(
appl_short_name => :appl_short_name,--SQLGL
key_flex_code => :key_flex_code,--GL#
  structure_number => :structure_number,--50228
  combination_id => :combination_id,--113773
displayable => :displayable,--ALL
  data_set => :data_set,
  vrule => :vrule,
  security => :security, --IGNORE
  get_columns => :get_columns,
  resp_appl_id => :resp_appl_id, --101
  resp_id => :resp_id,--50481
  user_id => :user_id, --11193
  select_comb_from_view => :select_comb_from_view);
    dbms_output.put_line(fnd_flex_keyval.concatenated_descriptions);                                          
   -- Convert false/true/null to 0/1/null
end;
 
组织访问权限的控制语句(11i)

SELECT ict.ROWID row_id,
       ict.organization_id,
       ict.rate,
       ict.base_type_code,
       flv.MEANING,
       ict.adjust_account_id,
       ict.description,
       ict.created_by,
       ict.creation_date,
       ict.last_updated_by,
       ict.last_update_date,
       ict.last_update_login,
       ood.ORGANIZATION_NAME ORGANIZATION_NAME
  FROM dpos_item_cost_rate ict, org_organization_definitions ood,org_access oa,fnd_lookup_values_vl flv
 WHERE ict.organization_id = ood.ORGANIZATION_ID
 AND   oa.organization_id=ood.ORGANIZATION_ID
 AND   oa.resp_application_id=fnd_profile.VALUE('RESP_APPL_ID')
 AND   oa.responsibility_id = fnd_profile.VALUE('RESP_ID')
循环访问所有记录

DECLARE
      cur_blk VARCHAR2(40) := :System.Cursor_Block;
      bk_id   Block;
BEGIN
      bk_id := Find_Block(cur_blk);
      GO_BLOCK('SHOPPEDAYOVERTB_V');
  GO_RECORD(1);
  LOOP
      if get_block_property(bk_id,Update_Allowed)='TRUE' then
               :SHOPPEDAYOVERTB_V.import_flag:='N';
               UPDATE   SHOPPEDAYOVERTB SET  import_flag ='N' where SHOPPEDAYOVERTB.ROWID=:SHOPPEDAYOVERTB_V.ROW_ID;
         end if;      
         EXIT WHEN (NAME_IN('SYSTEM.LAST_RECORD') = 'TRUE');
         NEXT_RECORD;
  END LOOP;
  commit;
END;
在查询模式下使LOV有效

To enable LOVs in ENTER–QUERY mode on an item, create an item–level KEY–LISTVAL trigger as follows:
Trigger: KEY–LISTVAL
IF (:SYSTEM.MODE != ’ENTER–QUERY’) THEN LIST_VALUES;
ELSE SHOW_LOV(’query lov’);
END IF;
关闭窗口代码段

PROCEDURE close_window (wnd VARCHAR2) IS
IF wnd = ’HEADER’ THEN
––
–– Exit the form
––
app_window.close_first_window;
ELSIF wnd = ’LINES’ THEN
––
–– Close detail windows (Shipments)
––
app_custom.close_window(’SHIPMENTS’);
––
–– If cursor is in this window,
–– move it to the HEADER block
––
IF (wnd = GET_VIEW_PROPERTY(GET_ITEM_PROPERTY(
:SYSTEM.CURSOR_ITEM,ITEM_CANVAS),
WINDOW_NAME)) THEN
GO_BLOCK(’HEADER’);
END IF;
ELSIF wnd = ’SHIPMENTS’ THEN
––
–– If cursor is in this window,
–– move it to the LINES block
––
IF (wnd = GET_VIEW_PROPERTY(GET_ITEM_PROPERTY(
:SYSTEM.CURSOR_ITEM, ITEM_CANVAS),
WINDOW_NAME)) THEN
GO_BLOCK(’LINES’);
END IF;
END IF;
––
–– THIS CODE MUST REMAIN HERE. It ensures
–– the cursor is not in the window that will
–– be closed by moving it to the previous block.
––
IF (wnd = GET_VIEW_PROPERTY(GET_ITEM_PROPERTY(
:SYSTEM.CURSOR_ITEM, ITEM_CANVAS),
WINDOW_NAME)) THEN
DO_KEY(’PREVIOUS_BLOCK’);
END IF;
––
–– Now actually close the designated window
––
HIDE_WINDOW(wnd);
END close_window;
从当前form转到请求提交页面

fnd_function.execute( function_name => 'FND_FNDRSRUN',
open_flag => 'Y',
session_flag  => 'Y',
other_params  => 'DODT_REQ_ID="'||TO_CHAR(l_request_id)||'"');
R12中实现多OU编程

A.首先最重要的是要在pre-form中初始化多OU
BEGIN
    APP_STANDARD.EVENT(‘PRE-FORM’);
//必须在APP_STANDARD.EVENT()后执行
MO_GLOBAL.init ('INV');--参数可以使’S’—单OU,’M’-多OU,或者已经注册过的应用简称
END;
B.初始化后获取OU的信息,在Pre-form中获取OU信息,或在块上When-Create-Record获取OU信息
Pre-form
DECLARE
l_default_org_id number;
l_default_ou_name varchar2(240);
l_ou_count number;
BEGIN
...
mo_utils.get_default_ou(l_default_org_id, l_default_ou_name, l_ou_count);
:PARAMETER.mo_default_org_id) := l_default_org_id;
:PARAMETER.mo_default_ou_name := l_default_ou_name;
:PARAMETER.mo_ou_count := l_ou_count;
...
END;
When-Create-Record
IF :parameter.mo_default_org_id is not null and :block.org_id is null THEN
:block.org_id := :parameter.mo_default_org_id);
:block.operating_unit := :parameter.mo_default_ou_name;
END IF;
C.在各个触发器实现多OU的支持的代码
When-Create-Record Trigger of Operating Unit Field Block
IF (:parameter.mo_default_org_id IS NOT NULL ) THEN
   -- Defaulting org_id from profile option
   :block.org_id := :parameter.mo_default_org_id;
   :block.operating_unit := :parameter.mo_default_ou_name;
   -- Set policy context
   mo_global.set_policy_context('S’,:block.org_id);
ELSE
  mo_global.set_policy_context('M', null);
END IF;
IF :<your block name.org_id> is not null\
 IF :<block name.org_id> <> nvl(:<parameter.old_org_id>,-99) THEN
   -- Get the cache for current org
 END IF;
ELSE
 -- Refresh the cache
...
END IF;
When-Validate-Item Trigger of Operating Unit field
IF (:<your block name.org_id> IS NOT NULL ) THEN
 IF :<block name.org_id> <> nvl(:<parameter.old_org_id>,-99) THEN
    mo_global.set_policy_context('S', :block.org_id);
    -- Get the cache for the current org
 END IF;
ELSE -- :block.org_id is null
 mo_global.set_policy_context('M', null);
 -- Refresh the cache
END IF;
When-New-Record-Instance Trigger of Operating Unit Field Block
IF (:<your block name.org_id> IS NOT NULL ) THEN
 IF :<block name.org_id> <> nvl(:<parameter.old_org_id>,-99) THEN
   mo_global.set_policy_context('S', :block.org_id);
   -- Get the cache for the current org
 END IF;
ELSE -- :block.org_id is null, so set the context to multiple
 mo_global.set_policy_context('M', null);
 -- Refresh the cache
END IF;
Pre-Insert Trigger of Operating Unit Field Block
Use this trigger if the form allows the user to commit multiple records.
IF (:<your block name.org_id> IS NOT NULL ) THEN
 IF :<block name.org_id> <> nvl(:<parameter.old_org_id>,-99) THEN
   mo_global.set_policy_context('S', :block.org_id);
   -- Get the cache for the current org
 END IF;
ELSE -- :block.org_id is null, so set the context to multiple
 mo_global.set_policy_context('M', null);
 -- Refresh the cache
END IF;
Pre-Query Trigger of Operating Unit Field Block
BEGIN
 IF :parameter.mo_ou_count = 1 THEN
   mo_global.set_policy_context(‘S’,:parameter.mo_default_org_id);
 ELSE
   mo_global.set_policy_context('M', null);
 END IF;
 -- Other Code
END;
Pre-Record Trigger of Operating Unit Field Block
use this trigger if the form forces the user to commit each record.
IF (:parameter.current_record is not null and
    :parameter.current_record != :system.trigger_record) THEN
  IF (:system.form_status in ('CHANGED','INSERT')) THEN
    mo_global.set_policy_context('S', :parameter.old_org_id);
    -- Get the cache for the current org
    -- raise error message to the user to commit;
    -- raise form_trigger_failure;
  ELSE
    -- No pending commits.
    -- Reset the current record variable.
    :parameter.current_record := '';
  END IF;
ELSE
  -- User has not navigated to another record.
  -- Do not reset the current record variable.
  null;
END IF;
Pre-Update Trigger
Use this trigger if the form allows the user to commit multiple records commits that are in different operating units.
IF (:<your block name.org_id> IS NOT NULL ) THEN
  IF :<block name.org_id> <> nvl(:<parameter.old_org_id>,-99) THEN
    mo_global.set_policy_context('S', :block.org_id);
    -- Get the cache for the current org
  END IF;
END IF;
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表