Visual Basic.NET - Aplicación en red, se pierden datos. ¿Cómo solucionarlo?

 
Vista:
sin imagen de perfil
Val: 1
Ha aumentado su posición en 2 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Aplicación en red, se pierden datos. ¿Cómo solucionarlo?

Publicado por Li (1 intervención) el 16/07/2019 20:04:04
Buenas tardes.

Desarrollé una aplicación en VB.Net que ya hace unos años está funcionando en una red que se ha ampliado últimamente. El motor de base de datos que utilizo el SQL Server 2014. Siempre he luchado con el problema de los números (de facturas en este caso) duplicados, pero lo he podido solucionar.

El problema que ahora tengo es que de vez en cuando, cuando toma un nuevo número de la base de datos para asignar a una nueva factura, no toma el último sino el anterior y ha este le suma 1, por lo que el número queda duplicado en el sistema, pero al guardar (como el número de factura es el identificador de la tabla) esos datos no se guardan sino que se pierden.

A continuación copio el código que obtiene el número de factura (función general) y la sentencia Sql para este caso:

Sentencia SQL: "SELECT NroFactura FROM Venta ORDER BY NroFactura DESC"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Function ProximoNumero(SQL As String) As Long
    Dim Conexion As SqlConnection, Trans As SqlTransaction
    Conexion = Interfaz.Instancia.Conectar()
    Dim Comando As New SqlCommand
    Dim Resultado As SqlDataReader
    Dim Proximo As Long
    Try
        Comando = Conexion.CreateCommand
        Trans = Conexion.BeginTransaction
        Comando.CommandText = SQL
        Comando.Transaction = Trans
        Resultado = Comando.ExecuteReader
        If Resultado.Read Then
            Proximo = 1 + Resultado.Item(0)
        End If
        Resultado.Close()
        Trans.Commit()
        Conexion.Close()
    Catch ex As Exception
        Trans.Rollback()
        MsgBox(ex.Message)
    End Try
    Return Proximo
End Function

Detallo también la conexión a la base de datos:

1
ConnString = "Data Source=192.168.1.19,1433;Initial Catalog=BD;User ID=x;Password=x;"
Espero puedan ayudarme. Desde ya muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 153
Ha aumentado 1 puesto en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Aplicación en red, se pierden datos. ¿Cómo solucionarlo?

Publicado por Yamil (631 intervenciones) el 16/07/2019 20:14:31
Lomejor es que dejes que SQL Server se encargue de la generacion del Numero de factura que por lo que cuentas es un consecutivo. Asi que cambialo a tipo de dato Indetity
Tambien seleccionalo como clave primay o como index que no se repita y asi si se va a asignar uno que ya existe por lo menos te da error y no te deja insertar repetidos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Diego
Val: 605
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Aplicación en red, se pierden datos. ¿Cómo solucionarlo?

Publicado por Diego (190 intervenciones) el 16/07/2019 22:21:35
Hola Li, probá esto....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Function ProximoNumero(SQL As String) As Long
	Dim Conexion As SqlConnection
	Conexion = Interfaz.Instancia.Conectar()
	Dim Comando As New SqlCommand(SQL) 'La consulta que debés pasar es: "SELECT max(NroFactura) FROM Venta"
	Dim Proximo As Long = 1
	Try
		Conexion.open
		proximo = Comando.ExecuteScalar() + 1
		Resultado.Close()
		msgbox("Todo OK")
	Catch ex As Exception
		MsgBox(ex.Message)
	Finally
		Conexion.Close()
	End Try
	Return Proximo
End Function

Comentandote resumidamente, utilizas la funcion MAX propia de SQL para buscar el maximo. Si no hubiera ninguno, el valor por defecto de Proximo es 1, asi que devolvés exactamente el 1, si la consulta obtiene algun valor con ExecuteScalar(), obtenes solamente ese numero resultado de la consulta al que le sumas 1 y listo. Es el valor siguiente a la ultima factura que devolves con el Return.

Espero haberte podido ayudar.
Saludos y +Bytes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Wilfredo Patricio Castillo
Val: 1.239
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Aplicación en red, se pierden datos. ¿Cómo solucionarlo?

Publicado por Wilfredo Patricio Castillo (720 intervenciones) el 17/07/2019 19:22:04
A ver, tienes un par de problemas a resolver.

Primero que según tu código inicias una transacción para una lectura que en ese caso es innecesaria y lo único que haces es demorar la operación.

Segundo, consigues el número para mostrarlo en pantalla?, o solo para guardarlo en la tabla?.

Lo que deberías hacer es tener una tabla de correlativos y actualizar dentro de una transacción al momento de grabar la factura, ya que si lo estás haciendo así como muestras el código, corres el riesgo que mientras sales de esa transacción y llevas el número a otro lado, otro usuario entra y se trae el mismo número de la tabla y le suma uno, con lo cual habrían 2 clientes llevando el mismo número de factura y allí ya tendrías el problema del duplicado.

Deberás verificarlo en la transacción si ya está, le sumas uno, sino guardas el que le corresponde.

Saludos cordiales,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar