Página 1 de 1

Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Jue Jul 02, 2015 10:13 am
por jasm
Hola

¿Funcionan los procedimientos almacenados de MySQL con TMySQLDataSource? Solo consigo un desesperante mensaje.

Gracias.

Re: Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Jue Jul 02, 2015 5:20 pm
por Rich
jasm, los procedimientos y funciones almacenados funcionan perfectamente tanto en MySQL como en MariaDB, hay dos modos principales para generarlos, el más adecuado es crearlos desde el cliente nativo de ambos RDBMS, el otro es desde Xailer con las clases TMySQLDataSource o TMariaDBDataSource (pueden ser generados desde algun administrador visual tambien), sin embargo para que obtengas el resultado deseado en cualquier caso, debes utilizar la sintaxis correcta.

Espero haberte ayudado.

Re: Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Dom Jul 05, 2015 10:39 am
por jasm
En Xailer 3.0.1

LOCAL aResult := {}
LOCAL cSelect

cSelect := "CALL p_registroCompleto( " + ;
Chr(34) + desde + Chr(34) + ", " + ;
Chr(34) + hasta + Chr(34) + ")"

::conexionMysql:Execute( cSelect, "PA consulta de registro",, @aResult )

Al ejecutar me muestra el siguiente mensaje:
Imagen

Re: Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Dom Jul 05, 2015 5:23 pm
por Rich
jasm, para poderte ayudar con más exactitud, necesitaría saber el contenido de tu procedimiento almacenado, ya que el mensaje de error que obtienes se refiere que MySQL no puede darte un resultado en las condiciones en que haces la llamada, sin embargo, asumo que desde y hasta son variables de memoria y quizás el problema esté en la forma en que estás enviando estos dos valores. Te invito a que visites nuestra pagina http://www.informaticaoverlisa.mx

Re: Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Lun Jul 06, 2015 9:31 am
por jasm
Este es el procedimiento almacenado. Funciona correctamente desde el shell de MySQL y desde SQLYog.

Código: Seleccionar todo

DELIMITER $$

USE `cerberos`$$

CREATE PROCEDURE `p_registroPresencia`( fechadesde DATETIME, fechahasta DATETIME)
BEGIN
	SELECT a.id   AS id_registro,
	a.fecha       AS Fecha,
	DATE_FORMAT(Fecha,'%d.%m.%Y %H:%i:%s') AS fechac,
	a.num_tarjeta AS Tarjeta,
	CONCAT(b.apellidos,', ',b.nombre) AS Empleado,
	c.nombre      AS Zona,
	d.id          AS id_incidencia,
	d.nombre      AS Incidencia,
	b.id_foto     AS id_foto,
	e.id_empleado AS id_empleado,
	a.id_zona     AS id_zona,
	e.baja        AS tarjeta_baja,
	a.sello       AS sello,
	a.lector      AS lector,
	a.baja        AS baja,
	a.id_turno    AS id_turno,
	f.nombre      AS turno,
	a.id_codigo   AS id_codigo,
	g.nombre      AS codigo,
	g.inicioturno AS inicioturno,
	g.finturno    AS finturno,
	g.no_computar AS no_computar
	FROM cerberos_registro a
	JOIN cerberos_emptarjeta e ON e.num_tarjeta = a.num_tarjeta
	JOIN cerberos_empleado b ON b.id = e.id_empleado
	JOIN cerberos_zona c ON c.id = a.id_zona
	JOIN cerberos_incidencia d ON d.id = a.incidencia
	JOIN cerberos_turno f ON f.id = a.id_turno
	JOIN cerberos_codigo g ON g.id = a.id_codigo
	WHERE e.baja=0 AND sello BETWEEN fechadesde AND fechahasta AND a.id_codigo != 0 
	ORDER BY tarjeta,fecha;
END$$

DELIMITER ;

Re: Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Lun Jul 06, 2015 9:56 am
por ignacio
Buenos días,

La futura actualización de Xailer soportará para TMySql y TMariaDB operaciones que devuelvan más de un 'result set'. En cualquier caso no sé si esto resolvería tu problema.

Un saludo

Re: Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Lun Jul 06, 2015 11:06 am
por jfgimenez
José Alfonso,

el problema es que los procedimientos almacenados de MySQL pueden devolver múltiples 'recordsets', y eso provoca que cuando lo ejecutas, la conexión se queda 'pillada' hasta que se fuerce la lectura de todos los recordsets y se asegure que no queda nada por leer.

Si te fijas bien, verás que la primera llamada que haces al PA devuelve correctamente el resultado. Pero a partir de ahí, cualquier cosa que hagas con la BD te dará un error. Precísamente porque hay que cerrar la llamada anterior, y eso es lo que no se está haciendo.

En la próxima versión estará solucionado, ya que hay un método para hacer esas lecturas adicionales dando por finalizado el PA.

Re: Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Lun Jul 06, 2015 11:32 am
por jasm
Gracias por las respuestas.

Esperaré a la versión siguiente.

Saludos.

Re: Procedimientos almacenados con MySQL y TMySQLDataSource

Publicado: Lun Jul 06, 2015 5:37 pm
por Rich
jasm, en forma provisional y en tanto nuestros amigos de xailer efectúan esta modificación, te sugiero que resuelvas tu necesidad creando una vista que incluya la información que necesites, pero hazlo en el cliente nativo de MySQL, llamando dicha vista desde TMySQLDataSource ya en tu aplicación.

Espero haberte ayudado.