Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta SQL (https://www.clubdelphi.com/foros/showthread.php?t=83206)

sac 22-05-2013 02:19:34

Consulta SQL
 
Hola tengo una duda que para ustedes debe ser fácil resolver.
Tengo una base de datos con campos como nombre, edad, Lugar y un campo boolean.
en el SQL detallo: Select * From Gente Where Nombre = :dato Order By Nombre.

Como puedo hacer para cambiar "ese where" y consultar por edad lugar order etc?
Hay que filtrar? como se hace porque de sql no se tanto
Gracias.

ecfisa 22-05-2013 02:51:29

Hola sac.

Si entendí bién lo que queres hacer, podrías hacer:
Código SQL [-]
SELECT *
FROM GENTE
WHERE NOMBRE = :PNOMBRE OR EDAD =:PEDAD OR LUGAR = :PLUGAR /* OR ... */
ORDER BY NOMBRE, EDAD, LUGAR /*, ...*/

Saludos. :)

Neftali [Germán.Estévez] 22-05-2013 13:32:41

Cita:

Empezado por sac (Mensaje 460900)
Como puedo hacer para cambiar "ese where" y consultar por edad lugar order etc?

Para saber qué es lo que hay que cambiare, rimero hay que saber qué hace cada cosa...

SELECT => Sirve para modificar los campos o datos de consulta.
WHERE => Sirve para definir (según los datos anteriores) qué registros de la tabla quieres recuperar.
ORDER => De los datos que se muestran, en qué orden los quieres.

Si quieres ver los mismos campos, pero con otros datos, deberás cambiar el WHERE (que es lo que yo he entendido)

sac 22-05-2013 15:06:18

No anda
 
Ecfisa eso es lo que quisiera escribir pero no me lo toma
y parece poco eficiente tener 30 sql uno por cada campo que quisiera consultar.
que puede estar fallando porque es casi literal tu código al que pensé y escribi.

marcoszorrilla 22-05-2013 15:22:27

Yo hago lo siguiente, un formulario con un Radiogroup para capturar lo que quiere el usuario:
Código Delphi [-]
procedure TfrDlgProductos.spbConsultaClick(Sender: TObject);
begin
  Case RdgProductos.ItemIndex of
  0:cListado:='Productos en Venta entre '  +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date);
  1:cListado:='Productos Reservados entre '+DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date);
  2:cListado:='Productos Vendidos entre '  +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date);
  3:cListado:='Productos Devueltos entre ' +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date);   
  4:cListado:='Productos en Venta entre '  +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date)+' de '+DmProveedores.IBDtsProvNOMBRE.Value;
  5:cListado:='Productos Reservados entre '+DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date)+' de '+DmProveedores.IBDtsProvNOMBRE.Value;
  6:cListado:='Productos Vendidos entre '  +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date)+' de '+DmProveedores.IBDtsProvNOMBRE.Value;
  7:cListado:='Productos Devueltos entre ' +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date)+' de '+DmProveedores.IBDtsProvNOMBRE.Value;
  8:cListado:='Productos en venta que han superado la fecha tope.';
  end;

Application.CreateForm(TfrConProductos, frConProductos);
frConProductos.ShowModal;
end;

Y luego en el formulario de consulta armo el SQL, según la opción seleccionada:
Código Delphi [-]
procedure TfrConProductos.FormActivate(Sender: TObject);
var
Sql1,Sql2:String;
begin
frConProductos.Caption:=cListado;

sql1:='select p.numero, p.codigo, p.descripcion, p.pvp, p.fventa, p.estado, P.pfinal,P.observaciones,'+
' R.numero, R.fentrega, R.codProveedor, R.Ftope, R.observaciones'+
' from productos P, Recepcion as R'+
' where P.numero = R.numero And Fentrega Between :F1 And :F2';

DmProveedores.IBDtsConProd.Close;
DmProveedores.IBDtsConProd.SelectSql.Clear;

  Case frDlgProductos.RdgProductos.ItemIndex of
  0:sql2:=' And Estado = 1';
  1:sql2:=' And Estado = 2';
  2:sql2:=' And Estado = 3';
  3:sql2:=' And Estado = 4';
  4:sql2:=' And Estado = 1 And CodProveedor = '+DmProveedores.IBDtsProvCODIGO.Value;
  5:sql2:=' And Estado = 2 And CodProveedor = '+DmProveedores.IBDtsProvCODIGO.Value;
  6:sql2:=' And Estado = 3 And CodProveedor = '+DmProveedores.IBDtsProvCODIGO.Value;
  7:sql2:=' And Estado = 4 And CodProveedor = '+DmProveedores.IBDtsProvCODIGO.Value;
  8:sql2:=' And Estado = 1 And fEntrega > :F3 ';
  end;

  if frDlgProductos.RdgProductos.ItemIndex < 8 then
  begin
  DmProveedores.IBDtsConProd.SelectSql.Text:=Sql1+sql2;
  DmProveedores.IBDtsConProd.ParamByName('F1').AsDate:=frDlgProductos.DtpkIni.Date;
  DmProveedores.IBDtsConProd.ParamByName('F2').AsDate:=frDlgProductos.DtpkFin.Date;
  end
  else
  begin
  sql1:='select p.numero, p.codigo, p.descripcion, p.pvp, p.fventa, p.estado, P.pfinal,P.observaciones,'+
