Problemas al actualizar un recordset

Te planteo el siguiente ejemplo

Fila Campo1

1 Dato1

2 Dato2

3 Dato3

4 Dato3

5 Dato5

Tengo la tabla anterior en un excel y me gustaría actualizarla con los valores 1;2;3;4;5. Para ello tengo el siguiente código.

'--Código que funciona--

For i = 0 To UBound(Datos)
.Update "Titulo", Datos(i)
.MoveNext
If .EOF = True Then
Exit For
End If
Next i

'--Código que funciona--

Sin embargo cuando llega a la fila 3, como el valor que está es igual al de la fila 4 entra en shock y me arroja el error: "-2147467259, Información de columna de clave insuficiente o incorrecta; demasiadas filas afectadas por la actualización."

¿Podría ayudarme a solucionarlo?

1 respuesta

Respuesta
1

Debes tener el id de la fila en el recordset para hacer el update, por ejemplo

Rs. Open "SELECT id, titulo FROM nombre_tabla",...

Si tienes solo la columna titulo

Rs. Open "SELECT titulo FROM nombre_tabla",...

te arrojara un error cuando el recordset tenga dos registros con el mismo titulo ya que no sabrá cual registro es el que debe actualizar.

uhm, no lo entiendo muy bien :-(. Dentro de '--Código que funciona-- abro el recordset con:

.Open "Select * from [" & Hoja & "$]", Data

donde data representa la conexión a excel y hoja la hoja donde están los datos. No se mucho (o nada) de SQL, sólo vba, vb.net y PI así que esto me coge un poco despistao. A mi entender, esto genera un recordset con los datos de esa hoja. Para mi, un recordset es un vector de datos(o matriz) con titulo (Corrígeme, que tu sabes que los autodidactas......). Si uso el id, entiendo que sólo saco uno de los datos, y si uso el titulo, sólo un vector, pero.... como me muevo luego a través de el? usando:

.movenext

.fields.value= Datox

.update

?¿

Conoces algún manual/tutorial que me pueda servir de ayuda?

Mil gracias

Otra cosa,

si uso .recordcount, me devuelve las filas, o lo que es lo mismo, si que distingue los registros que consecutivamente son iguales.

Mi segunda pregunta es ¿existe algún puntero que recorra los record? a lo mejor así....

Para evitar el error cada fila de la hoja del archivo de excel que consultas debe tener un identificador único (id) por ejemplo

A B C

1 1 Dato1

2 2 Dato2

3 3 Dato3

4 4 Dato4

5 5 Dato5

En la columna A están los id's y no se deben de repetir porque son únicos, y en la columna B están los datos, de esta forma cuando hagas el update, el recordset podrá identificar la fila que debe actualizar. La forma en que abres el recordset esta bien.

Cuando abres el recordset este se posiciona en la primera fila, así que si . Fields(0) te arrojará el valor de la columna 1 de la fila 1 (fijate que es base cero), y . Fields(1) te arrojará el valor de la columna 2 de la fila 1; para ir a la siguiente fila es con . MoveNext, después cuando pongas . Fields(0) te devolverá la columna 1 de la fila 2, y . Fields(1) de devolverá la columna 2 de la fila 2; si quieres regresar a la primera fila lo puedes hacer con . MoveFirst el cual sin importar en que fila estés te pasa directamente a la primera fila y cuando hagas . Fields(0) te arrojara el valor de la columna 1 de la fila 1; también puedes regresar a la primera fila con . MovePrevious que es para ir a la fila anterior, es decir si estamos en la fila 2 la anterior es la fila 1, y de igual forma cuando hagas . Fields(0) te arrojará el valor de la columna 1 de la fila 1; para ir a la ultima fila se usa . MoveLast que sin importar en que fila estés te pasa directamente a la ultima fila. Para ir a una fila determinada puedes usar . Move n donde n es el numero de filas que deseas avanzar, pero antes debes posicionarte en la primera fila con . MoveFirst y después avanzar las filas que quieras, por ejemplo si quieres moverte a la fila 5 primero haces . MoveFirst y después . Move 4.


Por ultimo el recordset tiene una propiedad . BOF y otra . EOF, el primero indica que ya has pasado de la primera fila si es así su valor es True y si no su valor es False, es decir si estas en la primera fila y haces un . MovePrevious entonces . BOF sera True porque ya te pasaste de la primera fila es decir estas en una posición anterior a la fila 1 y si haces . Fields(0) te arrojara error porque ya no estas en una fila si no que estas antes de la primera fila. La segunda propiedad es similar pero indica si ya te pasaste de la ultima fila, si estas en la ultima fila y haces . MoveNext entonces . EOF sera True porque ya estas en una posición superior a la ultima fila y si haces . Fields(0) te arrojará error porque ya no estas en una fila si no que estas después de la ultima fila.

La propiedad . RecordCount te devuelve el numero de filas siempre y cuando pongas esta instrucción antes de abrir el recordset .CursorLocation=adUseClient

Para recorrer todas las filas puedes hacer

i=0
Do While Not .EOF
     .Fields(1)=Datos(i)
     .MoveNext
     i=i+1
Loop
.Update

Nota que estoy considerando que el numero de filas del recordset es igual al numero de filas del array Datos, si no es así marcara un error; y solo actualizo el valor de la segunda columna del recordset (la de datos). El código dice Mientras no se haya pasado de la ultima fila del recordset cambiar el dato (segunda columna) de fila actual y después ir a la fila siguiente y repetir el ciclo, cuando se haya pasado de la ultima fila terminar el ciclo y actualizar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas