Crear código vba para guardar datos

Tengo este código para grabar los datos de un formulario, en una tabla en Access

Pero al ejecutarlo solo me guarda el primer registro 2 veces, ¿cuál sera el error?

Lo que quiero es que me coja todos los registros que hallan en el formulario y me los guarde en la tabla, y que no se repitan los datos si se le da guardar 2 veces

Y si se puede,, que al momento de guardar el formulario se desactive y no se puedan guardar más datos . Solo quede para consulta

Gracias por la ayuda ...

Private Sub Comando66_Click()
If Not IsNull(Forms![Control Ensamble].[Subformulario InspeccionEnsamble]!Fecha) And Not IsNull(Forms![Control Ensamble].[Subformulario InspeccionEnsamble]!HoraInicio) And Not IsNull(Forms![Control Ensamble].[Subformulario InspeccionEnsamble]!HoraFin) And Not IsNull(Forms![Control Ensamble].[Subformulario InspeccionEnsamble]![Total Hora]) And Not IsNull(Forms![Control Ensamble].[Subformulario InspeccionEnsamble]!Responsable) And Not IsNull(Forms![Control Ensamble].[Subformulario InspeccionEnsamble]!Actividad) Then
DoCmd.RunSQL "INSERT INTO InformeGnralEnsamble( Fecha,Orden, Referencia, Articulo, Cantidad_Programada, Hora_Inicial, Hora_Final, Total_Horas, Empleado, Tarea ) SELECT * forms![Control Ensamble].[Subformulario InspeccionEnsamble]!Fecha, forms![Control Ensamble]!DocNum, forms![Control Ensamble]!ItemCode, forms![Control Ensamble]!ItemName, forms![Control Ensamble]!PlannedQty, forms![Control Ensamble].[Subformulario InspeccionEnsamble]!HoraInicio, forms![Control Ensamble].[Subformulario InspeccionEnsamble]!HoraFin, forms![Control Ensamble].[Subformulario InspeccionEnsamble]![Total Hora], forms![Control Ensamble].[Subformulario InspeccionEnsamble]!Responsable, forms![Control Ensamble].[Subformulario InspeccionEnsamble]!Actividad FROM Registros;", -1
MsgBox "Datos Guardados de pruebas", vbInformation
DoCmd.Close acForm, "Control Ensamble"
DoCmd.OpenForm "Control Ensamble"
End If
End Sub

1 respuesta

Respuesta
2

La instrucción no es correcta. O haces que "recorra" los registros del subformulario insertando los valores con, por ejemplo

Docmd. Runsql"insert into detallefactura(producto, precio, etc)values( texto1, texto2,...) siendo texto1, texto, controles del subformulario,

O utilizas

Docmd.runsql" insert into Detallefactura (Producto, precio, etc) select campoa, campob, campoc from detalleventa where.....

Por otro lado, para que el formulario se "refresque" no es necesario cerrarlo y luego abrirlo, basta con usar o bien

Me. Refresh

o

Me. Requery lo que hace es obligar al formulario a "reconsultar" su origen de datos

Pero si el subformulario depende de una tabla no necesitas decirle que lo guarde. Access, por defecto, ya lo hace sin necesidad de decirle nada.

Si puedes concretar más, se podría decir algo más exacto.

Muchas gracias por la ayuda

Ya entendí como se debe hacer el código

Pero al momento de guardar se puede hacer que el formulario quede como bloqueado para que no ingrese más información

Para bloquearlo puedes hacerlo de muchas formas, todo depende de como esté construido el formulario. Por ejemplo, en la línea siguiente a me. Refresh puedes poder

me.allowedits=false

Es decir, que no puedes escribir en ningún control.

O si, por ejemplo, sólo quieres que no se pueda escribir en los cuadros de texto puedes cambiar lo de me. Allowedits por

for each control in form.controls

if control.controltype=actextbox then

control.enabled=false

end if

next

Para ser más concreto habría que saber como está diseñado el formulario.

Buen día

Este es el diseño de formulario

Y que al momento de guardar se deshabilite el subformaulario que dice CONTROL INSPECCIÓN, que es lo único que el usuario digita

Si tengo el formulario con el subformulario

Cuando en el subformulario he rellenado los productos y pulso el botón Guardar que está en el formulario, me bloquea el subformulario y sólo le he puesto( tu tendrías que ponerlo después de la instrucción que tienes puesta)

Private Sub Comando9_Click()
If DCount("*", "detallefactura", "idfactura=" & Me.IdFactura & "") >= 1 Then
Me.DetalleFactura.Enabled = False
End If
End Sub

En vez de idfactura tendrías que poner el campo que relaciona formulario con subformulario

Es decir, que cuente si hay registros en la tabla origen del subformulario con el mismo id... que el formulario y si los hay, que bloquee el subformulario, como efectivamente hace.

Y te aconsejaría que en el evento Al activar el registro del formulario pusieras

Private Sub Form_Current()
If Me.NewRecord Then
Me.DetalleFactura.Enabled = True
Else
Me.DetalleFactura.Enabled = False
End If
End Sub

De forma que si te vas a un registro nuevo, te desbloquee el subformulario

Como puedes ver en que la etiqueta se ha puesto "negra" y si te volvieras o desplazaras por registros que ya tienen datos en el subformulario, lo bloquee para que no puedan cambiarlo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas