由于国际业务或多币种业务的实际需要,在业务系统中能够处理多个币种并进行自动换算,是十分必要的。
一、设计汇率表
用于存储用户换算的外汇牌价。
mlwbpj字段列表: id int4 32 键号 textedit hbdh varchar 50 贷币代号 textedit hbmc varchar 20 货币名称 textedit jzhl numeric 18 记账汇率(每100外币) textedit n4 sfsh bool 0 是否审核 checkedit shry varchar 20 审核人员 textedit rq date 0 日期 dateedit yyyy-MM-dd
二、换算函数
编写两个外币转换函数。使外币与本币可以相互换算。
1、外币换算成本币金额
CREATE OR REPLACE FUNCTION public.x9_bbje( ywrq date, wbmc character varying, wbsl numeric) RETURNS numeric LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ -- Description: 本币金额 DECLARE bbje decimal(16,4); pjrq DATE; BEGIN bbje:=0; IF $2 = '人民币(RMB)' OR $2 = '' THEN BEGIN bbje:=$3; END; ELSE BEGIN IF $3 IS NULL THEN $3 = 0;END IF; SELECT max(rq) INTO pjrq FROM mlwbpj WHERE rq <= $1; SELECT (jzhl * $3) / 100 INTO bbje FROM mlwbpj WHERE rq = pjrq AND hbmc = $2 ; END; END IF ; RETURN bbje; END; $BODY$;
2、本币换算为外币金额
CREATE OR REPLACE FUNCTION public.x9_wbje( wbmc character varying, bbsl numeric) RETURNS numeric LANGUAGE 'plpgsql' COST 100 VOLATILE PARALLEL UNSAFE AS $BODY$ -- complete date:2022-09-18-- Description: 外币金额 DECLARE ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理 wbje decimal(16,4); pjrq DATE; BEGIN wbje:=0; IF $1 = '人民币(RMB)' OR $1 = '' THEN wbje:=0; ELSE IF $2 IS NULL THEN wbje = 0; END IF ; SELECT max(rq) INTO pjrq FROM mlwbpj WHERE hbmc = $1; SELECT ($2 * 100 / jzhl) INTO wbje FROM mlwbpj WHERE hbmc = $1 AND rq = pjrq; END IF ; RETURN wbje; EXCEPTION WHEN others THEN GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail, sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context; CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt); RETURN 0; END; $BODY$;
三、自动换算
在数据保存后,在后台自动计算并保存不同币种各自的金额。在设计数据表时,都设计有本币和外币字段。
四、总结
这些设计了以后,在数据查询时,就可按需要查询本币和外币了。
如果需要,在数据输入时,也可以调用后台函数,立即计算出换算后的结果,前提是实时更外币牌价表。