Ver Mensaje Individual
  #4 (permalink)  
Antiguo 15/02/2015, 08:47
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: php no muestra la consulta de un procedimiento almacenado.

Cita:
El proc almacenado esta correcto mi problema es con php
Puede no ser necesariamente cierto. El hecho de que no puedas acceder a un dato que supuestamente el SP está obteniendo, me hace sospechar de que hay un error de ejecución en el SP.
El SP, para ser válido, debe devolver datos en todas las ocasiones, o bien devolver un error. Cuando no devuelve ni lo uno ni lo otro, entonces hay un problema con los datos que se validan, con el rpcoesamientos de esos datos, o con los resultados de los mismos, que PHP no puede manejar.
Personalmente sospecho del uso de las variables de usuario de MySQL que estás poniendo en el SP, ya que a menos que domines conceptualmente esas variables propias de MySQL, pueden dar lugar a resultados erróneos o inesperados.

Respecto a la sugerencia de cambiar la librería de acceso MYSQL a MYSQLI, te la di yo, y te expliqué la razón: la librería MYSQL, además de obsoleta, no maneja los resultados de consultas como salida de un SP, y eso es un problema ampliamente documentado.

Yendo al punto del SP, que aqui pongo un poco mas limpio:

Código MySQL:
Ver original
  1. delimiter $$
  2.     SELECT @NUM_BOUGHT := CAST(SUM(Cantidad_salida) AS UNSIGNED) AS units
  3.     FROM movimiento_stock INNER JOIN producto
  4.     WHERE Nombre_de_producto = "arroz";
  5.     SELECT @EXPENSE := CAST(SUM(expense) AS UNSIGNED) AS expense, SUM(units) AS units
  6.     FROM
  7.         (SELECT
  8.             Precio_entrada * LEAST(@NUM_BOUGHT, Cantidad_entrada) AS expense,
  9.             LEAST(@NUM_BOUGHT, Cantidad_entrada) AS units,
  10.             @NUM_BOUGHT := @NUM_BOUGHT - LEAST(@NUM_BOUGHT, Cantidad_entrada)
  11.         FROM movimiento_stock INNER JOIN producto
  12.         WHERE Nombre_de_producto= "arroz" AND @NUM_BOUGHT > 0
  13.         ) AS a;
  14. END$$
  15.  
  16. delimiter ;
Yo le veo ciertos riesgos a la ejecución usando ese tipo de variables.
¿tienes claro que entre esta linea:?
Código MySQL:
Ver original
  1. Precio_entrada * LEAST(@NUM_BOUGHT, Cantidad_entrada) AS expense,
y esta otra:
Código MySQL:
Ver original
  1. @NUM_BOUGHT := @NUM_BOUGHT - LEAST(@NUM_BOUGHT, Cantidad_entrada)
el contenido de de @NUM_BOUGHT puede tener dos valores diferentes, y con eso esta otra líea:
Código MySQL:
Ver original
  1. WHERE Nombre_de_producto= "arroz" AND @NUM_BOUGHT > 0
podría estar realizando la evaluacion del AND en base a un valor diferente al registro anterior?

Esa es una características de las variables de usuario en MySQL: cada asignación, incluso en la misma SELECT, puede cambiar el valor de la variable.

La verdad es que sin probar con datos reales es difícil saber si esa query realmente funciona bien, más allá de que con algunas pruebas los resultados puedan ser correctos. Como dije, si al menos en un caso no da lo que se espera, entonces el SP está mal.


Posdata: Usa los highlight para poner el código. Para eso se pusieron, leer todo eso como texto plano es molesto y confuso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 15/02/2015 a las 09:04