Управление дубликатом ключа в базе данных Access - PullRequest
0 голосов
/ 02 мая 2019

У меня проблема с Access DB и VB6.

У меня есть программа для выставления счетов, и номер счета является уникальным ключом. Проблема в том, что два человека работают одновременно в сети, выставляя счета. Мне нужно убедиться, что номер счета, введенный каждым из них, не существует, чтобы избежать дублирования.

Private Sub GuardarFactura()

If InvoiceNumberExist Then
    MessageBox UserControl.hWnd, "Invoice number duplicate", "Control de errores", vbExclamation
    Exit Sub
End If

On Error GoTo ErrorGuardar

Dim HayTrans As Boolean

AreaDeTrabajo.BeginTrans
HayTrans = True

Screen.MousePointer = vbHourglass

With recFrasEmi
    .AddNew
    !Numero = teInvoiceNumber
    !Fecha = CDate(teFecha)
    !TotalEuros = Format(CDbl(teTotal), FormatoImporte)
    .Update
    .Move 0, .LastModified
End With

AreaDeTrabajo.CommitTrans
HayTrans = False

DoEvents

Screen.MousePointer = vbDefault

Exit Sub

ErrorGuardar:

    If HayTrans Then AreaDeTrabajo.Rollback
    Screen.MousePointer = vbDefault

    MessageBox UserControl.hWnd, Err.Number & ": " & Err.Description, "Control de errores", vbExclamation

End Sub

function InvoiceNumberExist

    dim RS as recordset

    Sql "Select * From Facturas Where Numero='" & teInvoiceNumber & "'"

    Set RS = BD.OpenRecordset(Sql)
    If Not (RS.EOF And RS.BOF) Then
        InvoiceNumberExist=true
    else
        InvoiceNumberExist=false
    End If

end function

InvoiceNumberExist не всегда работает, если пользователи работают одновременно, Я знаю, что могу использовать «если Err = 3022, то ....», но возможно найти дубликат перед ошибкой ??

Спасибо

1 Ответ

0 голосов
/ 03 мая 2019

Спасибо, тогда я думаю, что единственное решение - это использование на goto:

Private Sub GuardarFactura()

On Error GoTo ErrorGuardar

Dim HayTrans As Boolean

AreaDeTrabajo.BeginTrans
HayTrans = True

Screen.MousePointer = vbHourglass

With recFrasEmi
.AddNew
!Numero = teInvoiceNumber
!Fecha = CDate(teFecha)
!TotalEuros = Format(CDbl(teTotal), FormatoImporte)
.Update
.Move 0, .LastModified
End With

AreaDeTrabajo.CommitTrans
HayTrans = False

DoEvents

Screen.MousePointer = vbDefault

Exit Sub

ErrorGuardar:

If HayTrans Then AreaDeTrabajo.Rollback
Screen.MousePointer = vbDefault

If Err=3022 Then
   MessageBox UserControl.hWnd, "Invoice number duplicate", "Control de errores", vbExclamation
Else
   MessageBox UserControl.hWnd, Err.Number & ": " & Err.Description, "Control de errores", vbExclamation
End If

End Sub
...