PDA

Ver la Versión Completa : Ayuda Con Consulta


enecumene
13-07-2006, 17:22:17
hola A TODOS, sucede lo siguiente, este es mi codigo:
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 :
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.
qryCliente.Parameters.ParamByName('telefono').AsString:=MaskEdit1.Text;

roman
13-07-2006, 17:34:41
¿Y si no pones nada?


qryCliente.Parameters.ParamByName('telefono').Value:=MaskEdit1.Text;


// Saludos

roman
13-07-2006, 17:36:20
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

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...
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
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:


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.
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
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:


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:

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:

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)

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...

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;

ContraVeneno
14-07-2006, 16:40:51
procedure TAlquiler.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key=#13 then begin
with qryCliente do begin
if active then Close; //Agregué aquí
sql.Clear; // y aquí
SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellidos_cliente FROM tbClientes ');
SQL.Add('WHERE telefono1_cliente = '+quotedstr(MaskEdit1.Text) );
Open;
if not IsEmpty then begin
DBText1.Caption:=fieldByName('nombre_cliente').AsString+' '+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; //if cliente is not empty (aquí te sobraba un "end"
end; //with
end; //procedire

a ver ahora.... ;)

P.D. Extraño a delphi

enecumene
14-07-2006, 16:55:01
EXCELENTE!!!! gracias ContraVeneno me salio superbo, te lo agradezco muchissimo que hayas tomado un poco de tu tiempo para ayudarme, muchas gracias.. :):) y a los demas que me han contestado no se quedan atras tampoco, muchas gracias a todos!!

ContraVeneno
14-07-2006, 17:36:10
De nada ;)

Nada más como recomendación, siempre dale nombre a tus controles, tal vez solo tengas unos pocos y sabes perfectamente que edit2 se refiere a las películas. Pero llegará el día que tendrás tantos edits que no sabrás ni cuál es cuál. Ahí es cuando te daras cuenta que es mucho más fácil identificar entre Edit2 y edtPeliculas.

enecumene
14-07-2006, 19:10:16
gracias ContraVeneno por tu recomendacion lo llevare a cabo.

roman
14-07-2006, 19:23:00
Aquí hay algo muy raro. Me alegra que ya hayas resuelto el problema pero la verdad es que como lo tenías al principio, usando parámetros, debería funcionar. Incluso como lo tenías antes de usar QuotedStr, aunque más confuso, también debía funcionar. Yo seguiría investigando porque el uso de parámetros hace un código mucho más claro.

// Saludos

ContraVeneno
14-07-2006, 19:28:39
Muy cierto, con parámetros debería funcionar mejor que con "quotedstr"

Igual y el problema desde un principio era que no limpiabas la instrucción SQL con la instrucción "SQL.Clear"

Pero en fin, ya te tocará a ti seguir investigando :D

vtdeleon
15-07-2006, 01:58:06
Saludos

El Query de Ado no tiene manera de asignar el tipo de dato como AsString, AsInteger,... solo tiene value; pero para Ado, Qué tipo de dato es el que tiene Value :confused:?, a mi entender no sabe y esa misma pregunta se hace el componente, y debemos contestar asingando el tipo de dato en DataType

//Codigo fuenta Ado
{ TParameter }

TDataType = TFieldType;
...
...
//Codigo DB
TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord,
ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,
ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo,
ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString,
ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob,
ftVariant, ftInterface, ftIDispatch, ftGuid, ftTimeStamp, ftFMTBcd);