• Domingo 22 de Diciembre de 2024, 07:57

Autor Tema:  Bloqueo de Registros  (Leído 2964 veces)

[Zerox]

  • Nuevo Miembro
  • *
  • Mensajes: 20
  • Nacionalidad: pe
    • Ver Perfil
Bloqueo de Registros
« en: Miércoles 22 de Octubre de 2008, 00:12 »
0
Ante todo buenas colegas, se que este tema ya se ha tocado en el foro, pero la verdad es que no he hayado ninguna solución concreta...

Bueno ante todo decirles que mi problema es el siguiente:

Tengo una aplicación cliente-servidor corriendo en mas de 5 Pcs, y lo que quisiera es bloquear un registro, les pongo un ejemplo:

Tengo una tabla Productos con el campo Stock... (BD Ventas)
(* Esto solo es un ejemplo)

ID         DESCRIPCION              STOCK
--         ----------------              --------
1          MUEBLE XXXX                 2

Al momento en que 2 o 3 personas ingresan al Sistema y justamente en ese momento llegan 2 clientes y piden los 2 muebles cada uno en diferentes sucursales, en el Formulario de Ventas les aparecera 2 muebles a cada vendedor que este usando el sistema...
Logicamente el primero que haga la venta descargara el stock de muebles y el otro vendedor al momento de vender, obtendra un mensaje diciendo que ya se vendieron (previo controlador de errores)...

La idea es no hacer esperar al cliente para decirle despues que se acabo el stock...

Ojala me haya dejado entender
Lo que quisiera es bloquear el registro, o de alguna forma especificar que ese registro esta siendo usado para una venta...

Gracias de antemano
TP-Systems
Our Knowledge is our power...

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Bloqueo de Registros
« Respuesta #1 en: Miércoles 22 de Octubre de 2008, 00:26 »
0
Pues añade un byte que indique si ese registro está siendo usado (byte = 1, usado, = 0 libre). Cuidado con la concurrencia, es decir, es posible que 2 vendedores accedan exactamente a la vez al campo y vean que está a 0 los dos. Aunque la probabilidad de que ello ocurra teniendo tan sólo 5 accesos simultáneos, la Ley de Murphy siempre está ahí. Un saludo.

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Bloqueo de Registros
« Respuesta #2 en: Miércoles 22 de Octubre de 2008, 02:05 »
0
El bloqueo de registros se hace por medio del DBMS, quien es quien se debe de encargar de estas tareas. al menos que estes usando archivos...

Este problema no debe resolverse con programacion

independientemente del patron de diseño que estas utilizando;es en la capa de datos  donde debe resolverse incluso creo que la duda esta en el foro incorrecto ( ya que VB es un lenguaje de programacion  :o :P ) , deberias de especificar que DBMS utilizas y cuales son las formas o metodos en que accesas a los datos.

Comentanos mas sobre tu base de datos, conexiones, y consultas

Cita de: "m0skit0"
Pues añade un byte que indique si ese registro está siendo usado (byte = 1, usado, = 0 libre). Cuidado con la concurrencia, es decir, es posible que 2 vendedores accedan exactamente a la vez al campo y vean que está a 0 los dos...

 :blink:


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Bloqueo de Registros
« Respuesta #3 en: Miércoles 22 de Octubre de 2008, 08:52 »
0
Cita de: "F_Tanori"
   m0skit0 escribió:Pues añade un byte que indique si ese registro está siendo usado (byte = 1, usado, = 0 libre). Cuidado con la concurrencia, es decir, es posible que 2 vendedores accedan exactamente a la vez al campo y vean que está a 0 los dos...


:blink:


 :blink:

[Zerox]

  • Nuevo Miembro
  • *
  • Mensajes: 20
  • Nacionalidad: pe
    • Ver Perfil
Bloqueo de Registros
« Respuesta #4 en: Jueves 23 de Octubre de 2008, 18:05 »
0
Bueno ante todo gracias por la debida atencion

Decirles primero que uso SQL Server 2000, (procedimientos almacenados para inserciones, actualizaciones y eliminaciones)...
Ahora bien, uso recordsets, pero solo para cargar registros y hacer las respectivas consultas y setearlas a sus respectivos Grids..
Para insertar o hacer cualquier movimiento... uso el metodo Execute de la Conexion, al cual le paso el SP respectivo...

