Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Tipo de datos a usar para precios con comas incluidas

Estas en el tema de Tipo de datos a usar para precios con comas incluidas en el foro de Mysql en Foros del Web. Hola a todos, Tengo un problema con la forma en que mi MySQL carga los valores de precios que contienen miles separados por comas. La ...
  #1 (permalink)  
Antiguo 05/11/2010, 03:17
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 14 años
Puntos: 0
Tipo de datos a usar para precios con comas incluidas

Hola a todos,

Tengo un problema con la forma en que mi MySQL carga los valores de precios
que contienen miles separados por comas.

La base de datos es cargada de archivos CSV.txt,
El formato del campo precios es
8,230.15
1,200.10
564.20

Pero cuando la base de datos es cargada, en el campo precios solo aparece el primer número (unidad de millar) como sigue

En CSV.txt En BD MySQL
8,230.15----> 8.00-->Cargado incorrectamente
1,200.10----> 1.00-->Cargado incorrectamente
564.20------> 564.20-->Cargado correctamente

La estructura del campo de precios es:
Campo------Tipo----------Cotej---Atributos---Nulo---Predeterminado
prodPrice---decimal(10,2)----+++----++++++----Sí-------NULL

Qué tipo de dato tendría que poner en proPrice para que aparezcan correctamente los precios con comas en la BD y por condiguiente en la página web?


Gracias de antemano por cualquier sugerencia.

Saludos
  #2 (permalink)  
Antiguo 05/11/2010, 03:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Tipo de datos a usar para precios con comas incluidas

Cita:
Qué tipo de dato tendría que poner en proPrice para que aparezcan correctamente los precios con comas en la BD y por condiguiente en la página web?
El formato está técnicamente bien. Es en ambos casos el Inglés, sólo que ese software está incluyendo los separadores de grupos de miles, que habría que eliminar.
Habría que ver cómo realizas la carga desde el CSV a la base para poder darte una forma más o menos simple de hacer la conversión.

Una forma de realizarlo a lo tosco es hacer tres pasos:

1) Cargar el CSV a una tabla temporal, donde esa columna sea un VARCHAR.
2) Realizar un UPDATE sobre esa tabla para "extirpar" las coma.
3) Volcar todo a la tabla final.

Sería rústico, pero funcionaría.

Hacerlo en un sólo paso requiere que nos expliques con qué estás realizando la carga, para ver si el problema se puede resolver por el código de la aplicación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/11/2010, 06:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Tipo de datos a usar para precios con comas incluidas

Otra forma que podrías tratar el problema es abriendo el archivo con excel con la configuración del equipo sin separador de miles y con separador decimal en punto.

La otra es hacer un replace desde el archivo de la coma por un vacío y que el archivo esté delimitado por ; para que no te entre enb conflicto.

La forma de gnzsoloyo es totalmente y la he utilizado cuando el archivo csv a importar es muy grande. Hacer estos reemplazos en un archivo toma horas mientras que cargar un archivo grande a un gestor de base de datos es sumamente eficiente.

Dependiendo del caso puedes tomar una decisión.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 05/11/2010, 14:50
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 14 años
Puntos: 0
Respuesta: Tipo de datos a usar para precios con comas incluidas

Hola a todos,

huesos52 y gnzsoloyo, gracias a ambos por sus respuestas.

Pues el CSV.txt es cargado dentro de la BD MySWL por medio de un aplicación PHP, y en el Back End, hay una opción que me permite cargar los archivos CSV.txt.

El problema es que el script compara precios de más a menos, meno a más etc, y cuando le pongo formato de texto obviamente ya no los puede comparar aunque si los muestra en la página web. Probé con otros formatos y no dio resultado.

Hice un pequeño script de AWK para quitarle las comas a los CSV.txt de la columna de precios y una vez cargados en la BD si los carga completos y los muestra igualmente completos en la página web, aunque sin las comas delimitadoras de miles.

Es una solución, aunque me gustaría que los visitantes vieran los precios con comas, si fuera posible modificar los comandos PHP responsables de mostrar los precios.

Encontre que el archivo products.inc.php contiene comandos donde incluye las variables de precios (HighPrice, LowPrice, etc) y la variable "ProdPrice". Y veo que los últimos comando (box_content) posiblemente son los que arrojan los precios después de compararlos, pero no tengo idea cómo modificarles el formato para que mueste comas de miles y que las demas operaciones y comparación se siga dando.

Los comandos de los que hablo son:
Código PHP:
$box_content->assign("PRICEREFLINKDATA",$installDir['value'].'index.php?ps='.str_replace(" ""+"strip_tags($_GET['ps'])).$pscatvar.'&pslow='.$lowprice.'&pshigh='.ceil($lowprice $divideprice).$rshow);                                                                                                                                                                                                          
$box_content->assign("PRICEREFINE",$row_product['prodCurrency'].$lowprice.' - '.$row_product['prodCurrency'].ceil($lowprice $divideprice));                                                                                                                                                                                                                                                                         
$box_content->parse("prod.refine.priceli");                                                                                                                                                                                                                                                                                                                                                                           
$box_content->assign("PRICEREFLINKDATA",$installDir['value'].'index.php?ps='.str_replace(" ""+"strip_tags($_GET['ps'])).$pscatvar.'&pslow='.ceil($lowprice $divideprice).'&pshigh='.ceil($lowprice + ($divideprice 2)).$rshow);                                                                                                                                                                               
$box_content->assign("PRICEREFINE",$row_product['prodCurrency'].ceil($lowprice $divideprice).' - '.$row_product['prodCurrency'].ceil($lowprice + ($divideprice 2)));                                                                                                                                                                                                                                              
$box_content->parse("prod.refine.priceli");                                                                                                                                                                                                                                                                                                                                                                           
$box_content->assign("PRICEREFLINKDATA",$installDir['value'].'index.php?ps='.str_replace(" ""+"strip_tags($_GET['ps'])).$pscatvar.'&pslow='.ceil($lowprice + ($divideprice 2)).'&pshigh='.ceil($lowprice + ($divideprice 3)).$rshow);                                                                                                                                                                         
$box_content->assign("PRICEREFINE",$row_product['prodCurrency'].ceil($lowprice + ($divideprice 2)).' - '.$row_product['prodCurrency'].ceil($lowprice + ($divideprice 3)));                                                                                                                                                                                                                                        
$box_content->parse("prod.refine.priceli");                                                                                                                                                                                                                                                                                                                                                                           
$box_content->assign("PRICEREFLINKDATA",$installDir['value'].'index.php?ps='.str_replace(" ""+"strip_tags($_GET['ps'])).$pscatvar.'&pslow='.ceil($lowprice + ($divideprice 3)).'&pshigh='.ceil($lowprice + ($divideprice 4)).$rshow);                                                                                                                                                                         
$box_content->assign("PRICEREFINE",$row_product['prodCurrency'].ceil($lowprice + ($divideprice 3)).' - '.$row_product['prodCurrency'].ceil($lowprice + ($divideprice 4)));                                                                                                                                                                                                                                        
$box_content->parse("prod.refine.priceli");   
                                                                                                                                                                                                                                                                                                                                                                        
$box_content->assign("PRICEREFLINKDATA",$installDir['value'].'index.php?ps='.str_replace(" ""+"strip_tags($_GET['ps'])).$pscatvar.'&pslow='.ceil($lowprice + ($divideprice 4)).'&pshigh='.ceil($lowprice + ($divideprice 5)).$rshow);                                                                                                                                                                         
$box_content->assign("PRICEREFINE",$row_product['prodCurrency'].ceil($lowprice + ($divideprice 4)).' - '.$row_product['prodCurrency'].ceil($lowprice + ($divideprice 5)));                                                                                                                                                                                                                                        
$box_content->parse("prod.refine.priceli"); 
Ojalá alguien pudiera determinar si estos comandos son responsables de dar formato de presentación de los precios y cómo se les puede modificar para que muestren comas separadoras de miles.

Gracias de antemano, saludos.

Etiquetas: comas, precios, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:50.