Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como organizar un cliente con varios contactos (https://www.clubdelphi.com/foros/showthread.php?t=87095)

Delphitest 13-11-2014 19:17:14

Como organizar un cliente con varios contactos
 
Buenas tardes,

estoy haciendo un programa de gestión de prestamos y me surge una duda a la hora de organizar las tablas.

El caso es que tengo una tabla de clientes donde quiero reflejar los datos básicos pero necesito poder indicar una serie de "contactos" que están relacionados con el.

Por ejemplo al dar de alta un cliente a veces es necesario indicar el nombre de su cónyuge, de sus hermanos, hijos... Para estos contactos no querría tener que crear otra tabla sino más bien usar la misma de clientes pero que de alguna forma se sepa que están relacionados entre ellos. No sería válido poner campos auxiliares ya que es un número no determinado de personas, en algunos casos hay uno y otros puede haber 4 o 5.

Así al entrar en un cliente vería quienes más están vinculados a él y podría acceder a sus datos.

No se si me he explicado bien.

¿Alguien podría decirme cómo puedo plantear esto para tener una idea de cómo se suele hacer?

Ando un poco perdido y dándole vueltas pero quizás sea algo habitual.

Muchas Gracias

radenf 13-11-2014 19:33:35

Estimado Delphitest:

En mi experiencia lo mejor es crear otra tabla (Contactos) y unirlas a través de un campo común en una relación maestro-detalle.
Saludos

Casimiro Notevi 13-11-2014 19:35:32

Puedes tener un dato "tipo de usuario"
0. cliente
1. proveedor
2. cónyuge
3. hijo
4. amigo
5. vecino
...

Y para más funcionalidad, una tabla para definirlos y así poder ampliarlos, editarlos, etc.

Delphitest 13-11-2014 19:52:45

Muchas gracias por vuestras opiniones,

en este ultimo caso Casimiro, es algo que había pensado

Por ejemplo pongo "Tipo de Cliente" ;

Cliente Principal
Hermano
Padre
Hijo
....

¿Pero como lo vinculo al cliente principal? ¿Creo otro campo tipo "Relacionado con.."? ¿O como podría hacerlo?

Es decir, hay un cliente principal y luego puede estar el padre, el hermano... pero sería necesario saber que están relacionados.

Lo de crear otra tabla de contactos sería otra opción, por eso ando preguntando, no lo tengo muy claro cual sería la mejor forma.

Casimiro Notevi 13-11-2014 20:01:29

Necesitas otra tabla.
Código:

cliente.....otra cosa
1------------34
1------------14
1------------3
2------------48
2------------1
3------------15
3------------5
3------------4

Aunque yo haría lo que ha comentado radenf, otra tabla de "contactos", que podrían ser enlazadas con la principal de clientes, de 1 a muchos.

Delphitest 14-11-2014 21:11:21

Voy a probar con lo que comentáis de crear otra tabla de contactos.

No se exactamente como funcionan las relaciones pero por lógica entiendo que debo de tener un campo común en las dos tablas que me permita relacionarlas.

Tengo la tabla "clientes" con estos campos:

IDCliente
Nombre
Apellidos
....

Y debo crear la tabla "contactos" con estos:

IDContacto
Nombre
Apellidos
...

Supongo que esta última tengo que poner un campo IDCliente para que en caso de que haya varios contactos de un mismo cliente se sepa con quien están relacionados.

Para relacionarlas ¿Basta con tener un campo común y crear una query a la hora de mostrarlos? Por ejemplo diciéndole que solo se vean los contactos que tengan el IDCLiente (de contactos) igual al IDCLiente (de Clientes)

¿O es necesario crear esa relación de forma especifica con alguna sentencia SQL?

Casimiro Notevi 14-11-2014 22:21:21

Depende de lo que vayas a hacer exactamente, pero si un cliente puede tener varios contactos y un contacto puede pertenecer a varios clientes, entonces creo que tendrás que usar una tabla intermedia que haga de unión entre ambos, como especifiqué antes.

Código SQL [-]
tbClientes
  id
  nombre
  telefono
  primary key (id)

tbContactos
  id
  nombre
  telefono
  primary key (id)

tbEnlaces
  idCliente
  idContacto
  primary key (idCliente,idContacto)

Delphitest 15-11-2014 09:17:03

Solo necesitaría que un cliente pueda tener varios contactos pero los contactos serían únicos para el clientes, es decir bastaría saber de la ficha del contacto con qué cliente está relacionado, pero no tendría más de uno.

Casimiro Notevi 15-11-2014 10:13:49

Si un contacto solamente va a tener un enlace con un cliente entonces puedes añadir únicamente un campo en el contacto donde almacenas el código del cliente al que está enlazado.
Ejemplo:
Código:

tbClientes
  id
  nombre
  telefono
  primary key (id)

tbContactos
  id
  idCliente    /* (id en tbClientes) */
  nombre
  telefono
  primary key (id,idCliente)

Aunque de esa forma, si alguna vez te dicen: "oye, que el contacto 111 es padre del cliente 33 y cónyuge del cliente 42, ¿ahora qué haces?

Mejor la primera forma, tabla intermedia.

Delphitest 16-11-2014 19:31:14

Perfecto, ya me he puesto manos a la obra.

En mi caso un contacto nunca podrá ser de varios clientes asi que esto simplifica la tarea...

Ya hice la tabla de Contactos con el campo IdCliente

Lo que hago al añadir un Contacto desde la Ficha del Cliente es que automaticamente el IdCliente del contacto sea el valor de IdCliente de la tabla Cliente, lo hago incluyendo esta línea en el evento onclick del botón añadir:

Código Delphi [-]
  TContactos.FieldByName('IdCliente').Value := DMmain.TClientes.FieldByName('IdCliente').value;

La tabla contactos está en el Form actual pero la de clientes está en un Data Module.

Hasta ahí creo que lo hago bien porque he probado y todo es correcto.

En la finca de cliente he puesto un DBGrid donde pretendo que aparezcan todos los contactos relacionados con este cliente.

Lo hago a través de una Query pero no sé qué debo poner el la sentencia SQL, ando un poco perdido con estas cosas.

Si le pongo esto:

Código SQL [-]
Select * From Contactos

Vería todos los contacto, pero para ver únicamente los contactos cuyo IdCliente sea el mismo que el IdCLiente de la tabla Clientes no se que tengo que poner.

Se hace con un where creo que al tener dos tablas no se como indicar que un campo sea igual al de otra tabla

He probado con

Código SQL [-]
Select * From Contactos where IdCliente = DMMain.TClientes.IdCliente

Pero no funciona, debo de andar cerca....

También he visto una opción para poner un filtro en la query aunque no se si es ahí donde hay que ponerlo o en la SQL

ecfisa 16-11-2014 19:48:24

Hola Delphitest.

La consulta sería similar a esta:
Código SQL [-]
SELECT CO.NOMBRE,  CO.TELEFONO, ...
FROM CONTACTOS CO
INNER JOIN CLIENTES CL ON CO.ID_CLIENTE = CL.ID 
  AND CL.ID = :P_ID
ORDER BY CO.NOMBRE
Pero desconozco los campos que deseas obtener y los componentes que estas usando como para darte una respuesta mas concreta.

Saludos :)

ecfisa 16-11-2014 20:27:56

Hola de nuevo.

Otra forma mas simple, pero una pizca menos eficiente es:
Código SQL [-]
SELECT NOMBRE, TELEFONO, ...
FROM CONTACTOS
WHERE ID_CLIENTE = :P_ID
ORDER BY NOMBRE

Saludos :)

Delphitest 16-11-2014 20:44:55

En cuanto a los campos de la tabla contactos solo necesito Nombre, DNI y Telefono

El componente que uso es ADO

La duda que tengo es cómo indicar la tabla clientes en la SQL ya que no está en el Form donde tengo la consulta de Contactos, está en Data Module que llamo DMMain

ecfisa 16-11-2014 21:17:05

Hola Delphitest.

Código Delphi [-]
  with DMMain.ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT CO.NOMBRE, CO.DNI, CO.TELEFONO');
    SQL.Add('FROM CONTACTOS CO INNER JOIN CLIENTES CL');
    SQL.Add('ON CO.ID_CLIENTE = CL.ID AND CL.ID = :P_ID');
    SQL.Add('ORDER BY CO.NOMBRE');
    Parameters.ParamByName('P_ID').Value:= tu_variable; //(*)
    Open;
  end;
(*) Donde "tu_variable" es cualquier variable (o constante) de tipo Integer que contenga el ID del cliente cuyos contactos se desea listar.

Saludos :)

Delphitest 18-11-2014 07:51:16

Buenos días,

gracias por vuestra ayuda, siento no haber contestado pero no acabo de conseguir hacerlo funcionar.

Qué duro es esto de la programación por momentos... :o , me está dando la noche este problema

El caso es que no se donde meter ese código que me comenta ecfisa y estoy intentando hacer una sola línea de sql para ponerla en las propiedades de la query TContactos pero sigo fallando en la parte que indica el campo IDCliente de la tabla TClientes y que no está en el mismo form, no se si me falta algo por probar pero he hecho todo tipo de combinaciones.

Quizás la solución sea crear una variable en el Form que recoja el contenido de IDCLiente de la tabla TClientes y después hacer referencia a esa variable dentro de la sentencia SQL, pero mis pruebas tampoco han sido exitosas.

No pierdo la esperanza, sigo haciendo pruebas...

Casimiro Notevi 18-11-2014 10:11:05

Cita:

Empezado por Delphitest (Mensaje 484966)
El caso es que no se donde meter ese código que me comenta ecfisa

Por ejemplo, al pulsar un botón.

Delphitest 18-11-2014 10:46:13

Es que me estoy liando con esto...

Pensaba que la forma de hacerlo era poner en las propiedades SQL de la query lo necesario para que actuara de filtro y mostrase los datos que necesito.

Voy a hacer mas pruebas poniendo en ese sitio "select * from contactos" porque requiere que ponga algo por lo que he comprobado y el código que proporciona ecfisa en algún botón aunque sea para ver si da el resultado esperado.

Muchas gracias, os mantengo informados

Que paséis un buen día.

Delphitest 18-11-2014 19:06:16

Solucionado con el código de ecfisa y una ayudita de un forero ;)

He metido el código en el evento OnChange de las pestañas donde aparece el DBGrid con los datos de los contactos

Gracias por todo


La franja horaria es GMT +2. Ahora son las 14:51:49.

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