Oracle EBS Form 开发 Tips.docx
《Oracle EBS Form 开发 Tips.docx》由会员分享,可在线阅读,更多相关《Oracle EBS Form 开发 Tips.docx(6页珍藏版)》请在冰豆网上搜索。
OracleEBSForm开发Tips
OracleEBSForm开发Tips
EBSForm开发中经常会遇到一些小问题,以免再次遇到而不记得什么原因,在此记下,如有新的问题,亦在此继续更新...
1.带有stackedcanvas的Form,比如contentcanvasA,stackedcanvasB,这两个canvas在WINDOWM上,当光标移动到A的最后一个Item(例如z)的时候,Bcanvas消失了(可以用Tab键移动光标至它,即显示)。
Cause:
B和A.z发生的互相遮盖,即有重叠区域。
Solution:
将Item间距离拉大一些。
1-1)有时候还会发现某一个stackedcanvas没有显示出来,在树状结构中把canvas的排列顺序调整一下(最好把item的顺序也调整一下,因其也会有影响),content在前,后面跟stackedA,stackedB。
1-2)一个contentcanvas(Main),两个stackedcanvas(A&B),发现只显示了contentcanvas上的item。
Cause:
由于是在测试,B上还没有内容,只选择了viewstackedcanvasA。
症状是A的内容不显示,只是用TAB键的时候才会把A切换出来。
造成这个的原因是B虽然没有显示,但是也是存在的,且是较大片空白,盖住了A。
--shit...
1-3)有时候view--stackedcanvas,选中了要显示的stackedcanvas,却不见其显示出来,看下stackedcanvas的视图端口高度和宽度是否为0。
2.在Form中使用LOV时,LOV的RecordGroup中的语句不要有用'--'Mark掉的东东在里面,如果有的话,'--'后面的所有语句都会被mark掉,因为RecordGroup的Query语句会全部被放在一行中。
切记
3.Set_item_instance_property()用来改变一列中的某个的属性,如显示特殊颜色等
4.复选框背景色及前景色无法显示成canvas底色、白字。
Solution:
将背景色、前景色改成别的颜色,再分别改回automatic、automatic、transparent.
5.用emp做了一个TabPage的测试Form,在Application中打开Form的时候报错
developererror:
set_window_positioncalledwithinvalidrelation:
EMP
Solution:
原来是PRE-FORMTrigger中的app_window.set_window_position('EMP','FIRST_WINDOW');写成了
app_window.set_window_position('EMP','EMP');将'FIRST_WINDOW'用WINDOW名替换掉了。
这里切记:
只是写相应的BLOCKNAME。
6.FRM-30100:
Blockmusthaveatleastoneprimarykeyitem.
Block:
B_XXXX
Form:
F_XXXX
FRM-30085:
Unabletoadjustformforoutput
Solution:
将Block的DMLDataTargetName改为None。
7.
基于view的block,在CRTL+F11查询后变为灰色,无法进行新增等操作,关闭画面重新打开后,画面显示正常,一旦执行查询完毕则变
为灰色。
Solution:
增加on-insertTrigger后正常。
8.Blockdatasource为view,在on-insertTrigger里面有写一段用来在插入资料后将DB生成的ROWID抓出赋给相应block的ROW_ID项。
测试运行Form,在保存时报错:
on-insert抛出no-data-found的异常。
将抓ROWID的语句拿掉,测试正常,查看DB中rowid生成也正
常,之后看了一下Formblock的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,DMLdatasourcetype设置为无,这样删除按钮会亮,但不能删除记录,点删除按钮时下面会提示需要ON-LOCKtrigger。
12.如果在post-query中用selectinto为某个item赋值,此item的databaseitem属性需设置为No,否则在ctrl+f11查询后后会有提示框
frm-41050:
Youcannotupdatethisrecord.
13.编译时报错:
错误0发生在第0行,第0列
Compilationunitanalysisterminated
procedure等的spec和body参数不一致的时候,编译会报这个错误。
14.用Button中代码控制修改DB数据,但数据并没有在Form画面显示,按下Button时会提示FRM-40401:
Nochangestosave
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语句中直接写insertintoxx(id,...)values(sequence.nextval,...),因为这样写时,block.item依然是无值的,需在insert完成后从DB中取出相应ID值赋值给block.item,否则易有问题,例如其下还有detail
block由id串过去,则在detailblock中作记录保存时会报错说ID不能为空(已经设置不空)或ID塞进了空值。
17.CurrentRecordVisualAttributeGroup,可以用来使当前记录显示不同颜色
18.query_find类型的Form,关闭resultwindow时,如果光标在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');
endif;
hide_window(wnd);
而把每个resultblock的"previousnavigationblock"都改成了query_findblock。
19.可利用APP_EXCEPTION.DISABLED;来失效KEY-按钮
如在KEY-CLRRECTrigger中写APP_EXCEPTION.DISABLED;则画面上的擦除按钮虽亮却失效。
20.想要显示Stackedcanvas时,用View――Stackedcanvas,列表框中却没有想要显示的Stackedcanvas供选择,是因为想要显示的Stackedcanvas的Window和Contentcanvas的Window不同。
21.注意,如果在已经建立好的数据块上重新使用数据块向导,例如增加栏位(比如数据块的源为某个table,现在需要增加一个列在table及block中,此时table增加列后,在block上重新使用数据块向导刷新table调出新item),会使得当前已经建立的basetableitem的属性发生还原!
此时如果已经设置了很多非默认属性,最好手动增加item。
22.Stackedcanvas的水平滚动条位置是由canvas本身的viewport的下边界决定,将其viewport下界设置为比canvas最下面的记录多出一个滚动条的高度的位置。
Viewport的宽度决定了stackedcanvas在contentcanvas上的视界宽度。
有时会发现水平滚动条拉到最左端时,stackedcanvas右边界却在垂直滚动条的左边很远的距离,这是stackedcanvas的canvas太宽造成的,应设置为靠紧最右边Item。
Stackedcanvas的垂直滚动条一般放在contentcanvas上(即一般设置为block显示垂直滚动条,并显示于contentcanvas,stackedcanvas显示水平滚动条,显示于stackedcanvas)。
23.Tools等菜单项,例在form级增加special1(specialxx....)trigger,里面可以写这个菜单项要执行的代码,初始化此菜单项可以在when-new-form-instance中用类似APP_SPECIAL.INSTANTIATE('SPECIAL1','生成明细数据','POBKORD',TRUE);来实现。
24.LIST条目,ElementsinList增加以后,没法删除掉,只得删掉这个Item重新建一个,如果ElementsinList多的话,会很麻烦,要一个一个重新写。
Solution:
使用Shift+Ctrl+小于号(Shift+Ctrl+<)快捷键可以删除掉多余的Elements25.按钮按过之后灰,可以按后go_block,go_item,到其它Block,然后在when-new-record-instance里面写使controlblock的按钮失效,当然也可以在其它trigger里面写,看情形。
26.独立安装oralceformdeveloper组件,oralceexclusiveshowlovbuttoninoralceformdeveloper.
解决方法:
forms\java\oracle\forms\registry\Registry.dat
修改app.ui.lovButtons=true(默认是false)
注:
个人没测试过,不知效果。
27.FRM-40654Recordhasbeenupdatedbyanotheruser.Re-querytoseechange.
不知道为什么出这个错误,新写的Form,BaseView,没什么anotheruser在用,后自己写了个on-lock就没再出现这。
28.限制在新增记录的时候必须第一个输入某栏位,直接把这个Item设为Firstnavigateitem即可,即在block中位置排在最上面,或者排在它上面的item的keyboardnavigable属性全部设置为No,然后在when-validate-item中判断,如果这个Item为空则raiseform_trigger_failure。
29.状态栏提示信息。
如果发现在保存记录等情形下应该在Window底部显示的如"FRM-40400:
Transactioncomplete:
1recordsappliedandsaved."没有显示,应该是FormModule的ConsoleWindow属性被设为了Null。
改为随便设一个Window即可。
附属性说明:
ConsoleWindowproperty
SpecifiesthenameofthewindowthatshoulddisplaytheFormBuilderconsole.Theconsoleincludesthestatuslineandmessageline,andisdisplayedatthebottomofthewindow.
OnMicrosoftWindows,theconsoleisalwaysdisplayedontheMDIapplicationwindow,ratherthanonanyparticularwindowintheform;however,youmuststillsetthispropertytothenameofaformwindow
toindicatethatyouwanttheconsoletobedisplayed.
Ifyoudonotwantaformtohaveaconsole,setthispropertyto<Null>.
30.QUERY_FIND类型,Findblock的queryallowed设为NO,发现光标在Resultblock时,手电筒不可用,如果下面还有别的blcok,光标点过去,手电筒亮了,再点回Resultblock,手电筒可用。
Solution:
把Findblock的queryallowed设为YES。
(IJustwannasay"shit!
")
31.Master-Detail类型的两个Block,发现Master没有值的时候,在DetailBlock上执行CTRL+F11竟然把所有记录都查出来了。
Solution:
Relations的属性PreventMasterlessOperations设置为Yes
32.Lov的FilterBeforeDisplay如果设置为Y,且这个lov使用的recordgroup的SQL中用了别名,就会有问题,会报frm-40502。
因为FilterBeforeDisplay设置为Y的话,它会以where原列名like%%去筛选。
可以尝试在原SQL外嵌套一层select。
33.Block的QueryDataSourceType为FROMclausequery时,报FRM-30100:
Blockmusthaveatleastoneprimarykeyitem.----把DMLDataTargetType设置为Nonemaybe有效。
34.录入数据时,选择日期--确定,系统询问是否保存记录。
原因:
数据块1trigger:
WHEN-NEW-BLOCK-INSTANCE中有写execute_query;因此录入时,光标从当前块(数据块1)跳到数据块:
CALENDAR-接着又回到当前块(数据块1),触发数据块1的WHEN-NEW-BLOCK-INSTANCE,执行execute_query;
35.Form中的Procedure中可以以下方式来写
BEGIN
IFevent='INIT'THEN
...
ELSIFevent=xxxxxTHEN
...
ELSE
app_exception.invalid_argument(procname=>p_procedure_name,
argument=>p_argument,
VALUE=>p_value);
ENDIF;
END;
36.在注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Oracle下新建字符串值ORACLE_APPLICATIONS,值设定为TRUE,重新打开FormBuilder可以看到所有引用的对象后面都会带一个图标,以方便区分哪些对象是引用的,哪些对象是属于自己的。
37.有时候会发现关闭FORM的时候(点右上角的叉叉,F4没发现这种情况),Form关闭了,却留下一个红色的ProgressIndicator进度条,无法关闭,请检查APP_CUSTOM包中的<firstwindow>是否已改为你的第一个WINDOW的名字。
38.Displayitem使用Lov,返回Lov的第二个值到某DatabaseItem(DB中保存此值),且Lov的RecordGroupSQL中用notexists()排除掉了已经存在于数据库的值,即每选择一个值保存后,就不会再挑选到此值。
症状:
Form查询的时候,会弹出Lov让选择值
Cause:
查询时,Displayitem的显示值是在Post-query中由此记录的DBitem得到并赋予的,由于发生Validation,而Lov中此时已无此值。
Solution:
在Post-query中赋值后加上
SET_RECORD_PROPERTY(:
SYSTEM.TRIGGER_RECORD,:
SYSTEM.TRIGGER_BLOCK,STATUS,QUERY_STATUS);