Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   "ADOQUERY3: Parameter 'p' not found" error (POR FAVOR AYUDA) (https://www.clubdelphi.com/foros/showthread.php?t=67510)

JuanchoDev 20-04-2010 21:22:56

"ADOQUERY3: Parameter 'p' not found" error (POR FAVOR AYUDA)
 
Estoy tratando de modificar una base en access y siempre me da este error"ADOQUERY3: Parameter 'p' not found" error
Cualquier ayuda la agradecercia enormemente...espero que me puedan dar una mano

procedure TForm3.Modificar1Click(Sender: TObject);
var cons1, cons2, cons3:string;

begin
if edit2.Text = edit9.Text then
begin
adoquery2.Close;
adoquery2.SQL.Text:='select id from colaboradores where usuario= ::p';
adoquery2.Parameters.ParamByName('p').Value:=edit1.Text;
adoquery2.Open;

adoquery3.Close;

//estos los comente porque me recomendaron usar .sql.add(blablabla) de ultima lo vuelvo a poner asi...

//cons1:='select colaboradores.id, colaboradores.usuario, colaboradores.password, colaboradores.nombre, colaboradores.apellido,
colaboradores.direccion, colaboradores.telefono, colaboradores.email, colaboradores.web, colaboradores.rol, colaboradores.fecha
';
//cons2:='from colaboradores, roles ';
//cons3:='where colaboradores.rol=roles.id and colaboradores.id= ::p';
adoquery3.SQL.Add('select colaboradores.id, colaboradores.usuario, colaboradores.password, colaboradores.nombre,
colaboradores.apellido, colaboradores.direccion, colaboradores.telefono, colaboradores.email, colaboradores.web,
colaboradores.rol, colaboradores.fecha ');



adoquery3.SQL.Add('from colaboradores, roles ');
adoquery3.SQL.Add('where colaboradores.rol=roles.id and colaboradores.id= ::p') ;
adoquery3.SQl.Text:=adoquery3.Parameters.ParseSQL(adoquery3.SQL.Text,true);
//adoquery3.SQL.Text:=cons1+cons2+cons3;
//adoquery3.Parameters.ParseSQL(adoquery3.SQL.Text,true);
adoquery3.Parameters.ParamByName('p').Value:=adoquery2.Fields[0].AsInteger;



//aca se da el error que no encuentra el parametro!!!!!!!!
//si adoquery2.fields[0]. lo pongo como asString pasa lo mismo...ademas el error seria distinto me imagino
//puse ::p porque el foro no me permite imagenes pero es con un solo ":"

adoquery3.Open;
adoquery3.Edit;
adoquery3.Fields[1].AsString:=edit1.Text;
adoquery3.Fields[2].AsString:=edit2.Text;
adoquery3.Fields[3].AsString:=edit3.Text;
adoquery3.Fields[4].AsString:=edit4.Text;
adoquery3.Fields[5].AsString:=edit5.Text;
adoquery3.Fields[6].AsString:=edit6.Text;
adoquery3.Fields[7].AsString:=edit7.Text;
adoquery3.Fields[8].AsString:=edit8.Text;
//averiguo el rol
adoquery4.Close;
adoquery4.SQL.Text:='select id from roles where rol= ::p';
adoquery4.Parameters.ParamByName('p').Value:=combobox1.Text ;
adoquery4.Open;
adoquery3.Fields[9].AsInteger:=adoquery4.Fields[10].AsInteger;
adoquery3.Fields[10].AsString:=edit10.Text;
adoquery3.Post;
showmessage('Registro modificado exitosamente!');
adoquery3.Close;
end
else
showmessage('Las Contraseñas no fueron confirmadas correctamente, deben ser iguales');

end;

Caral 20-04-2010 21:39:17

Hola
Esta es la parte que da el error?
Código Delphi [-]
adoquery3.SQL.Add('select colaboradores.id, colaboradores.usuario, colaboradores.password, colaboradores.nombre, 
colaboradores.apellido, colaboradores.direccion, colaboradores.telefono, colaboradores.email, colaboradores.web, 
colaboradores.rol, colaboradores.fecha ');

adoquery3.SQL.Add('from colaboradores, roles ');
adoquery3.SQL.Add('where colaboradores.rol=roles.id and colaboradores.id= :') ;
adoquery3.SQl.Text:=adoquery3.Parameters.ParseSQL(adoquery3.SQL.Text,true);
//adoquery3.SQL.Text:=cons1+cons2+cons3;
//adoquery3.Parameters.ParseSQL(adoquery3.SQL.Text,true);
adoquery3.Parameters.ParamByName('p').Value:=adoquery2.Fields[0].AsInteger;
Saludos

JuanchoDev 20-04-2010 21:47:16

Si
 
exacto, el ":p" (quiero decir :[letra p] no aparece porque lo trunca el foro
adoquery3.SQL.Add('select colaboradores.id, colaboradores.usuario, colaboradores.password, colaboradores.nombre, colaboradores.apellido, colaboradores.direccion, colaboradores.telefono, colaboradores.email, colaboradores.web, colaboradores.rol, colaboradores.fecha ');
adoquery3.SQL.Add('from colaboradores, roles ');
adoquery3.SQL.Add('where colaboradores.rol=roles.id and colaboradores.id= :') ;
adoquery3.SQl.Text:=adoquery3.Parameters.ParseSQL(adoquery3.SQL.Text,true);
//adoquery3.SQL.Text:=cons1+cons2+cons3;
//adoquery3.Parameters.ParseSQL(adoquery3.SQL.Text,true);
adoquery3.Parameters.ParamByName('p').Value:=adoquery2.Fields[0].AsInteger;

JuanchoDev 20-04-2010 21:50:33

ademas
 
el parse lo comente porque tiraba list bound out of index

Caral 20-04-2010 21:51:12

Hola
Disculpa, para tratar de entender, que quieres hacer en esta linea, que es la que pretendes?
Código Delphi [-]
adoquery3.SQl.Text:=adoquery3.Parameters.ParseSQL(adoquery3.SQL.Text,true);
Saludos

JuanchoDev 20-04-2010 21:52:19

mentira
 
el parse lo comente por error...por favor me das una mano?...

Caral 20-04-2010 21:55:06

Hola
A ver:
Código Delphi [-]
adoquery3.SQL.Add('select colaboradores.id, colaboradores.usuario, colaboradores.password, colaboradores.nombre, 
colaboradores.apellido, colaboradores.direccion, colaboradores.telefono, colaboradores.email, colaboradores.web, 
colaboradores.rol, colaboradores.fecha ');
adoquery3.SQL.Add('from colaboradores, roles ');
adoquery3.SQL.Add('where colaboradores.rol=roles.id and colaboradores.id= :A');
adoquery3.Parameters[0].Value:= adoquery2.Fields[0].AsInteger;
Saludos

JuanchoDev 20-04-2010 21:55:58

era una sugerencia que encontre
 
en el foro de embarcadero...

JuanchoDev 20-04-2010 21:56:41

pero
 
si esa linea no esta...el error sigue dandose

Caral 20-04-2010 21:59:19

Hola
Estamos en lo mismo?.
As probado el ultimo codigo que puse?.
Saludos

JuanchoDev 20-04-2010 22:27:13

Ahora da
 
List Index Out Of Bounds (10)


despues probe cambiar un poco tu codigo y recibo el mismo error
adoquery3.SQL.Add('select colaboradores.id, colaboradores.usuario, colaboradores.password, colaboradores.nombre,colaboradores.apellido, colaboradores.direccion, colaboradores.telefono, colaboradores.email, colaboradores.web,colaboradores.rol, colaboradores.fecha ');
adoquery3.SQL.Add('from colaboradores, roles ');
adoquery3.SQL.Add('where colaboradores.rol=roles.id and colaboradores.id= :A');
adoquery3.Parameters.ParamByName('A').Value:= adoquery2.Fields[0].AsInteger;

JuanchoDev 20-04-2010 23:28:58

quiero decir
 
recibo como error List Index Out Of Bounds (10)

Caral 20-04-2010 23:33:09

Hola
Lo que se me ocurre es que el adoquery2 no este open;
Saludos

JuanchoDev 20-04-2010 23:59:19

Verificado
 
begin
if edit2.Text = edit9.Text then
begin
adoquery2.Close;
adoquery2.SQL.Text:='select id from colaboradores where usuario= :f';
adoquery2.Parameters.ParamByName('f').Value:=edit1.Text;
adoquery2.Open;


alguna otra idea...?

JuanchoDev 21-04-2010 01:35:53

Te doy mil gracias
 
El error estaba en:
adoquery4.Close;
adoquery4.SQL.Text:='select id from roles where rol= :w';
adoquery4.Parameters.ParamByName('w').Value:=combobox1.Text ;
adoquery4.Open;
adoquery3.Fields[9].AsInteger:=adoquery4.Fields[10].AsInteger;

No podia ser adoquery4.Fields[10].AsInteger;
Ya que el adoquery4 solo retorna Fields[0].asinteger...


Ahora para que te de 1 millon de gracias ;-)
Mira lo que me pasa...
En la primer iteracion corre bien y modifica todo
En la segunda modificacion (cuando cambio otro registro) da error "Objeto Parameter mal definido. Se proporciono informacion incompleta o incoherente"

adoquery4.Close;
adoquery4.SQL.Text:='select id from roles where rol=:f';
adoquery4.Parameters.ParamByName('f').Value:=combobox1.Text ;
adoquery4.Open;
adoquery3.Fields[9].AsInteger:=adoquery4.Fields[0].AsInteger ;
adoquery4.Close;
adoquery3.Fields[10].AsString:=edit10.Text;
adoquery3.Post;
showmessage('Registro modificado exitosamente!');
adoquery3.Close;


Como veras tomé la precaución de cerrar el qry4.close

Espero ideas y no te molesto mas!

Caral 21-04-2010 01:55:25

Hola
Puedes colocar el codigo completo para verlo?.
Usa las etiquetas delphi, encierras el codigo entre :
[DELPHI ]aqui [ /DELPHI]
En el centro de estos pones el codigo.
Que base de datos usas?.
Saludos
PD: Si presionas avanzado veras un boton al lado del de sql, es el que pone las etiquetas.

JuanchoDev 21-04-2010 03:16:10

re
 
Uso Access




Código Delphi [-]
 
procedure TForm3.Modificar1Click(Sender: TObject);
var cons1, cons2, cons3:string;

begin
if edit2.Text = edit9.Text then
begin
adoquery2.Close;
adoquery2.SQL.Text:='select id from colaboradores where usuario=:p';
adoquery2.Parameters.ParamByName('p').Value:=edit1.Text;
adoquery2.Open;
adoquery3.Close;
adoquery3.SQL.Add('select colaboradores.id, colaboradores.usuario, colaboradores.password, colaboradores.nombre,colaboradores.apellido, colaboradores.direccion, colaboradores.telefono, colaboradores.email, colaboradores.web,colaboradores.rol, colaboradores.fecha ');
adoquery3.SQL.Add('from colaboradores, roles ');
adoquery3.SQL.Add('where colaboradores.rol=roles.id and colaboradores.id=:a');
adoquery3.Parameters.ParamByName('a').Value:=adoquery2.Fields[0].AsString;
adoquery3.Open;
adoquery3.Edit;
adoquery3.Fields[1].AsString:=edit1.Text;
adoquery3.Fields[2].AsString:=edit2.Text;
adoquery3.Fields[3].AsString:=edit3.Text;
adoquery3.Fields[4].AsString:=edit4.Text;
adoquery3.Fields[5].AsString:=edit5.Text;
adoquery3.Fields[6].AsString:=edit6.Text;
adoquery3.Fields[7].AsString:=edit7.Text;
adoquery3.Fields[8].AsString:=edit8.Text;
//averiguo el rol
adoquery4.Close;
adoquery4.SQL.Text:='select id from roles where rol=:f';
adoquery4.Parameters.ParamByName('f').Value:=combobox1.Text  ;
adoquery4.Open;
adoquery3.Fields[9].AsInteger:=adoquery4.Fields[0].AsInteger ;
adoquery3.Fields[10].AsString:=edit10.Text;
adoquery3.Post;
showmessage('Registro modificado exitosamente!');

end
else
showmessage('Las Contraseñas no fueron confirmadas correctamente, deben ser iguales');

end;

Caral 21-04-2010 03:54:17

Hola
A ver esto:

Código Delphi [-]
procedure TForm3.Modificar1Click(Sender: TObject);
var cons1, cons2, cons3:string;
begin
if edit2.Text = edit9.Text then
begin

adoquery2.Close;
adoquery2.SQL.Text:='select id from colaboradores where usuario= :X';
adoquery2.Parameters[0].Value:= edit1.Text;
adoquery2.Open;

adoquery3.Close;
adoquery3.SQL.Add('select colaboradores.id, colaboradores.usuario, colaboradores.password, colaboradores.nombre,colaboradores.apellido, colaboradores.direccion, colaboradores.telefono, colaboradores.email, colaboradores.web,colaboradores.rol, colaboradores.fecha ');
adoquery3.SQL.Add('from colaboradores, roles ');
adoquery3.SQL.Add('where colaboradores.rol=roles.id and colaboradores.id=:a');
adoquery3.Parameters[0].Value:= adoquery2.Fields[0].AsString;
adoquery3.Open;

//averiguo el rol
adoquery4.Close;
adoquery4.SQL.Text:='select id from roles where rol= :B';
adoquery4.Parameters[0].Value:= combobox1.Text  ;
adoquery4.Open;

adoquery3.Edit;
adoquery3.Fields[9].AsInteger:= adoquery4.Fields[0].AsInteger ;
adoquery3.Fields[10].AsString:= edit10.Text;
adoquery3.Fields[1].AsString:= edit1.Text;
adoquery3.Fields[2].AsString:= edit2.Text;
adoquery3.Fields[3].AsString:= edit3.Text;
adoquery3.Fields[4].AsString:= edit4.Text;
adoquery3.Fields[5].AsString:= edit5.Text;
adoquery3.Fields[6].AsString:= edit6.Text;
adoquery3.Fields[7].AsString:= edit7.Text;
adoquery3.Fields[8].AsString:= edit8.Text;
adoquery3.Post;
showmessage('Registro modificado exitosamente!');

end
else
showmessage('Las Contraseñas no fueron confirmadas correctamente, deben ser iguales');

end;
Saludos

JuanchoDev 21-04-2010 04:21:36

mismo error
 
che te agradezco la buena onda...

Caral 21-04-2010 04:54:28

Hola
Creo entender que la primera vez modifica y hace todo bien, pero la segunda vez que tratas de modificar da el error.
Si es asi es por el uso de ADD en el query3 ya que no se limpia la consulta, por eso me gusta usar mas text.
Veamos esta vez a ver que pasa:
Código Delphi [-]
procedure TForm3.Modificar1Click(Sender: TObject);
var cons1, cons2, cons3:string;
begin
if edit2.Text = edit9.Text then
begin
adoquery2.Close;
adoquery2.SQL.Text:='select id from colaboradores where usuario= :X';
adoquery2.Parameters[0].Value:= edit1.Text;
adoquery2.Open;

adoquery3.Close;
adoquery3.SQL.Text:= 'select colaboradores.id, colaboradores.usuario,'+
             'colaboradores.password, colaboradores.nombre,colaboradores.apellido,'+
             'colaboradores.direccion, colaboradores.telefono, colaboradores.email,'+
             'colaboradores.web,colaboradores.rol, colaboradores.fecha '+
             'from colaboradores, roles where colaboradores.rol = roles.id and colaboradores.id = :A';
adoquery3.Parameters[0].Value:= adoquery2.Fields[0].AsString;
adoquery3.Open;

//averiguo el rol
adoquery4.Close;
adoquery4.SQL.Text:='select id from roles where rol= :B';
adoquery4.Parameters[0].Value:= combobox1.Text  ;
adoquery4.Open;

adoquery3.Edit;
adoquery3.Fields[9].AsInteger:= adoquery4.Fields[0].AsInteger ;
adoquery3.Fields[10].AsString:= edit10.Text;
adoquery3.Fields[1].AsString:= edit1.Text;
adoquery3.Fields[2].AsString:= edit2.Text;
adoquery3.Fields[3].AsString:= edit3.Text;
adoquery3.Fields[4].AsString:= edit4.Text;
adoquery3.Fields[5].AsString:= edit5.Text;
adoquery3.Fields[6].AsString:= edit6.Text;
adoquery3.Fields[7].AsString:= edit7.Text;
adoquery3.Fields[8].AsString:= edit8.Text;
adoquery3.Post;
showmessage('Registro modificado exitosamente!');

end
else
showmessage('Las Contraseñas no fueron confirmadas correctamente, deben ser iguales');

end;
Si no sale, coloca aqui el programa completo con la base de datos, en un zip, sin el exe y lo reviso.
Saludos


La franja horaria es GMT +2. Ahora son las 20:35:05.

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