Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   referencia de recibos en facturas (https://www.clubdelphi.com/foros/showthread.php?t=50783)

ebeltete 28-11-2007 10:10:37

referencia de recibos en facturas
 
Hola amigos del foro, estoy haciendo una aplicacion en Delphi 5 con Firebird 2.0, tengo un maestro detalle, para facturas y clientes, el tema que ahora estoy incorporando los recibos que referenciare a esas facturas.
o sea que una factura de $ 1.000 puede ser paga con uno a mas recibos, por ej. 4 recibos de $ 250.
Los detalles de los recibos y las facturas se guardan en una tabla que se llama movdeud. Ahora para llevar esas referencias hice una tabla donde se guardan en un campo el ID de la factuta, en otro campo el ID del recibo, en los otros dos el monto de la factura y el monto del recibo.
Mi pregunta es voy bien o hay una manera mas simple de hacer esto?
De esta manera se me complica un poco en el momento de realizar las consultas sobre los saldos de cada cliente, espero hayan entendido mis dudas, esta medio entreverado.

kuan-yiu 28-11-2007 11:35:24

No es un método muy correcto.
Lo mejor es que los recibos (que es algo diferente de las facturas) los guardes en una tabla aparte que guarde el ID de la factura a la que corresponden.
Incluso te recomendaría que la numeración de esos recibos tenga una relación directa con las facturas para que en caso de que un operario tenga que localizarlas le sea fácil, por ejemplo: <nº factura>+ '_R'+<nº recibo>

Lepe 28-11-2007 12:40:04

Lo de relacionar los recibos y facturas no estoy de acuerdo :p.

Crea una vista que una las facturas, clientes y recibos. Si el usuario quiere buscar algo, que use esa vista. También te puede servir esa vista para calcular rápidamente el importe pendiente de una factura, teniendo en cuenta los recibos que tenga entregados.

Código SQL [-]
select sum(total_recibo), Total_factura, Total_factura - Sum(total_recibo) as Pendiente 
from vwfactura
where id_factura = 33

Nota: Yo a los recibos le llamo vencimientos, y la tabla en cuestión se llama así.

Usando un query y un UpdateSql puedes acceder a esa vista y editar registros, borrar, insertar, etc.

Saludos

ebeltete 29-11-2007 02:04:38

Creo entender sus consejos.
AL principio lo habia pensado de esa manera, pero que pasa si un cliente tiene 3 facturas:
nº 101 = $ 2.000
nº 102 = $ 1.500
nº 103 = $ 3.000
A la vez ese cliente va entregando a cuenta con varios pagos pero va asignando los pagos a direntes facturas, Ej.:

factura nº 101 = $ 2.000
recibo nº 10 = $ 500
recibo nº 11 = $ 1.000

pendiente $ 500

factura nº 102 = $ 1.500
recibo nº 12 = $ 500
recibo nº 13 = $ 250

pendiente $ 750

factura nº 103 = $ 3.000
recibo nº 14 = $ 500
recibo nº 15 = $ 200
recibo nº 15 = $ 300
recibo nº 16 = $ 500
pendiente $ 1.500

Con este ejemplo creo que necesariamente necesito un maestro detalle, donde en el maestro estan las facturas y en el detalle los recibos.
Yo no lo hice con el numero de factura, ya que tambien tiene la serie; por lo tanto cada factura y cada recibo tienen un ID único.
Gracias por vuestra ayuda, saludos.

kuan-yiu 29-11-2007 09:36:12

Claro, es lo que pretendía decirte: esos recibos deben estar en una tabla propia que guarde una relación "N:1" con la de facturas.
Por otra parte no me parece buena idea usar la numeración de la factura como ID, ¿o es lo que usas en esa tabla como clave primaria? ¿O no he entendido lo que querías decir?
Yo me refería a que cuando un cliente se lleva un recibo suele ser cómodo que en algún sitio se refleje a que factura pertenece, por lo que indicar que su numeración es la misma que la de la factura añadiéndole algo más parece la solución más directa. (Ojo para mi los números de factura y los ID de las facturas siempre son cosas distintas.)
Si ya lo tienes hecho de otro modo y funciona bien no lo cambies.

Lepe 29-11-2007 14:34:08

Creo que todos estamos diciendo lo mismo pero con palabras distintas:

Relación de tablas:
Código:

Factura:
  idfactura autoincremento clave primaria
  nfactura  varchar    numero de la factura que ve el usuario
  total factura numeric

Recibo:
  idRecibo  autoincremento clave primaria
  nRecibo  varchar el número de recibo que ve el usuario,
              puede tener incluido el nfactura (lo que decía kuan-yiu)
  idFactura  clave ajena a Factura.idFactura
  total_recibo  numeric  (lo pagado en este recibo).

Al usar una vista o un sql, unimos ambas tablas por el idfactura, así que tenemos "ordenados" cada factura con su recibo, es decir:
Código:

idfactura    idRecibo      Total_Factura    Total_Recibo
    101                10                2.000                500
    101                11                2.000                1.000

    102                12                1.500                500
    102                13                1.500                250

El total_factura se repite por cada recibo que haya, ahora con la consulta que puse, obtendremos lo que hay pendiente de cada factura.

No hay ningún problema con hacerlo así.
¿difiere algo de lo que tienes hecho ebeltete?

Saludos

marcoszorrilla 29-11-2007 14:56:37

Yo hago algo similar a lo que indican kuan-yiu y Lepe la Tabla Facturas por así decir tiene 2 detalles, Líneas compuesta como es lógico por las líneas de Factura y Recibos - Pagos o Vencimientos, el nombre que convenga, este sistema lo utilizo porque hay muchos clientes que hacen entregas en metálico acuenta de una factura.

Id_Factura:0001/07
Fecha:10/11/07
Concepto:Pago en Metálico
Importe:1.000,00

En la factura existe un Campo
Total
Pagado

Pendiente

Cada movimiento que se efectúa en Pagos, se actualiza en la factura, de esta manera es posible evaluar la deuda con tan solo consultar la tabla facturas, lo que hace más simple el SQL para dicha consulta.

Un Saludo.

ebeltete 29-11-2007 22:38:35

Esta claro que el id de la factura y el id del recibo no son unicos y son clave primaraia en la tabla.
Me parece interesante lo de marcoszorrilla:

En la factura existe un Campo
Total
Pagado
Pendiente

Ir actualizando el pendiente de la factura puede agilizar la consulta.
Hablamos mas o menos de lo mismo, recien estoy comenzando con este proyecto, es de Cuentas corrientes, facturacion recibos, cheques, acreedores, stock, etc.
Por eso estoy pidiendo estos consejos y me han sido de mucha utilidad.
Por ultimo, yo estoy manejando una sola tabla para las facturas y los recibos de los clientes, tambien en principio estoy usando la misma tabla para los proveedores, que es mejor? usar una tabla para cada cosa o no?
Me parecia que al ser una sola tabla, por ej., la consulta de un saldo seria mas sencilla, pero pienso tambien que al ser una sola tabla, tendria muchos renglones y la consulta seria mas lenta.
Gracias nuevamente, soy un agradecido de este foro por todo lo que aqui he aprendido.

ebeltete 29-11-2007 22:40:26

Perdon en el mensaje anterior quise decir que los ID de las facturas son unicos y no es el numero que el cliente ve en el papel.
Cita:

Empezado por ebeltete (Mensaje 249471)
Esta claro que el id de la factura y el id del recibo no son unicos y son clave primaraia en la tabla.
Me parece interesante lo de marcoszorrilla:
.


ebeltete 30-11-2007 00:08:44

Ahora si con un mismo recibo el cliente paga parte de dos facturas diferentes.
Ej.:
Factura Nº 101 = $ 2.000
Nº 102 = $ 1.500

Recibo Nº 13 = $ 500 paga: factura Nº 101 = $ 200 y Factura Nº 102 $ 300

Creo que en ese caso no estaria contemplando el monto que le asigno a cada factura de ese recibo, porque si utilizo un campo para eso, cuando tenga que ingresar otro recibo tendria que crear otro campo, y asi sucesivamente.
Por eso es que me parece mejor hacer un detalle donde cada recibo tenga uno o mas renglones que especifique a que facturas se refiere y que monto se le asigna a cada factura. Yo lo estaba haciendo en una tabla donde tenia cuatro campos
ID_factura = es el ID de la factura
ID_recibo = es el ID del recibo
Monto_factura = es el monto que paga de la factura
monto_recibo = es el monto del recibo que se le asigna a esa factura

Saludos.

lbuelvas 01-12-2007 18:10:43

Interesante tema, quiero compartir con ustedes mi experiencia en un proyecto
en el que nos pedian algo un poco mas complejo.

Nosotros llamamos "conciliaciones" al proceso de ir descontando el saldo pendiente a cancelar por factura.

La empresa nos pidio que se hiciera automaticamente para algunos clientes y manualmente para otros, me explico, hay clientes a los que no les interesa como estan pagando sus cuentas pues llevan mentalmente su total de facturas y su total de abonos, sin embargo otros clientes cunado efectuan sus pagos indican que facturas estan cancelando y puede suceder que con un abono (recibo) paguen parte de una y parte de otra factura.

El modelo que elaboramos fue el siguiente:

Código:

Tercero:
  Codigo_Tercero Integer (PK)
  ...
  Cliente_Saldo_Automatico
  Cliente_Saldo_Actual

Factura:
  Numero_Factura (PK)
  Fecha_Documento
  Codigo_Cliente (FK -> Tercero)
  Valor_Total
  Valor_Conciliado
  Saldo_Por_Conciliar
  ...

Abono:
  Numero_abono (PK)
  Fecha_Documento
  Codigo_Cliente (FK -> Tercero)
  Valor_Total
  Valor_Conciliado
  Saldo_Por_Conciliar
  ...

Conciliacion:
  ID_Conciliacion (PK automatico)
  Fecha_Conciliacion
  Numero_Abono  (FK -> Abono)
  Numero_Factura (FK -> Factura) 
  Valor_Conciliacion
  ...

Explicacion:

El campo Cliente_Saldo_Automatico tiene dos pocibles valores S/N, si el valor es S el sisterma automaticamente concilia los documentos con saldo pendiente por conciliar.

En el sistema cuando las conciliaciones son manuales, se "cruza" un abono contra una o mas facturas, en ocasiones el pago es mayor que lo que debe el cliente, entonces quedan un saldo pendiente por cruzar.

El modelo real es un poco mas complejo porque se maneja otros documentos como son NotasDebito y NotasCredito.

Espero que les sea de utilidad.

Lepe 01-12-2007 19:41:33

ebeltete busca en google por "Normalizar tablas" o "formas normales", eso te ayudará a dividir las tablas de forma precisa.

Saludos.


La franja horaria es GMT +2. Ahora son las 23:15:00.

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