Ayuda con error para guardar datos.
Tengo un formulario de visual basic para a través de el guardar datos en una tabla de access, el problema que me presenta, es que para que funcione debo agregar el primer dato directamente a la tabla de access,,, luego para poder ingresar los datos debo tener un registro en el formulario,, y aveces lo lleno le doy guardar y en lugar de agregagarme un nuevo registro me reemplaza los datos de algún registro...
Como puedo hacer para que cuando abra un formulario y empiece a guarar datos no me pida que ya tenga datos en la tabla,, y también que cuando lo abra me aparezca en blanco y que cuando llene el registro y lo guarde se anexe a la ultima posición de la tabla de access y no me haga el reemplazo de datos como me esta funcionando.
Como puedo hacer para que cuando abra un formulario y empiece a guarar datos no me pida que ya tenga datos en la tabla,, y también que cuando lo abra me aparezca en blanco y que cuando llene el registro y lo guarde se anexe a la ultima posición de la tabla de access y no me haga el reemplazo de datos como me esta funcionando.
1 respuesta
Respuesta de Roberto Alvarado
1
0
Roberto Alvarado
, Desarrollador de aplicaciones en plataforma
Utiliza ADO para agregar y leer datos, revisa en enlace externo allí el tiene un cursode VB6 y explica muy bein el tema.
Exactamente de allí tome gran parte de la información en la que estoy trabajando, pero me uciona con los errores, a) si no tengo datos en la tabla me aparece un error BOF o EOF es true...
b)Siempre cuando abro el formulario me aparece un registro en pantalla,, y cuando lo modifico y guardo en lugar de crearlo como nuevo me lo cambia,, y si le doy nuevo me empieza a dejar espacios en la tabla de access.. Como puedo condicionar para que cuando abra el formulario, me aparezca en blanco y que cuando digite la información y la guarde de una vez se valla agregando a la ultima fila en la tabla, y lo más importante pues cuando la abra que no tenga necesidad de tener datos cargados, por seguridad de la información... Gracias, no se si el problema es enta en la linea donde conecto la tabla desde visual, es decir si el modo de consulta esta bien.
b)Siempre cuando abro el formulario me aparece un registro en pantalla,, y cuando lo modifico y guardo en lugar de crearlo como nuevo me lo cambia,, y si le doy nuevo me empieza a dejar espacios en la tabla de access.. Como puedo condicionar para que cuando abra el formulario, me aparezca en blanco y que cuando digite la información y la guarde de una vez se valla agregando a la ultima fila en la tabla, y lo más importante pues cuando la abra que no tenga necesidad de tener datos cargados, por seguridad de la información... Gracias, no se si el problema es enta en la linea donde conecto la tabla desde visual, es decir si el modo de consulta esta bien.
a) Pero tu puedes verificar si es BOF o EOF. Algo como If recordset. BOF AND recordset. EOF then ... entonces no hay datos
b) Entonces no estas usando ADO estas usando un control de enlace de datos y si es así no te puedo ayudar pues yo no utilizo esos controles por ser unc omplique no se pueden manejar ni cambiar como uno lo necesita, incluso ya tu tienes problemas con el.
c) Recomendacion : utiliza ADO pero todo pro codigo escrito para que tu puedas controlar todo y no dependes de nada, asi los errores se minimizan.
b) Entonces no estas usando ADO estas usando un control de enlace de datos y si es así no te puedo ayudar pues yo no utilizo esos controles por ser unc omplique no se pueden manejar ni cambiar como uno lo necesita, incluso ya tu tienes problemas con el.
c) Recomendacion : utiliza ADO pero todo pro codigo escrito para que tu puedas controlar todo y no dependes de nada, asi los errores se minimizan.
Este es el código que utilizo,, ¿sera por eso?
Option Explicit
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'Connection Confirmation
Private Sub Form_Load()
' establece la cadena de conexión a utilizar en la propiedad ConnectionString
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
App.Path & "\db1.mdb" & ";Persist Security Info=False"
' Abre la base de datos
cnn.Open
' Abre el recordset enviando la consulta sql
rs.Open "Select * from personas", cnn, adOpenDynamic, adLockOptimistic
' Muestra los datos en los text
Call Visualizar_Datos
End Sub
' botón que mueve al primer previo
'''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveFirst_Click()
rs.MoveFirst
' Visualiza los datos en los textbox
Call Visualizar_Datos
End Sub
' botón que se desplaza al último registro
'''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveLast_Click()
' Ejecuta MoveLast y se posiciona en el último registro
rs.MoveLast
' Visualiza los datos en los textbox
Call Visualizar_Datos
End Sub
' Botón para el siguiente
'''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveNext_Click()
rs.MoveNext
' Si no sobrepasó el final del recordset ...
If rs.EOF Then
' Se posiciona en el ultimo
rs.MoveLast
MsgBox " Se está en el ultimo registro ", vbInformation
Else
' Visualiza los datos en los text box
Call Visualizar_Datos
End If
End Sub
' Command para ir al registro previo
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMovePrevious_Click()
rs.MovePrevious
' si el recordset sobrepasó el comienzo se posiciona en el primero
If rs.BOF Then
rs.MoveFirst
MsgBox " este es el Primer registro ", vbInformation, " Primer registro"
Else
' Carga los datos
Call Visualizar_Datos
End If
End Sub
' Botón que añade un nuevo registro
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdAddNew_Click()
Call clear
' Ejecuta el método AddNew para crear un registro
rs.AddNew
' Le pasa el foco al control
Text2.SetFocus
Frame2.Enabled = False
End Sub
' Botón que elimina el registro
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdDelete_click()
If MsgBox(" Eliminar el registro ?? ", vbOKCancel + vbExclamation, " Eliminar ") = vbOK Then
' Elimina el registro en el que está posicionado el recordset
rs.Delete
' Mueve al siguiente
rs.MoveNext
' Si elrecordset llegó al final se posiciona en el último
If rs.EOF Then
rs.MoveLast
MsgBox " Ultimo registro ", vbInformation
End If
' muestra los datos en los textbox
Call Visualizar_Datos
End If
Frame2.Enabled = True
End Sub
' Botón que graba los datos
'''''''''''''''''''''''''''''''''''''''
Private Sub cmdSave_Click()
If Text2 = "" Or Text3 = "" Then
MsgBox "Debe completar los datos", vbExclamation
Exit Sub
End If
Call Asignar_Datos
rs.Update
MsgBox " Registro guardado", vbInformation, "Grabar"
Frame2.Enabled = True
End Sub
' Command para Agregar un nuevo registro
Private Sub CmdNuevo_Click()
If Text1.Text = "" Or Text2.Text = "" Or _
Text3.Text = "" Then
MsgBox "Datos incompletos", vbCritical, "Error ..."
Exit Sub
End If
sql = "Insert Into Tabla " _
& "(Nombre,Apellido,DNI) " _
& "Values ('" & Text1.Text & _
"','" & Text2.Text & "'," _
& Text3.Text & ")"
Call Ejecutar_Comando(sql, cn)
Text2.Text = ""
Text3.Text = ""
End Sub
' Sub que carga los datos del recordset y los asigna a los textbox
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Visualizar_Datos()
Text1.Text = CLng(rs("Id"))
Text2.Text = rs("Nombre")
Text3.Text = rs("Apellido")
End Sub
' Limpia las cajas de texto
Private Sub clear()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
End Sub
' Sub que asigna los datos al recordset
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Asignar_Datos()
rs("Nombre") = Text2.Text
rs("Apellido") = Text3.Text
End Sub
Option Explicit
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
'Connection Confirmation
Private Sub Form_Load()
' establece la cadena de conexión a utilizar en la propiedad ConnectionString
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
App.Path & "\db1.mdb" & ";Persist Security Info=False"
' Abre la base de datos
cnn.Open
' Abre el recordset enviando la consulta sql
rs.Open "Select * from personas", cnn, adOpenDynamic, adLockOptimistic
' Muestra los datos en los text
Call Visualizar_Datos
End Sub
' botón que mueve al primer previo
'''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveFirst_Click()
rs.MoveFirst
' Visualiza los datos en los textbox
Call Visualizar_Datos
End Sub
' botón que se desplaza al último registro
'''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveLast_Click()
' Ejecuta MoveLast y se posiciona en el último registro
rs.MoveLast
' Visualiza los datos en los textbox
Call Visualizar_Datos
End Sub
' Botón para el siguiente
'''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMoveNext_Click()
rs.MoveNext
' Si no sobrepasó el final del recordset ...
If rs.EOF Then
' Se posiciona en el ultimo
rs.MoveLast
MsgBox " Se está en el ultimo registro ", vbInformation
Else
' Visualiza los datos en los text box
Call Visualizar_Datos
End If
End Sub
' Command para ir al registro previo
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdMovePrevious_Click()
rs.MovePrevious
' si el recordset sobrepasó el comienzo se posiciona en el primero
If rs.BOF Then
rs.MoveFirst
MsgBox " este es el Primer registro ", vbInformation, " Primer registro"
Else
' Carga los datos
Call Visualizar_Datos
End If
End Sub
' Botón que añade un nuevo registro
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdAddNew_Click()
Call clear
' Ejecuta el método AddNew para crear un registro
rs.AddNew
' Le pasa el foco al control
Text2.SetFocus
Frame2.Enabled = False
End Sub
' Botón que elimina el registro
''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub cmdDelete_click()
If MsgBox(" Eliminar el registro ?? ", vbOKCancel + vbExclamation, " Eliminar ") = vbOK Then
' Elimina el registro en el que está posicionado el recordset
rs.Delete
' Mueve al siguiente
rs.MoveNext
' Si elrecordset llegó al final se posiciona en el último
If rs.EOF Then
rs.MoveLast
MsgBox " Ultimo registro ", vbInformation
End If
' muestra los datos en los textbox
Call Visualizar_Datos
End If
Frame2.Enabled = True
End Sub
' Botón que graba los datos
'''''''''''''''''''''''''''''''''''''''
Private Sub cmdSave_Click()
If Text2 = "" Or Text3 = "" Then
MsgBox "Debe completar los datos", vbExclamation
Exit Sub
End If
Call Asignar_Datos
rs.Update
MsgBox " Registro guardado", vbInformation, "Grabar"
Frame2.Enabled = True
End Sub
' Command para Agregar un nuevo registro
Private Sub CmdNuevo_Click()
If Text1.Text = "" Or Text2.Text = "" Or _
Text3.Text = "" Then
MsgBox "Datos incompletos", vbCritical, "Error ..."
Exit Sub
End If
sql = "Insert Into Tabla " _
& "(Nombre,Apellido,DNI) " _
& "Values ('" & Text1.Text & _
"','" & Text2.Text & "'," _
& Text3.Text & ")"
Call Ejecutar_Comando(sql, cn)
Text2.Text = ""
Text3.Text = ""
End Sub
' Sub que carga los datos del recordset y los asigna a los textbox
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Visualizar_Datos()
Text1.Text = CLng(rs("Id"))
Text2.Text = rs("Nombre")
Text3.Text = rs("Apellido")
End Sub
' Limpia las cajas de texto
Private Sub clear()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
End Sub
' Sub que asigna los datos al recordset
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Asignar_Datos()
rs("Nombre") = Text2.Text
rs("Apellido") = Text3.Text
End Sub
Cuando no tengo datos en la tabla y voy a abrir el formulario me aparece este error.
Error 3021 en tiempo de ejcucion
El valor de BOF o EOF es true, o el actual registro se elimino, la operación solicitda requiere un registro actual.
Cuando le doy en el botón depurar el error se me va a esta linea
Private Sub Visualizar_Datos()
Text1.Text = CLng(rs("Id")) ' Esta es la linea que me queda seleccionada cuando me da el error
Text2.Text = rs("Nombre")
Text3.Text = rs("Apellido")
End Sub
¿Sera qué esta linea es para visualizarlos?, y si la quitara que pasaría,, ademas no me interesa ver los datos por este lado,, solo es llenar y guardarlos y ya.. para verlos tengo un buscador en otro formulario.
Error 3021 en tiempo de ejcucion
El valor de BOF o EOF es true, o el actual registro se elimino, la operación solicitda requiere un registro actual.
Cuando le doy en el botón depurar el error se me va a esta linea
Private Sub Visualizar_Datos()
Text1.Text = CLng(rs("Id")) ' Esta es la linea que me queda seleccionada cuando me da el error
Text2.Text = rs("Nombre")
Text3.Text = rs("Apellido")
End Sub
¿Sera qué esta linea es para visualizarlos?, y si la quitara que pasaría,, ademas no me interesa ver los datos por este lado,, solo es llenar y guardarlos y ya.. para verlos tengo un buscador en otro formulario.
- Compartir respuesta