¿Por qué se agregan registros a la tabla sin macro ni evento?

Tengo un problema con mi botón de comando en access. La situación es la siguiente, tengo un formulario en el cual los varios campos son ingresados a la tabla a través de un botón de comando, este no fue creado por asistente y tiene la generación de código para poder hacer el insert. El problema es que aunque no tenga la macro para hacer el insert y comentando las sentencias que hacen el alta de los datos, el registro es agregado. Cuando descomento la consulta insert, ¿la inserción del registro la hace dos veces... Porque puede estar pasando esto o que es lo que tengo que tener en cuanta para que no suceda?

1

1 Respuesta

43.275 pts. Soy Programador de Aplicaciones MS Access en sus...

Tendría que ver código, ya que no es posible determinar con lo que comentas el problema, si fuera posible me adjuntas algunas capturas de pantalla y el código efectuado. En el mejor de los casos adjuntar la base de datos enviándola a [email protected] de esta form podré ayudarte en lo que necesitas.

De todas formas podría deberse a que la macro se ejecuta 2 veces y no 1 sola,

Atentamente. Miguel Sandoval

A ver, te copio el código:

Private Sub addItem_Click()
Dim DB As Database
Dim rst, rst1 As Recordset
Dim strSQL, strSQL2, strSQL3 As String
Dim fechaActual As Date
Set DB = CurrentDb
fechaActual = Date
n_exp = id_exp_sg & "-" & Year(fechaActual)
strSQL = "INSERT INTO Expediente (id_exp_sg, id_exp_mge, id_exp_origen, Iniciador, Extracto) VALUES ('" & n_exp & "','" & id_exp_mge & "','" & id_exp_origen & "','" & Iniciador & "','" & Extracto & "');"
'MsgBox "query :" & strSQL
DB.Execute strSQL
strSQL2 = "SELECT LAST(id_exp_sg) FROM Expediente;"
'MsgBox "ultimo :" & strSQL2
Set rst = DB.OpenRecordset(strSQL2, dbOpenSnapshot)
strSQL3 = "INSERT INTO Destino (id_exp_sg, Destino) VALUES ('" & n_exp & "','Secretaria General');"
'MsgBox "destino :" & strSQL3
DB.Execute strSQL3
rst.Close
Set rst = Nothing
DB.Close
Set DB = Nothing
End Sub

Te hago un par de aclaraciones.

1- Estoy usando Office 2007.

2- El botón de comando no es creado con el Asistente que por lo general te agrega una macro, sino que fue creado como un botón común y a través del botón derecho seleccione Generador de Código e inserte le programación en el Procedimiento de Evento, Esta programación funciona bien y hace lo que necesito, pero no se cual es la razón por la que duplica la info.

Muchas Gracias Miguel.

Consulta por si las dudas,

Eres de los que al hacer clic en los link hacen doble clic o un solo clic. Porque el evento esta generado en el evento Clic y No DobleClic, por que te pregunto esto, hay personas que sin querer todo los activan con doble clic, un vínculo, un icono en el escritorio etc. y cuando hacen doble clic en un botón de comando de access aveces ejecutan dos veces las acciones de este.

Por lo que veo es la siguiente línea la que llena la tabla Expediente.

strSQL = "INSERT INTO Expediente (id_exp_sg, id_exp_mge, id_exp_origen,
Iniciador, Extracto) VALUES ('" & n_exp & "','" & id_exp_mge
& "','" & id_exp_origen & "','" & Iniciador & "','"
& Extracto & "');"

Y DB.Execute strSQL es la sentencia que ejecuta la consulta.

Bueno he visto que en versiones superiores a 2003 para ejecutar una sentencia SQL se hace directamente como esto.

DB.Execute "INSERT INTO Expediente (id_exp_sg, id_exp_mge, id_exp_origen,
Iniciador, Extracto) VALUES ('" & n_exp & "','" & id_exp_mge
& "','" & id_exp_origen & "','" & Iniciador & "','"
& Extracto & "');"

Y luego tienes que cerrar el recorset para asegurarse que la consulta se ejecutó y se cerró.

Con la siguiente sentencia:

DB. Close

Esto cierra la consulta que se ejecutó y evita residuos.


Veo que en tu consulta solo cierras una vez el DB y es el final debes hacerlo para cada consulta a ejecutar. Como digo debes ejecutar y cerrar. Con DB. Close.

Recuerdo que esto lo aprendí cuando hacia inset into en las bases de datos de mysql desde visual basic.

Espero se resuelva tu problema, de todas formas y en lo que más domino es en el entorno gráfico, ya que puedo ver que es lo que sucede con las consultas, a veces usar max, last, min, etc, no te arroja lo que uno desea, yo prefiero probar las consultas en el entorno gráfico y las ejecuto vía código con DoCmd. Openquery stDocName, AcNormal, AcEdit.

Entonces hago una consulta de actualización o se inserción o de eliminación y solo la ejecuto a través de código.

Si no sabes como se hace eso, puedo enseñarte con un ejemplo practico en access. Saludos y espero sea eso del DB. Close.

Esta por demás decir que agradezco mucho tu ayuda y el tiempo que te tomas en contestar. Lamentablemente no ha sido la solución al problema, soy Analista programador y pienso las cosas como tal es por eso que me llevo mejor con el ambiente de programación que con el entorno gráfico.

Vamos a puntualizar bien el problema, lo que yo veo es lo siguiente.

1- Llenas los campos del form

2- Click al botón de comando

3- Cuando chequeo la tabla, veo que se hace la inserción tal cual se programó, pero he aquí la primera alerta "la fila que tiene el registro insertado con la consulta programada no es el contiguo, osea si el último autonumérico era 68, vos ves el registro insertado con 70. Cuando salís del formulario se agrega la fila 69, como si fuera automáticamente".

La verdad es que no se si entendés mi problema, la cosa es que no encuentro la solución.

Te hice una base de datos para que veas como resolvería yo este problema, más que mal, las soluciones podrían ser muchas, pero solo una es la que uno elige.

Este ejemplo muestra como hacer un insert Into en modo de consulta de Access como entorno gráfico, es lo mismo que el código solo que de forma gráfica.

He comentado la mayoría de las líneas de código. Y como vez la consulta se ejecuta sin problemas.

He añadido algo de validación vía código para que los datos ingresados estén correctamente ingresados.

Aquí está el enlace: <a>http://sdrv.ms/VVqpN9</a>

Espero se entienda Atentamente. Miguel Ángel Sandoval Sepúlveda.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas