PDA

Ver la Versión Completa : select de media no funciona con ado


juangabriel1786
10-12-2008, 20:58:12
Estoy realizando un select con MySql 5.0 y delphi 7 , tengo una base de datos con una tabla paciente donde se registra el codigo _ paciente, nombre,apellidos,fecha_creacion,etc, este select me lo dieron en un hilo que yo hice pero tengo problema cuando preparo el ado query,antes de ejecutarlo berifico que todo este bien como la propiedad de parametros de query y todo esos detallitos

select count(*)/datediff(date_add(:n1, interval 1 day), :n2) as Media
from paciente p
where p.fcreacion between :n1 and :n2

en un ado query me trae como valor 0 y en EMS SQL MANAGER ejecuto el mismo select y me trae resultados correctos, pero cuando lo ejecuto en delphi el ado query me trae como resultado 0

ContraVeneno
10-12-2008, 21:03:42
Con ADO no he podido establecer el mismo parámetro en dos puntos, es decir, a cada parámetro le tengo que dar otro nombre. Igual y va por ahí el problema. En lugar de tener :n1 en el select y :n1 en el where, pon un nombre diferente para cada parámetro.

Igual y yo tampoco supe como solucionar ese pequeño detalle. Con BDE lo podía realizar sin problemas, pero con ADO no pude. Si alguien sabe, que nos diga. :D

juangabriel1786
11-12-2008, 12:40:34
Registrado: May 2005
Ubicación: Torreón, México
Posts: 3.639
Con ADO no he podido establecer el mismo parámetro en dos puntos, es decir, a cada parámetro le tengo que dar otro nombre. Igual y va por ahí el problema. En lugar de tener :n1 en el select y :n1 en el where, pon un nombre diferente para cada parámetro.

Igual y yo tampoco supe como solucionar ese pequeño detalle. Con BDE lo podía realizar sin problemas, pero con ADO no pude. Si alguien sabe, que nos diga.

Graias por tu comentario realmente resolvio mi problema.

ContraVeneno
09-03-2009, 17:11:51
Tal vez a alguien le interese:

Para tener un parámetro con el mismo valor y que ADO no se haga pelotas con los nombres, se puede optar por declarar variables en la consulta SQL.

Una consulta normal:

with UnADOQuery do begin
...
SQL.Add('Select UnCampo');
SQL.Add('From UnaTabla');
SQL.Add('Where Nombre = :Nombre');
SQL.Add('or SegundoNombre = :Nombre');
...
Parameters.ParambyName('Nombre').value := edtNombre.text;
...


generaría errores con los nombres de los parámetros, ya que, a diferencia de BDE, no se puede tener establecido varias veces el mismo parámetro.

Por lo que se tendría que hacer algo como:

with UnADOQuery do begin
...
SQL.Add('Select UnCampo');
SQL.Add('From UnaTabla');
SQL.Add('Where Nombre = :Nombre');
SQL.Add('or SegundoNombre = :Nombre2');
...
Parameters.ParambyName('Nombre').value := edtNombre.text;
Parameters.ParambyName('Nombre2').value := edtNombre.text;
...


Tal vez en el ejemplo no se note mucho, ya que solo se usa dos veces. Pero cuando tenemos que usar el mismo valor 5 o 6 veces, ya se empieza a hacer tedioso.

La opción que me ha funcionado con ADO y SQL Server, es declarar las variables en la consulta SQL:


with UnADOQuery do begin
...
SQL.Add('Declare @Nombre as varchar(20)');
SQL.Add('Select @Nombre = :Nombre');
SQL.Add('Select UnCampo');
SQL.Add('From UnaTabla');
SQL.Add('Where Nombre = @Nombre');
SQL.Add('or SegundoNombre = @Nombre');
...
Parameters.ParambyName('Nombre').value := edtNombre.text;
...


Y con eso se puede usar el mismo parámetro tantas veces sea necesario, ya que realmente solo se pasa una sola vez el parámetro.

P.D. Aunque si tu consulta se empieza a complicar y necesitas mas parámetros, convendría utilizar un procedimiento almacenado.