FORM TIPS --转

EBS Form开发中经常会遇到一些小问题,以免再次遇到而不记得什么原因,在此记下,如有新的问题,亦在此继续更新...

      1.带有stacked canvas 的Form,比如content canvas A,stacked canvas B,这两个canvas在WINDOW M上,当光标移动到A的最后一个Item(例如z)的时候,B canvas消失了(可以用Tab键移动光标至它,即显示)。

Cause:    B和A.z发生的互相遮盖,即有重叠区域。

Solution: 将Item间距离拉大一些。

      1-1)有时候还会发现某一个stacked canvas 没有显示出来,在树状结构中把canvas的排列顺序调整一下(最好把item的顺序也调整一下,因其也会有影响),content 在前,后面跟stacked A,stacked B。

      1-2)一个content canvas(Main),两个stacked canvas(A&B),发现只显示了content canvas上的item。

Cause: 由于是在测试,B上还没有内容,只选择了view stacked canvas A。症状是A的内容不显示,只是用TAB键的时候才会把A切换出来。造成这个的原因是B虽然没有显示,但是也是存在的,且是较大片空白,盖住了A。--shit...

      1-3)有时候view--stacked canvas,选中了要显示的stacked canvas,却不见其显示出来,看下stacked canvas的视图端口高度和宽度是否为0。

      2.在Form中使用LOV时,LOV的Record Group 中的语句不要有用'--' Mark掉的东东在里面,如果有的话,'--'后面的所有语句都会被mark掉,因为Record Group 的Query语句会全部被放在一行中。切记

      3.Set_item_instance_property() 用来改变一列中的某个的属性,如显示特殊颜色等

      4.复选框背景色及前景色无法显示成canvas底色、白字。
Solution:将背景色、前景色改成别的颜色,再分别改回automatic、automatic、transparent.

      5.  用emp做了一个Tab Page的测试Form,在Application中打开Form的时候报错

developer error: set_window_position called with invalid relation:EMP

Solution:原来是PRE-FORM Trigger 中的app_window.set_window_position('EMP', 'FIRST_WINDOW');写成了

app_window.set_window_position('EMP', 'EMP');将'FIRST_WINDOW'用WINDOW名替换掉了。

这里切记:只是写相应的BLOCKNAME。

6.  FRM-30100:Block must have at least one primary key item.

Block:B_XXXX

Form:F_XXXX

FRM-30085: Unable to adjust form for output

Solution:将Block的DML Data Target Name 改为None。

7. 

基于view的block,在CRTL+F11查询后变为灰色,无法进行新增等操作,关闭画面重新打开后,画面显示正常,一旦执行查询完毕则变 

 为灰色。

Solution: 增加on-insert Trigger后正常。

8.Block data source为view,在on-insert Trigger里面有写一段用来在插入资料后将DB生成的ROWID抓出赋给相应block的ROW_ID项。

测试运行Form,在保存时报错:on-insert 抛出no-data-found的异常。将抓ROWID的语句拿掉,测试正常,查看DB中rowid生成也正

常,之后看了一下Form block的ROW_ID项,杯具,不知道长度怎么变成4了…

9.有时候在post-query里面对某个要显示的非数据库item赋值,这样会造成在鼠标切换到另一条记录时以及查询完毕没有做任何改动却被

提示是否要保存修改。
       Solution:POST-QUERY里面写set_record_property(:system.trigger_record,:system.trigger_block, STATUS,QUERY_STATUS);

10.SET_ITEM_PROPERTY用来设置某个ITEM的某个属性,可以说是设置Block中某个Item整体的某个属性,有时候要设置某条记录中的Item属性(如当前记录),这样可以使用SET_ITEM_INSTANCE_PROPERTY.

11.Block 的insert_allowed属性设置为Y,在when-new-block-instance里面用set_block_property设置insert_allowed为false,这样新增记录的按钮会亮,但不能新增记录
            Block 的delete_allowed属性设置为Y,DML data source type设置为无,这样删除按钮会亮,但不能删除记录,点删除按钮时下面会提示需要ON-LOCK trigger

 12.如果在post-query中用select into为某个item赋值,此item的database item属性需设置为No,否则在ctrl+f11查询后后会有提示框
frm-41050: You cannot update this record.

 13.编译时报错:错误0发生在第0行,第0列
Compilation unit analysis terminated
procedure等的spec和body参数不一致的时候,编译会报这个错误。

 14.用Button中代码控制修改DB数据,但数据并没有在Form画面显示,按下Button时会提示FRM-40401:  No changes to save
Solution:在update等及commit之前写:System.Message_Level := 25;

 15. 有时候想要在Button按过之后使其变为灰色,不可以在when-button-pressed中写 set_item_property(blk.itm,enabled,property_false);改变自身的状态,只能改变其它,可行的情况下可 以在这里使某个block执行execute_query,然后在post_query中利用条件将这个按钮变灰。

 16. 经常有id栏位在insert 记录的时候自动塞sequence的值,这种情况最好在per-insert中把sequence.nexval赋值给block.item,而不要在 insert语句中直接写insert into xx(id,...) values(sequence.nextval,...),因为这样写时,block.item依然是无值的,需在insert完成后从DB中取出相应 ID值赋值给block.item,否则易有问题,例如其下还有detail block由id串过去,则在detail block中作记录保存时会报错说ID不能为空(已经设置不空)或ID塞进了空值。

 17. Current Record Visual Attribute Group,可以用来使当前记录显示不同颜色

 18. query_find类型的Form,关闭result window时,如果光标在Window的最后一个block(多block时),则每点一次关闭,光标会往前走一个block,一直到第一个block时再点关闭才会关闭window.

为了不改动app_custom里面的

  if (wnd = get_view_property(get_item_property(:SYSTEM.CURSOR_ITEM,

                              ITEM_CANVAS), WINDOW_NAME)) then

    do_key('PREVIOUS_BLOCK');

  end if;

  hide_window(wnd);

而把每个result block的 "previous navigation block"都改成了query_find block。

19.   可利用APP_EXCEPTION.DISABLED;来失效KEY-按钮

如在KEY-CLRREC Trigger中写APP_EXCEPTION.DISABLED;则画面上的擦除按钮虽亮却失效。

20.   想要显示Stacked canvas时,用View――Stacked canvas,列表框中却没有想要显示的Stacked canvas供选择,是因为想要显示的Stacked canvas的Window和Content canvas的Window不同。

 21.注意,如果在已经建立好的数据块上重新使用数据块向导,例如增加栏位(比如数据块的源为某个table,现在需要增加一个列在table及block中,此时table增加列后,在block上重新使用数据块向导刷新table调出新item),会使得当前已经建立的base table item的属性发生还原!此时如果已经设置了很多非默认属性,最好手动增加item。

22.Stacked canvas的水平滚动条位置是由canvas本身的view port的下边界决定,将其view port下界设置为比canvas最下面的记录多出一个滚动条的高度的位置。
View port的宽度决定了stacked canvas 在content canvas上的视界宽度。
有时会发现水平滚动条拉到最左端时,stacked canvas右边界却在垂直滚动条的左边很远的距离,这是stacked canvas的canvas太宽造成的,应设置为靠紧最右边Item。
Stacked canvas 的垂直滚动条一般放在content canvas上(即一般设置为block显示垂直滚动条,并显示于content canvas,stacked canvas显示水平滚动条,显示于stacked canvas)。

23.Tools等菜单项,例在form级增加special1(special xx....) trigger,里面可以写这个菜单项要执行的代码。

初始化此菜单项:在when-new-form-instance中用类似APP_SPECIAL.INSTANTIATE('SPECIAL1','生成资料', 'POBKORD', TRUE);

黑体TRUE表示默认此按钮是生效的

后续如需条件控制生效或失效可if ...then app_special.enable('SPECIAL1'); else app_special.disable('SPECIAL1'); end if;来实现

24.LIST条目,Elements in List增加以后,没法删除掉,只得删掉这个Item重新建一个,如果Elements in List多的话,会很麻烦,要一个一个重新写。
Solution:使用Shift+Ctrl+小于号(Shift+Ctrl+<)快捷键可以删除掉多余的Elements

25.按钮按过之后灰,可以按后go_block,go_item,到其它Block,然后在when-new-record-instance里面写使control block的按钮失效,当然也可以在其它trigger里面写,看情形。
       26.独立安装oralce form developer组件,oralce exclusive show lov button in oralce form developer.

解决方法:

forms\java\oracle\forms\registry\Registry.dat

修改app.ui.lovButtons=true(默认是false)

注:个人没测试过,不知效果。

27.FRM-40654 Record has been updated by another user.Re-query to see change. 

不知道为什么出这个错误,新写的Form,Base View,没什么another user在用,后自己写了个on-lock就没再出现这。

28. 限制在新增记录的时候必须第一个输入某栏位,直接把这个Item设为First navigate item即可,即在block中位置排在最上面,或者排在它上面的item 的keyboard navigable属性全部设置为No,然后在when-validate-item中判断,如果这个Item为空则raise form_trigger_failure。

29.状态栏提示信息。如果发现在保 存记录等情形下应该在Window底部显示的如"FRM-40400:Transaction complete:1 records applied and saved."没有显示,应该是Form Module的Console Window属性被设为了Null。改为随便设一个Window即可。

附属性说明:

Console Window property

Specifies the name of the window that should display the Form Builder console.  The console includes the status line and message line, and is displayed at the bottom of the window. 

On Microsoft Windows, the console is always displayed on the MDI application window, rather than on any particular window in the form; however, you must still set this property to the name of a form window to indicate that you want the console to be displayed. 

If you do not want a form to have a console, set this property to <Null>. 

30.QUERY_FIND类型,Find block的query allowed设为NO,发现光标在Result block时,手电筒不可用,如果下面还有别的blcok,光标点过去,手电筒亮了,再点回Result block,手电筒可用。

Solution:把Find block的query allowed设为YES。(I Just wanna say "shit!")

31.Master-Detail类型的两个Block,发现Master没有值的时候,在Detail Block上执行CTRL+F11竟然把所有记录都查出来了。

Solution:Relations的属性Prevent Masterless Operations设置为Yes 

32.Lov 的Filter Before Display如果设置为Y,且这个lov使用的record group的SQL中用了别名,就会有问题,会报frm-40502。因为Filter Before Display设置为Y的话,它会以 where 原列名 like %% 去筛选。可以尝试在原SQL外嵌套一层select。

33.Block 的Query Data Source Type为FROM clause query时,报FRM-30100: Block must have at least one primary key item.----把DML Data Target Type设置为None maybe有效。

34.录入数据时,选择日期--确定,系统询问是否保存记录。

原 因:数据块1 trigger:WHEN-NEW-BLOCK-INSTANCE中有写execute_query;因此录入时,光标从当前块(数据块1)跳到数据 块:CALENDAR-接着又回到当前块(数据块1),触发数据块1的WHEN-NEW-BLOCK-INSTANCE,执行 execute_query;

35.Form中的Procedure中可以以下方式来写

BEGIN
          IF event = 'INIT' THEN
             ...

   ELSIF event=xxxxx THEN

      ...
          ELSE
             app_exception.invalid_argument(procname => p_procedure_name,
                                                                         argument => p_argument,
                                                                            VALUE    => p_value);
           END IF;
       END; 

36. 在注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Oracle下新建字符串值ORACLE_APPLICATIONS,值设定为 TRUE,重新打开Form Builder可以看到 所有引用的对象后面都会带一个图标,以方便区分哪些对象是引用的,哪些对象是属于自己的。

Oracle EBS Form 开发 Tips - Gabriel - Gabriel

 37.有时候会发现关闭FORM的时候(点右上角的叉叉,F4没发现这种情况),Form关闭了,却留下一个红色的Progress Indicator进度条,无法关闭,请检查APP_CUSTOM包中的<first window>是否已改为你的第一个WINDOW的名字。

 38.Display item使用Lov,返回Lov的第二个值到某Database Item(DB中保存此值),且Lov的Record Group SQL中用not exists ()排除掉了已经存在于数据库的值,即每选择一个值保存后,就不会再挑选到此值。

症状:Form查询的时候,会弹出Lov让选择值

Cause:查询时,Display item的显示值是在Post-query中由此记录的DB item得到并赋予的,由于发生Validation,而Lov中此时已无此值。

Solution:在Post-query中赋值后加上

SET_RECORD_PROPERTY(:SYSTEM.TRIGGER_RECORD,:SYSTEM.TRIGGER_BLOCK, STATUS,QUERY_STATUS);

39.ORA-00904:'C':invalid identifier 无效标识符

引自http://bestwangyan.blog.163.com/blog/static/8422774201121542330124/

在form开发时,创建主从块关系后,删除关系,则出现这个错误。

查找代码,没有发现一个C标识符。
原来是在主块属性中的‘包括REF项’ 被设置成了‘是’ 将其改成‘否’,即可解决问题。

朋友遇到这个问题,正好看到作者的日志,感谢。

朋友是创建了一个REF的Relation,然后又删除产生的如上错误,后发现子块相应属性为YES,改为NO后正常。

40.需要弄一个TAB Page的FORM,但是并不标准,两个TAB来源于不同的数据块。

在FIND按钮的WHEN-BUTTON-PRESSED Trigger里面写了分别go_block到两个Result Block并execute_query,问题是如果只写一个Block的话,如果没有记录查询出来就会以hint的形式提示FRM-40350:Query caused no records to be retrieved。但是如果写了两个Block,却会以消息框的形式提示。

Solution:在结果Block的on-message trigger里面写

 

IF MESSAGE_CODE = 40350 THEN

null;--MESSAGE('NO records found plzz try again with another no.');

ELSE

MESSAGE(MESSAGE_TYPE||'-'||TO_CHAR(MESSAGE_CODE)||': '||ERROR_TEXT);

END IF;

或者直接在提交execute_query之前写:System.Message_Level := 25;

        41.ITEM赋值语句要写在PRE-INSERT中,而不要直接在ON-INSERT中写要INSERT的值,因为这样写的话,ITEM本身会没有值,如果此时保存后直接更新,会将此值更新为空值。

        42.FORM数字显示格式:FM999999999999.0000,以此为FORMAT MASK,则例:

原值                        显示值

123.4                       123.4000

123.45678                123.4568

0.123                       0.1230

43.on-lock不要把有后台update代码处理的栏位写进去,否则好像会被锁冲突。建议只写界面上有显示的栏位

FRM-40657 Record changed or deleted by another user

引用某论坛朋友的回复

“一 般导致这种错误的原因有:1界面字段未赋值使用了替代值存入数据库;2由于Item字段长度不够导致部分数据截断;3值列表与View字段         内容不一致。建议在Lock Row字段中只锁定界面Block上的可见字段,在操作数据前保证Block字段与传入参数保持一致,最后就使用Block字段       作为传入参数。”

posted @ 2014-11-23 15:36  你丫的要不要好好学习  阅读(353)  评论(0编辑  收藏  举报