Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Problemas para buscar - Locate (https://www.clubdelphi.com/foros/showthread.php?t=70361)

ekstase 16-10-2010 21:07:53

Problemas para buscar - Locate
 
Hola amigos, por favor si alguien me puede ayudar.Estoy terminado una aplicacion para una playa de estacionamiento y Tengo 2 tablas, Tablasocio(IdSocio,Apellido, Nombre) y TablaAutos(IdSocio, Marca, Patente) siendo el IdSocio el campo por el cual se relacionan, con la Propiedad MasterSource de la TablaAutos. Ahora bien todo funciona de maravilla, pero al realizar una busqueda de un registro en la TablaAutos no encuentra nada. :S ...
Probando encontre que si quito la relacion, osea si anulo lo de la propiedad MasterSource, entonces si encuentro el registro.- :S
Utilizo MySql y Delphi 7.

El codigo para realizar la busqueda es el siguiente:

If (DM.TablaAutos.Locate('Patente',Edt_Num.Text,[])) Then
Begin
ShowMessage('El vehiculo pertenece a un Socio.');
Edt_Num.SetFocus();
end;

Si alguien me puede dar una manito. Gracias.-
Gustavo.-

Al González 17-10-2010 02:25:26

Hola Gustavo.

No has comentado qué componentes de acceso a datos estás utilizando, pero, en general, cuando relacionas un conjunto de datos (data set, table, query) como detalle de otro, en él solamente tendrás acceso a los registros detalles que correspondan al actual registro maestro (el registro donde se encuentra posicionado el conjunto de datos maestro).

Así que si le estás pidiendo que localice un valor que no se encuentra en el actual "grupo" de registros detalles, no lograrás que el conjunto de datos se posicione en el registro que buscas, porque sencillamente no tiene relación con el actual registro maestro.

Existen varias formas de sacarle la vuelta a este problema pero, antes de hablar sobre ellas, ¿podrías ampliar el tema detallando qué componentes usas e indicando valores de ejemplo? No olvides usar la etiqueta para código Delphi (el botón del pequeño Partenón).

Saludos.

Al González. :)

ekstase 17-10-2010 03:59:08

Hola Al Gonzalez, gracias por responder, me quedo claro lo que me dijsite, pero la verdad nose como resolverlo. El tema es asi: Utilizo 2 tablas una de SOCIOS y otra de AUTOS (Donde cada socio puede ser dueño hasta de 3 autos) entonces, utilizo dos Grillas, una muestra todos los socios y a medida que selecciono alguno, en la otra grilla se actualiza mostrandome los datos de los vehiculos que le pertenecen a ese socio seleccionado. Utilizo componentes Datasource, Query. En la propiedad Mastersource de la tabla AUTOS lo enlazo con el DataSource de la tabla SOCIOS y en la Propiedad MasterFields selecciono el campo IDSocios. El código que utilizo es el que te mostre anteriormente.

SOCIOS
======
IDSocios Nombre Apellido
11 Marcelo Gonzalez
12 Sergio Rodriguez
13 Andres Chavez

AUTOS
=====
IDSocios Patente Marca
11 GAA-222 WV
11 ABB-322 Renault
12 BTT-188 Fiat
13 CDD-553 Ford

Ese es el esquema de las tablas.
Espero poder hacerme entender jaja.. Bueno gracais amigo por tu atencion.- Espero tu respuesta. Gracias.-

Al González 18-10-2010 04:52:49

Gracias por ampliar el panorama, ekstase. Supongo que con query y tabla te refieres a componentes TQuery y TTable, ¿es así?

¿Entonces sí se da la situación de que el usuario o el programa requiera buscar un registro de auto que no necesariamente pertenezca al actual registro de socio?

En ese caso quizá convenga que te auxilies con una consulta (query) adicional, que sirva para obtener el / los IDSocios de una patente en particular. Ejecutando dicha consulta para luego usar el IDSocios resultante y con él hacer Locate en el conjunto de datos maestro, antes de hacer el Locate en la tabla detalle.

La sentencia SQL sería:
Código SQL [-]
Select IDSocios From Autos Where Patente = :Patente

Puede que haya mejores soluciones, pero es algo que se me ocurre ahora, a bote pronto. ¿Qué te parece la idea?

Un saludo de año nuevo. :p

Al González. :)

RebeccaGL 18-10-2010 18:34:52

Código Delphi [-]
If (DM.TablaAutos.Locate('Patente',Edt_Num.Text,[])) Then
Begin
  ShowMessage('El vehiculo pertenece a un Socio.');
  Edt_Num.SetFocus();
end;

 
Mira este Ejemplo.
 
if (DM.TableAutos.Locate('IDSocio; Patente',
      VarArrayOf([TablaSocio('IDSocio').AsFloat,
                      Edt_Num.Text]),
                      [loCaseInsensitive, loPartialKey])) then
Begin
  ShowMessage('El vehiculo pertenece a un Socio.');
  Edt_Num.SetFocus();
end;

Y no quites el MasterSource;
Asegurate de que los campos de enlace esten asi.

LinkedField := 'IDSocio';
MasterFields := 'IDSocio';

ekstase 20-10-2010 01:42:24

Gracias [Al González] lo resolvi con tu sugerencia, asi fue el código final:

Código Delphi [-]
 
      QueryTablaAutos.Active    :=  False;
      QueryTablaAutos.SQL.Clear;
      QueryTablaAutos.SQL.Text  :=  'Select IdSocio From TablaAutos Where Patente = :Patente';
      QueryTablaAutos.ParamByName('Patente').Value  :=  Edt_Num.Text;
      QueryTablaAutos.Active    :=  True;
  
      If (QueryTablaAutos.Fields[0].Value <> Null) Then
          Begin
              ShowMessage('El vehiculo pertenecea a un socio.');
          end;

Connor gracias por tu atención también, me sacaron un peso de encima.
Gracias Chicos, hasta la próxima. :)
Gustavo.-


La franja horaria es GMT +2. Ahora son las 23:31:26.

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