• Viernes 3 de Mayo de 2024, 01:12

Autor Tema:  Bloqueo De Registros  (Leído 2942 veces)

Juan C

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Bloqueo De Registros
« en: Jueves 23 de Septiembre de 2004, 22:52 »
0
Hola a todos:

La situación es la siguiente:
Tengo un programa que está trabajando muy bien, es de ventas, inclusive para red y la base de datos esta en un servidor.
El problema es que si quiero añadir un registro por ejemplo para grabar (añadir con addnew) una venta, pero si de dos maquinas o mas quieren añadir al mismo tiempo el registro (exactamente al mismo tiempo oprimen la tecla para grabar), como tiene que registrar el numero de la venta tengo conflicto con la actualización de los datos o que me de el número consecutivo de la venta.

Este problema solo lo hace si se oprime la tecla de grabar al mismo tiempo en diferentes máquinas, si pasa una fracción de segundo, no hay problema.

Alguien por favor me puede decir si hay que bloquear  el registro si es asi como le hago, o de que manera lo puedo solucionar.

Muchas gracias

PD realmente me urge

Saludos

Juanolo

  • Miembro MUY activo
  • ***
  • Mensajes: 202
    • Ver Perfil
Re: Bloqueo De Registros
« Respuesta #1 en: Jueves 23 de Septiembre de 2004, 23:35 »
0
Hola, Juan.

Tengo un par de dudas: ¿De dónde sacas el número de la venta? ¿En que momento se produce el error?
Te lo pregunto porque realmente no veo que el problema esté al añadir registros. Yo tengo un sistema similar en donde el número de factura está en una tabla de la base de datos. Cuando se realiza una venta, voy a esa tabla, tomo el número actual para el documento y lo incremento en uno para la nueva venta.
Es en esta tabla donde se debe controlar un posible error por encontrar el registro bloqueado (debo usar 'edit' para incrementar el número). En caso de error, puedes colocar un simple retardo como el siguiente:

Código: Text
  1. for i=0 to 1000
  2.   i=i+1
  3. next i
  4.  

y luego vuelves a intentarlo con la instrucción resume.

Ahí nos cuentas.

Salu2.
La luz que sólo se ilumina a sí misma, es oscuridad.

Juan C

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Bloqueo De Registros
« Respuesta #2 en: Jueves 23 de Septiembre de 2004, 23:46 »
0
Juanolo:

De antemano muchas gracias por interesarte a ayudarme

Efectivamente es algo muy similar a lo que escribiste.

El número consecutivo lo tomo del ultimo registro de la tabla de ventas ( o facturas) y lo incremento en uno, el problema que me da es que pueda suceder que exactamente al mismo tiempo de dos maquinas quieran acceder a ver el ultimo registro para tomar el numero e incrementarlo, asi tendria dos ventas con el mismo número y como no se aceptan duplicados ahi estará el problema, voy a itrabajar un poco con lo que me dices, lo que no entiendo para ponerlo en EDIT, yo uso lo sig. para abrir la tabla:

Set rsVenta = New ADODB.Recordset
rsVenta.Open "Select * from ventas", cnC, adOpenKeyset, adLockOptimistic

Gracias y saludos

Juanolo

  • Miembro MUY activo
  • ***
  • Mensajes: 202
    • Ver Perfil
Re: Bloqueo De Registros
« Respuesta #3 en: Viernes 24 de Septiembre de 2004, 00:10 »
0
Ok... Es que yo estoy en el pasado... Uso DAO.
Efectivamente cuando intenté con ADO me volví loco buscando el comando Edit; je, je.
Lo que hago es ir al registro y editarlo (al tiempo que leo el número). Mientras lo estoy editando, que es una fracción de segundo, el registro permanece bloqueado, lo que hace que otra máquina que intente lo mismo reciba un error interceptable.
El manejo de error a que me refiero más arriba, permite a la máquina intentar nuevamente el cambio, entonces el registro ya estará desbloqueado y con el número ya actualizado.
Ahora bien, eso es en DAO, en donde el registro se bloquea automáticamente cuando recibe la instrucción edit. Me imagino que en ADO debe existir la posibilidad de realizar un manejo similar.

Suerte.
La luz que sólo se ilumina a sí misma, es oscuridad.

Juan C

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Bloqueo De Registros
« Respuesta #4 en: Lunes 27 de Septiembre de 2004, 18:11 »
0
Hola:
En DAO es buena opción al usar edit se bloquea el registro, pero como le hago en ADO, para indicarle que bloquee un registro determinado, esa sería ahora mi duda

si alguien me ayuda mil gracias:

Juan Carlos

seek20

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: Bloqueo De Registros
« Respuesta #5 en: Martes 28 de Septiembre de 2004, 21:04 »
0
Hola!!!

Tengo una duda, la base de datos que estás usando es Access o SQL???, bueno el caso es que para cualquiera de los dos tipos tu puedes modificar la llave primaria de tu tabla de ventas y ponerlo como un número automático (Autonumeric para Access y Identity para SQL), con esto te evitas hacer el cálculo del consecutivo de venta ya que la base de datos lo hace en automático, pero para esto será necesario modificar la consulta de inserción a la tabla de ventas y ya no pasar más el campo del consecutivo de venta ya que lo hará solo la base de datos.

Espero que te sirva esta información, de cualquier manera quedo a tus órdenes para cualqueir duda que tengas.

Suerte y comunicas que fue lo que pasó!!!

 :devil:

Sagutxo

  • Miembro MUY activo
  • ***
  • Mensajes: 320
    • Ver Perfil
Re: Bloqueo De Registros
« Respuesta #6 en: Lunes 4 de Octubre de 2004, 14:08 »
0
Salu2.

No estoy seguro de que sea el mismo caso, pero yo al abrir las TABLAS de la DB uso la opcion DBDENYWRITE y así no permite entrar a esa tabla mas que como lectura hasta que la cierres. Así que con ponerle un while no pueda abrir la tabla bastará.

set Var=base.openrecordset("tabla",dbOpenDynaset,dbdenywrite)

P.D.
Si usas eso, te recomiendo que pongas un caracter de escape por si acaso la tabla se bloqueara mucho tiempo, hay ususarios de todo tipo.
Mi mujer tiene un físico bárbaro!!!. Einstein.

Juan C

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Bloqueo De Registros
« Respuesta #7 en: Jueves 7 de Octubre de 2004, 23:08 »
0
Hola:


Gracias a todos po interesarse y escribirme.

Oye Saquotxo, eso que pones creo es para DAO y yo estoy trabajando en ADO, de todos modos muchas gracias.

Que tal Seek20, efectivamente puedo poner el campo autonúmerico, y evito ver el último registro, pero si hago esto mi pregunta sería, que pasa por ejemplo:

Si estoy en el número de venta 50, como está en red, van un usuario da de alta otra ventas (addnew), enseguida otro usuario da de alta (addnew), que pasa si los dos al mism tiempo exacto graban la venta (update), cual seria 51 y cual 52, o que es lo que pasa con el registro cundo uso addnew, hay forma de bloquerlo?.

Por que ya me entere que con DAO usando el metodo Edit, se bloquea el registro y con ADO, automaticamente cuando estoy modificando un campo entra en modo de edición y se bloquea, pero cuando doy de alta?


Muchas gracias

Saludos
Juan Carlos