[Ayuda] Con Mysql y tipo de Registro/Tabla

Buenas a todos, despues de intentar exprimir mi pobre cabeza no doy con el metodo para hacer lo siguiente.

Vereis quiero hacer un registro de "cobros" a unos usuarios y llebar digamos la contabilidad via PHP, el tema del PHP es el que menos me cuesta, pero el problema esta en crear las tablas para que funcione de la siguiente manera:

Quiero que cuando haga una consulta a por ejemplo el usuario "pepito grillo" me liste Todos los meses de Enero a Diciembre. y me ponga pagado o no pagado en cada uno de ellos.

ahora mismo tengo una tabla usuarios con los datos del usuario y su DNI como Primary key. pero no se como hacer para que cada vez que me genere un usuario, me cree los meses y me ponga no pagado por defecto.

Me explico un poco mejor, poner un valor por defecto si se hacerlo xD, lo que no se como hacer es el tema de como sería la tabla "cobros" por asi decirlo, para que me aparezcan los meses y el campo pagado.


Alguna idea?

gracias!
Desde MySQL

creas la tabla de meses, en principio: dni enero febrero marzo... diciembre
y asignas al valor "mes" por defecto los valores "no"

Cuando crees un usuario, tienes que insertar además su dni en la tabla de meses, no hace falta introducir nada más, ya que el gestor introducirá por defecto los valores "no" en los respectivos meses.

Pues ahorrarte esa tabla y poner los meses en la tabla de usuarios. Pero no me gusta crear tablas monstruosas.

Así pues, crear la lista completa:

SELECT Usuarios.*, Cobros.*
FROM Usuarios, Cobros
WHERE Usuarios.dni=Cobros.dni
AND Usuarios.dni=[valor_a_buscar];

Cuando un usuario 1234567 pague el mes enero
UPDATE Cobros
SET enero="si"
WHERE dni=1234567;
Te lo mando a PC/General.

Saludos.
Esa solución parece la más sencilla...

Y has mirado como hacer varios años??? Porque imagino que lo necesitarás para más de un año jaja. Podrías llamar a los meses Enero_2012, Febrero_2012 ..., y la misma tabla meses te valdrá hasta el infinito.

Total, luego para buscar deudores...

Select dni
from meses
where enero_2012 = 'no' or febrero_2012 = 'no', etc...

Cada mes añades el nuevo a la consulta, o por php creas un bucle que lance la query sin el 'or', desde el primer mes hasta el actual.
Anduril escribió:Esa solución parece la más sencilla...

Y has mirado como hacer varios años??? Porque imagino que lo necesitarás para más de un año jaja. Podrías llamar a los meses Enero_2012, Febrero_2012 ..., y la misma tabla meses te valdrá hasta el infinito.

Total, luego para buscar deudores...

Select dni
from meses
where enero_2012 = 'no' or febrero_2012 = 'no', etc...

Cada mes añades el nuevo a la consulta, o por php creas un bucle que lance la query sin el 'or', desde el primer mes hasta el actual.


Yo creo que lo más sencillo para los años es la tabla siguiente:
Cobros=dni+año+enero+febrero+...+diciembre
PK (dni,año)
FK (dni->Usuarios)

Pero sí, al poner la solución anterior había pensado sólo en un año XD
Si añades el año, unir las tablas ya no es compatible con un buen diseño
jorge_zk8 escribió:ahora mismo tengo una tabla usuarios con los datos del usuario y su DNI como Primary key. pero no se como hacer para que cada vez que me genere un usuario, me cree los meses y me ponga no pagado por defecto.


Creo que el muchacho va más por ahí que por la estructura de tablas. Si lo que quieres es que tras un insert en la tabla de usuarios se generen más cosas en BD, tienes dos opciones: Implementarlo en el lenguaje en el que estés haciendo el insert, o hacerte un trigger en BD.

http://dev.mysql.com/doc/refman/5.0/en/ ... igger.html

A mi pre-rellenar la tabla de cobros me parece una ñapa como un piano. Yo lo haría de otra forma ya que lo lógico es definir la entidad de negocio "cobro".

Esa entidad (tabla) tendría los siguientes campos (columnas): Usuario, Importe, Año, Mes, IndicadorPago. Aparte lo suyo es definirte una tabla de Mes, con dos columnas (la PK de 1 a 12, y la descripción con el nombre del mes). Y que el Mes de la tabla Cobros sea FK a la tabla de Mes.

Y luego sería: Select IndicadorPago from Cobros where Usuario = %DNI% and Año = 2013 and Mes = %mes% and IndicadorCobro = 1. Y si no te da resultados la búsqueda es que no ha pagau. Esto suponiendo que el IndicadorCobro sirve también para indicar que se le ha pedido la pastaca pero aún no la ha soltado. Sino directamente sobra.
Pues eso digo yo, tampoco hace falta rellenar con 'noes', con buscar si no hay 'sies' es suficiente.

Si luego hay que imprimirlo o algo, con decirle que ponga No en 'where cobro = null'.

También tendrás que tener en cuenta la fecha de alta del usuario, para cuando hagas eso en el where le puedas decir que mire los meses desde que lo añadiste en adelante, no te aparezca como moroso alguien que no te pagó hace 4 meses, si acaba de llegar jajajaja.

Bueno, que me estoy yendo del punto, como dice redscare también me parece lamejor opción la tabla intermedia en la que unas dni por un lado, mes por otro, y ahí añadas el año.
Bueno primero gracias a todos por la ayuda.

jorcoval escribió:Desde MySQL

creas la tabla de meses, en principio: dni enero febrero marzo... diciembre
y asignas al valor "mes" por defecto los valores "no"

Cuando crees un usuario, tienes que insertar además su dni en la tabla de meses, no hace falta introducir nada más, ya que el gestor introducirá por defecto los valores "no" en los respectivos meses.

Pues ahorrarte esa tabla y poner los meses en la tabla de usuarios. Pero no me gusta crear tablas monstruosas.

Así pues, crear la lista completa:

SELECT Usuarios.*, Cobros.*
FROM Usuarios, Cobros
WHERE Usuarios.dni=Cobros.dni
AND Usuarios.dni=[valor_a_buscar];

Cuando un usuario 1234567 pague el mes enero
UPDATE Cobros
SET enero="si"
WHERE dni=1234567;


Finalmente he usado este modelo, se que es menos profesional y más cutron, pero la pagina la va a usar mi madre (un hans topo en informática) y ella quería que le apareciera listado con los meses que ha pagado y que no ha pagado.

el tema de los años lo he dejado fuera, por que es para un curro temporal, en una "empresa" agena y cuando se le acabe el "curro" se llevará la pagina con ella (no les voy a regalar la pagina by the face).

Muchas gracias a todos =)!
jorge_zk8 escribió:Finalmente he usado este modelo, se que es menos profesional y más cutron, pero la pagina la va a usar mi madre (un hans topo en informática) y ella quería que le apareciera listado con los meses que ha pagado y que no ha pagado.

el tema de los años lo he dejado fuera, por que es para un curro temporal, en una "empresa" agena y cuando se le acabe el "curro" se llevará la pagina con ella (no les voy a regalar la pagina by the face).

Muchas gracias a todos =)!


El primer principio del buen desarrollador es no construir un cohete espacial si el cliente te ha pedido una bicicleta [+risas] Así que ferpecto XD
8 respuestas