En Access eliminar registros al azar

Tengo una tabla que no tiene id autonumérico y hay un campo "nroasignado" tipo texto de 4 dígitos, es decir, algo como,

Iddvendedor idloteria idrifa nroasignado

1                           1            2           0001

1                           1            2           0003

1                           1            2           1244

1                           1            2           1345

1                           1            2          1400

Necesito retirar, por ejemplo, 70 registros, pero al azar, no vale ordenar porque se retiraría todos los de una serie, es decir, 0000, 1000.

1 respuesta

Respuesta
1

Martha, interesante su pregunta esto tuve que hacerlo hace un tiempo cuando utilizaba Acccess como backend. Lo puede hacer con estas funciones manipulando los índices y ordenarlos, utilizo el método de la burbuja. Copie este código en un módulo

Public Function EliminarRegistrosAlAzar(n As Integer, idVendedorFiltro As Long, codLoteriaFiltro As Long, rifa As Long)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim sql As String
    Dim totalRegistros As Integer
    Dim indicesEliminar() As Integer
    Dim i As Integer
    Set db = CurrentDb
    ' Obtener los registros filtrados y ordenados por NroAsignado
    sql = "SELECT * FROM tblNrosAsignados " & _
          "WHERE idVendedor = " & idVendedorFiltro & " AND CodigoLoteria =  " & codLoteriaFiltro & _
          " AND idrifa=" & rifa & " ORDER BY NroAsignado"
    Set rs = db.OpenRecordset(sql, dbOpenDynaset)
    If rs.RecordCount = 0 Then
        MsgBox "No hay registros que coincidan con los filtros."
        Exit Function
    End If
    rs.MoveLast
    totalRegistros = rs.RecordCount
    rs.MoveFirst
    If n > totalRegistros Then
        MsgBox "No hay suficientes registros para eliminar " & n & " al azar."
        Exit Function
    End If
    ' Generar una lista de índices únicos al azar
    ReDim indicesEliminar(1 To n)
    Dim indice As Integer, duplicado As Boolean
    Randomize
    For i = 1 To n
        Do
            duplicado = False
            indice = Int(Rnd() * totalRegistros) + 1
            ' Verificar que no esté repetido
            Dim j As Integer
            For j = 1 To i - 1
                If indicesEliminar(j) = indice Then
                    duplicado = True
                    Exit For
                End If
            Next j
        Loop While duplicado
        indicesEliminar(i) = indice
    Next i
    ' Ordenar los índices para procesarlos desde el final
    Call ordenacion_burbuja(indicesEliminar)
    ' Eliminar los registros según índice
    For i = n To 1 Step -1
        rs.MoveFirst
        rs.Move indicesEliminar(i) - 1
        rs.Delete
    Next i
    MsgBox n & " registros eliminados al azar.", vbInformation, "Eliminando Números asignados"
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Function
Private Sub ordenacion_burbuja(arr() As Integer)
    Dim i As Integer, j As Integer, temp As Integer
    For i = LBound(arr) To UBound(arr) - 1
        For j = i + 1 To UBound(arr)
            If arr(i) > arr(j) Then
                temp = arr(i)
                arr(i) = arr(j)
                arr(j) = temp
            End If
        Next j
    Next i
End Sub

Construí una tabla de acuerdo con los campos que suministro en la consulta, no obstante, cambie el nombre de la tabla tblNrosAsignados y el nombre de los campos de acuerdo con sus datos,

Ejemplo de llamada:

 EliminarRegistrosAlAzar(20,17,1,2).

Elimina 20 registros del idevendedor=17, CodigoLoteria=1 e idrifa=2.

Lo probé y funciona correctamente.

¡Gracias!  Eduardo una maravilla su función era lo que necesitaba.

Un saludo

Con mucho gusto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas