Ya sea que trabajemos con algún lenguaje de programación o base de datos, lo habitual es dejarle a estos las operaciones en este caso suma o resta de inventarios, pero hoy veremos un gran problema no esperado y que claro el resultado no es lógico.

En el problema que me he enfrentado es la actualización de inventarios, lo mas habitual es hacer la siguiente consulta directamente en la base de datos:

Estas consultas fueron realizadas en MySql

UPDATE productos SET existencias = existencias + 87 WHERE id = 132

Hasta aquí todo bien  pero si trabábamos con decimales podremos toparnos con un resultado erróneo, como no lo muestra la siguiente consulta:

SELECT existencia, (existencia + 0.07 ), (24.92 + 0.07) FROM productos WHERE id = ‘2640’

Los tres resultados que nos arroga son:

  1. Existencia del producto.
  2. Existencia final después de actualizar nuestro inventario (normalmente usamos esta expresión).
  3. Existencia final del inventario pero usando valores numéricos directos en la consulta, nada de referencia a valores.

image

 

Lo peor es que que estas operaciones en VB 2005 arrogan el mismo valor larguísimo, entonces lo que podremos hacer para evitar estos valores no deseados es hacer dos consulta en lugar de una:

1 – Primero obtenemos el inventario

SELECT existencia FROM productos WHERE id = ‘2640’

2 – Después de esto hacemos un UPDATE pero con los valores directos

UPDATE productos SET existencia = (24.92 + 0.07) WHERE id = ‘2640’

Aparentemente esto no tiene sentido, o es redundante pero si alguien quiere compartir una experiencia similar y como la resolvió les aseguro que estaremos encantados de leerla.

Ahora veremos la misma consulta pero en SQLite

La imagen habla por si sola.

image

2 comentarios en «Problemas de calculo :/»
  1. Igual el error lo tienes en la tabla que al poner la función provoca una consulta erronea sobre la misma base de datos. Pasa con lenguajes de programación sobre escritorio que sino añades las variables como funciones resueltas te tira algún error, míralo por http://adbuds.es/Mbz

  2. La solucion una es cambiar el tipo de dato en la base de datos «seguro esta en float, si quieres que no tengas ese problema deberia ser double»

    Ó la otra opcion es realizar un casting o round en la consulta

    SELECT existencia,CAST((existencia + 0.07)AS DECIMAL(20,2)), ROUND((existencia + 0.07), 4),(24.92 + 0.07) FROM productos

    Saludos!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *