• Martes 14 de Mayo de 2024, 23:54

Autor Tema:  Como Crear un historial para un cliente?  (Leído 1637 veces)

Dragos

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Como Crear un historial para un cliente?
« en: Lunes 7 de Septiembre de 2009, 22:22 »
0
Hola amigos, primero que nada excelente foro...estoy realizando una aplicacion para el control de clientes de un Gimnasio, el problema es que la persona quiere un historial de cada cliente, es decir, el cliente que va al gimnasio paga semanalmente, el dueño lo que quiere es que se guarde un Historial de todas las semanas que pago, cuanto pago, etc, desde que comenzo hasta que dejo de ir al gimnasio...

En mi aplicacion yo le ofrezco un TEXTBOX donde colocara la semana que pago y una actualizacion del mismo cliente para cuando pague la proxima semana, es decir, edita el cliente y coloca la semana que esta pagando!

Quiero saber como puedo hacer para llevar un Historial, agradeceria sus respuestas!

Saludos

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Como Crear un historial para un cliente?
« Respuesta #1 en: Jueves 10 de Septiembre de 2009, 03:34 »
0
Crea una base de datos.

Si las bases de datos no es lo tuyo (que es loque se deduce de la pregunta que haces), siempre podrás hacer el mantenimiento sobre ficheros de texto plano usando estructuras. En este caso usa una jerarquía a modo de tablas.

..ya con la dirección que enfoques se podrá concretar ...
«Ma non troppo»
----> ModoVacaciones = False<----

Dragos

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Como Crear un historial para un cliente?
« Respuesta #2 en: Jueves 10 de Septiembre de 2009, 22:09 »
0
Si, manejo base de datos pero no a nivel profesional, lo que quiero decir es que, por ejemplo... tu pagas la primera semana, pagas la segunda semana y asi sucesivamente por un año!

Que es lo que quiero, que al buscarte por el numero de cedula (Que es mi modo de busqueda en este proyecto) me salga todo el historial tuyo, es decir todas las semanas que pagaste desde que entraste hasta  que dejaste de ir al gym!

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Como Crear un historial para un cliente?
« Respuesta #3 en: Viernes 11 de Septiembre de 2009, 17:16 »
0
Ok...

Bien, veamos deberías tener como mínimo 5 tablas (el sistema que te propongo y que tienes que adaptarlo a tus necesidades),
Las tablas serían DatosGenerales, Clientes, ClientesInactivos, Semanario, SemanarioInactivo
La Tabla Clientes y clientesInactivos son idénticas, sólo cambia el contenido, sucede igual con Semanario y SemanarioInactivo

Tabla tblDatosGenerales: contiene datos estadísticos, el registro 0 son los datos globales, la suma detodos los años, menos el que va en curso.
+ Campos:
- Año: clave única, refiere el número de registro, el número 0 es el registro 0 que representaría la suma de todos los años, el global, los demás son los específicos del año referido. El años en curso son los datos actuales. El global tiene los datos de todos los años vencidos, excepto el que va en curso, si no se hace así, cada vez que se actualice el año actual debe actualizarse también el registro global(el 0). Y tenemos un registro global, porque de otro modo cada vez que quiesiéramos obtener dichos datos deberíamos hacer la suma correspondiente, de este modo sólo se hace 1 vez cuando cambia el año.
- ClientesActivos: indica el número de clientes vigente
- ClientesInactivos: indica el número de clientes
- ClientesMorosos: indica el número de clientes que a la finalización del año tiene pendiente el pago de alguna factura
- PagosMorosos: indica el número de facturas no cobradas...
- PrimeraSemanaAñoCompleta: indica si la primera semana del año empieza el primer día de lasemana o no, del año en curso, para años anteriores este valor debe calcularse, para el año actual sólo se calcula cuando se crea la tabla Semanario y elresto de veces se consulta, este campo sólo esescribible 1 vez, cuando se crea la tabla Semanario.

+ Metodos: clientestotales, señala cuantos clientes totales tiene el gimnasio
- clientestotales= clientesActivos + ClientesInactivos


Tabla tblClientes (Activos): contiene los datos básicos de los clientes, además de la fecha de alta y el estado de pago de la semana actual y otro campo que refleja (no es imprescindible pero permite hacer consultas rápidas) la cantidad de semanas pendientes de pago. ...y esta debería tener los siguientes campos casi forzosos, otros datos ya a tu gusto y necesidades

- IdCliente: clave autonumérica , esto deberías usarlo aparte de que uses el número del documento de identidad, en el gimnasio es mejor que traten con cliente 1, cliente 25 y no por un número que después de todo concierne a la privacidad... el número de cédula sólo debe exponerse cuando lo que se precise sea identificar a alguien, para operar con la base de datos debe usarse un id anónimo.  Puedes si lo crees conveniente tener una tabla cuyos campos sean precisamente un par de claves, el idcliente y NumeroCedula, pero yo ese dato aunque sea obligatorio al darse de alta, lo dejaría semioculto en todas las operaciones que no sean exclusivamente modificar datos del cliente o especifiicamente consultar ese dato. Más aún este dato lo haría de modo que sólo admita una escritura y para evitar errores, al añadir el dato debería 'teclearse' 2 veces, sólo si coinciden se añade, si no borrarlo y solicitar reentrar...  Todo esto es por seguridad, para evitar que alguien con acceso a la BD intercambie datos decliente y por tanto falsifique sus datos de pago por el de otro cliente sin deudas pendientes.
- Nombre: nombre del cliente,
- Apellido1:  idem....
- Apellido2:  idem....
- dirección: datos de donde reside, puede ser un único campo de texto o desglosarlo en varios(es lo emjor, pero cada país tiene sus propios términos de definición de divisiones del territorio, por lo que esto va según usos y costumbres de cada lugar).
- FechaAlta: tipo date.
- FechaCalculo: es necesario para consultar pagos pendientes y poder filtrar por fecha desde el alta, el primer año este  valor tiene el mismo que fecha de alta, después del 31 de diciembre del añoen curso tiene fecha 1 de enero . Esto obliga a que cuando el cliente (el del gimnasio) cree un nuevo año, este dato sobre cada cliente del gimnasio se coloque la fecha 1 de enero.
- PagosPendientes: contendrá el número de semanas que el cliente tiene sin pagar,  no se considera la semana actual, esta tiene su propio campo.
- SemanaActualPagada: Indica si la semana en curso está pagada o no. Cuando se inicia una nueva semana se recorre toda la tabla de clientes y este campo se pone a false (0), esto es por defecto vale 0.

Tabla tblClientesInactivos: Esta tabla es idéntica en campos a la tabla clientes.
En ella lo que tienes son las fichas de los clientes que se dieron de baja, la tabla no se utiliza excepto cuando un cliente vaya a ser añadido. El hecho de tener 2 tablas de esta manera hace que realizar consultas sobre los clientes activos (que será lo más común y frecuente) hace que sean más rápidas al contener menos registros. También sirve para no tener largas tablas de consultas sobre clientes cuyos datos no interesan precisamente en un momento dado.

Si quieres  omitir esta tabla, puedes hacerlo pero entonces en la tabla Clienhtes tendrás que añadir obligadamente un nuevo campo llamado:
- ClienteActivo: tipo boolean
y al hacer operaciones de actualización y/o consulta típicamente en las queries  deberás añadir el condicional 'and tblCliente.ClienteActivo = True' (o false), a la mayoría de ellas...

+ Metodos: Ahora una somera descripción de los métodos que atañen a estas 2 tablas:
- AñadirCliente: toma el numcedula y obtenemos el Idcliente  en la tabla clientesinactivos usando el campo NumCedula, si existe (distinto de 0), se copia dicho registro a la tabla clientes y se eleimina de la tabla ClientesInactivos,  luego se le  solicita al cliente que revise si alguno de sus datos no es vigente (excepto el numcedula que no se puede cambiar). ... si el cliente no existe en la tabla clientesinactivos, entonces se introduce elresto de datos. sobre la tabla DatosGenerales se actualizan  convenientemente los campos clientesActivos, clientesInactivos... clientesActivos se suma 1, si el cliente existía previamente a clientesInactivos se le resta 1.
- DesactivarCliente:  primero habrá que decidir que se desea hacer cuando elcliente tiene pagos pendientes, una vez sabido esto y hecho lo que se desee al respecto el registro se copia a la tabla ClientesInactivos y se borra de esta, en la tabla de datos generales ClientesActivos se resta 1 y clientesInactivos se suma 1. Si elegiste tener una sola tabla de clientes, entonces basta que marques el campo ClienteActivo=0
- EliminarCliente: Igual que al desactivar clientes, deberemos decidir si uncliente con deudas puede o no ser borrado y decidir que hacer con la deuda...  Esta función debe estar restringida y sólo poderse usar con privilegios y advertencias, ya que eliminar definitivamente un cliente de la BD implica borrar todos sus datos definitivamente. Por seguridad antes de eliminar un cliente, debería tomar precauciones que de acuerdo al nivel de seguridad que se quiera imponer debería ir desde guardar un log de los datos del cliente eliminado hasta solicitar una clave se seguridad o enviar por email los datos del cliente a eliminar o el sólo intento de eliminación, incluyendoen todos los casos el identificador del usuario de la BD que está llevando a cabo dicha operación. La operación consistirá enlocalizar en la tabla Semanario (si es un clienteactivo, semanarioInactivo si es un clienteInactivo) y eliminar todos los registros cuyo idcliente coincidan... (where tblSemanario.Idcliente = tblCliente.IdCliente), si como decíamos al principio tiene facturas pendientes, de acuerdo a lo que hayamos decidido, antes de borrar estos registros, deberemos hacer lo deseado, y luego si procede actualizar los campos de ClientesMorosos y PagosMorosos de la tabla DatosGenerales, luego se elimina el registro de la tabla Clientes finalmentese actualiza los campos requeridos en la tabla Datosgenerales. ClientesActivos, clientesinactivos...
- ListarClientes: busca sobre la tabla los clientes cuyo valor en el/los campos a buscar coincidan con el patrón de búsqueda, debería poder devolver una lista simple o completa, la lista simple sería un par idcliente- nombre completo usuario, en la lista completa aparecería el registro completo de cada usuario hallado.
- ConsultarDatoscliente: Recoge de la tabla el  registro cuyo idcliente se solicita y se exhibe en un formulario, debería añadir boton para modificar datos y si se pulsa copiar dichos datos a otro formulario para modificar datos, ese contiene 2 botones, aceptar_cambios y  rechazar_cambios, rechazar campos cierra elformulario, aceptar cambios primero actualiza dichos datos en la tabla y cierra el formulario, al regresar al formulario de datos del usuario, si se  hicieron cambios se relee el registro y se vuelca nuevamente en el formulario... En esta consulta también debería haber otrobotón para solicitar estadodepagos.
- ModificarDatosCliente: (Como se especificaba en el apartadoanterior). Esta función recibe un registro y lo guarda en la tabla, los campos no modificables son el idcliente, numcedula,fechaalta.

Tabla Semanario: Esta tabla cuando se crea la BD, recrea tantos registros como semanas tiene el año.
Puede ser concebida de muchas maneras, yo te propongo el siguiente sistema, no es el más óptimo pero si el gimnasio no tiene miles de clientes (lo habitual suelen ser unas decenas), te ahorra una tabla y los métodos son más sencillo s de programar, para ser puristas, esto no es aceptable, pero para tu caso puede valer perfectamente.
Latabla tiene sólo 2 campos, NumeroSemana y clientes.
- NumeroSemana: es una clave cuyos límites van de 0 a 54 (el año tiene 52 semanas completas y 1 o 2 incompletas). Si el año empieza en una semana incompleta el primer registro de esta tabla es 0, y tiene los dato de la última semana del año anterior, si este año empieza en lunes (supuesto el caso que consideremos que elprimer día de la semana es lunes), el registro 0 está vacío y no deberá poderse editar.
- Clientes: Es un campo tipo string, cuando se crea la tabla este campo es una cadena vacía, cuando un cliente paga la semana x, este campo se actualiza, el modo de actualizarse es añadir el Idcliente a dicha cadena... ejemplo:
 where tblsemanario.Numerosemana= semana ...    tblSemanario.clientes= tblSemanario.clientes & " , " & idcliente
Una función en el formulario podría ser
Código: Visual Basic
  1. Function SemanaPagada(byval Semana as integer, Idcliente as long) as boolean
  2.       'si el valor de la semana no es correcto o el idcliente no existe,
  3.       '       devolver false
  4.      'en otro caso
  5.      '        ... ejecuta la querie
  6.      'fin comprobaciones
  7. end function
  8.  
Dado que los gimnasios notienen largas listas de clientes, saber si un cliente ha pagado o no es bastante fácil y rápido... todolo que necesitamos hacer es recoger el campo clientes de lasemana deseada en latabla semanario, volcar la cadena en una matriz y localizar si exise el idcliente. ejemplo.
Código: Visual Basic
  1.  
  2. ' si pagó devolverá 1, si no pagó devolvera 0 si los datos de entrada no se validan devolverá -1
  3. Function EstaPagadaSemanaPorCliente(byval Semana as integer, Idcliente as long) as integer
  4.       dim clientes() as string, ClientesSemana as string , k as long
  5.       'si el valor de la semana no es correcto o el idcliente no existe,
  6.       '       devolver -1
  7.       ' en otro caso
  8.             clientesSemana= query(semana, idcliente)
  9.            if clientesSemana <>"" then
  10.                clientes= split(clientesSemana, " , ")
  11.                for k= 0 to ubound(clientes)
  12.                      if clientes(k)= cstr(idcliente) then
  13.                           EstaPagadaSemanaPorCliente=1
  14.                           exit for
  15.                      end if
  16.                next
  17.           end if
  18.       'fin comprobaciones
  19. end function
  20.  
  21.  

Si no quieres mantener este sistema, entonces esta tabla secomplica contendrá un varios campos llamado Idcliente Numerosemana, y habrá un registro por cada cliente que ha pagado cada semana (100 clientes al año supondrían más omenos 100*52= 5200 registros, la forma de arriba sólo tiene 50 y pocos registros) , cuando un cliente paga se añade un registro a esta tabla con su idcliente, Numerosemana, adicionalmente podría añadirse un campo con la cantidad pagada e incluso otro con la fecha (fecha y hora) de pago, e idUsuarioBD de la BD que registró el pago en la BD... este sietema es mejor, más profesional, pero también te dará más trabajo, si el número de clientes no es elevado, el sistema anterior es perfectamente válido, no estará normalizada, pero cumple su objetivo.

La Tabla SemanarioInactivo, tiene el mismo propósito que la Tabla ClientesInactivos respecto de la tabla clientes, pero siendo un reflejo esta de la tabla Semanario...

En fin creo que me extendido lo bastante como para que tengas por donde tomarlo...
p.d.: Como el mensaje me ha salido largo en otro momento te comento otros detalles que se me han quedado en el tintero,  ahora mismo no tengo tiempo...
«Ma non troppo»
----> ModoVacaciones = False<----