' R.numero, R.fentrega, R.codProveedor, R.Ftope, R.observaciones'+
' from productos P, Recepcion as R'+
' where P.numero = R.numero And Ftope < :F3 ';
  DmProveedores.IBDtsConProd.SelectSql.Text:=Sql1;
  DmProveedores.IBDtsConProd.ParamByName('F3').AsDate:=Date;
  end;

DmProveedores.IBDtsConProd.Open;

DmProveedores.IBDtsConProd.Last;
lbRegistros.Caption:='Número de registros:'+FormatFloat(',0',DmProveedores.IBDtsConProd.RecordCount);
end;

Un Saludo

sac 23-05-2013 20:02:12

Así Funciona
 
Para ayudar a alguno que lo necesite a mi me funcionó de ésta manera:
Código Delphi [-]
Query1.close;   
Query1.sql.clear;   
Query1.SQL.Add('Select ...');   
Query1.SQL.Add('From ....'); //Luego anidé un if con mis 4 posibles consultas por campo cambiando el where y order   
if variable1 then 
begin 
  query1.sql.add('where Edad = :Pedad');  
  query1.sql.add('order by Nombre');   
end 
else //y Saliendo del if  
  Query1.Open; 
  DBGrid1.DataSource:=DS_...;  
end;
También podría haber usado un case en lugar del if
Espero que se haya entendido pero de ésta manera me funcionó

oscarac 24-05-2013 05:00:07

claro sac
lo mas recomendable en esos caso es ir armando una cadena segun los requerimientos y/o parametros de la aplicacion
bien hecho

PepeLolo 26-05-2013 00:38:21

Yo en estos casos lo que hago es lo siguiente:
Siempre construyo las consultas con el siguiente truco en el WHERE
Código SQL [-]
SELECT ID, NOMBRE, DIRECCION, POBLACIÓN
FROM CM_CLIENTES 
WHERE 1=1

Otro es poner marcas de sustitución en el SQL:
Código SQL [-]
SELECT ID, NOMBRE, DIRECCIÓN, POBLACIÓN
/* SELECT */ 
FROM CM_CLIENTES
/* FROM */
WHERE 1=1
/* WHERE */
/*ORDER BY*/

Cada una de estas marcas o comentarios los sustituyo por lo que corresponda en función de lo que haya seleccionado el usuario.

En mi caso todas las SQL de las aplicaciones están en BBDD y se leen y cargan donde y cuándo son requeridas.

sac 31-05-2013 13:49:27

PepeLolo cómo sustituís me podés dar un ejemplo? xq ese código parece muy bueno

PepeLolo 02-06-2013 01:03:01

Cita:

Empezado por sac (Mensaje 461565)
PepeLolo cómo sustituís me podés dar un ejemplo? xq ese código parece muy bueno

Ejemplo:
En el evento Oncreate del form
Código Delphi [-]
cSqlCliente := sqlCliente.SQL.Text
lo que se hace es reservar la SQL original

Luego donde corresponda se sustituyen las marcas, yo siempre lo hago en el evento BeforeOpen de los componentes de datos
Código Delphi [-]
var cWhere, cSql :String;
Begin
   cWhere := '';
   cSql:= cSqlCliente;
   If eProvincia.txt <> '' Then cWhere := cWhere + 'AND Provincia  Like  ' + Quotedstr(eProvincia.txt) + FF;
   If eMunicipio.txt <> '' Then cWhere := cWhere +  'AND Municipio  Like  ' + Quotedstr(eMunicipio.txt) + FF
    cSql := stringReplace(cSql, '/* WHERE */, cWhere, []);
    SqlCliente.Sql.clear;
    SqlCliente.Sql.Text := cSql;
End;

Con ORDER BY, lo mismo.

He puesto un ejemplo basico para que te hagas una idea y lo comprendas. Este modelo lo puedes complicar mucho, hasta convertirlo en completamente dinámico.

En mi caso, no hay una instrucción DML en la aplicación, todas se encuentran almacenadas en la BBDD y se recuperan en función del formulario y componentes de este.


La franja horaria es GMT +2. Ahora son las 10:41:17.

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