标签归档:Form开发

Form开发常用命令点

1. 根据条件,输出错误提示

IF :detail_line.quantity <= 0 THEN
        fnd_message.set_string('数量不能为0或负数!');
        fnd_message.error;
        RAISE form_trigger_failure;
END IF;

2.  完成MOAC的初始化
   CUX_MOAC_PKG.pre_form;   
   app_window.set_window_position('MAIN', 'FIRST_WINDOW');

3. 初始化folder块,可初始化多个folder块
    app_folder.define_folder_block(object_name=>'CUXGSPCHK01',
                                   folder_block_name=>'DETAIL_HEADER',
                                   prompt_block_name=>'DETAIL_HEADER_PROMPT',
                                   folder_canvas_name=>'DETAIL_HEADER_STK',
                                   folder_window_name=>'MAIN',
                                   disabled_functions=>null,
                                   tab_canvas_name=>null,
                                   fixed_canvas_name=>null);
    app_folder.event('INSTANTIATE');

4. 功能:当进入FORM时,执行pre_form程序完成MOAC的初始化
   procedure pre_form
   is
      l_default_org_id  number;
      l_default_ou_name varchar2(240);
      l_ou_count         number;
   begin
        MO_GLOBAL.init('CUX');
       
        mo_utils.get_default_ou(l_default_org_id, l_default_ou_name, l_ou_count);
     
        copy(l_default_org_id,'PARAMETER.mo_default_org_id'); 
        copy(l_default_ou_name,'PARAMETER.mo_default_ou_name');
        copy(l_ou_count,'PARAMETER.mo_ou_count'); 
       
        –fnd_message.debug('l_default_org_id = ' || l_default_org_id);
        –fnd_message.debug('l_default_ou_name = ' || l_default_ou_name);
        –fnd_message.debug('l_ou_count = ' || l_ou_count);
       
        –判断是否找到了OU,如果没有找到,则报错
        if nvl(l_ou_count,0) <= 0 then
            fnd_message.set_name('CUX', '没有找到相应的OU,请联系系统管理员或开发人员!');
            fnd_message.error;
            raise form_trigger_failure;
        end if;           
   end pre_form;

 5. 帮助》历史记录灰掉问题

问题:在一个FORM中发现历史记录菜单灰掉

解决:这个跟块查询灰掉一样,块查询是把块级触发器WHEN-NEW-RECORD-INSTANCE触发器层级修改为BEFORE,

这个问题需要将WHEN-NEW-BLOCK-INSTANCE触发器层级修改为BEFORE,因为这两个的可用与否,是FORM级触发器判断的,如果覆盖,就不可用了。

PS:使用历史记录时报“历史记录不可用”,是由于在该块中没有5个数据库WHO字段的原因,添加上就行。

6. 设置ITEM属性

set_item_instance_property('DETAIL_LINE.LOT_NUMBER',
                                   current_record,
                                   update_allowed,
                                   property_false);

 set_item_property('QUERY_FIND.VENDOR_CUST_NAME'
                       ,insert_allowed
                       ,property_false);

7.Form客户化设置消息例子,参考系统用户创建form,用户创建触发器

FND_USER_PKG_WRP

FND_USER_PKG

8.问题描述: 手电筒功能查询一次后变灰色,不可用

原因:QUERY_FIND查询块中的Query_Allowed属性为NO

方法:把该属性设置为YES即可。

原因:这是主数据块(被查询的数据块)上When-new-record-instance触发器的执行层次问题

方法:改一下主data block的触发器WHEN-NEW-RECORD-INSTANCE ,把属性execution hierarchy改为after。

Form客户化开发大致步骤

  客户化一个Form程序,一般会经历如下开发过程(未包括具体代码书写及程序包调用):
      1.建立数据库对象(表,视图,序列,同义词等)
      2.打开template.fmb文件,更名为CUXGLIMPORT
      3.删除Data Blocks下的两个块——BLOCKNAME、DETAILBLOCK,
        它们是模版自带的示例主从块。
      4.删除Canvases下的一个画布——BLOCKNAME
      5.修改Windows下的BLOCKNAME这个Window,在Property Palette中
        将Name改为“HEADERS”,将Title改  为“XXXX”
      6.修改Forms级触发器PRE-FORM
      7.修改Forms级触发器WHEN-NEW-FORM-INSTANCE
      8.修改Program Unit下app_custom中的close_window过程
      9.创建Block数据块
      10.设置Block属性及其Subclass
      11.新增CURRENT_RECODE_INDICATOR 子类信息
         CURRENT_RECODE_INDICATOR
      12.画布创建
      13.程序单元    
      14.块级别触发器on_insert……

注意点:
      1.画布和窗口的对应,LOV创建最后在指定的item上面。
      2.ROW_ID 属性 row_id 18
      3.记录间距为0
      4.LOV建立时,需要注意返回项,否则在保存的时候会报错
      5.一般情况下请在order by 中写上命令
      6.form级别第一个导航块
      7.block级别导航块

完成后,通过ftp工具上传至相应服务器目录,最后通过ssh工具编译即可完成。可参考此链接编译form命令:http://www.llku.com/?p=177

 

Form开发复选框应该注意事项

    今天就写说一个form开发的时候,大家可能不太注意的地方,前几天,我做完一个开发功能,部署到测试环境中去,测试过几次,完全没有问题,就在第二天准备上生产的时候,问题出现了,数据无缘无故丢失了,事情是这样的:
    做财务的可能都会遇到这样的问题,税费计提的功能,大量重复性繁杂的工作量,没有技术性,纯属体力劳动,因此客户提出需求需要用系统帮忙解决此问题,于是,业务顾问谈好需求后,自己作为技术顾问就开始安装功能需求文档做设计,做开发,当然这个本来也不是什么大的开发,就是需要对不同机构,不同产品进行税费计算,然后生成日记账入账即可,于是,form开发,逻辑代码书写都完成了,部署测试环境,内部测试完成,无误,提交客户测试,问题出现了,比如有一个产品A,税率是0.00013,然后需要生成公司间往来,这样,一个税种就会生成总公司本部和分支机构两条日记账,但是结果两条数据都没有出现,由于form界面是开发的,里面的数据是人工维护进去的,如图:

2 1 3

    这两者的差别就是:未选中的时候,此ITEM的值,在数据库里面存储可能是空,可能是N,如果选中不允许,结果就只会在数据库中存储为N,提出这点主要是因为,最近在一个form的开发中遇到这样的问题,我根据此字段去作为判断条件的时候,发现有时候数据正确有时候数据错误,数据库,“有时候”这个问题就很麻烦,做技术的就最怕这个了,于是我仔细核对FORM,才发现这个问题,其实如果对于复选框还好,毕竟只有三种结果,Y,N,NULL,这样的话,我可以根据Y和<>'Y'来,但是遇到其他的,就得注意了,且要记得赋初始值,否则FORM编译会报错,记下以此警醒自己。
    今天就写这样一个小知识点,谢谢。(此文是本人之前发布在ERP100上的,链接 http://bbs.erp100.com/forum.php?mod=viewthread&tid=266572&extra=