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.

1 Respuesta

Respuesta
1
Utiliza ADO para agregar y leer datos, revisa en www.elguille.info 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.
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.
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
¿? En que linea te da el error, ¿cuál es el mensaje exacto del error?
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.
Lo que sucede es que el objeto recordset es posible que sea nulo y por eso el error. Coloca una pregunta :
if not rs.eof and  not rs.bof then
...
Y colocas el código que enviaste dentro de esta pregunta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas