zoukankan      html  css  js  c++  java
  • FORM开发相关技术(三)

    1.打开windows
    --修改PER-FORM触发器中调用第一个form
    --修改app_custo.open_window中调用windows的名字,打开窗口
    (用键盘切换当前Block或用button打开窗体时,需使用APP_CUSTOM.OPEN_WINDOW函数,语法为APP_CUSTOM.OPEN_WINDOW(‘block_name’)
    APP_CUSTOM.OPEN_WINDOW 中又会调用app_window.set_window_position。如果是Master-Detail Block需要建立coordination关系的,在APP_CUSTOM.OPEN_WINDOW('LINES')时,调用 APP_WINDOW.SET_COORDINATION)
    --对于每一个window而言,
    --用app_window.set_coordination 来设置必要的关系(
    procedure APP_WINDOW.SET_COORDINATION(event varchar2,coordination varchar2,relation_name varchar2);
    --其中event
    The name of the trigger event (either WHEN-CHECKBOX-CHANGED,WHEN-WINDOW-CLOSED, or OPEN-WINDOW)
    --coordination
    IMMEDIATE or DEFERRED. Defaults to IMMEDIATE
    --relation_name
    Name of the relation, which is listed in the Oracle Forms Designer under the Block object in the
    Relation object)
    --设置窗体的位子使用app_window.set_window_position(位子包括(CASCADE, RIGHT, BELOW, OVERLAP or CENTER).)
    --COORDINATION,重设
    2.关闭windows
    --与打开form相对,用APP_CUSTOM.CLOSE_WINDOW函数调用windows的名字关闭窗口
    --对于每一个窗口,用app_window.set_coordination 来设置必要的关系
    --当第一个窗口关闭时,使用APP_WINDOW.CLOSE_FIRST_WINDOW关闭form
    --避免关闭查询中的windows
    --将光标从一个关闭的窗口移到前一个数据库上
    --用hide_window隐藏制定窗口,
    3.设置window title
    --用app_windows.set_title来设置context-dependent 信息
    --在PRE-RECORD中调用title
    当用键盘切换当前Block或用button打开窗体时,需使用APP_CUSTOM.OPEN_WINDOW函数
    可以使用下面的procedure
    PROCEDURE LINES(EVENT VARCHAR2) IS
    BEGIN
    IF (EVENT IN ('WHEN-BUTTON-PRESSED', 'KEY-NXTBLK'))
    THEN APP_CUSTOM.OPEN_WINDOW('LINES');
    ELSE
    FND_MESSAGE.DEBUG('Invalid event passed to orders.lines: '|| EVENT);
    END IF;
    END LINES;
    修改APP_CUSTOM.OPEN_WINDOW函数,打开windows的规则:
    1.设置windows位置;用app_window.set_window_position('你要打开的界面','打开模式--CASCADE, RIGHT, BELOW, OVERLAP or CENTER','前一个页面')
    2 重置master-detail 关系(如有需要的话);如果是Master-Detail Block,则需要建立coordination关系,
    APP_WINDOW.SET_COORDINATION(event varchar2,coordination varchar2,relation_name varchar2);如
    APP_WINDOW.SET_COORDINATION('OPEN-WINDOW'--触发事件(包括‘WHEN–CHECKBOX–CHANGED,
    WHEN–WINDOW–CLOSED, or OPEN–WINDOW)’),:control.orders_lines--需要调用coordination的数据块(IMMEDIATE or DEFERRED. Defaults to IMMEDIATE),'ORDERS_LINES'--主从关系的名字Name of the relation,);
    3导航到window中的一个block。go_block('block')
    4 必要时需要设置窗体属性 SET_WINDOW_PROPERTY('LINES',VISIBLE,PROPERTY_TRUE);
    对于APP_WINDOW.SET_COORDINATION的进一步理解:(用于主从关系中)
    This call sets the deferred coordination attribute of a relation to ON or
    OFF based on the state of the coordination check box. The check box is
    either ”DEFERRED” or ”IMMEDIATE.”For a closed window, the relation is always ”DEFERRED.”
    When coordination is set to ”DEFERRED,” AutoQuery is turned on.
    coordination check box选中与否决定其取值是‘IMMEDIATE’ 还是‘DEFERRED’。如果coordination check box选中的话,
    即使焦点在Master window时,Detail window中数据会于Master window同步;如果coordination check box没有选中,
    Detail window的内容不会于Master window同步,直到焦点落在Detail window时,系统才会执行查询更新数据。
    这个过程自己试验一下会非常的清楚。
    使用coordination check box 必须在其WHEN-CHECKBOX-CHANGED trigger中重置Master-Detail windows的同步关系。
    设置上下文相关联的windows的标题:
    动态设置相关联的窗体标题依靠APP_WINDOW.SET_TITLE函数,
    注意在两类trigger中需要调用它。一类是Block-level的pre-record和on-insert trigger,
    另一类是相关联字段的when-validate-item trigger
    APP_WINDOW.SET_TITLE函数用法:
    APP_WINDOW.SET_TITLE('ADJ_RECEIVE',ARAMETER.ORG_CODE);
    其中ADJ_RECEIVE是window 的名字,用于设置window的title
    4.常用item 事件包括:
    when_validate_item : 调用一个item的验证并且设置动态的item 属性
    when_new_record_unstance :重置item属性到默认状态给一个新的纪录。
    init:测试当前条件,必要时重置默认属性和动态属性
    对于‘INIT’的理解:
    Examine current conditions and reset defaults and dynamic attributes as necessary. Usually called by other handlers that affect this item.
    5. EBS中客户化表结构的设计原则:
    1)必须包括一个主键,并建立相应的序列;
    2)建立5个WHO字段,也就是
    CREATED_BY NUMBER
    CREATION_DATE DATE
    LAST_UPDATED_BY NUMBER
    LAST_UPDATE_DATE DATE
    LAST_UPDATE_LOGIN NUMBER
    在FORM中使用属性类:CREATION_OR_LAST_UPDATE_DATE,WHO字段并不会自动地被赋值,必须自己在FORM中编写代码来完成这项工作。
    EBS中提供了一个函数FND_STANDARD.SET_WHO,大家只要在FORM的BLOCK级触发器PRE-INSERT/PRE-UPDATE中进行调用即可。
    对于记录的PRE-INSERT,PRE-UPDATE Trigger中加入了fnd_standard.set_who后,
    程序自动会对CREATE _BY,CREATION_DATE,LAST_UPDATE_BY,LSAT_UPDATE_DATE,LAST_UPDATE_LOGIN这5个栏位赋新的值
    6.form 编程规则:
    *引用字段时,使用 :BlockName.ItemName的形式;
    *使用亚元直接用dual,不要用sys.dual和system.dual;
    *使用object IDs获得更好的性能;
    declare
    x_id item;
    begin
    x_id := find_item(’block.item’);
    /* your code here */
    end;
    *总是使用显式游标;
    *使用FND_MESSAGE程序显示信息
    *使用FND_MESSAGE.DEBUG拉显示debugging信息,
    典型用法:
    ELSE
    fnd_message.debug(’Invalid event passed to control.orders_lines: ’ || EVENT);
    END IF;
    *使用RAISE FORM_TIGGER_FAILURE来终止应用层的运行
    *使用APP_EXCEPTION.RAISE_EXCEPTION 来终止数据库层的运行
    *用fnd_fuction.execute代替open_form
    *不要使用CALL_FORM
    *用do_key(‘exit_form’)代替exit_form
    To exit the Oracle Applications suite:
    copy (’Y’, ’GLOBAL.APPCORE_EXIT_FLAG’);
    do_key(’exit_form’);
    *用do_key(‘clear_form’)代替clear_form
    *用do_key('COMMIT_form')代替commit
    *用do_key(‘edit_field’)代替EDIT_FIELD/EDIT_TEXTITEM
    触发器编程规则
    *Post-Query trigger说明:
    .用带有LOVS的items使用lov来验证是否正确,当他们在无意识的情况下被要求保存changes会使用户感到混淆,
    这种情况下,在你的post-query 触发器里面重置记录状态 :(设置当前块的属性为查询状态)
    set_record_property(:system.trigger_record,:system.trigger_block, STATUS,QUERY_STATUS);
    *必须设置为Before的trigger有WHEN-NEW-RECORD-INSTANCE, WHEN-NEW-BLOCK-INSTANCE,WHEN-NEW-ITEM-INSTANCE;
    可以设置为Override的trigger有KEY-DUPREC,KEY-MENU,KEY-LISTVAL,QUERY_FIND, ACCEPT。
    7.FND_Function 用法:
    FND_Function.Execute 可使用
    Procedure--过程
    Executes the specified Form 指定的form
    Only accessible from Client-side PL/SQL 可连接form的客户端的pl/sql
    Should be used in place of Oracle Forms built-ins OPEN_FORM and NEW_FORM 应该在form级触发器OPEN_FORM与NEW_FORM
    Usage:--使用例子
    procedure FND_FUNCTION.EXECUTE
    (function_name IN varchar2,
    open_flag IN varchar2 default ’Y’,
    session_flag IN varchar2 default ’SESSION’,
    other_params IN varchar2 default NULL,
    activate IN varchar2 default ’ACTIVATE’,
    browser_target IN varchar2 default NULL);
    8.fnd_message.set_name用法:
    一般情况下在FORM中显示出错信息使用以下代码:
    FND_MESSAGE.SET_NAME( APPL_SHORT_NAME,MESSAGE_NAME) ;
    FND_MESSAGE.ERROR ;
    在PACKAGE中显示出错信息一般使用以下代码:
    FND_MESSAGE.SET_NAME( APPL_SHORT_NAME,MESSAGE_NAME) ;
    APP_EXCEPTION.RAISE_EXCEPTION ;
    例 fnd_message.set_name('FND','是否删除该记录?');
    fnd_message.question 用法:
    例 在删除某条记录之前提示是否删除该如何实现?即在删除某条记录之前提示用户是否删除,
    如何用户选择删除则删除,如果选择否则不删除的实现?
    1。首先新建Alter 'DELETE_ALERT',更改其属性button1为"Yes",button2为"No"
    2。在Block level Trigger: key-delrec中增加如下代码即可:
    declare
    return_value number;
    begin
    set_alert_property('DELETE_ALERT',alert_message_text,'Are You Sure Delete This Record ?');
    return_value := show_alert('DELETE_ALERT');
    if return_value = alert_button1 then
    delete_record;
    end if;
    end;
    9.提交请示
    关于fnd_request.submit_request的用法:
    FND_REQUEST.SUBMIT_REQUEST 函數是用來提交一個請求的,它返回一個NUMBER值.具體調用如下
    :result := fnd_request.submit_request(application CHAR, --AP模快
    program CHAR, --應用程式
    description CHAR, --請求說明(可選)
    start_time CHAR, --RUN 時間(可選)
    sub_request BOOLEAN, --立刻提交請求
    argument1 CHAR, --參數1
    argument2 CHAR, --參數2
    argument3 CHAR, --參數3
    argument4 CHAR, --參數4
    argument5 CHAR, --參數5.......
    argument100 CHAR);
    英文說明(zt oracle) :
    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.
    补充说明:
    在用fnd_request.submit_request的时候,第五个参数用false,不要被参数名称误导;
    这个函数有105个参数,前面五个定义请求本身,后面100个是传递给请求的具体参数,都是Char类型,
    我们需要转换,默认值是chr(0),代表这个参数不用传递给调用的请求;
    在Package里面调用只需要传递需要的参数个数,因为它有默认值指示结束;
    在form里面则不行,要写满105个,而且我们参数结束之后要用一个chr(0)来表示结束
    例 fnd_request.submit_request('AR', 'SVAINEX_P', '', '', FALSE, :parameter.invoice_store,
    chr(0), '','','',
    '','','','','','','','','','','','','','','','','','','','',
    '','','','','','','','','','','','','','','','','','','','',
    '','','','','','','','','','','','','','','','','','','','',
    '','','','','','','','','','','','','','','','','','','','',
    '','','','','','','','','','','','','','','');

    10. 程式中如何设置才能在点MENU上的FIND的图标时调出FIND WINDOW?(客制的ORACLE FORM中)?
    在相应的QUERY_FIND里写的,最后调用到app_find.query_find
    OA 中的查询可以通过2 种方法来实现:
    l LOV 查询
    l QUERY-WINDOW查询。
    LOV 查询的实现比较简单,且适合单一条件的查询;相比来说QUERY-WINDOW 查
    询的实现较繁琐,但它可以实现复杂的查询。
    LOV 查询的实现
    使用LOV 查询,需要按照以下步骤实现:
    l 创建PARAMETER,用于保存查询变量
    l 创建LOV,其返回值赋予上面定义的参数
    l 创建BLOCK 级的PRE-QUERY,将LOV 返回的值赋予BLOCK 中的对应字段
    l 创建BLOCK 级的QUERY-FIND。添加如下代码:
    APP_FIND.QUERY_FIND(’<LOV Name>’) ;
    QUERY-WINDOW查询的实现
    使用QUERY-WINDOW 查询,需要按照以下步骤实现:
    l 从APPSTAND 中拷贝QUERY-FIND 对象组,其中包括WIINDOW,BLOCK, CANVAS
    l 更改WINDOW, BLOCK, CANVAS 的名字
    l 更改按钮“NEW”的TRIGGER,编写如下代码:app_find.new(<块名> )
    l 更改按钮“FIND”的TRIGGER,编写如下代码:app_find.find(<块名> )
    l 设置导航属性。设置查询窗口的前导块为查询目标块,但查询窗口不能作为任何块的前导块或后续块
    l 编辑KEY–NXTBLK,使之功能同按钮“FIND”
    l 设置查询窗口名
    l 创建PRE-QUERY 代码,例如填写查询值,用APP_FIND.QUERY_RANGE设置查询范围等
    l 创建QUERY-FIND 代码,其中代码如下:
    APP_FIND.QUERY_FIND(’<块所在窗口名>’,’<查询窗口名>’,’<块名>’);
    方法2 1要建一个查询的数据块 在这个数据块中,放置各个需要查询的数据项.然后,在FORM级的触发器QUERY_FIND中,屏蔽掉标准的代码,而写为:go_block('你的查询数据块名称');
    这样,当用户点“手电筒”图标时,系统就会自动转到那个查询数据块的界面了。
    2查询数据块应该单独放在一个画布中,并且单独放在一个WINDOWS中。
    这样,就可以显示单独的查询窗口。
    如果要实现"当点击那个手电筒,出现我要查询的数据的windows,当我选中后,他会自动显示在另外一张windows".则要在查询数据块中放一个查询的按钮,在按钮中添加语句:go_block('要导向的结果数据块');
    execute_query;
    这样,用户输入好条件之后,点击“查询”按钮,就可以转到结果集窗口了。
    两句一起写在按钮事件下。
    在查询结果的数据块中,你可以在where条件那里直接引用查询数据块的各数据项的数据,
    写在where条件中限制结果集。
    方法3
    1要建一个查询的数据块 在这个数据块中,放置各个需要查询的数据项
    然后,在FORM级的触发器QUERY_FIND中,屏蔽掉标准的代码,而写为如:app_window.set_window_position('QUERY','CASCADE','MAIN' );--CASCADE',层叠的方式,就是把query窗口层叠在main之上
    app_find.QUERY_FIND('MAIN','QUERY','QUERY');--APP_FIND.QUERY_FIND(’<块所在窗口名>’,’<查询窗口名>’,’<块名>’);
    2查询数据块应该单独放在一个画布中,并且单独放在一个WINDOWS中。
    则要在查询数据块中放一个查询的按钮,在按钮中添加语句:go_block('要导向的结果数据块');
    execute_query;

  • 相关阅读:
    解决.net core 3.1 json日期带T的问题
    C# 将指定得时间转换成秒
    WPF Button按钮的按下和抬起分别触发的事件
    WPF Image图片后台绑定图片,不对图片照成占用
    WPF Textbox漂亮的文本控件框封装
    WPF Slider实现可拖动的时间轴
    .net mvc 下显示PDF文件
    .net core 3.1使用命令自动生成MySQL表对应的实体类
    .net core A generic error occurred in GD 已解决
    WPF 模拟Button按钮事件触发
  • 原文地址:https://www.cnblogs.com/quanweiru/p/2616120.html
Copyright © 2011-2022 走看看