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)
-   -   Busqueda con LOCATE (https://www.clubdelphi.com/foros/showthread.php?t=16336)

MaríaMR 24-11-2004 15:06:12

Busqueda con LOCATE
 
Hola:

Necesito Ayuda URGENTE con una Búsqueda LOCATE.

Estoy haciendo una búsqueda con un LOCATE en una Tabla, Busco por dos campos distintos pero a la hora de ejecutarla me tarda mucho en localizarla, la búsqueda que hago es la siguiente:

IF ModuloDatos.TFacturas.Locate('Serie; Nfactura', VarArrayof([PSerie.Text, PnFactura.Text]), Opciones) THEN

Serie y Nfactura son las claves de Tfacturas ¿que es lo que hago mal?

marcoszorrilla 24-11-2004 15:15:39

Si el problema es que tarda mucho únicamente, entonces lo que te falta es declarar los índices apropiados en la tabla, ya que sino Locate hace un búsqueda sencuencial.

Un Saludo.

MaríaMR 24-11-2004 15:20:59

Declarar Indices Tabla
 
Cita:

Empezado por marcoszorrilla
Si el problema es que tarda mucho únicamente, entonces lo que te falta es declarar los índices apropiados en la tabla, ya que sino Locate hace un búsqueda sencuencial.

Un Saludo.

Y como tengo que declararlos, al definir la tabla los campo:

NSerie , y Nfactura los puse como primary Key, ¿hay que hacer algo mas?

gracias

marcoszorrilla 24-11-2004 15:31:37

Creo que te tendrás que explicar un poco mejor, qué es exactamente lo que quieres encontrar en la tabla?

Los 2 no pueden ser PrimaryKey ya que como su nombre índica solamente puede haber una, y también conviene que indicas que tablas estas utilizando.

Un Saludo.

MaríaMR 24-11-2004 15:51:39

La Tabla que utilizo es DBASE y lo que quiero es un índice que integre los dos campos la Serie y el Nº Factura porque integrando los dos campos este índice es único.

Puedo haber dos mas números de facturas iguales pero si añado la serie hago el índice único.

gracias

eduarcol 24-11-2004 16:04:22

Si estas trabajando con el ttable porq no utilizas el FindKey en lugar de locate eso te asegura una busqueda mas rapida

MaríaMR 24-11-2004 16:55:47

He probado con el FindKey y sigue tardando muchísimo, yo creo que el problema es que no he creado los índices bien, lo que necesito es que me digaís como crear estos índices:

Quiero crear un índice con estos dos campor: Serie, Nfactura de una tabla DBBAse, yo las tablas las he definido con el Databasedestock.

Espero que una vez alguien me de una solución completa.

gracias

eduarcol 24-11-2004 17:10:54

Una de dos o no tienes los indices o se estan corrompiendo, la forma de crear los indices es colocar esos dos campos al principio de la lista de campos, luego en la columna Key presionar la barra espaciadora para que salga el * que identifica el campo clave, presionas el boton save y listo.

antes de ejecutar el findkey debes asegurarte que el indexname de la tabla sea "" porq ese es el q identifica el principal.

espero haberte servido de ayuda

MaríaMR 25-11-2004 09:15:40

Dame un ejemplo del IndexName, para ver como se hace lo que me comentas de que tiene que ser = "". ¿Estas Seguro de que me solucionara el Problema?.

gracias

eduarcol 25-11-2004 10:19:12

Te solucionara el problema si y solo si:

- La clave principal esta bien definida
-No esta corrupta

-Ej. Table1.IndexName := '';
Table1.FindKey([txSerie.Text, txFactura.Text]);

MaríaMR 25-11-2004 12:06:21

No me soluciona el Problema el FindKey hace lo mismo que el Locate, ¿Alguien Sabe La Solución?

gracias

Lepe 25-11-2004 12:37:08

¿cuantos registros tiene la tabla ? millones?

MaríaMR 25-11-2004 12:51:17

sobre 300, ya ves no son muchos

marcoszorrilla 25-11-2004 15:09:04

Ian Marteens: "La Cara Oculta de Delphi".

Cita:

Por ejemplo, tomemos una tabla que tenga los campos Nombre y Apellidos, y cuyo índice activo sea un índice basado en la expresión Nombre + Apelldos. Hay dos campos involucrados en el índice, y un programador inocente puede verse tentado a programar algo asi:

Table1.FindKey([‘Howard’,’Lovecraft’]) //No funciona

¿Cuál es el valor que debe tomarse como nombre y cuál debe tomarse como apellido?. Delphi no lo sabe. Y tanto FindKey como FindNearest están programados para lanzar un excepción si el índice activo es un índice de expresiones. La técnica correcta para realizar una búsqueda sobre este tipo de índices es la siguiente
Código Delphi [-]
  Table1.SetKey;
  Table1[‘Nombre’ ]:=’Howard’;
  Table1[‘Apellidos’]:=’Lovecraft’;
  Table1.GotoKey;

Un Saludo.

eduarcol 25-11-2004 15:15:23

Cita:

Empezado por Ian Marteens: "La Cara Oculta de Delphi"
y un programador inocente puede verse tentdo a programar algo asi:

Table1.FindKey([‘Howard’,’Lovecraft’]) //No funciona

Upss, me habeis descubierto :confused: :p,

Pero en todas mis aplicaciones esta asi y me funciona de lo mejor por eso no me habia visto en la necesidad de documentarme al respecto

MaríaMR 25-11-2004 16:20:53

en Table Properties que opcion coges, porque igual está ahí el problema

gracias


La franja horaria es GMT +2. Ahora son las 13:29:19.

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