Access - Actualizar campos o registros de tabla desde modulo o por código

 
Vista:
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Access (en relación al último mes)
Gráfica de Access

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Miguel (56 intervenciones) el 16/12/2023 03:15:23
Hola a todos.
Tendrán un buen ejemplo de como podría agregar registros (campo a campo) a partir de una consulta y todo por medio de código?

Tengo una consulta que me resume o agrupa algunos datos y que sería mi fuente de datos esta consulta que llamaré QryOrigen

A partir de esta consulta, deseo evaluar registro por registro y de acuerdo a algunas consideraciones, que me sume o acumule algunos datos y luego agregue un registro nuevo resumen en una nueva tabla destino que llamaré TblDestino

Finalmente deseo volcar todo la qryorigen dentro de tblDestino


El resultado final de TblDestino debería tener todos los registros de QryOrigen + registros evaluados (estos serán bajo una determina lógica omoun acumulativos de algunos registros)

Por que bajo código y no por consulta normal? porque la validación es algo compleja y es mejor trabajarlo por código.


Como lógica la tengo clara pero me falta saber como abro una consulta y que los registros de esa consulta estén en memoria y los pueda evaluar y pasar de registro en registro evaluando.


Espero sea algo explicito mi pedido. Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Anonimo (3316 intervenciones) el 16/12/2023 20:47:38
La forma de manipular los registros (o cualquier conjunto de datos) es creando un Recordset y se tendrá acceso a todo su contenido (campo a campo y registro a registro)

En síntesis:

Se dimensiona un recordset
Se la adjudica la SQL (la consulta)
.- A partir de este punto (y mientras no se cierre) se puede acceder a cualquier campo y registro del conjunto de datos

Para modificar y guardar un dato en un registro, se ha de poner en modo 'edición' al recordset, cambiar los valores que se precisen y guardar el registro (si no se guarda antes de cambiar de registro, se cancela la edición y los cambios son ignorados)

Para recorrer el recordset se puede ir al primero al ultimo, al siguiente, al anterior, asignar un desplazamiento o localizar por coincidencia.

Al finalizar con los cambios es una buena costumbre cerrar el recorset y liberar la memoria que ocupa.

La forma mas cómoda de añadir registros es generando una consulta de inserción, tras ello copiar la SQL y utilizarla en VBA (ejecutarla tras componerla asignado los nuevos valores).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Eduardo Pérez Fernández (317 intervenciones) el 17/12/2023 22:43:54
Puede hacerlo con DAO o ADO, partiendo de un recordset el cual debe recorrer y con base a los criterios va haciendo un INSERT INTO el respectiva tabla. Le dejo un modelo


DIM rs AS DAO.Recordset

set rs=currentdb.Opendrecordset("NombreConsulta")

DO UNTIL rs.EOF

' Aca evaluia sus criterioso

IF secumplet THEN
currentdb.Execute "INSERT INTO sutabladestino(campo1,campo2, campo3) VALUES(uno,dos,tres)
ENDIF


rs.MoveNext

LOOP

Esto es una aproximación
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Access (en relación al último mes)
Gráfica de Access

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Miguel (56 intervenciones) el 19/12/2023 01:48:31
Gracias por tu respuesta.
Es algo así lo que estaba buscando. Me has dado una idea y me pondré a trabajar en ello.

Vamos a ver como me va.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Access (en relación al último mes)
Gráfica de Access

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Miguel (56 intervenciones) el 20/12/2023 04:47:00
Hola Eduardo. Al momento voy bien y logrando lo que deseo, pero me queda una duda:

Es posible crear un recorset a partir de una consulta sql ?

es válido lo siguiente? o como sería?

Lo que deseo es crear un recordset a partir de una consulta sql (asignada en variable Miqry). Luego de creado el recordser en MiRs1, elimino los registros de esa tabla y almaceno la tabla vacía en recordset 2 (MiRs2)

finalmente los registros de MiRs1 se agregaran en MiRs2 bajo alguna validaciones previas.

Es correcto lo que estoy haciendo?

Miqry = "SELECT campo1, campo2, campo3, campo4, campo5 FROM mitblatmp ORDER BY campo1, campo2"
Set MiRs1 = MiDbs.OpenRecordset(Miqry)
DoCmd.SetWarnings False
DoCmd.RunSQL "Delete * from mitblatmp"
DoCmd.SetWarnings True
Set MiRs2 = MiDbs.OpenRecordset("mitblatmp")

With MiRs1
MiRs1.MoveFirst
Do While Not .EOF
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Eduardo Pérez Fernández (317 intervenciones) el 20/12/2023 13:37:03
Le dejo esta idea

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Dim MiDbs As DAO.Database
Dim MiRs1 As DAO.Recordset
Dim MiRs2 As DAO.Recordset
Dim Miqry As String
 
' Establecer la conexión a la base de datos actual
Set MiDbs = CurrentDb
 
' Definir la consulta SQL
Miqry = "SELECT campo1, campo2, campo3, campo4, campo5 FROM mitblatmp ORDER BY campo1, campo2"
 
' Crear el primer Recordset (MiRs1) con los resultados de la consulta
Set MiRs1 = MiDbs.OpenRecordset(Miqry)
 
' Deshabilitar las advertencias de Access antes de eliminar los registros
DoCmd.SetWarnings False
 
' Eliminar todos los registros de mitblatmp
DoCmd.RunSQL "DELETE * FROM mitblatmp"
 
' Volver a habilitar las advertencias de Access
DoCmd.SetWarnings True
 
' Crear el segundo Recordset (MiRs2) con la tabla vacía
Set MiRs2 = MiDbs.OpenRecordset("mitblatmp")
 
' Copiar los registros de MiRs1 a MiRs2
With MiRs1
    .MoveFirst
    Do While Not .EOF
        ' Realizar validaciones previas aquí si es necesario
 
        ' Agregar el registro a MiRs2
        MiRs2.AddNew
        MiRs2!campo1 = !campo1
        MiRs2!campo2 = !campo2
        MiRs2!campo3 = !campo3
        MiRs2!campo4 = !campo4
        MiRs2!campo5 = !campo5
        MiRs2.Update
 
        .MoveNext
    Loop
End With
 
' Cerrar los Recordsets
MiRs1.Close
MiRs2.Close
 
' Liberar recursos
Set MiRs1 = Nothing
Set MiRs2 = Nothing
Set MiDbs = Nothing

Este código mejora la gestión de errores, cierra correctamente los recordsets y libera los recursos cuando ya no son necesarios. Además, añade un bloque para realizar validaciones previas antes de agregar los registros a MiRs2. Asegúrese de adaptar las asignaciones de campo según la estructura real de su tabla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Access (en relación al último mes)
Gráfica de Access

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Miguel (56 intervenciones) el 20/12/2023 20:18:25
Indudablemente eres muy organizado y haces una programación bastante ordenada, clara, estructurada y bien documentada.
Suelo hacer algo similar pero no tanto jejejeje y después son los dolores de cabeza para recordar cada cosa.
Definitivamente seguiré tu ejemplo.

Lo he hecho tal cual lo has indicado y me sale un error de que el registro ha sido eliminado. Puede ayudarme a ubicar el error?

Voy a a recrear tu ejemplo e indicaré donde aparece el error. He obviado algunas líneas de arriba pero es tal cual lo has indicado



' Definir la consulta SQL
Miqry = "SELECT campo1, campo2, campo3, campo4, campo5 FROM mitblatmp ORDER BY campo1, campo2"

' Crear el primer Recordset (MiRs1) con los resultados de la consulta
Set MiRs1 = MiDbs.OpenRecordset(Miqry)

' Deshabilitar las advertencias de Access antes de eliminar los registros
DoCmd.SetWarnings False

' Eliminar todos los registros de mitblatmp
DoCmd.RunSQL "DELETE * FROM mitblatmp"

' Volver a habilitar las advertencias de Access
DoCmd.SetWarnings True

' Crear el segundo Recordset (MiRs2) con la tabla vacía
Set MiRs2 = MiDbs.OpenRecordset("mitblatmp")

' Copiar los registros de MiRs1 a MiRs2
With MiRs1
.MoveFirst
Do While Not .EOF
' Realizar validaciones previas aquí si es necesario

' En este punto, asigno todos los campos a unas variables y es en primera asignación de campos que me da el error:
' Se ha producido el error '167' en tiempo de ejecución:
' Record is deleted

xcampo1 = !campo1: xcampo2 = !campo2: xcampo3 = !campo3

' Agregar el registro a MiRs2
MiRs2.AddNew
MiRs2!campo1 = !campo1
MiRs2!campo2 = !campo2
MiRs2!campo3 = !campo3
MiRs2!campo4 = !campo4
MiRs2!campo5 = !campo5
MiRs2.Update

.MoveNext
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 8
Ha aumentado su posición en 5 puestos en Access (en relación al último mes)
Gráfica de Access

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Miguel (56 intervenciones) el 21/12/2023 01:14:24
Trate de sacarle la vuelta al error y no encuentro que puede pasar.
Será que siendo la misma tabla a la cual guardo inicialmente todos sus registros en el MiRs1 y que después le elimino todos sus registros para poder asignarla como tabla vacía en Mirs2, cree el conflicto?

Porque el error es claro en indicarme en esa primera asignación de campos, que el registro ha sido eliminado, sin embargo consulto o muestro con msgbox ("nro de registros en recordest 1: " & Mirs1.recordcount()) este resultado me trae 1931 registros que son los que tiene la tabla inicialmente.

Son los recordset independientes de las tablas o consultas que los generan? Osea si asigno una tabla a un recordset, y luego esa tabla sufre cambios como son eliminación de registros, el recordset debería seguir inmutable o sin cambios o es que internamente son lo mismo tabla y recordset ??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Actualizar campos o registros de tabla desde modulo o por código

Publicado por Anonimo (3316 intervenciones) el 21/12/2023 01:45:49
Es un extraño planteamiento, lo adecuado -si solo se desean una parte de esos datos- consiste en borrar los indeseados tras hacer las oportunas verificaciones.

Pero lo optimo seria aplicar esa validación en la consulta que obtiene los actuales, para ello se puede utilizar una función que haga las validaciones y en la consulta aplicarla como una condición mas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar