Título: [Resuelto] Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: pavel.escobar en 7 Marzo 2018, 01:42 am
Hola estoy realizando una pagina en PHP, en la cual tengo una conexion a una base SQL y uso el sqlsrv, todo va bien cuando uso sentencias simples, pero cuando intento recibir datos de un SELECT que se encuentra en un procedimiento almacenado no me genera ningun dato. El codigo de mi proceso almacenado es el siguiente: ================================================== ALTER PROCEDURE [dbo].[comparar_ventas_meses] @f_inicio AS DATE, @f_fin AS DATE, @gestora AS nvarchar(100) AS BEGIN SELECT MONTH(SalesDate) AS mes, SUM(paytotal) AS VENTA_ACT, 0 AS VENTA_ANT INTO #tmpResumen FROM _RetailData..RECEIPT INNER JOIN _RetailData..STORE ON RECEIPT.StoreNo = store.StoreNo WHERE CAST(SalesDate AS DATE) BETWEEN @f_inicio AND @f_fin AND RECEIPT.StatusCode = 'A' AND RECEIPT.SalesCode IN ('S', 'R') AND STORE.ActiveStatus=1 AND STORE.StoreNo IN (SELECT idtienda FROM Administrator..tbgestoras_tienda WHERE idgestora =@gestora) GROUP BY MONTH(SalesDate) UNION ALL SELECT MONTH(SalesDate) AS mes, 0 AS VENTA_ACT, SUM(paytotal) AS VENTA_ANT FROM _RetailData..RECEIPT INNER JOIN _RetailData..STORE ON RECEIPT.StoreNo = store.StoreNo WHERE CAST(SalesDate AS DATE) BETWEEN DATEADD(DD, -365, @f_inicio) AND DATEADD(DD, -365, @f_fin) AND RECEIPT.StatusCode = 'A' AND RECEIPT.SalesCode IN ('S', 'R') AND STORE.ActiveStatus=1 AND STORE.StoreNo IN (SELECT idtienda FROM Administrator..tbgestoras_tienda WHERE idgestora =@gestora) GROUP BY MONTH(SalesDate) SELECT mes, CAST(SUM(venta_act) AS DECIMAL(18,2)) AS actual, CAST(SUM(venta_ant) AS DECIMAL(18,2)) AS anterior, CAST((SUM(venta_act)/SUM(venta_ant) -1) * 100 AS DECIMAL(18,2) AS crecimiento FROM #tmpResumen GROUP BY mes HAVING NOT (SUM(venta_act) = 0 AND SUM(venta_ant) = 0) END
================================================= y mi codigo php es el siguiente: $f_inicial ='01/01/'.(date("Y")); $f_final = date("d/m/Y"); $gestora='pescobar'; $mes=0; $actual=0; $anterior=0; $crecimiento=0; include ("seguro.php"); global $HOSTNAME, $USERNAME, $PASSWORD, $DATABASE; $info = array('Database'=>'Adicional', 'UID'=>$USERNAME, 'PWD'=>$PASSWORD); $conexion = sqlsrv_connect($HOSTNAME, $info); $sql_preg="EXEC comparar_ventas_meses ?, ?, ?"; &$f_inicial, &$f_final, &$gestora); $registros = sqlsrv_prepare( $conexion,$sql_preg, $params); if (sqlsrv_execute($registros)) { while ($id= sqlsrv_fetch_array($registros)) { echo $id['actual']; } } else { }
por favor ayudenme ya que llevo dias buscando en internet y no enucentro ninguna solucion.
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: EFEX en 7 Marzo 2018, 03:46 am
Siempre verifica la conexion con la db ... $conexion = sqlsrv_connect($HOSTNAME, $info); if( $conexion === false) { } $sql_preg="EXEC comparar_ventas_meses ?, ?, ?"; ...
sqlsrv_execute() devuelve TRUE o FALSE, utiliza sqlsrv_query() en su lugar. http://php.net/manual/es/function.sqlsrv-execute.php#refsect1-function.sqlsrv-execute-returnvalues
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: pavel.escobar en 7 Marzo 2018, 17:54 pm
Gracias por responder EFEX ya probe con sqlsrv_query y tambien ya habia visto el manual que me enviaste pero siempre obtengo el mismo resultado o sea nada, no se si hay algo mas en mi codigo que estea mal, te envio el codigo modiicado a sqlsrv_query $f_inicial ='01/01/'.(date("Y")); $f_final = date("d/m/Y"); $gestora='pescobar'; $mes=0; $actual=0; $anterior=0; $crecimiento=0; include ("seguro.php"); global $HOSTNAME, $USERNAME, $PASSWORD, $DATABASE; $info = array('Database'=>'Adicional', 'UID'=>$USERNAME, 'PWD'=>$PASSWORD); $conexion = sqlsrv_connect($HOSTNAME, $info); if( $conexion === false) { } $sql_preg="EXEC comparar_ventas_meses ?, ?, ?"; &$f_inicial, &$f_final, &$gestora); $registros = sqlsrv_query( $conexion,$sql_preg, $params); while ($id= sqlsrv_fetch_array($registros)) { echo $id['actual']; }
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: EFEX en 7 Marzo 2018, 19:19 pm
Los errores de php te los a mostrado antes no ? Fijate en tu archivo php.ini si es correcto el siguiente parametro display_errors = on Algunos cambios, prueba y dime <?php //Solo para asegurar que los errores en php se //muestren, luego borralo ini_set('display_startup_errors', 1); $f_inicial = '01/01/'.(date("Y")); $f_final = date("d/m/Y"); $gestora = 'pescobar'; $mes = 0; $actual = 0; $anterior = 0; $crecimiento = 0; include("seguro.php"); global $HOSTNAME, $USERNAME, $PASSWORD, $DATABASE; $info = array('Database' => 'Adicional', 'UID' => $USERNAME, 'PWD' => $PASSWORD); $conexion = sqlsrv_connect($HOSTNAME, $info); if ($conexion === false) { } //Segun varios ejemplos con mssql para SP //vi que utilizan 'call' $sql_preg = "{CALL comparar_ventas_meses(?, ?, ?)}"; //Tambien siguiendo varios ejemplos utilizan //arrays multimensional para definir //parametros conjunto a una constante en //este caso SQLSRV_PARAM_IN array( $f_inicial, SQLSRV_PARAM_IN ); array( $f_final, SQLSRV_PARAM_IN ); array( $gestora, SQLSRV_PARAM_IN ); ); $registros = sqlsrv_query($conexion, $sql_preg, $params); //No se pudo realizar la consulta, boom error if( $registros === false) { } //Mostrar todo lo que devuelve la consulta //sola para ver que devuelve echo '<pre>'; echo '</pre>'; while ($id = sqlsrv_fetch_array($registros)) { echo $id['actual']; }
Si no voy a tratar de montar una maquina virtual para ver si es correcto, no tengo como probar el codigo.
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: pavel.escobar en 7 Marzo 2018, 23:32 pm
ingrese el código que me mandaste y todo pasa normal se imprime el siguiente dato en pantalla: Resource id #6 pero no sale ningun dato mas el resultado que te digo sale cuando se ejecuta el codigo echo '<pre>'; echo '</pre>';
pero de ahi no sale mas datos
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: EFEX en 8 Marzo 2018, 00:55 am
Haber si esto lo resuelve ... while ($id = sqlsrv_fetch_array($registros, SQLSRV_FETCH_ASSOC)) { echo '<pre>'; echo '</pre>' } ...
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: pavel.escobar en 8 Marzo 2018, 02:29 am
tampoco imprime nada, intente imprimiendo algo como echo "imprime hasta aca"; en el while como se muestra en este código pero ni eso imprime, o sea no esta funcionando el while while ($id = sqlsrv_fetch_array($registros, SQLSRV_FETCH_ASSOC)) { echo 'imprime hasta aca'; echo '<pre>'; echo '</pre>';
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: EFEX en 8 Marzo 2018, 03:14 am
Estoy empezando a dudar si la db esta vacia ja. Haber la conexion lo establece y parece ser que tambien realiza la consulta, lo que dudo es que no devuelve nada por que este vacia ?. $rows = sqlsrv_has_rows( $registros ); //Vemos si existen filas.. if ($rows === true) { //Existen? cuantas? echo 'Cant: ' . sqlsrv_num_rows( $registros ) . '</br>'; }else{ echo 'No existen datos </br>'. } while ($id = sqlsrv_fetch_array($registros, SQLSRV_FETCH_ASSOC)) { echo '<pre>'; echo '</pre>'; }
Probaste el SP sobre MSSQL no ? te devuelve la lista de filas no? Que version de PHP y MSSQL estas.
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: pavel.escobar en 8 Marzo 2018, 03:23 am
>:( la base si tiene datos.
cuando ejecuto una sentencia simple "un SELECT * FROM TABLA", si tengo resultados, el problema que tengo es solo cuando uso Procesos almacenados, si ves el proceso almacenado se juntan unas tablas creando una tabla temporal y después sacando los datos de la tabla temporal, intente instalar el MSSQL en el servidor pero me sale errores en cambio con el SQLSRV no tengo problemas
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: EFEX en 8 Marzo 2018, 04:16 am
Si entiendo lo que dices, solo llamar a un SP no devuelve nada. Estuve toda la tarde pensando, se me hace dificl no poder montar una vm para probar. Otra cosa el proceso almacenado(SP) veo que tiene un solo UNION de tres SELECT, devuelve dos tablas, quizas eso sea, tambien agrege los '&' en los parametros por que me habia olvidado.. este es el codigo completo, pruebalo.. ini_set('display_startup_errors', 1); $f_inicial = '01/01/'.(date("Y")); $f_final = date("d/m/Y"); $gestora = 'pescobar'; $mes = 0; $actual = 0; $anterior = 0; $crecimiento = 0; include("seguro.php"); global $HOSTNAME, $USERNAME, $PASSWORD, $DATABASE; $info = array('Database' => 'Adicional', 'UID' => $USERNAME, 'PWD' => $PASSWORD); $conexion = sqlsrv_connect($HOSTNAME, $info); if ($conexion === false) { } $sql_preg = "{CALL comparar_ventas_meses(?, ?, ?)}"; array( &$f_inicial, SQLSRV_PARAM_IN ); array( &$f_final, SQLSRV_PARAM_IN ); array( &$gestora, SQLSRV_PARAM_IN ); ); $registros = sqlsrv_query($conexion, $sql_preg, $params); if( $registros === false) { } $rows = sqlsrv_has_rows( $registros ); //Vemos si existen filas.. if ($rows === true) { //Existen? cuantas? echo 'Cant: ' . sqlsrv_num_rows( $registros ) . '</br>'; }else{ echo 'No existen datos </br>'. } /* while ($id = sqlsrv_fetch_array($registros, SQLSRV_FETCH_ASSOC)) { echo '<pre>'; print_r($id); echo '</pre>'; } */ //Quizas esta sea la mejor forma para un SP do { while ($row = sqlsrv_fetch_array($registros)) { echo '<pre>'; echo '</pre>'; } } while (sqlsrv_next_result($registros)); //Siguiente tabla
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: pavel.escobar en 8 Marzo 2018, 05:47 am
;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)
perecto, tenias toda la razón la diferencia en el PHP cuando usas un proceso almacenado toma como datos todas las partes del proceso, al crear una tabla temporal el PHP lo toma como un resultado y sale en blanco por que no genera respuesta y en la siguiente parte del proceso recién envia los datos de la tabla temporal y ahí si genera un resultado por eso cuando pusiste el otro while si nos da resultados, eres un capo, que gran nivel el tuyo, nuevamente gracias.
;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-) ;-)
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: EFEX en 8 Marzo 2018, 06:15 am
Buenisimo que se solucione ;D. saludos
Título: Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
Publicado por: xjorge14x en 19 Junio 2018, 23:02 pm
tuve el mismo problema.
utiliza: set nocount on (al principio del procedimiento) y set nocount off ( antes de el SELECT que envía los datos.)
|