在form界面我们要想格式化一个数字行如:123456.03的话,我们可以把这个Item的属性
成这样
原数字 | Format Mask | 结果 | 说明 |
123456.03 | FM999,990 | FM999,990.00 | |
0.123 | FM999,999.00 | .12 | 小数点前是9 |
0.123 | FM999,990.00 | 0.12 | 小数点前是0 |
123456789.03 | FM999,990.00 | ###### | 因为Format Mask的个数不够 |
123456789.03 | FM999,999,990.00 | 123,456,789.03 |
在to_char中to_char(A,B)
A | B | 结果 | 说明 |
0.123 | FM999,999.00 | .123 | 小数点前是9 |
0.123 | FM999,990.00 | 0.123 | 小数点前是0 |
金额的格式输入不应该用上面的方法,因为不同种类币种的格式掩码是不一样的,例如:币种为‘CNY’时金额保留两位小数,币种为‘BHD’时显示三位小数,有两种方法可以实现:
(1) 用代码根据币种动态控制格式掩码
设需要格式化的块为TEST,Item为AMOUNT,在块TEST的Post-query里加入如下代码:
APP_ITEM_PROPERTY.SET_PROPERTY('TEST.AMOUNT', --需要格式化的Item
FORMAT_MASK,
FND_CURRENCY.GET_FORMAT_MASK(
/*格式化用的币种,如果想用本位币可以这样取得
Select currency_code
Into l_currency_code
From gl_sets_of_books
Where set_of_books_id = fnd_profile(‘GL_SET_OF_BOOKS_ID’);
*/
‘USD’,
GET_ITEM_PROPERTY('TEST.AMOUNT', --返回Item的长度
MAX_LENGTH)));
这种方法简单,但如果是一个块显示为多行数据,每行的币种不同的话,就不起作用了。
(2) 用函数APP_CURRENCY.Line_Dyn_Currency实现,这种方法可以实现多行不同币种的格式化
具体方法如下:
设需要格式化的块为TEST,Item为AMOUNT,每行的币种为Item CURRENCY_CODE在数据块中新建一个非数据库描述字段DESC,AMOUNT不显示,显示DESC,在块TEST的post-query里加入如下代码:
:TEST.DESC := TEST.DESC;
APP_CURRENCY.Line_Dyn_Currency(:TEST.CURRENCY_CODE, 'TEST.AMOUNT', 'TEST.DESC', 'POST-QUERY');
在Item:DESC的WHEN-VALIDATE-ITEM里添加如下代码:
APP_CURRENCY.Line_Dyn_Currency(:TEST.CURRENCY_CODE, 'TEST.AMOUNT',
'TEST.DESC', 'WHEN-VALIDATE-ITEM');
它的作用是当DESC改变之后重新设置。
当然这种方法也有它的缺限,在块上查询之后用户没有操作,当前块的状态变成‘CHANGED’因显示AMOUNT时函数会APP_CURRENCY.Line_Dyn_Currency对AMOUNT重新赋值。解决以上问题,可以在块TEST的 post-query里加 APP_RECORD.SET_STATUS('QUERY'),把块的状态改回来。