PDA

Ver la Versión Completa : Tipos de moneda en firebird 2.5


ronimaxh
24-08-2016, 16:20:09
Saludos amigos del club, tengo una duda quiero pedirles ayuda tengo un sistema de punto de venta me gustaría saber como podria manejar difernetes tipos de monedas: euro, dolares y pesos domincano. Cómo firebird los define

ecfisa
24-08-2016, 19:13:01
Hola.

No entiendo bién a donde apunta la pregunta, supongo que te refieres al contenido de los distintos juegos de caracteres y como definirlos:

Character set (http://www.firebirdsql.org/refdocs/langrefupd25-ddl-charset.html)
Character sets and Unicode in Firebird (http://ibexpert.net/ibe/index.php?n=Doc.CharacterSetsAndUnicodeInFirebird)
Firebird Character Sets and Collations (http://www.destructor.de/firebird/charsets.htm)

Pero si aludes al formato de salida, (pantalla/impresión, etc) normalmente se maneja desde el lenguaje.

Saludos :)

ronimaxh
24-08-2016, 20:02:55
Parece que no me di a entender bien, lo quiero saber es: registrar dolores o registrar euros aquí hay una diferencia en la forma como quedarían guardados, ejemplo 1,500.00 (dolares o pesos) y en euro seria 1.500,00 como se puede manejar eso.

mamcx
24-08-2016, 20:43:51
Lo mas simple es crear una columna por cada denominacion, si tienes una lista fija. Si no, haces una relacion uno a muchos y creas una fila por cada denominacion

ecfisa
24-08-2016, 20:52:49
Hola.

Como te dije antes, no es Firebird quién debe encargarse de los formatos de presentación sino el lenguaje, revisa las variables globales:

ThousandSeparator (http://www.delphibasics.co.uk/RTL.asp?Name=ThousandSeparator)
DecimalSeparator (http://www.delphibasics.co.uk/RTL.asp?Name=DecimalSeparator)


Un ejemplo:


procedure SetMoney(Euro: Boolean = False);
begin
if Euro then
begin
ThousandSeparator := '.';
DecimalSeparator := ',';
end
else
begin
ThousandSeparator := ',';
DecimalSeparator := '.';
end;
end;

procedure TForm1.btnDolarClick(Sender: TObject);
begin
SetMoney; // dolar-peso
end;

procedure TForm1.btnEuroClick(Sender: TObject);
begin
SetMoney(True); // euro
end;

var
Monto: Double = 1500.99;

procedure TForm1.btnShowClick(Sender: TObject);
begin
ListBox1.Items.Add( FormatFloat(',0.00', Monto) );
end;

Podes asegurar que no se cambie el formato durante la ejecución mediante:
Application.UpdateFormatSettings := False;

También te va a resultar útil la informacion y consejos de este hilo: float con coma (,) o punto (.) (http://www.clubdelphi.com/foros/showthread.php?t=82854)

Saludos :)

ronimaxh
24-08-2016, 20:56:00
Gracias amigos ahora si tengo una idea clara.

Ferrari
24-08-2016, 22:18:45
Coincido con eficsa.....!!!

AgustinOrtu
24-08-2016, 22:28:43
Estas a tiempo de no usar un valor primitivo para representar dinero.

Yo justamente por eso ahora tengo planeada una refactorizacion bastante grande. En la mayoría de los modelos, los tipos primitivos léase string, float, integer, etc, no son adecuados para representar objetos del modelo

Lo más adecuado es usar clases que encapsulen ese comportamiento. De esa manera vas a poder realizar conversiones desde hasta en cualquier momento y fácilmente

Acá se explica más detenidamente este "mal olor" o potencial problema conocido como "primitive obsession" o en español algo así como "abuso de tipos primitivos"

http://blog.ploeh.dk/2011/05/25/DesignSmellPrimitiveObsession/

http://blog.ploeh.dk/2015/01/19/from-primitive-obsession-to-domain-modelling/

De esta forma centralizas: conversión a string, cambio de moneda, equivalencias, redondeo, validaciónes, parseo de string, etc

Casimiro Notevi
24-08-2016, 22:55:28
En la base de datos, como te han indicado, un valor numérico decimal o currency, y la base de datos lo guardará como crea oportuno. Luego eres tú quien presentará en pantalla ese dato como más te convenga.
Date cuenta que tu pregunta es lo mismo que: quiero guardar cantidad de manzanas, peras y limones: 5 peras, 6 manzanas, 8 limones.
Tú guardarás directamente un número 5, 6, 8 o la cantidad que sea. Luego en pantalla mostrarás la descripción del producto: peras, manzanas, tomates o pimientos.

rocksoft
25-08-2016, 07:45:10
La pregunta del millon que usar para monedas decimal o money (currency)?

:) quien se robo el limon? y de donde salieron los tomates o el pimiento :)

Casimiro Notevi
25-08-2016, 09:17:20
Mira esta página. (http://www.firebirdmanual.com/firebird/es/firebird-manual/2/tipos-de-datos-firebird/50)

Los tomates y pimientos acabaron en la ensalada, y el limón para aderezarlo :)

rastafarey
09-09-2016, 14:49:38
te recomiendo usar numeric o decimal con formato definido fijo.

Moneda = numeric(18, 2) o numeric(1,4). Al igual que el calcul o de % tambien usar algo asi. Si no haces eso fijo vas a tener problemas con el los redondeos y la presision. te lo digo por que ya me paso.

Aqui en el foro hay uno o varios hilo sque este tema, lo de la meneda en bastanto delicado y no se debe tomar a la ligera, es preferible hacer el calculo redondear y almacenar los decimales con un largo definco para que te evites muchos dolodres de cabeza mas adelante.