Migración de aplicaciones de BD Postgres de Ptas a Euros

Antonio Castro Snurmacher

18 de septiembre de 2001

Quizás es usted una de esas personas que aún no ha adaptado sus
programas de gestión a la nueva moneda Euro.
El ejemplo que se comenta parte de una tabla donde las Ptas estaban
guardadas en BD como simples enteros ya que hace bastante que en España
no se usan los céntimos. Partimos de este supuesto por ser un supuesto
pesimista.
Necesitamos un formato capaz de trabajar con céntimos. No es
recomendable usar tipos 'float' para eso porque su representación
interna en coma flotante no es adecuada para tratar datos de importes
monetarios. Los datos 'float' están bien para cálculos científicos por
su gran precisión pero en los datos monetarios es muy importante que los
valores internos correspondan fielmente con los valores representados.
Hay que evitar problemas de redondeo. Si usáramos 'float' pueden ocurrir
cosas como lo siguiente:
|
501.314 --> 501.31
502.224 --> 111.22
=======        ======
503.538 --> 512.54
|
En PostgreSQL han de usarse datos de tipo 'numeric' o 'decimal'. El
formato 'money' es un formato en desuso equivalente a decimal(9,2).
El ejemplo que viene a continuación cargará en primer lugar una tabla en
la BD template1 que suele venir por creada por defecto. (En caso
contrario habrá que crearla). Los datos nuestro ejemplo contienen unos
importes así como un campo para el tipo de moneda y su cambio. En el
caso de que usted use tablas sin campos para el tipo de moneda deberá
considerar si le interesa añadirlos o no. Esto nos permitirá mantener en
Ptas los importes que se manejaron en Ptas y en Euros los nuevos
importes en Euros, pero estas cosas afectan a los programas porque los
cálculos deberán tener todo esto en cuenta.
Este es un ejemplo simplemente para aportar ideas más que otra cosa.
Advierta que en este ejemplo se conserva una copia con los datos
antiguos a modo de copia de seguridad.
LISTADO de ptas2euros.bash
#/bin/bash
####################################################################
#  Programa : ptas2euros.bash Autor : Antonio Castro Snurmacher Fecha :
#  10/09/2001 Licencia : Este programa que puede ser libremente
#  distribuido bajo los términos de la Licencia GPL (Gnu Public
#  License). Garantías: NINGUNA
#
#    Proposito: Ejemplo de conversión de unos datos con importes en
#             Ptas a Euros para bases de datos PostgreSQL.
####################################################################
psql -d template1 <<FIN
DROP TABLE PRUPTAS2EUROS;
DROP TABLE X_PRUPTAS2EUROS;
DROP TABLE Z_PRUPTAS2EUROS;
CREATE TABLE PRUPTAS2EUROS ( fecha date, imp1 int4, imp2 int4, moneda
char(10), cambiomoneda float8 );
INSERT INTO PRUPTAS2EUROS ( fecha, imp1, imp2, moneda, cambiomoneda )
VALUES ( '27/12/2001', 12569, 6789, 'PTA', 1);
INSERT INTO PRUPTAS2EUROS ( fecha, imp1, imp2, moneda, cambiomoneda )
VALUES ( '28/12/2001', 182569, 789, 'PTA', 1);
INSERT INTO PRUPTAS2EUROS ( fecha, imp1, imp2, moneda, cambiomoneda )
VALUES ( '02/01/2002', 97569, 1009, 'PTA', 1);
INSERT INTO PRUPTAS2EUROS ( fecha, imp1, imp2, moneda, cambiomoneda )
VALUES ( '04/01/2002', 62577, 1144, 'PTA', 1);
\d PRUPTAS2EUROS
SELECT * FROM PRUPTAS2EUROS;
CREATE TABLE X_PRUPTAS2EUROS ( fecha date, imp1 decimal(9,2), imp2
decimal(9,2), moneda char(10), cambiomoneda float8 ); \d X_PRUPTAS2EUROS
INSERT INTO X_PRUPTAS2EUROS ( fecha, imp1, imp2, moneda, cambiomoneda )
SELECT fecha, imp1, imp2, 'PTA', 0.6010121 FROM PRUPTAS2EUROS WHERE
fecha < '01/01/2002' ;
INSERT INTO X_PRUPTAS2EUROS ( fecha, imp1, imp2, moneda, cambiomoneda )
SELECT fecha, float8(imp1)/ 166.386, float8(imp2)/ 166.386, 'EUR', 1
FROM PRUPTAS2EUROS WHERE fecha >= '01/01/2002' ;
ALTER TABLE PRUPTAS2EUROS RENAME TO Z_PRUPTAS2EUROS;
ALTER TABLE X_PRUPTAS2EUROS RENAME TO PRUPTAS2EUROS;
SELECT * FROM PRUPTAS2EUROS;
FIN



Página creada en: 2004-11-04 11:41:01 +0000
© Copyright 2001, 2002, 2003, 2004, La Espiral, debian-laespiral@lists.debian.org
Permitida la copia y distribución textual, integral, siempre y cuando se mantenga este aviso.