Ahora bien, moskito, gracias por el aporte, a lo que entendi, es que cree yo un campo mas en la tabla con el valor de un estado, para saber si esta siendo usado o no... ahora bien, que pasa si un usuario del sistema ingresa y bloquea el registro (poniendole el estado a 1), pero justo en ese momento  se reinicia la PC, el registro se va a quedar bloqueado y nadie podra acceder ya que sigue estando bloqueado... no es que sea muy extremista, pero ustedes saben que como ing. de sistemas o informaticos, tenemos que hacer el programa tan robusto que resista a cualquier imprevisto.

F_Tanori
Agradezco tu aporte, en parte creo que tienes razon, ya que usando transacciones o ISOLATION LEVEL, en este caso con SQL Server se puede boquear tablas o en su defecto con la transaccion evitar errores...

Pero = el cliente perderia tiempo esperando a que en cualquiera de los puntos le digan que justo en ese momento ya se acabo de vender el producto a otra persona.... esto es lo que me preocupa mas que todo

Ver la forma de como poder solucionar este problema...
Gracias de antemano
TP-Systems
Our Knowledge is our power...

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Bloqueo de Registros
« Respuesta #5 en: Jueves 23 de Octubre de 2008, 18:59 »
0
Cita de: "xZerox"
que pasa si un usuario del sistema ingresa y bloquea el registro (poniendole el estado a 1), pero justo en ese momento se reinicia la PC, el registro se va a quedar bloqueado y nadie podra acceder ya que sigue estando bloqueado

Efectivamente, tienes razón, pero ese problema que mencionas en inherente a cualquier sistema concurrente. ¿Qué pasa en un SO cuando un proceso bloquea un recurso y luego se cuelga? Exactamente lo mismo. Es un problema harto complicado de solucionar, aunque se me ocurre que podrías ponerle un time-out al bloqueo, es decir, que pasado cierto tiempo el registro quede de nuevo habilitado para el acceso. Un saludo y suerte.

9tnix

  • Miembro MUY activo
  • ***
  • Mensajes: 165
  • Nacionalidad: pe
    • Ver Perfil
Re: Bloqueo de Registros
« Respuesta #6 en: Jueves 23 de Octubre de 2008, 22:53 »
0
Hola xZerox

A mi se me ocurre un artificio usando sockets, pero la solucion deberia estar como dice F_Tanori en el DBMS, pero se ocurre lo siguiente:

Creas 2 aplicaciones 1 cliente en cada estacion y 1 en el servidor de tal forma que esten conectados permanentemente. el proposito de estar conectados es que cuando 2 o + usuarios accedan al registro al mismo tiempo pues el programa servidor determine quien es el primero que accedio y en una tabla (que esta en el servidor) guarde la siguiente info temporal: IDEquipo, Tabla, IDRegistro, Estado=1 asi cuando el resto quiera acceder pues no podra porque primero para accede a un registro tendra que leer en esta tabla y ver si el registro al que quiere acceder esta o no bloqueado.

Ahora que pasa si se apaga la pc del usuario entonces lo que sucedera es que se perdera la conexion entre los programas cliente y servidor por lo que si sucede eso pues se debe borrar de la tabla (que esta en el servidor) el registro que bloqueo esa maquina que se apago y volvera a estar disponible para el resto de usuarios.

Bueno eso es lo que se me ocurre como artificio, algo laborioso pero es una idea.

Saludos cordiales
Att. Zeekel
TP-Systems
our knowledge is our power!

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Bloqueo de Registros
« Respuesta #7 en: Viernes 24 de Octubre de 2008, 01:35 »
0
Cita de: "xZerox"
Bueno ante todo gracias por la debida atencion

Pero = el cliente perderia tiempo esperando a que en cualquiera de los puntos le digan que justo en ese momento ya se acabo de vender el producto a otra persona.... esto es lo que me preocupa mas que todo


Esto suele arreglarse con mayor o menor comodidad creando un trigger  ( create trigger ), debes indicar el límite cuando el trigger entrará en funcionamiento, por ejemplo si hay 10.000 artículos en stock de un producto está demás, pero si quedan 20 en las  4 tiendas de una ciudad, (por ejemplo) sería bastante útil.

El trigger lo que debería hacer es que una vez que de un producto (o de una lista de productos) queden menos de x cantidades (al caso tener una tabla especificando qué producto y cual es su límite mínimo) en una tabla  (tbl_StockMin) añadir (serían los campos de la tabla) el nombre del producto los artículos que restan, los que están reservados, el período de reserva ( por ejemplo 40 minutos) y hora de reserva ... ahora cuando un cliente pregunte por un producto y demuestre ese interés el 'vendedor' hace la reserva, el trigger se dispara automáticamente (a través de un procedimiento almacenado que en cada llamada consulta  y luego compara el stock del artículo con la tabla tbl_StockMin articulo=el_preguntado y valor <= tbl_Stockmin.min, si se da el caso el trigger comprueba si el artículo consta en la tabla, si no consta lo añade, fija la hora de reserva, y previamente si hubiera una reserva sobre ese artículo comprueba si la hora de reserva + el tiempo máximo de reserva es mayor que la hora actual, si es que sí, ese artículo  libera una unidad de reserva (si las unidades en reserva llegan a cero el artículo se retira de la tabla) , existe por tanto la posibilidad de decirle al cliente que hay una reserva que caducará en x minutos, que si lo desea se pase después de ese tiempo porque o se ha vendido o se ha retirado la reserva. Por supuesto cuando se vende definitivamente esa reserva se retira de la tabla tbl_stockmin y además decrece el stock en una unidad, si las unidades alcanzan definitivamente cero se retira de la tabla y la referencia se pasa a la tabla de artículos agotados para peticiones al almacén o lo que se quiera...)..

Si se cuelga el ordenador, no pasa nada ya que la próxima petición a ese producto actualiza automáticamente el estado actual del producto y de las reservas.

No es necesario programar otro trigger para comprobar la vigencia de una reserva sino que se actualiza justo cuando surja otra petición y compruebe que el stock.

Ten en cuenta que utilizar triggers sin ton ni son hace trabajar muy pesado a una base de datos, por tanto úsalos con cautela...

Hablamos de 2 tablas: Una retiene que artículos serán 'vigilados'  y a partir de que límite de stock  un trigger controla las reservas de ventas y el tiempo máximo de reserva para dicho artículo (por ejemplo un TV puede reservarse 60 minutos, pero una moto 4días y una vivienda 1mes, según el valor el período puede variar e incluso para los de gran valor sólo se admite reserva previo pago anticipado de una cuantía, en dicho caso esa tabla también debería tener ese campo . La otra tabla, la 2ª de la que hablo, mantiene los datos de reserva, producto, stock actual disponible, reservas hora de reserva hora de final de reserva y adicionalmente algún dato del cliente que lo reserva. La primera tabla puede o no crearse o añadir esos campos a las tablas de artículos, lo cual irá en función de que sería más rentable en función de la cantidad de artículos del alamcén, la cantidad de stock de cada artículo, la cantidad de clientes y ventas-reservas, etc... si tienes 10000 artículos pero son 20 los artículos que se venden como rosquillas quizás interese una tabla y sólo sobrecargar cada consulta con una comprobación de procedimiento alamacenado cuando sean alguno de esos 20 artículos los solicitados por el cliente, en los otros 9980 no.
«Ma non troppo»
----> ModoVacaciones = False<----

[Zerox]

  • Nuevo Miembro
  • *
  • Mensajes: 20
  • Nacionalidad: pe
    • Ver Perfil
Re: Bloqueo de Registros
« Respuesta #8 en: Sábado 25 de Octubre de 2008, 18:10 »
0
bueno nebire, me parece buena tu idea, igualmente la de zeekel
Vere cual de las 2 implementare, claro que tomando en cuenta que no se realizan reservas de productos o articulos, ya que no es una regla de negocio de la empresa el separar articulos, pero vale nebire muy interesantes aportes, los tendre en cuenta gracias igualmente a ambos...
TP-Systems
Our Knowledge is our power...