PDA

Ver la Versión Completa : Consulta SQL


sac
22-05-2013, 02:19:34
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:

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
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
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:
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:
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
Para ayudar a alguno que lo necesite a mi me funcionó de ésta manera:

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
SELECT ID, NOMBRE, DIRECCION, POBLACIÓN
FROM CM_CLIENTES
WHERE 1=1

Otro es poner marcas de sustitución en el 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
PepeLolo cómo sustituís me podés dar un ejemplo? xq ese código parece muy bueno
Ejemplo:
En el evento Oncreate del formcSqlCliente := 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
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.