zoukankan      html  css  js  c++  java
  • FORM开发笔记

    1,

    界面对行循环后在回到循环前的行

    v_current_record number:=Get_Block_Property('block名称', Current_Record); --返回当前行号

    go_record(v_current_record); --回到以前的当前行

    2,Form中的系统变量,它存在于一个Form的整个运行时期的会话之中,变量包含了有关Form相关属性的字节信息。有些变量标明了当前状态,还有些变量包含了告诉Oracle如何进行相关操作的设定信息。当系统变量在表达式中出现时,system前要加上分号,表示为:system,多个变量之间用逗号分隔开,:system后面以圆点(.)连接变量名,例如:system.message_level = '25'这样的系统变量赋值操作。

    Oracle Form系统变量中文总结如下:
    变量名
    变量描述
    system.block_status
    包含了当前块的状态,可有三个值:CHANGED,表明块中至少有一个记录被修改过;NEW,表明块中仅有未被修改过的记录;QUERY,表明块处于查询模式中。
    system.coordination_operation
    被用于块的同步过程,它与变量system.master_block合用。在块同步的过程中,变量system.master_block包含了主块的名字,变量system.coordination_operation包含了使触发器on_clear_details启动的主块中所发生的事件名称。
    system.current_block
    决定输入点的位置,当它出现在块、记录、项中时,它的值是块名。当pre_,post_form类触发器启动时,它的值为空(null)。
    system.current_datetime
    包含当前操作系统的日期和时间的字符值,默认格式为DD_MON_YYYY  HH24:MI:SS。
    system.current_form
    包含当前form的名称。
    system.current_item
    包含当前域的名字,当光标从一项移动到另一项时,这个值为空。
    system.current_value
    包含由system.current_item变量代表的项的值。
    system.cursor_block
    包含当前光标所停留的块的名字。
    system.cursor_item
    包含当前光标所停留的块和项的名字。
    system.cursor_record
    包含当前光标所停留的记录的名字。
    system.cursor_value
    包含当前光标所停留的项的数值。
    system.custom_item_event
    包含由VBX控制所引起的事件的名字。
    system.custom_item_event_parameters
    为VBX控制保持附加事件。
    system.date_threshold
    包含数据库数据重复查询临界值。此变量与$$DBDATE$$、$$DBDATETIME$$、$$DBTIMES$$变量一同使用,来控制form使用RDBMS同步数据库数据的频繁程度。数值的格式是:mi:ss(分:秒)。
    system.effective_date
    设置有效的数据库数据,数据格式为:DD_MON_YYYY.HH24:MI:SS。
    system.event_window
    包含最后一个由窗口事件触发器带来的操作所影响的窗口的名字。
    system.form_status
    包含含有光标的form的状态。其值可为以下一个或多个:CHANGED,NEW,QUERY。
    system.last_query
    在当前进程中包含用来添加一个form块的select语句。
    system.last_record
    包含一个在记录块集中表示当前记录是否是最后记录的布尔值。
    system.master_block
    与system.coordinations_operation变量一同使用,来决定由触发器on_clear_details启动的操作类型。
    system.message_level
    控制错误信息的显示,oracle错误信息被分配在0到25之间,间隔为5。小于这个值的错误信息将不被显示,这个值要由单引号括起。
    system.mode
    决定form是否处于normal、enter_query、query进程模式。
    system.mouse_button_pressed
    包含了点击鼠标的次数。左键值为1,从左键到右键值增长为1.
    system.mouse_button_shift_state
    标明了在点击鼠标时的按键。数值为:shift、control、alt。
    system.mouse_canvas
    包含了鼠标输入点所在的画布的名字。
    system.mouse_form
    包含了鼠标输入点所在的form的名字。
    system.mouse_item
    包含了鼠标输入点所在的item的名字。
    system.mouse_record
    包含了鼠标输入点所在位置的记录的个数。
    system.mouse_record_offset
    包含了鼠标输入点所在位置的可见记录的个数。
    system.mouse_x_pos
    包含了鼠标所在位置的x坐标位置。
    system.mouse_y_pos 包含了鼠标所在位置的y坐标位置。
    system.record_status
    包含了鼠标所在位置的记录状态,其值为CHANGED、INSERT、NEW和QUERY。
    system.suppress_working 包含一个在form执行时禁止显示working...信息的布尔值。True将防止显示;False反之。
    system.trigger_block
    包含了在当前触发器启动时鼠标所在块的名字。
    system.trigger_item
    包含了在当前触发器启动时鼠标所在块和项的名字。
    system.trigger_record
    包含了Form正在处理的记录个数。

    界面 工具 菜单下挂 form

    在 WHEN-NEW-FORM-INSTANCE 的触发器中写:

    APP_SPECIAL.INSTANTIATE('SPECIAL11','批量导入');
    APP_SPECIAL.INSTANTIATE('SPECIAL12','手工关闭', 'xxhanlj', TRUE, 'LINE');--
    APP_SPECIAL.INSTANTIATE('SPECIAL13','零件表导入', 'xxhanljdr', TRUE, 'LINE');

    然后在form的触发器中创建SPECIAL13触发器,并在其中写逻辑

    FORM表单的查询方法:

    1、使用:parameter.G_query_find参数;

    IF (NAME_IN('PO_HEADERS.PO_HEADER_ID') IS NOT NULL) THEN 
       :parameter.G_query_find := 'TRUE'; 
       app_find.find('CUX_PO_HEADERS_ADD_MESSAGE'); 
       :parameter.G_query_find := 'FALSE'; 
    ELSE 
       FND_MESSAGE.DEBUG('请先保存订单头'); 
    END IF;

    在CUX_PO_HEADERS_ADD_MESSAGE的PRE-BLOCK中处理 
      copy(name_in('PO_HEADERS.PO_HEADER_ID'),'CUX_PO_HEADERS_ADD_MESSAGE.PO_HEADER_ID');

    在CUX_PO_HEADERS_ADD_MESSAGE的pre_query里加

    app_query.reset('块名'); 

    app_query.append('PO_HEADERS',' SEGMENT1 like '||chr(39)||:PARAMETER.PO_NUM||'%'||chr(39) );

    2、使用Default_where属性处理 
    declare 
      lv_default varchar2(2000); 
    begin 
      lv_default:='.....'; 
      go_block('CUX_PO_HEADERS_ADD_MESSAGE'); 
      set_block_property('CUX_PO_HEADERS_ADD_MESSAGE',DEFAULT_WHERE,lv_default); 
      execute_query; 
    end;

     一段程序:

    --------------------------------------------------------------------------------------------

    -- Create override record group if not exist else clear record group
    procedure initialize_override_group is
    rg_name VARCHAR2(40) := 'OVERRIDE_FIELDS';
    rg_id RecordGroup;
    gc_id GroupColumn;

    BEGIN
    rg_id := FIND_GROUP( rg_name );
    if id_null(rg_id) then
    rg_id := create_group(rg_name);
    gc_id := add_group_column(rg_id, 'ROW_ID', CHAR_COLUMN, 20);
    gc_id := add_group_column(rg_id, 'FIELD_NAME', CHAR_COLUMN, 20);
    gc_id := add_group_column(rg_id, 'FIELD_VALUE', CHAR_COLUMN, 80);
    gc_id := add_group_column(rg_id, 'FIELD_VALUE_CODE', CHAR_COLUMN, 30);
    gc_id := add_group_column(rg_id, 'LIMITING_VALUE', CHAR_COLUMN, 30);
    gc_id := add_group_column(rg_id, 'REQUIRED_FLAG', CHAR_COLUMN, 1);
    --Project Classifications changes
    --Ansari
    gc_id := add_group_column(rg_id, 'SELECT_FLAG', CHAR_COLUMN, 1);
    gc_id := add_group_column(rg_id, 'code_percent', NUMBER_COLUMN);
    --Project Classifications changes
    --Ansari
    else
    delete_group_row(rg_id, ALL_ROWS);
    end if;
    END initialize_override_group;

    rg_id RecordGroup;
    rg_col1 GroupColumn;
    rg_col2 GroupColumn;
    rg_col3 GroupColumn;
    rg_col4 GroupColumn;

    rg_id := find_group('OVERRIDE_FIELDS');
    row_count := get_group_row_count(rg_id);

    rg_col1 := find_column('OVERRIDE_FIELDS.FIELD_NAME');
    rg_col2 := find_column('OVERRIDE_FIELDS.FIELD_VALUE');
    rg_col3 := find_column('OVERRIDE_FIELDS.FIELD_VALUE_CODE');
    rg_col4 := find_column('OVERRIDE_FIELDS.LIMITING_VALUE');

    for i in 1..row_count LOOP

    if (Get_Group_Char_Cell( rg_col1, i) = 'KEY_MEMBER' and
    Get_Group_Char_Cell( rg_col2, i) is not null ) then

    x_field_value_id := to_number(Get_Group_Char_Cell( rg_col3, i));
    x_limiting_value := Get_Group_Char_Cell( rg_col4, i);

    ---------------------------------------------------------------------------------------------------

    form中打印报表:

    先调用请求:

    v_Bool := Fnd_Request.Add_Layout(Template_Appl_Name => 'CUX'
    ,Template_Code => 'CUXQA' || l_Program_Code-- || 'PRINT'
    ,Template_Language => 'zh'
    ,Template_Territory => 'CN'
    --,Output_Format => 'PDF'
    ,Output_Format => p_print_type);

    v_Req_Id_1 := Fnd_Request.Submit_Request('CUX'
    ,'CUXQA' || l_Program_Code-- || 'PRINT'
    ,NULL
    ,NULL
    ,FALSE
    ,:Cux_Qa_Report_Headers.Header_Id
    ,v_Work_Num
    ,l_Report_Date);

    COMMIT;

    等待请求结果:

    f_Bool := Fnd_Concurrent.Wait_For_Request(v_Req_Id_1
    ,1
    ,0
    ,l_Phase
    ,l_Status
    ,l_Dev_Phase
    ,l_Dev_Status
    ,l_Message);

    显示结果:

     Editor_Pkg.Report(Req_Id, 'Y'); -- 报表输出 要在附加数据库和PL/DQL程序库中加入FNDCONC.pll文件

    ------------------------------------------------------------------------------------------------

    form总调用package,网页结果

    v_command := fnd_profile.VALUE ('APPS_WEB_AGENT');
    v_command := v_command || '/Cinv_Print_Doc.Print_Issueord1?p_Organization_Id=' || :ORDER_HEADER.ORGANIZATION_ID;
    v_command := v_command || '&p_Doc_Id=' || :ORDER_HEADER.HEADER_ID;
    v_command := v_command || '&p_Doc_type=' || :ORDER_HEADER.DOC_TYPE_NAME;
    --v_command := v_command || '&p_doc_num_from=' || :ORDER_HEADER.DOC_NUMBER;
    --v_command := v_command || '&p_Doc_Num_To =' || :ORDER_HEADER.DOC_NUMBER;
    v_command := v_command || '&p_Date_From=' || NULL;
    v_command := v_command || '&p_Date_To=' || NULL;
    v_command := v_command || '&p_Create_By=' || :ORDER_HEADER.CREATED_BY;
    v_command := v_command || '&p_Print_Person=' || V_PRN_PERSON;
    web.show_document (v_command, '_blank');

    -------------------------

    form中加提示消息

    FND_MESSAGE.SET_STRING('请重新查询记录');
    FND_MESSAGE.HINT;

    -----------------------------

    Dependencies item(相依性Item)的编程
    语法:

    --建立相依字段的属性
    APP_FIELD.SET_DEPENDENT_FIELD(EVENT,:block.master_item = CONDITION,‘block.dependent_item’);

    注意:设定一次即可一直使用Dependencies属性。

    --清除相依字段的数据

    app_field.clear_dependent_fields('HEADER.REQUESTER_NAME', 'HEADER.REQUESTER_ID');

    ---建立Required Field

    APP_FIELD.SET_REQUIRED_FIELD
    用途:Conditionally Mandatory items—use APP_FIELD.SET_REQUIRED_FIELD to
    require certain items only if a certain condition is met.

    --APP_FIELD.SET_REQUIRED_FIELD(EVENT,(CONDITION),’block.item’);

    具体步骤:

    1,  Pre-record的时候,最好要将所有的Dependent field初始化。有的删除,一定需要的可以建立。

    2,  建立的Procedure最好要系统化,子程序化。使得相互之间可以调用。例子:见R11i test form的:dependent item sql sample.sql

    3,  通常在以下的trigger中调用Dependencies控制逻辑:

    PRE-RECORD,when-create-record,
    when-validate-item,when-checkbox-changed, when-radio-changed,when-list-changed和‘INIT’事件。

    PRE-RECORD和INIT是在操作数据前初始化这些逻辑,而其他是在item发生变化后验证这些逻辑,满足条件则进行后续的动作。

    需要注意的是,设置了Dependent的关系的Item,在其主变化时候,相依的Item会自动清空。但是仅仅会清空相依的那一个字段。

    如果相依的字段,还有自己相依的字段(比如Show值,但是存ID,或者Show值,另外还有描述等信息),如果想一起清空,要用:app_field.clear_dependent_fields

    --------------

    Eg:

    APP_FIELD.SET_DEPENDENT_FIELD(EVENT,

    :block.master_item = CONDITION,

    ’block.dependent_item’);

    APP_FIELD.SET_DEPENDENT_FIELD(EVENT,

    ((:block.master_item1 IS NOT NULL) AND

    (:block.master_item2 IS NOT NULL)),

    ’block.dependent_item’);

    APP_FIELD.SET_EXCLUSIVE_FIELD(EVENT,

    ’block.item1’,

    ’block.item2’,

    ’block.item3’);

    APP_FIELD.SET_INCLUSIVE_FIELD(EVENT,

    ’block.item1’,

    ’block.item2’);

    APP_FIELD.SET_REQUIRED_FIELD(EVENT,

    (CONDITION),

    ’block.item’);

     ------------------------

  • 相关阅读:
    零知识证明,中间人攻击,盲签名:原理和应用——三篇密码学科普文章
    json
    优化自己的编写出来的C#程序
    C++中不同的继承方式
    C语言程序编写涉及内存的问题
    面向Android的Tesseract工具
    常见Linux使用的十大问题
    Java语言链接数据库连接池配置的两种技巧
    配置数据库连接池的技巧
    PHP和Java在Web开发下相比较
  • 原文地址:https://www.cnblogs.com/gary-bao/p/4932721.html
Copyright © 2011-2022 走看看