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

EXtraño caso con vistas, resultados inestables.

Estas en el tema de EXtraño caso con vistas, resultados inestables. en el foro de Mysql en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 02/06/2018, 12:45
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 10 años, 3 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?
  #2 (permalink)  
Antiguo 04/06/2018, 07:37
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.274
Antigüedad: 12 años
Puntos: 756
Respuesta: EXtraño caso con vistas, resultados inestables.

y el codigo de la vista??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 04/06/2018, 10:49
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 10 años, 3 meses
Puntos: 528
Respuesta: EXtraño caso con vistas, resultados inestables.

Esta es la consulta que genera la vista:


Código SQL:
Ver original
  1. SELECT
  2.     ven_doc_fecha_documento AS `ven_doc_fecha_documento`,
  3.     ven_doc_id_moneda AS `ven_doc_id_moneda`,
  4.     ven_doc_id_tipo_movimiento AS `ven_doc_id_tipo_movimiento`,
  5.     ven_doc_status AS `ven_doc_status`,
  6.     cat_cli_codigo AS `cat_cli_codigo`,
  7.     cat_cli_rfc AS `cat_cli_rfc`,
  8.     cat_cli_nombre AS `cat_cli_nombre`,
  9.     ven_doc_folio AS `ven_doc_folio`,
  10.     cat_iva_porcentaje AS `cat_iva_porcentaje`,
  11.     cat_ieps_porcentaje AS `cat_ieps_porcentaje`,
  12.     cat_alm_id AS `cat_alm_id`,
  13.     cat_alm_codigo AS `cat_alm_codigo`,
  14.     cat_alm_descripcion AS `cat_alm_descripcion`,
  15.     cat_ven_codigo AS `cat_ven_codigo`,
  16.     cat_ven_nombre AS `cat_ven_nombre`,
  17.     cat_clf_clasificacion1 AS `cat_clf_clasificacion1`,
  18.     cat_clf_clasificacion2 AS `cat_clf_clasificacion2`,
  19.     cat_clf_clasificacion3 AS `cat_clf_clasificacion3`,
  20.     cat_clf_descripcion AS `cat_clf_descripcion`,
  21.     cat_clf_descripcion2 AS `cat_clf_descripcion2`,
  22.     cat_clf_descripcion3 AS `cat_clf_descripcion3`,
  23.     cat_art_codigo1 AS `cat_art_codigo1`,
  24.     cat_art_descripcion1 AS `cat_art_descripcion1`,
  25.     ven_par_descuento1,
  26.     ven_par_descuento2,
  27.     ven_par_descuento3,
  28.     ven_par_descuento4,
  29.     ven_par_descuento5,
  30.     ven_par_cantidad_total AS `Unidades`,
  31.     ven_par_devueltas AS `UnidadesDevueltas`,
  32.     ven_par_costo AS `Costo`,
  33.     (ven_par_costo/ven_par_cantidad_total)*ven_par_devueltas AS `CostoDevoluciones`,
  34.     ven_par_precio_uni*ven_par_cantidad_total AS `Importe`,
  35.    
  36.     IF(
  37.         ven_par_descuento1>0,(1-
  38.             (
  39.                 (1-(ven_par_descuento1/100))*
  40.                 (IF(ven_par_descuento2>0,1-(ven_par_descuento2/100),1))*
  41.                 (IF(ven_par_descuento3>0,1-(ven_par_descuento3/100),1))*
  42.                 (IF(ven_par_descuento4>0,1-(ven_par_descuento4/100),1))*
  43.                 (IF(ven_par_descuento5>0,1-(ven_par_descuento5/100),1))
  44.             ))*100,
  45.             0
  46.    
  47.     ) AS `porcentajeDescuento`,
  48.     IF(ven_par_descuento1>0,((SELECT porcentajeDescuento)/100)*(ven_par_precio_uni*ven_par_cantidad_total),0) AS importeDescuento,
  49.  
  50.     ven_par_precio_uni*(IF(ven_par_descuento1>0,1-((SELECT porcentajeDescuento)/100),1)) AS importeUniConDescuento,
  51.     ven_par_precio_uni*(IF(ven_par_descuento1>0,1-((SELECT porcentajeDescuento)/100),1))*ven_par_cantidad_total AS importeConDescuento,
  52.    
  53.     ven_par_tipo_cambio AS `TipoCambio`,
  54.  
  55.     ((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)*ven_par_cantidad_total AS `ImporteIEPS`,
  56.     ((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total AS `ImporteMN`,
  57.     (((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total AS `ImporteMNIEPS`,
  58.  
  59.     ((((SELECT importeUniConDescuento))*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total)*(cat_iva_porcentaje/100) AS `ImporteIVA`,
  60.  
  61.     ((((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total)+
  62.     (((((SELECT importeUniConDescuento))*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total)*(cat_iva_porcentaje/100)) AS `ImporteConIVA`,
  63.  
  64.  
  65.     ((SELECT importeUniConDescuento)*ven_par_devueltas*ven_par_tipo_cambio)*-1 AS `ImporteDevoluciones`,
  66.     (((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)*ven_par_devueltas)*-1 AS `DevolucionesIEPS`,
  67.     ((((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_devueltas)*-1 AS `ImporteDevolucionesMN`,
  68.     (((((SELECT importeUniConDescuento))*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_devueltas)*(cat_iva_porcentaje/100))*-1 AS `DevolucionesIVA`,
  69.  
  70.     (((((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_devueltas)+
  71.     (((((SELECT importeUniConDescuento))*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_devueltas)*(cat_iva_porcentaje/100)))*-1 AS `ImporteDevolucionesConIVA`,
  72.  
  73.     ((((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total)-
  74.     (((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_devueltas AS `Total`,
  75.    
  76.     (((((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_cantidad_total)-
  77.     (((SELECT importeUniConDescuento)*ven_par_tipo_cambio)*(cat_ieps_porcentaje/100)+(SELECT importeUniConDescuento)*ven_par_tipo_cambio)*ven_par_devueltas) -
  78.     (ven_par_costo+((ven_par_costo/ven_par_cantidad_total)*ven_par_devueltas)) AS `Utilidad`
  79.    
  80.    
  81. FROM
  82.     ventas_documentos
  83. JOIN
  84.     ventas_partidas
  85.         ON
  86.     ven_par_id_documento = ven_doc_id
  87. JOIN
  88.     cat_articulos
  89.         ON
  90.     cat_art_id = ven_par_id_articulo
  91. JOIN
  92.     cat_clasificaciones
  93.         ON
  94.     cat_clf_id = cat_art_id_clasificacion
  95. JOIN
  96.     cat_iva
  97.         ON
  98.     cat_iva_id = ven_par_id_iva
  99. JOIN
  100.     cat_ieps
  101.         ON
  102.     cat_ieps_id = ven_par_id_ieps
  103. JOIN
  104.     cat_almacenes
  105.         ON
  106.     cat_alm_id = ven_doc_id_almacen
  107. JOIN
  108.     cat_clientes
  109.         ON
  110.     cat_cli_id = ven_doc_id_cliente
  111. JOIN
  112.     cat_vendedores
  113.         ON
  114.     cat_ven_id = ven_doc_id_vendedor

Cabe señalar que esta misma vista en otras bases de datos no genera el error, o al menos los usuarios no han reportado nada.
  #4 (permalink)  
Antiguo 06/06/2018, 18:53
Avatar de vicram10  
Fecha de Ingreso: enero-2009
Ubicación: Asuncion
Mensajes: 313
Antigüedad: 9 años, 6 meses
Puntos: 27
Respuesta: EXtraño caso con vistas, resultados inestables.

en su momento tuve el mismo inconveniente (en otro tipo de base de datos).
la misma se debia a la configuracion que poseia el cliente cuando hacia la consulta contra la base, al que le salia bien tenia un tipo de formato de fecha, y el mismo select al que le salia mal tenia otro formato de fecha (sesiones diferentes, configuraciones diferentes de sesion).

no se si esto se aplica a tu caso pero tambien es un punto que podria verificarse (ya que el mismo select se ve distintas formas en 2 sesiones diferentes).
__________________
Asunción Paraguay
Licenciado - Desarrollador Web - Gerente Desarrollo TI (BEPSA)
Espacio Geek - Comunidad Tecnologica
  #5 (permalink)  
Antiguo 07/06/2018, 07:01
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.975
Antigüedad: 9 años, 6 meses
Puntos: 356
Respuesta: EXtraño caso con vistas, resultados inestables.

Cita:
Iniciado por vicram10 Ver Mensaje
en su momento tuve el mismo inconveniente (en otro tipo de base de datos).
la misma se debia a la configuracion que poseia el cliente cuando hacia la consulta contra la base, al que le salia bien tenia un tipo de formato de fecha, y el mismo select al que le salia mal tenia otro formato de fecha (sesiones diferentes, configuraciones diferentes de sesion).

no se si esto se aplica a tu caso pero tambien es un punto que podria verificarse (ya que el mismo select se ve distintas formas en 2 sesiones diferentes).
Me iría por esta misma linea.

El manejo de fechas es algo que se debe validar muy bien en este tipo de situaciones.
Prueba tu vista con la siguiente corrección:

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 STR_TO_DATE('2018-06-01 00:00:00','%Y-%m-%d %h:%i:%s') AND STR_TO_DATE('2018-06-30 23:59:59','%Y-%m-%d %h:%i:%s')

De igual forma, asegurate que la fecha que iongrese a la consulta sea en el formato '2018-06-01 00:00:00'

Nos cuentas como te va
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 07/06/2018, 10:23
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 10 años, 3 meses
Puntos: 528
Respuesta: EXtraño caso con vistas, resultados inestables.

Hola. En primer lugar gracias por responder.

El tema de la fecha es un punto ya revisado, después de que el usuario lo reportara, personalmente realicé las consultas, usando como ejemplo las que indiqué al principio:

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

y

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

En su momento, la primer consulta me daba resultados incorrectos, la segunda me dió resultados correctos, y la única diferencia entre las dos consultas es que en la segunda agregué una columna.

Mis pruebas son:
1 Hago una consulta general, me da mal el resultado.
2 Repito la consulta varias veces con espacio de algunos minutos, a veces hasta 10 minutos, y sigue saliendo mal, el resultado es el mismo, erróneo, pero consistente, no cambia.
3 Agrego una columna a la consulta, el resultado ya es correcto.
Lo absurdo del caso es lo siguiente:
4 Después de haber obtenido un resultado correcto, al volver a ejecutar la consulta del paso 1 (la misma exactamente) ahora el resultado es correcto.

La única pista que tengo, es que el resultado incorrecto se da sólo en las columnas obtenidas por operación, en las columnas de datos en bruto por ejemplo unidades o costo el resultado siempre es correcto.

He buscado información sobre el tema y no he conseguido nada.

Ya revisé las tablas, y no parece haber ningún daño.
  #7 (permalink)  
Antiguo 11/06/2018, 03:47
 
Fecha de Ingreso: mayo-2011
Ubicación: Palma de Mallorca
Mensajes: 108
Antigüedad: 7 años, 2 meses
Puntos: 4
Respuesta: EXtraño caso con vistas, resultados inestables.

Hola opc001a

si te dan los resultados en las columnas que se obtienen por operación, alomejor es que la sentencia no trabaja bien la prioridad de operaciones.

Prueba con un solo registro y una sola columna, haz la operación a mano para obtener el resultado y prueba la sentencia para ver si da el mismo.

Se que es algo tedioso, pero así es una manera de asegurar que las operaciones se realizan como tocan.

Ya nos comentaras avances. Un saludo.



La zona horaria es GMT -6. Ahora son las 01:45.