Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/06/2018, 12:45
ocp001a
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
EXtraño caso con vistas, resultados inestables.

Hola compañeros del foro.

Tengo un tema que no he podido resolver por que me resulta muy difícil reproducirlo de manera fiable.

Mi base de datos está en MariaDB.

Resulta lo siguiente: tengo una vista que me devuelve una serie de resultados a partir de unas tablas (partidas de ventas, artículos, ivas, etc)

Pero en algunas ocasiones devuelve datos imposibles, totales miles de millones o incluso de trillones ya sea en positivo o en negativo.

Lo curioso del caso es que ejecutando la misma consulta con el mismo usuario en sesiones diferentes (mismo usuario en dos computadoras diferentes) puede dar dos resultados diferentes, uno correcto y otro elevado.

Lo peor del caso es que si en la sesión donde estoy obteniendo mal el resultado agrego una columna más a mi consulta, los campos que antes salían mal ya salen bien, no es algo estable.

Este es mi ejemplo:

Código SQL:
Ver original
  1. SELECT  cat_clf_clasificacion1, cat_art_descripcion1, Unidades, ImporteMN, Total, Utilidad
  2. FROM view_ventas  WHERE ven_doc_fecha_documento BETWEEN '2018-06-01 00:00:00' AND '2018-06-30 23:59:59'

Me devuelve esto (El importe, total y utilidad totalmente mal):
ME, LIPITOR 40 MG DUO, 1.000000, -5041497372.053800, -5041497372.053800, -5041498385.093800
ME, VONTROL 25 MG TAB 25, 1.000000, -828879903.425000, -828879903.425000, -828880063.425000
ME, PILOVAIT 1 MG TBS/56, 1.000000, 685.410000, 685.410000, 76.480000
ME, LOXCELL 2.0/1.0 G SUSP 20 ML, 1.000000, -296716296.387700, -296716296.387700, -296716338.887700
ME, OXAL 150/200 TAB., 1.000000, -424522764.784300, -424522764.784300, -424522846.434300
ME, OXAL 150/200 TAB., 1.000000, -424522764.784300, -424522764.784300, -424522842.353300
ME, DEXIVANT 60 MGS C/14 CAPS., 1.000000, 515.500000, 515.500000, 50.500000
ME, SPASMOPRIV 200 MG CAPS 12 3, 1.000000, 235.670000, 235.670000, 27.720000


Tratando de depurar mi consulta por si acaso alguna columna tuviera datos erróneos, agrego la columna importeConDescuento:

Código SQL:
Ver original
  1. SELECT  cat_clf_clasificacion1, cat_art_descripcion1, Unidades, importeConDescuento, ImporteMN, Total, Utilidad
  2. FROM view_ventas  WHERE ven_doc_fecha_documento BETWEEN '2018-06-01 00:00:00' AND '2018-06-30 23:59:59'

Y ahora me devuelve lo siguiente: (ahora las mismas columnas que antes estaban mal ahora están bien):
ME, LIPITOR 40 MG DUO, 1.000000, 1054.519000, 1054.519000, 1054.519000, 41.479000
ME, VONTROL 25 MG TAB 25, 1.000000, 173.375000, 173.375000, 173.375000, 13.375000
ME, PILOVAIT 1 MG TBS/56, 1.000000, 685.410000, 685.410000, 685.410000, 76.480000
ME, LOXCELL 2.0/1.0 G SUSP 20 ML, 1.000000, 62.063500, 62.063500, 62.063500, 19.563500
ME, OXAL 150/200 TAB., 1.000000, 88.796500, 88.796500, 88.796500, 7.146500
ME, OXAL 150/200 TAB., 1.000000, 88.796500, 88.796500, 88.796500, 11.227500
ME, DEXIVANT 60 MGS C/14 CAPS., 1.000000, 515.500000, 515.500000, 515.500000, 50.500000
ME, SPASMOPRIV 200 MG CAPS 12 3, 1.000000, 235.670000, 235.670000, 235.670000, 27.720000


Y entonces ahora, al volver a ejecutar la primer consulta que antes salía mal, ahora ya sale bien.

Cabe señalar que la vista devuelve muchos datos obtenidos a partir de operaciones, por ejemplo estos campos:
Código SQL:
Ver original
  1. ven_par_precio_uni*(IF(ven_par_descuento1>0,1-((SELECT porcentajeDescuento)/100),1)) AS importeUniConDescuento,
  2.     ven_par_precio_uni*(IF(ven_par_descuento1>0,1-((SELECT porcentajeDescuento)/100),1))*ven_par_cantidad_total AS importeConDescuento,
  3.    
  4.     ven_par_tipo_cambio AS `TipoCambio`,
  5.  
  6.     ((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)*ven_par_cantidad_total AS `ImporteIEPS`,
  7.     ((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total AS `ImporteMN`,
  8.     (((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total AS `ImporteMNIEPS`,


Sin embargo, no veo cómo esto pudiera dar resultados tan inestables, lo único que se me ocurre es que quizá haya alguna mala gestión por parte de MariaDB en la cache (o algún otro mecanismo similar) y que al agregar campos a la consulta la caché sea limpiada o reiniciada.

Esto lo comento por que la base de datos es prácticamente de sólo consulta. En las noches le subo los datos provenientes de otro sistema y los usuarios no pueden (no tienen los permisos) cambiar costos, precios, descuentos ni nada.

Por lo tanto, me inclino a pensar que no es un error en los datos de origen, si no en la vista que procesa los datos o mejor dicho en la cache, por que los datos salen mal o bien de un momento a otro.

¿Alguna idea?