Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Problema al guardar datos desde varias estaciones

Estas en el tema de Problema al guardar datos desde varias estaciones en el foro de Visual Basic clásico en Foros del Web. Saludos amigos. Tengo un problema; un sistema escrito en vb6 con base de dato en mysql, está instalado en una tienda de mas de 8 ...
  #1 (permalink)  
Antiguo 13/05/2012, 20:55
Avatar de Ticosoft  
Fecha de Ingreso: agosto-2008
Mensajes: 29
Antigüedad: 15 años, 8 meses
Puntos: 1
Exclamación Problema al guardar datos desde varias estaciones

Saludos amigos.
Tengo un problema; un sistema escrito en vb6 con base de dato en mysql, está instalado en una tienda de mas de 8 estaciones de ventas masivas y unas 6 estaciones de uso administrativo. A nivel de red y conexión trabaja super bien, el problema está, cuando después de cada venta registro la operación en una tabla (DocumentoVenta). Pero antes de guardar los datos realizo un Query para saber el ultimo numero de documento guardado y al valor devuelto le sumo 1.. (x = Nreg + 1), asi obtengo el próximo numero de documento a ocupar. El problema se presenta cuando 2 o mas estaciones llegan a guardar el registro al tiempo, bien me repite un registro 2 veces, o el correlativo me salta valores, ejm: (1250,1251,1253,1254).

¿Que puedo hacer para mejorar este problema?
¿Que me sugieren?

Atento a su ayuda al respecto.
  #2 (permalink)  
Antiguo 14/05/2012, 12:11
Avatar de lokoman  
Fecha de Ingreso: septiembre-2009
Mensajes: 502
Antigüedad: 14 años, 7 meses
Puntos: 47
Respuesta: Problema al guardar datos desde varias estaciones

Hola!
Por que no haces un numero combinado con la terminal? Así cada terminal tendrá su propia numeración:

Para la terminal 1 las secuencias:
• T1-0001
• T1-0002
• T1-0003
...
...
• T1-004

Para la terminal 2 las secuencias:
• T2-0001
• T2-0002
• T2-0003
...
...
• T2-004

Y así sucesivamente...

Una forma para números no repetidos, es una combinación de la fecha y la hora, así:
• YYMMDDHHMMSS = 120514135625

El código seria

Código vb:
Ver original
  1. Numero=Format(DateValue(Date), "YYMMDD") _
  2. & Replace(Replace(UCase(Replace(TimeValue(Time), ":", "")), "AM", ""), "PM", "")

Pero de esta forma no seran correlativos por los minutos y segundos...

O tambien puedes poner un bloqueo en la aplicacion al momento de guardar la transaccion, mientras esta bloqueado, que se muestre el relog de arena o alguna información en un Label y cuando se termine de guardar se desbloquee esa transaccion y asi se continua con la otra que estaba en cola... Con un Timer que verifique el estado de la transaccion en una tabla (si se esta guardando o no) se resuelve... algo asi:

Código vb:
Ver original
  1. Private Sub Timer_Timer()
  2. 'CON LAS PROPIEDADES DEL TIMER ENABLED=TRUE
  3. 'Y CON UN INTERVALO DE 1000 (QUE ES 1 SEGUNDO)
  4.  
  5.     Dim strSelect As String, strInsert As String
  6.     Dim rstEstado As ADODB.Recordset
  7.    
  8.     Set rstEstado = New ADODB.Recordset
  9.    
  10.     strSelect = "SELECT * FROM ESTADO"
  11.     rstEstado.Source = strSelect
  12.     rstEstado.Open , Conexion, adOpenDynamic, adLockBatchOptimistic
  13.    
  14. 'CONSULTA EL ESTADO, SI SE ESTA GUARDANDO O NO
  15. 'DEBES INSERTAR UN LABEL CON EL NOMBRE= lblInformacion
  16.  
  17.     If rstEstado.EOF = False Then
  18.             lblInformacion.Caption= "Espere un momento..."
  19.  
  20. 'LIBERAMOS EL RECORDSET
  21.            If rstEstado.State=1 then rstEstado.Close
  22.             Set rstEstado=Nothing
  23.  
  24.             Exit Sub
  25.     End If
  26.  
  27. 'SI NO HAY DATOS GUARDÁNDOSE EN LA TABLA, ENTONCES    
  28. 'SE INSERTA ESTADO DE LA CARGA EN LA BD
  29. 'DEBES CREAR UNA TABLA LLAMADA "ESTADO" CON LOS CAMPOS "FECHA" Y "ESTADO", AMBOS TIPO VARCHAR
  30.  
  31.      strInsert = "INSERT INTO ESTADO (FECHA, ESTADO) VALUES ('" _
  32.                         & Format(DateValue(Date), "DD/MM/YYYY")  & "','GUARDANDO')"
  33.      Conexion.Execute strInsert
  34.        
  35. 'AQUI GUARDAS TU TRANSACCION
  36. '
  37. ' CODIGO DE GUARDAR
  38. '
  39. 'AQUI GUARDAS TU TRANSACCION
  40.  
  41.      DoEvents
  42.  
  43. 'AQUI SE LIMPIA LA TABLA DE ESTADO PORQUE YA GUARDAMOS NUESTRA TRANSACCION            
  44.     Conexion.Execute "DELETE FROM ESTADO"
  45.  
  46. 'LIBERAMOS EL RECORDSET
  47.    If rstEstado.State=1 then rstEstado.Close
  48.     Set rstEstado=Nothing
  49.  
  50.     lblInformacion.Caption= Empty
  51. End Sub


Tambien si validas en tu base de datos que el numero de documento no se duplique, al momento de guardar y otro usuario ya tomó esa numeracion, le saltará una advertencia al usuario, y al intentar otra vez debe guardar sin problemas, porque el anterior ya guardó... el problema está en que si son varias terminales, el usuario va a estar dando clic al boton de guardar hasta que guarde... o haces una rutina con un FOR para que la aplicacion intente guardar automaticamente cuando presente este error.

Espero que te ayude...

Última edición por lokoman; 14/05/2012 a las 12:49

Etiquetas: vb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:43.