none
Diseño para poner el número secuencial de una factura. RRS feed

  • Pregunta

  • Hola

    Estoy trabajando con Visual Studio 2015 y SQL Server 2014 Express Edition.

    Tengo un problema en el diseño de mi entidad(tabla) Ventas, el número de factura consta de 001-001-000000001 paso a describir a mas detalle los primeros tres dígitos(001) representa el establecimiento, los otros tres dígitos(001) representa el punto de emisión(caja) y los nueve dígitos restantes representa el secuencial(000000001, 000000002, 000000003) un dato importante que cada punto de emisión tiene su propio secuencial.

    Les presento mi diseño.

    Como pueden ver Ventas esta relacionado con PuntoEmisiones que desde esta entidad(tabla) puedo obtener el código de Establecimiento(001) que esta en el campo Codigo, de igual manera el código de PuntoEmisiones y mostrarlo en mi formulario Facturación.

    • Pero el secuencial ¿Como lo podría obtener? se puede poner una tabla Secuenciales en el cual se va incrementando el número secuencial, pero esa tabla tendría el código de Establecimiento y PuntoEmisiones.
    • ¿Sería necesario agregar un campo Secuencial en Ventas? para tener registrado su número de secuencial y el resto de código(Establecimiento y PuntoEmisiones) lo obtengo por la relación entre Ventas => PuntoEmisiones => Establecimiento, quiero decir cuando lo tenga que identificar.

    ¿Como podría solucionar este diseño?

    Nota: Es para el ambiente de facturación electrónica.

    Saludos!

         


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    martes, 26 de junio de 2018 13:01

Respuestas

  • Hola,

    Para mi el numero de comprobante, en este caso una factura, es 001001000000001, por lo tanto ese sera el valor para el campo NumerodeComprobante o como lo quieras llamar.

    Algunos desarrolladores prefieren tener dos campos, uno para el punto de emision (001001) y otro para el numero secuencial (000000001).

    Con respecto a como tomar el numero secuencial, deberias tener una tabla de contadores o numeradores, donde el indice primario y unico sera el punto de emision. Si el numero secuencial es distinto por tipo de comprobante, Factura, Nota de Credito, Nota de Debito, etc, entonces el indice primario y unico sera el punto de emision + Tipo de comprobante o al revez. 

    Demas esta decir que al momento de emitir un comprobante deberas permtir que el operador seleccione el punto de emision.



    Victor Koch

    martes, 26 de junio de 2018 14:54

Todas las respuestas

  • Hola,

    Para mi el numero de comprobante, en este caso una factura, es 001001000000001, por lo tanto ese sera el valor para el campo NumerodeComprobante o como lo quieras llamar.

    Algunos desarrolladores prefieren tener dos campos, uno para el punto de emision (001001) y otro para el numero secuencial (000000001).

    Con respecto a como tomar el numero secuencial, deberias tener una tabla de contadores o numeradores, donde el indice primario y unico sera el punto de emision. Si el numero secuencial es distinto por tipo de comprobante, Factura, Nota de Credito, Nota de Debito, etc, entonces el indice primario y unico sera el punto de emision + Tipo de comprobante o al revez. 

    Demas esta decir que al momento de emitir un comprobante deberas permtir que el operador seleccione el punto de emision.



    Victor Koch

    martes, 26 de junio de 2018 14:54
  • hola

    >>Pero el secuencial ¿Como lo podría obtener? se puede poner una tabla Secuenciales en el cual se va incrementando el número secuencial, pero esa tabla tendría el código de Establecimiento y PuntoEmisiones

    porque una tabla ? eso no es una buena idea

    si tienes el secuencial podrias usar el

    SELECT MAX(v.secuencial) FROM Ventas v
       inner join emision em on v.EmisionId = em.EmisionId
       inner join establecimiento e ON em.EstablecimentoId = e.EstablecimentoId
    WHERE e.establecimiento = @establecimiento AND em.emision = @emision


    a ese max le sumarias uno para tener el siguiente

    ojo este secuencial no tiene porque ser la key de la tabla

    >>¿Sería necesario agregar un campo Secuencial en Ventas?

    si una venta genera una factura entonces si, la tabla de ventas minimamente deberia tener los campos de: emision(caje) y secuencial

    no veo necesario el establecimiento ya que se puede obtener mediente un join entre caja y establecimiento

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    miércoles, 27 de junio de 2018 13:36
  • No encuentro donde registras el numero de factura en tu diseño

    Donde lo almacenas???

    miércoles, 27 de junio de 2018 13:48
  • Hola leandro.

    jajaja no es el lugar para preguntar esto pero, que paso con tu blog

    desde el 2014 que no cambia nada. Ya esta pensaba que ya no andabas por aquí, 


    • Editado niqel miércoles, 27 de junio de 2018 13:50
    miércoles, 27 de junio de 2018 13:50
  • Hola,

    La solucion que propones, tomar el secuencial utilizando el MAX, no funciona en un ambiente multiusuario.

    Supongamos que de dos terminales se estan emitiendo facturas a distintos clientes, a la cola del motor puede ingresar el SELECT MAX de una terminal y luego el SELECT MAX de otra terminal. Para ambos casos obtendremos el mismo secuencial. 


    Victor Koch

    miércoles, 27 de junio de 2018 14:06
  • Te pregunte donde guardas la factura mas que nada por secuencial de nueve digitos

    ese debería ser un Id autoincrementable y asi garantizarias que siempre se actualice y no haya errores

    miércoles, 27 de junio de 2018 14:52
  • hola

    >>La solucion que propones, tomar el secuencial utilizando el MAX, no funciona en un ambiente multiusuario.

    por eso pregunte si es similar a una factura, la idea es que si lo implementa de esta forma debera generar un registro minimo de venta que bloquee el nro de secuencial cuando se inicia la venta

    despues al terminar de completarla se actualiza, o si se cancela se anula

    la misma operacion que se realiza cuando se completa un talonario de facturacion

    igual es verdad que hay que analizar un sistema de concurrencia para evitar colisiones en la generacion del secuencial, tambien hay que ver que tantas transacciones se generan en cada sucursal ya que entendi cada una lleva el secuencial diferente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 27 de junio de 2018 17:11
  • Hola,

    El numero de comprobante se va a obtener, o asignar, en el momento que confirma el comprobante que desea emitir.

    A su vez una vez que se confirma el comprobante hay que ver que logica aplica el colega. Imprime el comprobante y luego lo guarda en la base de datos o lo guarda en la base de datos y luego lo imprime.


    Victor Koch

    miércoles, 27 de junio de 2018 17:23
  • Hola

    Delegar la asignacion del numero de comprobante valiendose de un ID autoincrementable es lo mismo que suicidarce.

    Suponiendo que por fallas tecnicas se debe emitir la facturacion por el metodo alternativo, por ejemplo manualmente. Una vez solucionado el problema tecnico pasan dos cosas:

    1.Registrar en el sistema las facturas emitidas manualmente.

    2.Volver a facturar con el sistema comenzando con el mumero que corresponda.

    Como haces para controlar que el ID autoincrementable coincida con las emitidas manualmente al momento de registrarlas ?.   


    Victor Koch

    miércoles, 27 de junio de 2018 17:30
  • pedro avila comento esto

    Tengo un problema en el diseño de mi entidad(tabla) Ventas, el número de factura consta de 001-001-000000001 paso a describir a mas detalle los primeros tres dígitos(001) representa el establecimiento, los otros tres dígitos(001) representa el punto de emisión(caja) y los nueve dígitos restantes representa el secuencial(000000001, 000000002, 000000003) un dato importante que cada punto de emisión tiene su propio secuencial.

    el secuencial debe ir en la base de datos para garantizar que sea la secuencia correcta sin importar el clientes que creen facturas, cuando digo clientes me refiero a sistemas facturando.

    Victor Koch

    1.Registrar en el sistema las facturas emitidas manualmente.

    para empezar si la generaste manualmente como tendrá la secuencia correcta??? desde hay ya no puedes.

    2.- quien crea un sistema con base de datos protección, diseño etc. pensando en trabajar sin sistema.

    miércoles, 27 de junio de 2018 20:30
  • Hola Gustavo

    Te pregunte donde guardas la factura

    - El número de factura lo guardo en un campo de nombre NumeroComprobante en el cual guardo 001001000000001 registro el número de serie de Establecimiento y Punto de emisión mas el secuencial de 9 digitos pero mi id es un int identity autoincrementable, eso quiere decir que le doy la potestad al gestor de base de datos que se encargue del Id.

    El Id nos interesa a nosotros como desarrolladores.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    jueves, 28 de junio de 2018 20:30
  • Muchos Ids son Id del mundo real,

    No solo con interés a ti como programador o para el sistema.

    yo veo una llave primaria compuesta por 3 valores 

    y el valor el secuencial de 9 digitos como dices es autoincremental. y con eso ya tienes tu numero de factura funcionando. si así lo haces cual es el problema.

    jueves, 28 de junio de 2018 23:05