PDA

Ver la Versión Completa : ayuda con ADOQuery


Markoz
10-06-2006, 11:16:36
Tengo el siguiente codigo


if (key = #13) then
begin
With dm.QBusArticulo do
begin
Close;
SQL.Clear;

if rgBusArticulo.ItemIndex = 1 then
begin

SQL.Text := 'Select * from tb_Articulos where idArtEan =' + frmBusArticulo.edtBusArticulos.Text;
end
else
begin
SQL.Text := 'Select * from tb_Articulos where Nombre =' + frmBusArticulo.edtBusArticulos.Text ;
end;
Open;
end;
end;


trato de utilizar ADOQuery por que solo quiero realizar consultas a una base de datos la cual no puedo modificar para agregarle Procedimientos Almacenados.

Al correrlo con MSSQL me dice que el nombre de la columna no existe, y dicho nombre es lo que envio en el parametro frmBusArticulo.edtBusArticulos.Text ;

si alguien tiene algun ejemplo de uso de ADOQuery para consultas SQL se lo agradeceria

Lepe
10-06-2006, 11:50:19
Con tu permiso modifico el código, creo que falta QuotedStr para encerrar el valor de buscarArticulo.text entre comillas simples. ¿O será que en access son comillas dobles ¿?:confused:


const sqlArticulos = 'Select * from tb_Articulos where %s = %s'
if (key = #13) then
begin
With dm.QBusArticulo do
begin
Close;
// SQL.Clear; En realidad no hace falta, ya que al establecer la propiedad Text
// Se hace un Clear internamente.

if rgBusArticulo.ItemIndex = 1 then
SQL.Text := Format(sqlArticulos, ['idArtEan',
QuotedStr(frmBusArticulo.edtBusArticulos.Text)])
else
SQL.Text := Format(sqlArticulos, ['Nombre',
QuotedStr(frmBusArticulo.edtBusArticulos.Text)]);

Open;
end;
end;


En este caso, estoy suponiendo que idArtEan y Nombre son campos de tipo carácter (string, varchar, etc). Si idArtEan es un campo de tipo entero, no hace falta el QuotedStr.

Si QuotedStr no te funciona, prueba a encerrarlo con comillas dobles.

Si no es mucha molestia me gustaría que comentaras la solución (si se resuelve... claro ;))

Saludos

Markoz
10-06-2006, 18:05:45
Muchas gracias Lepe, sirvio bien, saludos.

Markoz
10-06-2006, 19:13:54
Trate de utilizar el mismo codigo para otra consulta donde manejo fechas

f1 := DateTimeToStr(dFechaInicio.date) ;
f2 := DateTimeToStr(dFechaFinal.date) ;
With dm.QBusKardex do
begin
Close;
SQL.Clear;

sqlKardex:= 'Select * from tb_Kardex where %s = %s AND FechaTransaccion BETWEEN %s AND %s';
//SQL.Text := 'Select * from tb_Articulos where Nombre =' + frmBusArticulo.edtBusArticulos.Text ;

SQL.Text := Format(sqlKardex,
['idArtEan',
QuotedStr(ResArticulo),
QuotedStr(f1),
QuotedStr(f2)]);
Open;


end;


y me regresa el siguiente error "sintax error converting character string to smalldatetime type"

Lepe
11-06-2006, 03:20:26
Las fechas son algo especiales, porque se pueden pasr en varios formatos :
dd/mm/yyyy
mm/dd/yyyy
yyyy/mm/dd

Es mejor que Delphi sea el que busque el formato adecuado para este tipo de datos, así que usamos parámetros:

With dm.QBusKardex do
begin
Close;
SQL.Clear;

sqlKardex:= 'Select * from tb_Kardex where %s = %s AND FechaTransaccion BETWEEN : prFechaInicio AND : prFechaFin';
SQL.Text := Format(sqlKardex,
['idArtEan',
QuotedStr(ResArticulo)]);
// hemos usado la técnica anterior para establecer parte del SQL,
// ahora usamos la otra técnica:
Parambyname('prFechaInicio').AsDatetime := dtFechaInicio.Date;
Parambyname('prFechaFin').AsDatetime := dtFechaFinal.Date;
Open;


En este caso queda algo engorrosa la consulta, pero el nombre de un campo (IdArtEan) no puede pasarse por parámetros. el uso de parámetros en una consulta simple sería:


query1.sql.text := ' SELECT * FROM TABLA WHERE Codigo = : prCodigo AND FECHA BETWEEN : pr1 AND : pr2' ;
query1.Parambyname('pr1').AsDateTime := now;
query1.Parambyname('pr2').AsDateTime := now + 4;
query1.Parambyname('prCodigo').AsInteger := 23;
query1.Open;

Como ves, a todos los parámetros de la consulta le pongo el prefijo "pr" delante, más que nada por claridad para mí. Simplemente con anteponer los dos puntos ":" a cualquier nombre, ya delphi lo interpreta como un parámetro.

Saludos