PDA

Ver la Versión Completa : Error de Sintaxis en Sentencia SQL


edwin.simon
10-09-2014, 19:45:57
Hola buena tarde, para todos.
estoy haciendo una pantalla para buscar un registro por tres opciones diferente usando un RadioGroup, todo corre bien pero cuando busco por código no me dice nada y por cédula o nombre me presenta un error de sistnaxi en la clausura From, a continuación como estoy haciendo la busqueda.


procedure TFrm_Consulta.Edit1Change(Sender: TObject);
const
STRSQL = 'Select * From Carnet';
begin
case RadioGroup1.ItemIndex of
0 : begin
Qry_BuscarRegistro.Close;
if (Edit1.Text = '') then begin
Qry_BuscarRegistro.SQL.Text := STRSQL;
end
else begin
Qry_BuscarRegistro.SQL.Text := STRSQL +
' WHERE Codigo_Carnet LIKE ' +QuotedStr('%' +Edit1.Text+ '%');
end;
Qry_BuscarRegistro.Open;
end;
end;
end;
procedure TFrm_Consulta.Edit2Change(Sender: TObject);
const
STRSQL = 'Select * From Carnet';
begin
case RadioGroup1.ItemIndex of
1 : begin
qry_BuscarRegistro.Close;
if (Edit2.Text = '') then begin
Qry_BuscarRegistro.SQL.Text := STRSQL;
end
else begin
Qry_BuscarRegistro.SQL.Text := STRSQL +
'WHERE Codigo_Pasaporte' +QuotedStr('%' +Edit2.Text+ '%');
end;
Qry_BuscarRegistro.Open;
end;
end;
end;

procedure TFrm_Consulta.Edit3Change(Sender: TObject);
const
STRSQL = 'Select * From Carnet';
begin
case RadioGroup1.ItemIndex of
2 : begin
Qry_BuscarRegistro.Close;
if (Edit3.Text = '') then begin
Qry_BuscarRegistro.SQL.Text := STRSQL
end
else begin
Qry_BuscarRegistro.SQL.Text := STRSQL +
'where Nombre like '+QuotedStr('%'+Edit3.Text+ '%');
end;
Qry_BuscarRegistro.Open;
end;
end;

end;

mamcx
10-09-2014, 19:55:54
Inspecciona el valor de Qry_BuscarRegistro.SQL.Text luego de asignarle el sql...

roman
10-09-2014, 20:04:53
En Edit2Change y Edit3Change, a diferencia de Edit1Change, en l clúsula else de la sentencia case no dejas un espacio antes de WHERE.

// Saludos

nlsgarcia
10-09-2014, 20:08:41
roman,


...En Edit2Change y Edit3Change...la sentencia case no dejas un espacio antes de WHERE...

^\||/

Nelson.

roman
10-09-2014, 20:19:51
Por otra parte, te recomiendo:


Usar SQL.Lines para agregar líneas a una consulta en lugar de concatenar con SQL.Text
Evitar al máximo posible armar las consultas al vuelo
Usar parámetros en la consulta
Simplificar


Por ejemplo, aun cuando no conozco el resto del código, parecería que puedes usar el mismo evento OnChange para los tres Edit, además de que te puedes evitar la concatenación de la consuta SQL:


procedure TFrm_Consulta.EditChange(Sender: TObject);
const
STRSQL = 'select * from Carnet where Codigo_Carnet like "%:codigo%"';

begin
case RadioGroup1.ItemIndex of
0:
begin
Qry_BuscarRegistro.Close;
Qry_BuscarRegistro.ParamByName('codigo').AsString := Trim((Sender as TEdit).Text);
Qry_BuscarRegistro.Open;
end;
end;
end;


Si el control de edición (Edit) está vacío, la consulta quedará así:


select * from Carnet where Codigo_Carnet like "%%"


que de todas maneras te dará todos los registros, así que no hace falta dividir en casos.

Fíjate que así, podrías entonces colocar el texto SQL directamente en el componente Query durante el diseño, en lugar de asignarlo en la ejecución, lo que da claridad a tu código.

// Saludos

edwin.simon
10-09-2014, 20:31:13
mil gracias mamcx y roman, todo corre bien pero no me busca nada y he leído la rutina por doto los puntos y no se que pasa