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)
-   -   Ayuda Con Consulta (https://www.clubdelphi.com/foros/showthread.php?t=33671)

enecumene 13-07-2006 17:22:17

Ayuda Con Consulta
 
hola A TODOS, sucede lo siguiente, este es mi codigo:
Código Delphi [-]
procedure TAlquiler.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
  begin
qryCliente.Close;
qryCliente.SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellido_cliente FROM tbClientes ');
qryCliente.SQL.Add('WHERE telefono1_cliente = :telefono');
qryCliente.Parameters.ParamByName('telefono').Value:=strtoInt(MaskEdit1.Text);
qryCliente.Open;
if not qryCliente.IsEmpty then
   DBText1.Caption:=qryClientenombre_cliente.Value+' '+qryClienteapellidos_cliente.Value;
  end;
end;


el campo telefono1_cliente es un campo de texto tipo 809-555-5555, pues cuando corro la aplicacion y digito el telefono para llamar al cliente 809-555-5555 me sale el siguiente error: "809-555-5555 is not a valid integer value" esta claro que no es un valor numerico esto esta en :
Código Delphi [-]
qryCliente.Parameters.ParamByName('telefono').Value:=strtoInt(MaskEdit1.Text);


cual es el valor que debo poner en vez de StrtoInt he intentado con varios y no doy con el. para que tengas una idea de todo lo que tengo en mi form:

1 - adoquery (deberia tenerlo? o no es necesario?, debe estar en false?)
1 - datasource
1 - maskedit (clientes)
1 - edit (peliculas)
1 - base de datos MS ACCESS
3 - tablas (tbClientes, tbPeliculas, tbPeliculasAlquilada)
1 - dbgrid
2 - speedbuttons (para hacer busquedas de clientes y peliculas tipo ... )
3 - dbedit (donde se mostraran los totales del alquiler, subtotal, iva y total)
2 - dbtext (donde se mostraran el nombre de la pelicula y el cliente)
2 - checkbox (donde se indicara si el cliente paga en efectivo o credito)
4 - buttons (cobrar, anular, cancelar y cerrar)

gracias

kuan-yiu 13-07-2006 17:32:01

¿Si telefono1_cliente es un campo de texto por qué le envías un integer? Deberías enviarle un string.
Código Delphi [-]
qryCliente.Parameters.ParamByName('telefono').AsString:=MaskEdit1.Text;

roman 13-07-2006 17:34:41

¿Y si no pones nada?

Código Delphi [-]
qryCliente.Parameters.ParamByName('telefono').Value:=MaskEdit1.Text;

// Saludos

roman 13-07-2006 17:36:20

Cita:

Empezado por kuan-yiu
Código Delphi [-]
qryCliente.Parameters.ParamByName('telefono').AsString:=MaskEdit1.Text;

Creo que tratándose de un AdoQuery, no hay AsString.

// Saludos

enecumene 13-07-2006 17:48:27

roman tiene razon tratandose de componentes ado no hay asString, y roman sin ponerle nada

Código Delphi [-]
qryCliente.Parameters.ParamByName('telefono').Value:=MaskEdit1.Text;

me sale un error que dice "ole error 800A0d5d" cuando intento probarlo.

gracias...

kuan-yiu 13-07-2006 17:59:27

jejeje... No me fijé en que era un AdoQuery :o
Bueno, yo normalmente no los uso, así que no estoy segura de que esto valga... Pero por probar...
Código Delphi [-]
qryCliente.Close;
qryCliente.SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellido_cliente FROM tbClientes ');
qryCliente.SQL.Add('WHERE telefono1_cliente = ' + '''' + MaskEdit1.Text + '''');
qryCliente.Open;

enecumene 13-07-2006 18:11:29

gracias kuan-yiu por responder, pero me salio un error de sintaxis en la consulta telefono1_cliente= ?, no habra otra forma de hacerlo?

gracias...

kuan-yiu 13-07-2006 18:14:59

Cita:

Empezado por enecumene
gracias kuan-yiu por responder, pero me sigue saliendo ese error de OLE, no se porque me sale eso. no habra otra forma?

gracias...

Por eliminar casos sustituye el "MaskEdit" por un "Edit" y mira si sigue fallando.

roman 13-07-2006 18:21:51

Una rápida búsqueda en google me lleva a:

Cita:

ADOBD Parameter error '800a0d5d'
The application is using a value of the wrong type for
the current operation.
Dado que el campo (en Access) es de tipo texto y lo que le asignas es un texto no veo de dónde va a haber una incompatibilidad de datos a menos que tengas definida una máscara de entrada en Access que no coincida con lo que estás metiendo. Revisa eso.

// Saludos

enecumene 13-07-2006 18:27:19

para kuan-yiu hice lo que me pediste y me salio otro error diciendo error de sintaxis en la clausula FROM y a roman en mi base de datos el campo no tiene asignado una mascara de entrada puede ser eso?

gracias

kuan-yiu 13-07-2006 18:56:02

¿¡Pero que leches hay en ese edit!? :mad: ... Con perdón :o

No entiendo por qué falla mi segunda opción si al "Add" se le pasa un string... A ver, construye el string de la consulta al completo fuera de la query, como texto, y úsalo como parámetro del "Add".
De paso sácalo por pantalla para asegurarte de que es correcto y úsalo para hacer una consulta DIRECTAMENTE en la BD...

enecumene 13-07-2006 19:11:20

disculpa kuan-yiu, espero que no te este haciendo perder el tiempo, pero no entiendo con lo que me quisiste decir, soy un newbie y bruto total;) , me podrias decir como es?, gracias

kuan-yiu 13-07-2006 19:33:32

Perdón a veces me explico fatal.
1) Crea la consulta entera como un string, escríbela en una variable string.
Código Delphi [-]
miConsulta := 'SELECT telefono1_cliente, nombre_cliente, apellido_cliente FROM tbClientes WHERE telefono1_cliente = ' + MaskEdit1.Text;
2) Pásale esto al "Add", o sea la variable "miConsulta".
3) Vuelca en algún lado (mediante código) la consulta, por ejemplo a un fichero, o por pantalla.
4) El texto que te muestre pégalo tal cual directamente en el editor de SQL que tenga tu BD.

