Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   aplicar clausula distinct a un solo campo de una tabla. (https://www.clubdelphi.com/foros/showthread.php?t=88146)

sorianolloret 18-04-2015 04:07:55

aplicar clausula distinct a un solo campo de una tabla.
 
Buenas, tengo la siguiente consulta:
Código Delphi [-]
adoqueryresultadoparcial.SQL.Add('select distinct año, idcondiciones, dni from tbcalendario 
where idcondiciones='+adodatasetresultadoparcial.FieldByName('idcondiciones').asstring+' 
and dni='+'"'+adodatasetresultadoparcial.FieldByName('dni').AsString+'"');
//showmessage(adoqueryresultadoparcial.SQL.Text);
pero necesitaría también delimitar la tabla con el campo fecha mayor o igual que un datetimepickerdesde.date y menor o igual que un datetimepickerhasta. pero si incluyo el campo fecha en la consulta sql no funciona.
¿Cómo se podría aplicar la clausula distinct solo al año, para asi poder delimitar las fechas. ya que las condiciones, dni son únicos.
esta consulta funciona pero no puedo delimitarla por fechas. Me interesaría saberlo usando parámetros y usando directamente los datetimepicker.date.

AgustinOrtu 18-04-2015 04:44:52

Que tal sorianolloret

Una consulta SQL parametrizada desde Delphi, es mas o menos asi


Código Delphi [-]
  with TADOQuery.Create(NIL) do
  begin
    // Connection := Acordate de asignar tu componente de ADOConnection!
    SQL.Text := ' SELECT DISTINCT Anio, IdCondiciones, DNI FROM tbcalendario WHERE ' +
                      ' (IdCondiciones = :Condiciones) AND (DNI = :DNI) ';

    with Parameters do
    begin
      // Aca asignas valor a los parametros. Podes usar variables, costantes, un valor de un campo..      
      ParamByName('Condiciones').Value := adodatasetresultadoparcial.FieldByName('IdCondiciones').AsString:
      ParamByName('DNI').Value := adodatasetresultadoparcial.FieldByName('DNI').AsString;  
    end;

    Open; 
  end;

Definir un parametro en una consulta SQL es tan sencillo como anteponer dos puntos a un identificador que será el nombre del parametro que se usa mas adelante para darle valor

En el ejemplo, :Condiciones es uno de los parametros, :DNI es el otro

Notese que nada tiene que ver el nombre del parametro con el nombre del campo

Una de las grandes ventajas de los parametros es que no hay que andar preocupandose por convertir o adaptar los valores de las consultas para que no den error (siempre pasa con los tipos "raros" como fechas, moneda, etc) todo ese trabajo se encarga el motor, uno simplemente suministra una fecha como parametro y el motor se encargará de darle el formato adecuado

Siguiendo con el ejemplo, para filtrar la consulta usando fechas seria algo como esto:

Código Delphi [-]
  with TADOQuery.Create(NIL) do
  begin
    // Connection := Acordate de asignar tu componente de ADOConnection!
    SQL.Text := ' SELECT DISTINCT Anio, IdCondiciones, DNI FROM tbcalendario WHERE ' +
                      ' (IdCondiciones = :Condiciones) AND (DNI = :DNI) ' + 
                      ' AND Fecha BETWEEN :Desde AND :Hasta ';

    with Parameters do
    begin
      // Aca asignas valor a los parametros. Podes usar variables, costantes, un valor de un campo..      
      ParamByName('Condiciones').Value := adodatasetresultadoparcial.FieldByName('IdCondiciones').AsString:
      ParamByName('DNI').Value := adodatasetresultadoparcial.FieldByName('DNI').AsString;  
      ParamByName('Desde').Value := DateTimePickerDesde.Date;
      ParamByName('Hasta ').Value := DateTimePickerHasta .Date;
    end;

    Open; 
  end;

Espero te sirva, saludos

sorianolloret 18-04-2015 05:32:19

Pero no incluye el campo fecha en el Select, no puede buscar los parámetros desde y hasta. es asi?

Casimiro Notevi 18-04-2015 13:28:29

Cita:

Empezado por sorianolloret (Mensaje 491492)
adoqueryresultadoparcial.SQL.Add('select distinct año, idcondiciones, dni from tbcalendario where idcondiciones='+adodatasetresultadoparcial.FieldByName('idcondiciones').asstring+' and dni='+'"'+adodatasetresultadoparcial.FieldByName('dni').AsString+'"');
//showmessage(adoqueryresultadoparcial.SQL.Text);

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

fjcg02 18-04-2015 15:00:00

Cita:

Empezado por sorianolloret (Mensaje 491495)
Pero no incluye el campo fecha en el Select, no puede buscar los parámetros desde y hasta. es asi?

No, no es así.

Puedes utilizar el campo fecha para delimitar la consulta utilizándolo en la clausura WHERE y no mostrarlo en la misma.

Espero haberte aclarado algo más este asunto.

Saludos


La franja horaria es GMT +2. Ahora son las 00:45:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi