none
Control de stock al emitir factura RRS feed

  • Pregunta

  • Tengo 3 tablas factura, lineas_factura y producto como debo hacer para restar el stock
    1.-Debo hacer los update para restar el stock dentro de la transaccion mejor dicho al momento de grabar la cabecera de la factura y sus items.
    2.-Aplicar consultas sql al stock para sumar y/o restar los productos cada vez que se ingrese un item al Datagrid antes de hacer la transacion.
    Habra 3 usuarios en simultaneo y no quiero que se emita una factura y no haya stock.
    Nota antes de ingresar un item al datagrid estoy verificando si hay stock pero mas nada, solo eso.
    martes, 15 de diciembre de 2009 17:33

Todas las respuestas

  • Hola Frankxsd.

    Te voy comentar un resumen básico acerca del tema, ya que el temas es bien extenso!

    1. Para trabajar con modulo de facturación en su forma basica se deberia trabajar con las siguientes tablas:
      CategoriaProductos, Productos, Clientes, Inventario, EncFactura, DetFactura.
    2. Hacer respectiva relación de las tablas (Tú puede determinar el grado de normalización que desea dar).
    3. En el caso de la concurrencia contra la disponibilidad de un articulo, debe establecer un escenario de Bloqueo bien sea Optimista o pesimista
    4. El sistema tiene que ser abierto a generar inventario negativo, te explico esto ya que mucha compañia le cuesta tener su inventario en orden, es decir no son exacto, o estan por abastecer su inventario!

    Algunas opciones:
    Algunas ERP actuales usa Bloqueos (es decir no permite la concurrencia en cierto escenarios) o simplemente hacer operaciones de base de datos en tiempo real!. 
    Tambien la estrategia de usar Columna  Bandera, para saber cuando esta siendo usado por otro usuario y contralar esto.
    Finalmente  se puede trabajar con tablas temporales fisica para hacer seguimiento de operaciones de base de datos.

    En fin amigo, hay muchas alternativas y mejores practica para esto!

    Para mayor información sobre la concurrencia: http://msdn.microsoft.com/es-es/library/cs6hb8k4.aspx

    Saludos.

    Si te ayudo esto, calificame como respuesta


    Developer .NET
    martes, 15 de diciembre de 2009 19:51
  • Como vas, de hecho si tengo las tablas que mencionas con sus respectivas pk, fk y relaciones menos la tabla de inventario ya que estoy haciendo un pequeño sistema solo de ventas y control de stock, el campo stock esta incluido en la tabla producto.

    Segun el link estoy aplicando "el ultimo gana" que no sera lo mas optimo pero lo tengo asi por el momento, la pregunta en si es para saber en que momento debo restarle al campo stock de la tabla producto y para el caso que mencionas para un sistema multisuario(concurrencia y bloqueos), como lo aplicaria, en que momento debo hacer la adicion?

    A que te refieres con abierto a inventario negativo, tambien me han dicho que para los bloqueos es mejor utilizar la columna bandera, en fin soy novato todavia, si puedes poner ejemplos simples estaria bueno pero bastara con comentarios, saludos y gracias por responder.

    miércoles, 16 de diciembre de 2009 2:26
  • Hola frankxsd.

    Primeramente recuerda que no  es lo mismo un campo Stock(maximo,minino)  que decir el stock de un producto (existencia).
    Una buena practica de Normalizacion  seria una Tabla Articulo y otra Tabla CantidadArticulo (Donde se espefique los almacenes relacionado).

    Ahora veo que el proyecto es algo academico y no comercial.Entonce puede controla la disponibilidad del producto en la misma tabla producto.

    Ahora amigo  la concurrencia optimista seria la recomendación para escenario Desconectado, donde se maneje dataset
    Te puede apoyar en columna bandera (flag) como: Fecha Hora  o  Numero de Version.

    Una forma de controlar la concurrencia es actualizar sólo si el valor de la cláusula WHERE coincide con el valor del registro. La representación SQL de este planteamiento es: UPDATE productos SET Existencia = Existencia -  @Cantidad  WHERE DateTimeStamp = @origDateTimeStamp

    Alternativamente, se puede realizar la comparación con el número de versión:
    UPDATE productos SET Existencia = Existencia -  @Cantidad WHERE RowVersion = @origRowVersionValue

    Si las marcas de fecha y hora o los números de versión coinciden, el registro del almacén de datos no ha cambiado y se puede actualizar de manera segura con los nuevos valores del conjunto de datos.

    Efectivamente tú puede realizar un proceso de refrescar datos previamente antes de procesar la factura, de tal manera que sí se realizaron cambios tu por medio de la aplicación lo notifique y no procesa nada hasta que usuario reprocese nuevamente.

    Y Cuando me refiero con abierto a inventario negativo (que puede seguir facturando articulo, asi no este en existencia!)

    Cualquier cosa me avisa
    saludos.

    por favor calificame como respuesta


    Developer .NET
    miércoles, 16 de diciembre de 2009 11:03
  • Hola Megasoft2,

    Estoy realizando una aplicación muy parecida a lo que habeis comentado y me estoy peleando con los eventos y generación de objetos cada vez que inserto una linia en el datagridview, ya que mi aplicación es 100% orientada a objetos. Utilizo el evento AddingNew para crear el objeto linia e insertarlo en la base de datos para después modificarlo con los datos que me introduzca el usuario.

    En este entorno es aconsejable utilizar controles datagridview de terceros?... ya que estoy viendo que me consume mucho tiempo el desarrollar cada evento. Y por ultimo, has aplicado alguna vez este tipo de arquitectura con transacciones para el control del stock, incluyendo claro está la concurrencia?.

    Decirte que estoy desarollando una arquitectura de 3 capas, y además en la capa de presentación he implementado un patron MVP (Model-View-Presenter) para mejorar la flexibilidad en la capa de presentación.

    Grácias de antemano.
    Albert Gassó
    Ingeniero Técnico en Informática
    sábado, 19 de diciembre de 2009 0:54