5) Si funciona directamente en la BD debería funcionar también a través de Delphi.

enecumene 13-07-2006 20:00:22

yo entiendo todo lo demas pero eso de volcar en algun lado o por pantalla no lo entiendo, y disculpas de nuevo...:o :o

ContraVeneno 13-07-2006 22:21:44

Código Delphi [-]
qryCliente.Close;
qryCliente.SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellido_cliente FROM tbClientes ');
qryCliente.SQL.Add('WHERE telefono1_cliente = ''' + MaskEdit1.Text + '''');
qryCliente.Open;

o Tambien:

Código Delphi [-]
qryCliente.Close;
qryCliente.SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellido_cliente FROM tbClientes ');
qryCliente.SQL.Add('WHERE telefono1_cliente = '+ quotedstr(MaskEdit1.Text) );
qryCliente.Open;

P.D. Extraño a delphi

enecumene 14-07-2006 00:27:12

gracias contraveneno me funciona perfecto, pero ahora me surge otro problema, despues de teclear un telefono me sale el nombre en el dbtext, lo limpio para teclear otro y cuando lo hago me sale esto:

Cita:

Syntax error, in query expression 'telefono1_cliente = '809-804-7530'
SELECT telefono1_cliente, nombre_cliente, apellidos_cliente FROM tbClientes
WHERE telefono1_cliente = '809-508-7990''
cual es el problema ahora?, quisiera tambien que luego de teclear el telefono me pase automaticamente al edit de peliculas...

gracias!!!

ContraVeneno 14-07-2006 00:34:06

El problema esta en las dobles apóstrofes al final del número. No deberías tener dobles apóstrofes.

Para pasar al siguiente contro, yo te recomiendo que al teclar enter en el control, validez el número de teléfono, y si este es válido, entonces hacer un edtPeliculas.SetFocus

Muchas personas hacen el cambio en el evento teléfono.lostfocus, pero a mi me parece que no sería correcto hacerlo en ese evento, por eso te recomiendo que lo hagas al presionar enter.

enecumene 14-07-2006 01:12:56

gracias ContraVeneno, pero me podrias decir como hacerlo??:confused::confused::confused: acordad que soy un total newbie...

te envio el codigo de nuevo para que lo veas:

Cita:

procedure TAlquiler.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then
begin
qryCliente.Close;
qryCliente.SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellidos_cliente FROM tbClientes ');
qryCliente.SQL.Add('WHERE telefono1_cliente = '+quotedstr(MaskEdit1.Text) );
qryCliente.Open;
if not qryCliente.IsEmpty then
DBText1.Caption:=qryClientenombre_cliente.Value+' '+qryClienteapellidos_cliente.Value;
end;
end;

ContraVeneno 14-07-2006 01:18:41

¬¬ ( <--- nos hace falta una carita con esta expresión :D)
Código Delphi [-]
procedure TAlquiler.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
 if Key=#13 then begin
  qryCliente.Close;
  qryCliente.SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellidos_cliente FROM tbClientes ');
  qryCliente.SQL.Add('WHERE telefono1_cliente = '+quotedstr(MaskEdit1.Text) );
  qryCliente.Open;
  if not qryCliente.IsEmpty then begin
    DBText1.Caption:=qryClientee.fieldByName("nombre_cliente").AsString+' '+qryCliente.fieldByName("apellidos_cliente").AsString;
    Peliculas.SetFocus; // esto era todo lo que necesitas para cambiar a películas
  else 
    //acciones cuando no encuentras al cliente
  end; //if cliente is not empty
end; //procedure

enecumene 14-07-2006 02:20:59

contraveneno, el error todavia persiste, el codigo funciona para una sola vez, pues si quiero digitar otro telefono tengo que cerrar y abrir de nuevo el form, no veo donde estan los apostrofe, pues en ningun lado los tengo...

Código Delphi [-]
procedure TAlquiler.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then begin
  qryCliente.Close;
  qryCliente.SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellidos_cliente FROM tbClientes ');
  qryCliente.SQL.Add('WHERE telefono1_cliente = '+quotedstr(MaskEdit1.Text) );
  qryCliente.Open;
  if not qryCliente.IsEmpty then begin
    DBText1.Caption:=qryCliente.fieldByName('nombre_cliente').AsString+' '+qryCliente.fieldByName('apellidos_cliente').AsString;
    Edit2.SetFocus // esto era todo lo que necesitas para cambiar a películas
    end
  else
    begin
    ShowMessage('Cliente no existe');
    end;
  end; //if cliente is not empty
end;


La franja horaria es GMT +2. Ahora son las 10:58:07.

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