首页 > 代码库 > Form_Form Builder的基本语法(概念)

Form_Form Builder的基本语法(概念)

2014-05-21 BaoXinjian In Capgemini

1. Trigger 
    (1). Override模式:默认模式不再触发高级别事件 
     (2). Before模式:触发完本级别事件后再触发高级别事件 
     (3). After模式:触发高级别事件后再触发本级别事件

 

2. 常用form trigger 
     (1). Form Level 
         i. per-form: form版本信息 
                     设定第一个windows 
                     切换org 
                     对Global和Parameter参数赋值 
        ii. when-new-form-instance: 定义弹性域 
                     定义folder 
     (2). Block Level 
         i. post-query 
         ii. when-new-record-form


3. Form 对基于View的block进行数据操作

    on-lock 
     on-insert 
     on-update 
     on-delete

 

4. Form Trigger的优先级

    (1).先从Item -> Record -> Block -> Form

    (2).如果另外设置Execution Hierarch属性(override,before,after),则按照设置后的顺序执行。

        如果是override的话,则执行完这个级别的触发器,就不往上执行了,

        before就是执行完这个级别的触发器后,如果上一个级别也有这个触发器的话,继续去执行,

        after就是先去执行上一个级别的触发器,然后再回来执行。

 

5. 打开Form时的Tigger执行的顺序

  • (1)PRE-FORM
  • (2)PRE-BLOCK(BLOCK级)
  • (3)WHEN-NEW-FORM-INSTANCE
  • (4)WHEN-NEW-BLOCK-INSTANCE
  • (5)WHEN-NEW-RECORD-INSTANCE
  • (6)WHEN-NEW-ITEM-INSTANCE

6. 触发Tigger的Execution Hierarchy

    (1).当一个事件发生的时候,Forms Engine可一并触发由低到高3个级别(Item、Block、Form)的同名事件,如何触发,由定义低级别的事件时所设置的执行层次决定。
     (2).Execution Hierarchy:
        Override模式,默认模式,不再触发高级别事件
        Before模式,触发完本级别的事件后,再触发高级别事件
        After模式,先触发高级别事件,再回来触发本级别事件
    当然了,如果某一层次我们没定义事件代码,Forms Engine就跳过该级别,直接进入下一级别。此外,Block中任何Item发生的事件,都可能引发该Block级事件,所以在Block级写本属于Item级的事件,要特别性能问题;Form级事件更有类似问题。
    例子. WHEN-VALIDATE-ITEM例子
    假设:
        1、 Item XXX的WHEN-VALIDATE-ITEM的代码是“代码1”,模式是“After”;
        2、 Item XXX所在BlockWHEN-VALIDATE-ITEM的代码是“代码2”,模式是“Override”;
        3、 Form级WHEN-VALIDATE-ITEM的代码是“代码3”。
    事件:发生Item XXX的WHEN-VALIDATE-ITEM

    那么:实际先执行“代码2”,然后执行“代码1”。

 

7. Form Builder的四种commit方式

    (1).commit 
        对form和数据库进行提交. 
        如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。 

    (2).commit_form 
        针对form上面的数据变动进行commit,对于代码中的类似update,insert语句也进行提交;会触发on-update,如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。 
     (3).do_key(‘commit_form‘) 
        会首先寻找form下的triggers中的KEY-COMMIT这个trigger,并执行KEY-COMMIT中所写的代码。 
        如果没有KEY-COMMIT这个trigger,则会针对form和代码一起提交。 
        如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准。 
     (4).forms_ddl(‘commit‘); 
        只针对代码中的update,insert,delete语句进行提交,form上面的数据变动不提交.

 

8. Form 中遍历行

    go_block(‘block_name‘); 
     first_record; 
     LOOP 
      message(:block_name.item); 
      if :system.last_record  = ‘TRUE‘ then 
          exit; 
       end if; 
      next_record; 
     END LOOP;

 

9. Compile Form

    frmcmp_batch module=xxapinvoice.fmb userid=apps/apps output_file=$CUX_TOP/forms/ZHS/xxapinvoice.fmx

 

10. 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‘); 
            go_block(‘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‘);

    (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;

    (3). 用app_find.query_range()来处理: 
        begin 
           .... 
            app_find.query_range(:find_date_from, 
                                :find_date_to, 
                                ‘CUX_PO_HEADERS_ADD_MESSAGE.REATE_DATE‘); 
            :parameter.q_query_find:=‘false‘; 
         end;

    (4). LOV查询,选择LOV值后自动查询Block,如选择Invoice Num后自动查询: 
        a. 创建一个Paramter参数<invoice_id>
        b. 创建LOV, 并将返回的值付给:Parameter.Invoice_id 
             SELECT invoice_id, invoice_number, description FROM bxj_invoices_all 
         c. 添加Block层级的Trigger<query_find> 
             app_find.query_find(‘q_invoices‘); 
         d. 添加Block层级Trigger<pre_query> 
             IF :parameter.g_query_find = ‘true‘ THEN 
                 :invoice_header.invoice_id = :paramter.invoice_id 
                 :paramter.g_query_find = ‘true‘ 
             END IF;

11. Form 建立表时常用栏位

    (1). 1个表关键字ID,通常与表名一致,并用Sequence为每条记录获得一个唯一值。
     (2). 1个组织ID,根据不同的开发选用不同层次的组织ID,这里的销售订单跑在OU层,所以基表命名为_ALL表,并创建一个过滤组织的View作为“基表”。
     (3). 5个Who字段,记录由谁在何时创建,并由谁在何时修改,登录ID是多少。
     (4). 4个请求字段,处理的请求ID、请求日期、并发程序ID及其应用ID,如果有的话。
     (5). 16个描述性弹性域字段,1个上下文字段,15个弹性域字段。

 

Thanks and Regards