做选厂比价时,需要把比价表(vender_comparison_detail )里的报价金额(price )统一换算成美元,并将结果保存在折算金额(convert_usd)字段。换算的汇率根据汇率表(currencyrate)最新更新的汇率值,即取同一个币种(currency),更新日期(asof)最新的汇率(rate)。该汇率表是各币种100的金额换算成美元的汇率,例如币种‘RMB’,汇率为‘14.97300’,则意思是100元的人民币可换14.973的美元,其他币种类似。人民币换算成美元时,再除以1.25,是考虑若从国外进口会产生的保险费、运输费、关税等费用,估计占报价金额的25%,所以报价为美元的话,需乘以1.25,再换算成人民币再和国内厂家的报价进行比较。现在需吧把人民币换算美元,故反过来人民币除以1.25。
这里用到了round函数,round函数是计算结果进行四舍五入的方法,第二个参数表示开始四舍五入的位数,可取正数也可取负数。正数表示从小数点右边数起,第几位,负数相反,下面取2,表示从小数点后第2位开始四舍五入。我在orcale试的结果如下: round(155.7894,2) = 155.79, round(155.789,0) = 156,round(155.789,-1) = 160。
看网上说orcale没有update from语句,于是学习用了其他介绍的方法更新折算金额,加最后一个 where vc.com_no in ……是因为看网上说,oracle不会按照我们所想的只更新满足查询条件的那些记录,例如 com_no = '0107' ,不满足条件的记录会全被更新为空值,我试验了下果然!其他比价单的折算金额都置为空了,所以需加上 where vc.com_no in …… 才能保证只更新我想要的记录。
update vender_comparison_detail vc
set (convert_usd) =
(select decode(v.currency,
'RMB',
round(v.price * c.rate / 100 / 1.25, 2),
round(v.price * c.rate / 100, 2))
from vender_comparison_detail v, currencyrate c
where vc.com_no = v.com_no
and vc.pn = v.pn
and vc.vender = v.vender
and v.com_no = '0107' // 比价单号
and trim(c.currency) = v.currency
and c.asof = (select max(asof) // ‘asof’ 为更新日期
from currencyrate
where trim(currency) = v.currency))
where vc.com_no in
(select com_no from vender_comparison_detail where com_no = '0107')