Insertar un registro en una tabla donde yo le pongo el numero al ID y me lo posiciones en es numero que yo le asigne

Necesito inserta un registro en una tabla donde yo le pongo un id me lo posiciones en ese numero y reenumero todos los registro de la misma tabla un ejemplo registro el numero 10 pero ya tengo un registro con ese numero inserto el registro y me asigna en numero 10 al nuevo registro y hacer el corrimiento de registro anterior que tenia asignado ese numero 10 a 11 y me enumero así todos los demás encontré un código que lo hace pero me lo inserta en un registro después o lo inserta por orden alfabético

2 respuestas

Respuesta
1

Conceptualmente los registros están donde 'encuentran un hueco', el orden se le impone a voluntad indexando (ordenando) por un campo o varios (y el registro no 'cambia de posición).

Desconozco el método que se utiliza para preservar el índice actual, pero es muy fácil conservarlo.

Si quiero introducir un nuevo registro en la posición NN:

Paso 1 (dejar libre esa 'posición' manteniendo el orden actual) lo que se logra incrementando el valor de todos los registros cuya posición ordinal sea igual o superior a la que deseo liberar.

Paso 2 Liberado el hueco ya puedo insertar ese nuevo registro en la posición NN

Para ello se recorre la tabla de mayor a menor (desde atrás hacia adelante) incrementando una posición el registro con respecto a la actual:

For xx = (numero final) TO (numero a liberar)  Step -1

CurrentDb.Execute "Update [aqui la tabla] Set [aqui-el-campo indexado] = [aqui-el-campo-indexado] +1 Where [aqui-el-campo-indexado] = " & XX

Next XX

Al finalizar ese proceso TODOS los registros han aumentado una posición en el índice y deja libre la posición para que inserte el nuevo registro

Como ejemplo: deseo liberar el hueco 33 en un conjunto de 100 en la tabla ABC y el campo XYZ (que es el indexado)

Dim Posicion AS Long
For Posicion = 100 To 33 Step -1
CurrentDb.Execute "Update ABC set XYZ = XYZ +1 Where XYZ = " & Posicion 
Next Posicion 

La posición 33 queda libre y se puede insertar un registro ocupando (virtualmente) esa posición.

NOTA:

Si el campo indexado es un autonumerico, es INDISPENSABLE compactar la aplicación para que se regeneren el /los índices.
Si no se hace eso Access considerara como 'ultimo' al registro recién insertado (el 33 en el ejemplo) y su siguiente 'valor por defecto' será el 34 (y debería ser el 102)

Si el campo indexado NO es autonumerico no se necesita compactar el siguiente será el mayor del conjunto mas uno (en el ejemplo el 101 +1 = 102)

Respuesta
1

Supongamos que tengo la tabla Copia y un formulario basado en ella

Le añado un registro con un IdCliente que ya está, en este caso el 4. Le pongo el nombre del cliente. Puedes ver que el cursor aún está en el control NombreCliente. Cuando pulso Enter, "me los reordena"

En este caso, ya que la instrucción la puedes poner en cualquier otro evento, en el evento Después de actualizar del cuadro de texto Nombrecliente le pongo

Private Sub NombreCliente_AfterUpdate()
If DCount("*", "copia", "idcliente=" & Me.IdCliente & "") = 1 Then
DoCmd.RunSQL "update copia set idcliente=idcliente+1 where idcliente>=" & Me.IdCliente & ""
Me.RecordSource = "select * from copia order by idcliente"
End If
End Sub

Le digo lo de =1 porque hasta que en el nuevo registro el cursor no llegue al control final, "oficialmente" ese registro todavía no existe.

Hola otra vez perdón no les envié el código lo siento para que maso menos vea que es lo que intento hacer prácticamente generar un nuevo registro que yo le asigno una posición que me respete esa posición y me recorra la numeración después de insertar ese registro en esa posición este código que pongo a continuación lo hace, pero no me respeta la orden del número siempre me lo coloca en el número que le indique +1 miren.

Private Sub Consecutivo_Click()

'Dimensionamos las variables

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim factura As String

'Creamos RecordSet

Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("Select * from Clientes")

'Inicializamos la variable contador y recorremos todos los registros del RecordSet

rst.MoveFirst
contador = 1

Do Until rst.EOF

'Actualizamos el campo ID de la tabla

rst.Edit
rst!ID = contador
rst.Update
rst.MoveNext

contador = contador + 1

Loop

End Sub

¿Tu ejemplo es lo que necesito amigo pero yo lo coloco y y marca un error perdón soy principiante pero me apasiona esto te mando mi base y me la puedes checar por fis? Mira mi error

aqui me marca el errar If DCount("*", "copia", "ID=" & Me.ID & "") = 1 Then
DoCmd.RunSQL "update copia set idcliente=idcliente+1 where idcliente>=" & Me.ID & ""
Me.RecordSource = "select * from copia order by ID"
End If
El campo de mi tabla mi numeración es ID pero después de actualizar mi campo Nombre sustituí de acuerdo a a tu código si me posiciona pero me manda a la línea que te indique

Te comento un poco es un cotrol de oficios que luego llegan desfasado en fecha y numero por eso se tienen que insertar en el lugar que les corresponde y recorrer la numeración y tu ejemplo es perfecto pero no se por que me marca error y una disculpa por molestar pero en verdad lo necesito gracias por la ayuda de antemano

Creo que lo mejor es que si quieres, repito, si quieres, mándame un mensaje (sólo el mensaje) a [email protected] y te mando un ejemplo. O, si los datos de tu base no son confidenciales, haz una copia de la tabla y el formulario relacionado y me la envías.

Si lo haces, en el asunto del mensaje pon tu alias Adolfo López, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas