一、Form的布局方法
一个Form Module可能包含了多个window,多个Data Block,多个canvas,在对象众多的情况下,布局方法遵循一定的规则可让你事半功倍。
Form Module的基本结构,如图
一般来说布局,应按照windows-canvases-data block-items的顺序,先简单说明下各对象与布局相关的属性。
Window
Property Note
X Position Form启动时X轴坐标
Y Position Form启动时Y轴坐标
Width Form实际宽度
Height Form实际高度
Canvas
Property Note
Window 指定Canvas所在的window 7
View X Position on Canvas 可见部分相对于Canvas 的X轴坐标,通常置0
View Y Position on Canvas 可见部分相对于Canvas 的Y轴坐标,通常置0
Width Canvas实际宽度
Height Canvas实际高度
Canvas一般都要设置以上属性,但是根据Property Class的不同,几类canvas还是有所区别。
1、Content Canvas又称基础画布或内容画布,是必不可少的。一般情况下Content Canvas的宽和高应设置和windows的宽高一致或略小于,建议是设成一样。
2、CANVAS_STACKED Canvas又称堆叠画布。在需要显示得列太多,界面上无法一次排开的情况,需要使用滚动条时多用到这种画布。这种类型的画布,一般Canvas的宽和高要比Viewport的宽和高要大得多,另外还要设置Show Horizontal Scroll Bar属性为Yes,允许使用横向滚动条。
3、Tab_Canvas又称标签画布,此类画布使用起来比较简单再此就不再赘述。
Block
注意设置Number of Records Dispalyed和相关的Scrollbar属性。
Property Note
Navigate Style Same Record/Change Record/ Change Data Block 10
Previous Navigation Data Block 比如关闭一个window后,光标会落到Previous Block上的第一个可导航Item时
Next Navigation Data Block 当导航方式为Change Data Block时,光标落在前一个块最后一个可导航Item时,再按tab键,光标就会跳到Next Block上
***当Previous Navigation Data Block,Next Navigation Data Block属性为空时,系统会自动根据Form Builder对象树各block的排列顺序,自动决定各Block的导航顺序。这种默认的方式可能会带来其他的问题,比如关闭窗体时,光标落在不该落到的块上,最好指定一下。
Item
Item和布局属性相关的属性有Property Class和相关prompt属性。我一般的做法是根据不同类型字段先批量修改Property Class和Format mask,第二步根据Block的设置批量设置ITEM的相关prompt属性如:
Property Note
width 宽度
height 高度
Keyboard Navigable 设置Item是否可使用tab键导航
Previous Navigation Item 前一个可导航Item(可能会向前导航到前一个块的最后一个可导航Item)
Next Navigation Item 后一个可导航Item时(可能会向后导航到后一个块的第一个可导航Item)
***注意当Previous Navigation Item,Next Navigation Item属性为空时,系统会自动根据Form Builder对象树各block下Item的排列顺序,自动决定各Item的导航顺序。所以当我们不想去设置Item的导航顺序,又希望界面上各字段能够按照从上到下从左到右的顺序导航,那么就必须合理安排各Item的排列顺序,切记。
每个ITEM的prompt的属性值,会在layout 窗口中部分修改。
二、赋初始值
在form中需要记录一些变量的值,这些值在Form的整个运行过程中都可能被引用,为了避免重复的获取,我们采用的策略为在Form的when-new-form-instance时间中将这些变量读取出来赋值给parameter(有时候是存入global变量中),以后对这些变量的引用就转换成对Form parameter的引用。以下是程序示例:
Procedure Get_Profile_Parameter Is
Begin
Fnd_Profile.Get('ORG_ID', :Parameter.g_Org_Id);
Fnd_Profile.Get('USER_ID', :Parameter.g_User_Id);
Select User_Name
Into :Parameter.g_User_Name
From Fnd_User
Where User_Id = :Parameter.g_User_Id;
Select Nvl(Employee_Id, 100)
Into :Parameter.g_Employee_Id
From Fnd_User
Where User_Id = :Parameter.g_User_Id;
End Get_Profile_Parameter;
对于Item来说也需要赋初始值,设置日期型字段的初始值为当前日期,某主键字段为sequence的nextval
Eg:
Data Type Initial Value Note
Date $$DATE$$ 当前日期
NUMBER :sequence.order_header_s.nextval 取自sequence
NUMBER fnd_ profile.value(‘org_id’) 取自系统变量
Char :parameter.G_USER_NAME 取自parameter
三、Item对象的相关属性
各种Item由于property class的不同视觉效果与属性设置都有所不同,下面简单列举各类Item属性设置需要注意的地方。
1.Text Items
可以根据需要为Text Items设置不同的Property Class,TEXT_ITEM,TEXT_ITEM_DISPLAY_ONLY,TEXT_ITEM_MULTILINE, TEXT_ITEM_DATE ,
REATION_OR_LAST_UPDATE_DATE,TEXT_ITEM_PERCENT_FIXED等。对于各种类型的字段,注意根据data type设置合适的Format mask。
2. Display Items
应当设置足够宽以显示数据库中该项的最长内容。
3. Check Boxes
需要特别注意的属性
Property Note
Value when checked
Value when unchecked
Check Box mapping of other values checked/ unchecked/not allowed,当该选项为not
allowed时,必须指定Initial value,否则编译出错。
还有一类比较特殊的Check Boxes(property class-CHECKBOX_COORDINATION),用以控制Master-Detail Block的关联行为。
4. Buttons
可设置Access Key。(ALT+KEY)
5. Option Groups
必须设定缺省值。
6. Poplists
在可选值不超过15个情况下,Poplists是个不错的选择,对Poplists的编程应对应List Item Value。应尽量避免将Poplists设为multi-row blocks的首字段。
Property Note
List Style 列表风格,poplist/combox/tlist使用前两种风格居多,在设置poplist
风格的Elements时,有几项就输入几项,鼠标不要做多余的操作,比如明明只有4项,偏要点到第5项上去,虽然什么都不输入,编译后列表就是多出白花花的一行,非常的难看,此时只有删除该列表Item,重头来过,甚是麻烦。
mapping of other values 不指定的话遇到该项数据不匹配的情况,可能整条记录都被屏蔽。
Initial value 不指定的话编译时会提示,不影响程序。
7. LOVS
LOV可以比Poplists容纳更多的记录,使用中需注意的地方在后续章节介绍。
8. Flexfields
关于Key弹性域和Descriptive弹性域的介绍。
9. Current Record Indicator
建议对于多行的Block都建立一个Property Class为CURRENT_RECORD_INDICATOR的非数据字段,作用:当前记录指示器。
10. Rowid
这个字段不是必需但很有用。Property Class:ROW_ID,当需要利用记录的物理地址更新或删除一条记录时,该字段就是必需的,当然前提是Block的数据源中必须包含该字段。