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)
-   -   Creando Consulta de alquiler (https://www.clubdelphi.com/foros/showthread.php?t=33603)

enecumene 12-07-2006 03:33:52

Creando Consulta de alquiler
 
hola a todos!!

estoy haciendo una aplicacion para gestion de videclub, tengo lo siguiente:

2 - Edits (Cliente y Pelicula)
1 - DBGrid (columnas 'codigo', 'pelicula', 'fecha alquiler' y 'fecha devolucion')
2 - DBLabels
1 - tabla access (tbPeliculaAlquilada 'codigo_pelicula', 'codigo_cliente', 'fecha_alquiler', 'fecha_devolucion' y 'devuelta')
1 - datasource
1 - TTable (ADO)
1 - Tquery (ADO)

como configuro que al teclear en el Edit1.text y con Enter me llame al cliente y me lo presente al lado en un dblabel u otra cosa, igual lo mismo en el edit2.text de las peliculas y me los presente en el dbgrid con sus respectivos columnas cual seria la consulta sql y el codigo delphi??:confused::confused::confused:

nemesio 12-07-2006 03:52:51

Para buscar el Cliente podrías hacer algo parecido:
Código Delphi [-]
AdoQueryCliente.Close;
AdoQueryCliente.SQL.Add(' SELECT codcliente, Nombre, Apellido FROM CLIENTES ');
AdoQueryCliente.SQL.Add('WHERE CodCliente: Codigo');
AdoQueryCliente.ParamByname('Codigo').Value:=EditCodCliente.Text;
AdoQueryCliente.Open;
if not AdoqueryCliente.IsEmpty then
   LabelCliente.Caption:=AdoQueryClienteNombre.Value+' '+AdoQueryClienteApellido.Value;

Bueno con esa idea tienes para hacer las demás consultas. Suerte.

enecumene 12-07-2006 04:06:14

gracias nemesio por responder lo mas rapido, y disculpa que te haga esta pregunta porque me perdi, ese codigo donde lo pongo? en el edit? o en un Tbutton?:confused::confused::confused:

enecumene 12-07-2006 04:22:26

lo intente ponerlo en un tbutton y al compilar me sale 'Undeclared Identifier: ParamByName', a que se debe eso?:confused::confused:

nemesio 12-07-2006 04:26:38

Es válida cualquiera de las 2 opcíones. Puedes colocarlo en el evento OnKeyPress del Edit, algo asi como:

Código Delphi [-]
procedure TForm1.EditCodClienteKeyPress(Sender: TObject; var Key: Char);
begin  
  if Key=#13 then
  begin
   AdoQueryCliente.Close;     AdoQueryCliente.SQL.Add(' SELECT codcliente, Nombre, Apellido FROM CLIENTES ');   AdoQueryCliente.SQL.Add('WHERE CodCliente: Codigo');   AdoQueryCliente.ParamByname('Codigo').Value:=EditCodCliente.Text;   AdoQueryCliente.Open;     if not AdoqueryCliente.IsEmpty then      LabelCliente.Caption:=AdoQueryClienteNombre.Value+' '+AdoQueryClienteApellido.Value;  end;
end;

o Colocarlo en un en el evento OnClick de un Botón. Todo va a depender de como quieras hacerlo y de lo que requiera tu aplicación.

nemesio 12-07-2006 04:30:13

Esta si va con la etiqueta bien...

Es válida cualquiera de las 2 opcíones. Puedes colocarlo en el evento OnKeyPress del Edit, algo asi como:



Código Delphi [-]
procedure TForm1.EditCodClienteKeyPress(Sender: TObject; var Key: Char);
begin 
if Key=#13 then
begin
AdoQueryCliente.Close; AdoQueryCliente.SQL.Add(' SELECT codcliente, Nombre, Apellido FROM CLIENTES '); AdoQueryCliente.SQL.Add('WHERE CodCliente: Codigo'); AdoQueryCliente.ParamByname('Codigo').Value:=EditCodCliente.Text; AdoQueryCliente.Open; if not AdoqueryCliente.IsEmpty then LabelCliente.Caption:=AdoQueryClienteNombre.Value+' '+AdoQueryClienteApellido.Value; end;
end;





o Colocarlo en un en el evento OnClick de un Botón. Todo va a depender de como quieras hacerlo y de lo que requiera tu aplicación.

nemesio 12-07-2006 04:32:43

No se que pasó que en la Previsualización se veía bien el código con la Etiqueta delphi. pero no se que pasó. Bueno ahi tienes la idea, cualquier duda vuelve a preguntar.

nemesio 12-07-2006 04:40:42

Ok lo que pasa es que en Ado la sintaxis es asi:


Código Delphi [-]
  AdoQueryCliente.Parameters.ParamByName('codigo').Value;




Suerte

enecumene 12-07-2006 04:41:49

Código Delphi [-]
 procedure TForm1.EditCodClienteKeyPress(Sender: TObject; var Key: Char);
begin 
if Key=#13 then
begin
AdoQueryCliente.Close; AdoQueryCliente.SQL.Add(' SELECT codcliente, Nombre, Apellido FROM CLIENTES '); AdoQueryCliente.SQL.Add('WHERE CodCliente: Codigo'); AdoQueryCliente.ParamByname('Codigo').Value:=EditCodCliente.Text; AdoQueryCliente.Open; if not AdoqueryCliente.IsEmpty then LabelCliente.Caption:=AdoQueryClienteNombre.Value+' '+AdoQueryClienteApellido.Value; end;
end;

gracias nemesio con enter es mejor, pero estoy teniendo problemas que al compilar el ParamByname es Undeclared identifier que es lo que falta?:confused::confused::confused:

enecumene 12-07-2006 04:50:13

gracias nemesio ahora si! pero me surge otro problema, cuando corro la aplicacion y pruebo el codigo me sale el siguiente error: 'qryCliente: parameter 'Codigo' not found', y disculpa las molestias....:D

enecumene 12-07-2006 04:51:59

gracias nemesio ahora si! pero me surge otro problema, cuando corro la aplicacion y pruebo el codigo me sale el siguiente error: 'qryCliente: parameter 'Codigo' not found', y disculpa las molestias....:D

este es el codigo adaptado:

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: Codigo');
qryCliente.Parameters.ParamByName('Codigo').Value:=MaskEdit1.Text;
qryCliente.Open;
if not qryCliente.IsEmpty then
   DBText1.Caption:=qryClientenombre_cliente.Value+' '+qryClienteapellidos_cliente.Value;
  end;
end;

nemesio 12-07-2006 05:00:44

prueba pegando los dos puntos de la palabra codigo, asi:

Código Delphi [-]
qryCliente.SQL.Add('WHERE telefono1_cliente= :Codigo');
también coloca el "=" que por lo que veo no lo colocaste. Los dos indican en el SQL que lo que sigue es un parámetro.

nemesio 12-07-2006 05:06:30

Quise decir los dos puntos.

enecumene 12-07-2006 05:14:56

aqui estoy de nuevo nemesio, pero aun me dice que el parametro codigo no se encuentra, lo intente de estas maneras:

Código Delphi [-]
qryCliente.SQL.Add('WHERE telefono1_cliente =: Codigo');
qryCliente.SQL.Add('WHERE telefono1_cliente= :Codigo');

sera que me estara faltando algo? y que viene siendo 'Codigo'? algun campo de la tabla?

gracias, (diras que estas tratando con un bruto, jajajaja):confused::confused::confused::confused:

Lepe 12-07-2006 07:02:53

Hay 2 detalles que espero hayas corregido:
Código Delphi [-]
qryCliente.SQL.Add('WHERE telefono1_cliente: Codigo');

Falta el símbolo de comparación, como ya te dijo nemesio, debe decir:
Código Delphi [-]
qryCliente.SQL.Add('WHERE telefono1_cliente = :Codigo');

El otro detalle es darle valor al parámetro antes de abrir la consulta:
Código Delphi [-]
qryCliente.Parameters.ParamByName('Codigo').AsInteger :=StrToInt(MaskEdit1.Text);
qryCliente.Open;
if not qryCliente.IsEmpty then
   DBText1.Caption:=qryClientenombre_cliente.Value+' '+qryClienteapellidos_cliente.Value;
  end;
end;

Cuando pones ":Loquesea" estas indicando al SQL que lo que hay detras de los dos puntos es un parámetro, es decir, algo variable en la ejecución de esa SQL. Normalmente se hace un Query1.Prepare antes de abrir la consulta, así se agiliza y queda compilada esa consulta en el servidor; cuando posteriormente se llame a esa consulta con otro valor en el parámetro, la consulta ya se encuentra compilada y lista para ejecutarla, tardando menos en su ejecución.

Al menos esto funciona así en SGBD como Firebird / Interbase, etc, no sé que tal irá en Access.

Es importante que digas de qué clase es el parámetro:
Código Delphi [-]
qryCliente.Parameters.ParamByName('Codigo').AsInteger :=strToInt(MaskEdit1.Text);
Porque así Delphi lo traduce de forma correcta:
AsString - Delphi añade las comillas
AsInteger - Delphi lo pasa tal cual
AsDateTime - Delphi traduce el formato de fecha que espera el motor.

Según han comentado en otros mensajes sobre ACCESS, debes usar la propiedad Params del TQuery y especificar de qué tipo es el parámetro, obviamente es un parámetro de entrada pInput, si es de tipo String, etc.

Un detalle más. Ten cuidado al darle nombre al parámetro, porque si tienes un campo que se llama "Codigo" en tu tabla, puede que se haga un lio el Tquery, realmente no lo he probado, porque yo siempre le añado a los Parámetros el prefijo "pr"

Código Delphi [-]
 qryCliente.SQL.Add(' SELECT telefono1_cliente, nombre_cliente, apellido_cliente FROM tbClientes ');
qryCliente.SQL.Add('WHERE telefono1_cliente = : prCodigo');
Así nunca hay dudas.
Saludos

enecumene 12-07-2006 14:23:01

gracias lepe!!! ahora mismo voy hacer los arreglos. muchas gracias, luego te dire como me fue. chao.

enecumene 12-07-2006 14:52:39

aqui estoy de nuevo, hice lo que dijiste Lepe pero ahora me sale otro error

Código Delphi [-]
qryCliente.Parameters.ParamByName('Codigo').AsInteger :=StrToInt(MaskEdit1.Text);

me dice "Undeclared Identifier: 'AsInteger'", y por que sera ahora??:confused::confused::confused:

gracias y disculpa las molestias.

Neftali [Germán.Estévez] 12-07-2006 18:15:59

Por favor no repitas hilos (eso incluye abrir otro hilo diciendo que miren éste).
Revisa la Guía de estilo.

enecumene 12-07-2006 18:45:54

Perdon:(:(:(

Lepe 13-07-2006 10:05:09

Pues qué curioso, acabo de comprobar que ADO no tiene esa propiedad, así que tendrás que seguir usando .Value pero mira las propiedades de ese parámetro para indicarle que es un integer,char, etc.

Saludos

enecumene 13-07-2006 16:21:43

hola lepe, 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, espero que no este molestando mucho...

nemesio 14-07-2006 06:20:41

Qué tipo de campo es "Telefono"? StrToInt te muestra el error porque estas tratando de convertir a entero una cadena no válida. Recuerda que las cantidades válidas no tienen caracteres especiales a menos que sea el símbolo de negativo antes de la cantidad o el separador decimal. Por lo tanto si quieres guardar el número telefónico sin tener problemas, el campo debería ser string y debes quitar el StrToInt.

enecumene 14-07-2006 15:28:10

hola nemesio, ya pude resolver el problema este es el 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, apellidos_cliente FROM tbClientes ');
  qryCliente.SQL.Add('WHERE telefono1_cliente = :telefono');
  qryCliente.Parameters.ParamByName('telefono').Value:=MaskEdit1.Text;
  qryCliente.Open;
  if not qryCliente.IsEmpty then begin
    DBText1.Caption:=qryClientenombre_cliente.Value+''+qryClienteapellidos_cliente.Value;
    Edit2.SetFocus;
    end
  else
    ShowMessage('Cliente no existe')
  end; //if cliente is not empty
end;

pero ahora sucede que ocurre otro error, cuando digito un telefono me sale el nombre en el dbtext, perfecto hasta ahi todo bien, pero supongamos que ese no era el telefono que no queria, limpio la casilla para digitar otro telefono, y me sale este error:

Cita:

EOleException with message 'OLE error 800A0E7C'
y ahora que sera??:confused:

gracias...

enecumene 14-07-2006 17:19:24

ya pude resolver el problema habia que ponerle sql.clear, gracias a todos, por ayudarme..


La franja horaria es GMT +2. Ahora son las 06:48:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi