form界面我们要想格式化一个数字行如:123456.03的话,我们可以把这个Item的属性

成这样


原数字

Format Mask

结果

说明

123456.03

FM999990

FM999990.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_charto_char(A,B)

A

B

结果

说明

0.123

FM999,999.00

.123

小数点前是9

0.123

FM999,990.00

0.123

小数点前是0


金额的格式输入不应该用上面的方法,因为不同种类币种的格式掩码是不一样的,例如:币种为‘CNY’时金额保留两位小数,币种为‘BHD’时显示三位小数,有两种方法可以实现:

1. 用代码根据币种动态控制格式掩码

设需要格式化的块为TESTItemAMOUNT,在块TESTPost-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实现,这种方法可以实现多行不同币种的格式化

具体方法如下:

设需要格式化的块为TESTItemAMOUNT,每行的币种为Item  CURRENCY_CODE在数据块中新建一个非数据库描述字段DESCAMOUNT不显示,显示DESC,在块TESTpost-query里加入如下代码:

:TEST.DESC := TEST.DESC;
APP_CURRENCY.Line_Dyn_Currency(:TEST.CURRENCY_CODE,  'TEST.AMOUNT',  'TEST.DESC',  'POST-QUERY');

ItemDESCWHEN-VALIDATE-ITEM里添加如下代码:

APP_CURRENCY.Line_Dyn_Currency(:TEST.CURRENCY_CODE,  'TEST.AMOUNT',
'TEST.DESC',  'WHEN-VALIDATE-ITEM');

它的作用是当DESC改变之后重新设置。

当然这种方法也有它的缺限,在块上查询之后用户没有操作,当前块的状态变成‘CHANGED’因显示AMOUNT时函数会APP_CURRENCY.Line_Dyn_CurrencyAMOUNT重新赋值。解决以上问题,可以在块TEST  post-query里加  APP_RECORD.SET_STATUS('QUERY'),把块的状态改回来。