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.
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