Ver Mensaje Individual
  #4  
Antiguo 02-09-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Yo también considero que el punto central aquí es el planteamiento de la estructura relacional. Y por lo que colijo, no se trataría de añadir sólamente la tabla de nombres sino además una tabla asociativa ya que parece que la relación entre proyectos y empleados es n-n.

Tendrías tus tablas:

Código:
empleados = (id, nombre)
proyectos = (id, descripcion)
asignaciones = (empleado_id, proyecto_id)
Para una búsqueda como la que mencionas, primero buscas el id del empleado:

Código SQL [-]
select id from empleados where nombre like '%nombreEmpleado%'

Y usas el id obtenido para buscar en la tabla de asignaciones:

Código SQL [-]
select proyecto_id from asignaciones where empleado_id = :empleadoId

Con lo que obtienes la lista de ids de los proyectos en que participó el empleado.

Por supuesto puedes usar joins para obtener directamente los proyectos, por ejemplo:

Código SQL [-]
select proyectos.descripcion
from asignaciones
left join proyectos on proyectos.id = asignaciones.proyecto_id
where asignaciones.empleado_id = :empleadoId

o directamente con el nombre del empleado:

Código SQL [-]
select proyectos.descripcion
from asignaciones
left join empleados on empleados.id = asignaciones.empleado_id
left join proyectos on proyectos.id = asignaciones.proyecto_id
where empleados.nombre like '%nombreEmpleado%'

En cualquier forma que uses ten en cuenta que la búsqueda con like puede devolverte más de un registro.

Por otra parte, tal como comenta Marcos, Paradox no parece hacer uso de los índices en consultas SQL. Por ello, contrario a lo que se recomendaría en servidores SQL, en bases de escritorio resulta mucho más eficiente usar componentes TTable en lugar de TQuery, sobre todo si tus tablas son muy grandes.

Para este caso, por ejemplo, podrías tener componentes tblEmpleados, tblProyectos y tblAsignaciones.

Poniendo a tblEmpleados como master de tblAsignaciones, en cuanto localices al empleado (con tblEmpleados.Locate o tblEmpleados.FindKey si tienes un índice sobre el campo nombre), la componente tblAsignaciones automáticamente se filtrará con únicamente las asignaciones del empleado.

Semánticamente es lo mismo que hacer la relación por SQL pero más eficiente.

// Saludos
Responder Con Cita