PDA

Ver la Versión Completa : FindKey en TSQLTable


Kubelo
24-10-2014, 12:18:17
Buenos días, en primer lugar decir que he buscado y no he encontrado nada, así que si repito tema ha sido por torpeza en la búsqueda :D:D:D:D

Al lio, estoy migrando una aplicación de BDE a dbExpress y me encuentro con 2 problemas, usaba muchos TTable y veo que el TSQLTable no tiene ni el FindNearest (cuyo problema no es tan grande) ni FindKey (Mi dolor de cabeza más grande). Sabéis o habéis conseguido "replicar" o usar alguna función similar en los TSQLTable. El problema del FindKey es que trabajo con formularios "plantilla", y sin cambiar bastantes cosas no se la clave primaria de la tabla. Intentaré mostrarlo gráficamente...

FORMULARIO BASE (Aquí está el TTable) -> En este formulario se define una búsqueda que realiza un FINDKEY

FORMULARIO HIJO 1 - FORMULARIO HIJO 2 - FORMULARIO HIJO 3 ..... FORMULARIO HIJO N

Estos formularios HEREDAN el TTable y es en ellos cuando se asocia el TABLENAME, así pues en el BASE no tengo la PK de la tabla.

Si supiera en el base la PK, obviamente podría hacer un LOCATE, pero ahí viene el problema, modificar el código para ese cambio es muchísimo trabajo (que si no hay más remedio tendré que hacer), pero si puedo
hacerlo todo en el BASE, pues eso, para eso se usa la herencia, no? :D

Espero me podáis ayudar, ya que estoy bastante "empantanado". Gracias :rolleyes:

AgustinOrtu
25-10-2014, 09:24:32
Cual es la finalidad de la busqueda? Seleccionar un registro en particular y mandarlo a un form hijo? Como mostras los resultados de la busqueda? Algun control enlazado a un DataSource conectado al TTable (estilo DBGrid)?

Si fuera por ejemplo el caso del DBGrid y el usuario tiene que seleccionar un registro, si el DBGrid esta linkeado a un DataSource conectado al TTable, el TTable te queda "magicamente" apuntando a la PK que buscas

Kubelo
27-10-2014, 09:08:02
Hola, depende del hijo. Algunos son grids, otros tienen dbedits... Por ello necesito "traducir" el findkey a dbexpress, lo ideal sería obtener de algún modo los campos de la clave primaria de esa tabla (con alguna función) y hacer un locate, pero tampoco encuentro esa "función" que me devuelva los campos.

AgustinOrtu
27-10-2014, 11:29:04
Es algo confuso el problema porque decís que en el formulario base tenés una tabla a la que le aplicas una búsqueda, y luego se la pasas a un formulario hijo en donde se define el tablename ??? Como trabajar con un table si no tiene definido tablename?

Por otro lado, cuando haces la búsqueda en tú primer formulario, te queda la tabla apuntando al primer registro que cumpla las condiciones de búsqueda, es decir el registro actual. Proba hacer un show message de los campos en algún botón para que me entiendas

Saludos

Kubelo
27-10-2014, 11:50:55
El tablename es lo primero que se asigna en el create del hijo. Así pues si tiene tablename. O no me estoy explicando bien o es más confuso de lo que parece. Pero como bien he dicho lo que necesito es o bien cambiar ese FindKey por alguna intrucción "semejante" o como creo que no existe, intentar obtener la PK de la tabla para así poder hacer un LOCATE.

pacopenin
27-10-2014, 13:03:17
No se que base de datos usas ni el volumen de datos que utilizas, pero componentes de tipo Table contra BBDD es lo más ineficiente que hay, y el problema se agrava si tabajas desde varios puestos simultaneamente. Yo te recomendaría que lo cambies por un Query y en lugar de FindKey, Locate, etc hagas un 'SELECT * FROM NOMBRE_DE_LA_TABLA WHERE CLAVE = VALOR_A_POSICIONAR'. No es tanto el cambio y en términos de eficiencia, rapidez, veracidad de datos, etc. si tienes cierto volumen, lo notarías mucho. Inconveniente? Tocar algo de código y olvidarte de Siguiente-Anterior desde el formulario de edición (algo normalmente innecesario e inutil, e.m.h.o.).

En todo caso, si no hay equivalente a FindKey, deberás trasladar el posicionamiento en las tablas al método OnCreate, OnShow (o el que creas oportuno) de cada form hijo, así que el cambio no sería tan grande.

Un saludo.