Duplicidad al Generar un Numero de Pedido

Espero me puedan ayudar con este tema, quisiera saber si existe alguna forma de bloquear un registro al hacer un select max(id_pedido)+1 en access. Esto debido a que estoy trabajando un proyecto en el cual genero un numero de pedido al presionar el Botón de Grabar.

La inconsistencia que tengo es que estoy trabajando access en red, entonces si 2 usuarios presionan al mismo tiempo el botón de grabar me genera el mismo # de pedido y no logro encontrar la forma para bloquearlo hasta que se grabe.

Mi código es el siguiente:

Private Sub cmdGrabar_Click()

Dim iNumeroPedido As Integer
Dim Sql As String

Dim db As Database
Dim rs As Recordset
Set db = CurrentDb

On Error GoTo error

If Me.Confirmado = False Or IsNull(Me.Confirmado) Then
Me.Monto_total = Nz(Me.txtTotal, 0)
Me.Cantidad_Productos = Nz(Me.txtCantidad, 0)
Me.Cantidad_Articulos = Nz(Me.txtArticulos, 0)
If Me.Cantidad_Productos > 0 And Me.Monto_total > 0 Then
Set rs = db.OpenRecordset("select max(id_pedido)+1 from pedidos_enca")

Do While Not rs.EOF
Me.Id_Pedido = rs(0)
rs.MoveNext
Loop
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
Me.Confirmado = True

DoCmd.RunCommand acCmdSaveRecord

MsgBox "Pedido Guardado Y Confirmado !!!", vbInformation, "Ingreso de Pedidos"

Me.CmdNuevo.Enabled = True
Me.Refresh
Form_Current
Else
MsgBox "El pedido esta mal ingresado o le faltan datos!!!", vbCritical
Err.Clear
End If
Else
MsgBox "El Pedido ya Fue Grabado!!!", vbInformation
End If
Error:
'MsgBox "Existio Un error!!!" & Err. Description, vbCritical, "Error"
'MsgBox Err. Description

End Sub

1 respuesta

Respuesta

Si el campo id_pedido es Autonumérico no debe tener problema, en caso contrario pruebe con este código:

Private Sub cmdGrabar_Click()
Dim iNumeroPedido As Integer
Dim Sql As String
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
On Error GoTo error
If Me.Confirmado = False Or IsNull(Me.Confirmado) Then
Me.Monto_total = Nz(Me.txtTotal, 0)
Me.Cantidad_Productos = Nz(Me.txtCantidad, 0)
Me.Cantidad_Articulos = Nz(Me.txtArticulos, 0)
If Me.Cantidad_Productos > 0 And Me.Monto_total > 0 Then
regrabar:
Err.Clear
Set rs = db.OpenRecordset("select max(id_pedido)+1 from pedidos_enca")
Do While Not rs.EOF
Me.Id_Pedido = rs(0)
rs.MoveNext
Loop
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
Me.Confirmado = True
DoCmd.RunCommand acCmdSaveRecord
MsgBox "Pedido Guardado Y Confirmado !!!", vbInformation, "Ingreso de Pedidos"
Me.CmdNuevo.Enabled = True
Me.Refresh
Form_Current
Else
MsgBox "El pedido esta mal ingresado o le faltan datos!!!", vbCritical
Err.Clear
End If
Else
MsgBox "El Pedido ya Fue Grabado!!!", vbInformation
End If
Error:
If Err.Number = 3022 Then
   Err.Clear
   Resume regrabar
Else
   MsgBox "Existió Un error!!!" & Err. Description, vbCritical, "Error"
End If
End Sub

El código es el que está en negrita y letra Itálica.

Se me olvidó decirle el campo id_pedido debe ser indexado y SIN REPETIDOS.

Muchas gracias, fíjate que no me funciona, debido a que al cargar inicialmente el formulario, arranca con #pedido 0, y si abren los 2 usuarios me dice que hay un error por el índice. Se podrá hacer de otra forma ??

Tendría que mirar su base de datos si puede envíemela a [email protected]. Yo utilizo una función para obtener el último registro, algo como:

En Módulos creo la siguiente función

Public Function siguientepedido() as Long

  siguientepedido=Nz(DMax("[id_pedido]","pedidos_enca")+1,0)

End Function

La función se asegura que el primer pedido comience con 1

En este caso el código cambiaría a:

Private Sub cmdGrabar_Click()
Dim iNumeroPedido As Integer
Dim Sql As String
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
On Error GoTo error
If Me.Confirmado = False Or IsNull(Me.Confirmado) Then
Me.Monto_total = Nz(Me.txtTotal, 0)
Me.Cantidad_Productos = Nz(Me.txtCantidad, 0)
Me.Cantidad_Articulos = Nz(Me.txtArticulos, 0)
If Me.Cantidad_Productos > 0 And Me.Monto_total > 0 Then
regrabar:
Err.Clear
Me.Id_Pedido = siguientepedido()
Me.Confirmado = True
DoCmd.RunCommand acCmdSaveRecord
MsgBox "Pedido Guardado Y Confirmado !!!", vbInformation, "Ingreso de Pedidos"
Me.CmdNuevo.Enabled = True
Me.Refresh
Form_Current
Else
MsgBox "El pedido esta mal ingresado o le faltan datos!!!", vbCritical
Err.Clear
End If
Else
MsgBox "El Pedido ya Fue Grabado!!!", vbInformation
End If
Error:
If Err.Number = 3022 Then
   Err.Clear
   Resume regrabar
Else
   MsgBox "Existió Un error!!!" & Err. Description, vbCritical, "Error"
End If
End Sub

Si no le funciona envíeme su base de datos a [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas