Modificar registros y luego actualizar base de dat

Espero que me colabores en lo siguiente:
Tengo en un formulario un datagrid, el botón de buscar y el de modificar, ademas adicional a esto esta otro botón para guardar cambios más abajo coloque tres textbox, mi pregunta es la siguiente:¿Qué código le debo colocar al botón modificar para que una vez que le de click en este me muestre en los textbox la información del registro que había buscado y seleccionado previamente y desde esos textbox modificarlo?
Aquí te paso el código que tengo en ese formulario
Dim cnn1 As ADODB.Connection
Dim rstDATOS As ADODB.Recordset
Private Sub Form_Load()
Set cnn1 = New ADODB.Connection
Set rstDATOS = New ADODB.Recordset
rstDATOS.CursorLocation = adUseClient
cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\RECEPCION\REC\MINFRA.mdb;Mode=ReadWrite;Persist Security Info=False"
rstDATOS.Open "SELECT * FROM DATOS", cnn1, adOpenStatic, adLockOptimistic
Set DataGrid1.DataSource = rstDATOS
' Opcional . Esto hace que se seleccione la fila completa en el DataGrid
DataGrid1.MarqueeStyle = dbgHighlightRowRaiseCell
End Sub
Private Sub BUSCAR_Click()
With rstDATOS
C = InputBox("Ingrese CEDULA_IDENTIDAD del visitante a buscar", "")
.MoveFirst
.Find "CEDULA_IDENTIDAD='" & C & "'"
DataGrid1.Visible = True
DataGrid1.Refresh
End With
End Sub

1 respuesta

Respuesta
1
Lo que debes tener en cuenta es que estas trabajando con el datagrid enlazado a un recordset, entonces debes trabajar sobre el recordset, el código para mostrar los datos del registro seleccionado seria el siguiente:
Una vez que hiciste la búsqueda, pones lo siguiente:
with rsDATOS
    text1.text=.Fields(0).value
    text2.text=.Fields(1).value
End With
Este código fácilmente lo puedes poner en el botón modificar para que te ponga los datos del registro activo, para modificar los datos, solo debes editar los valores de los textbox y con el botón guardar pondrías lo siguiente:
cnn1.execute "Insert into tabla1 values(" & text1.text & "," & text2.text & ")"
Y luego para que se actualicen los datos y se reflejen en la grilla pones las sgtes lineas:
RsDATOS. Requery
Datagrid1. Refresh
Ya el programa edita, busca, elimina, agrega nuevos registros pero me falta que me imprima un reporte diario y que estolohaga por fechas es decir de una fecha a otra fecha que me muestre con laayuda de un filtro en el datagrid solo esos registros que necesito y que con la ayuda de datareport me imprima esos registros que están en ese datagrid unicamente ... en cuantolo termine te lo envío para que me des tu opinión pero si me puedes ayudar en eso con código decirme que tiene que ir en el modulo y en el fórmula,,,,, te loagradeceria de todo corazón
Ok fíjate tengo el siguiente código me filtra en un datagrid registros de tipo string comonombre apellido etc, pero cuando voy a escribir una fecha en el textpara filtrar por fecha me genera tremendo orror... je je, entonces mi pregunta es que debo añadirle o quitarle a ese código y en que linea para que mefiltre por fecha que es lo que me interesa no por nombre ni apellido no de tipo string ayudame lo tengo que entregar mañana, eslo que me falta para luegodecirle que me imprimaesos registros nada más o sea los correspondientes a esa fecha ... por fa espero que tu respuesta sea con código para modificar el mio (que en realidad lo baje y modifique)
attte.dioselyn
Option Explicit
' Ejemplo para filtrar datos en un datagrid _
>> Controles y referencias : referencia a Ado, un control DataGrid y un Text1
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Cadena de conexión
Private Const s_CONNECTION_STRING As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\RECEPCION\REC\MINFRA.mdb;Mode=ReadWrite;Persist Security Info=False"
Private Const SQL As String = "Select * From ANEXO"
Private Const CAMPO_A_FILTRAR As String = "NOMBRE"
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Variable de tipo Recordset y con evento
Private WithEvents rstDATOS As ADODB.Recordset
' Cuando se produce un error en el recordset se dispara este evento
Private Sub Recordset_Error( _
ByVal ErrorNumber As Long, _
Description As String, _
ByVal Scode As Long, _
ByVal Source As String, _
ByVal HelpFile As String, _
ByVal HelpContext As Long, _
fCancelDisplay As Boolean)
' Mostramos el error
MsgBox " Descripción del Error :" & Description, vbCritical
End Sub
' Botón que quita el fitro y vuelve a visualizar _
todos los datos del recordset en el dataGRid
Private Sub Command1_Click()
' Comprueba que el recordset está instanciado
If Not rstDATOS Is Nothing Then
' Comprueba que esté abierto
If rstDATOS.State = adStateOpen Then
' Elimina el filtro
rstDATOS.Filter = ""
' Carga el Datagrid
Set DataGrid1.DataSource = rstDATOS
' se posiciona en el primer registro
rstDATOS.MoveFirst
End If
End If
End Sub
' Esto muestra en el caption del formulario la posición _
actual del recordset mediante la propiedad AbsolutePosition
Private Sub rstDATOS_MoveComplete( _
ByVal adReason As ADODB.EventReasonEnum, _
ByVal pError As ADODB.Error, _
adStatus As ADODB.EventStatusEnum, _
ByVal pRecordset As ADODB.Recordset)
Me.Caption = " Registro actual: " & CStr(rstDATOS.AbsolutePosition)
End Sub
Private Sub rstDATOS_WillChangeRecord( _
ByVal adReason As ADODB.EventReasonEnum, _
ByVal cRecords As Long, _
adStatus As ADODB.EventStatusEnum, _
ByVal prstDATOS As ADODB.Recordset)
'Aquí se coloca el código de validación
'Se llama a este evento cuando ocurre la siguiente acción
Dim bCancel As Boolean
Select Case adReason
Case adRsnAddNew
Case adRsnClose
Case adRsnDelete
Case adRsnFirstChange
Case adRsnMove
Case adRsnRequery
Case adRsnResynch
Case adRsnUndoAddNew
Case adRsnUndoDelete
Case adRsnUndoUpdate
Case adRsnUpdate
End Select
If bCancel Then adStatus = adStatusCancel
End Sub
Private Sub Form_Load()
' Variable para la conexión Ado
Dim db As ADODB.Connection
' Nuevo objeto Connection
Set db = New ADODB.Connection
db.CursorLocation = adUseClient
' Cadena de conexión
db.Open s_CONNECTION_STRING
' Nuevo objeto Recordset
Set rstDATOS = New ADODB.Recordset
' Abre el Recordset con la consulta
rstDATOS.Open SQL, db, adOpenStatic, adLockOptimistic
' Asigna el recordset al datagrid
Set DataGrid1.DataSource = rstDATOS
' Opcional . esto hace que se seleccione la fila completa en el DataGrid
DataGrid1.MarqueeStyle = dbgHighlightRowRaiseCell
Text1 = ""
Command1.Caption = "Quitar Filtro"
Me.Caption = " Ejemplo para filtrar datos en un DataGrid con Ado "
End Sub
' Acá se filtra los datos del control dataGrid al escribir en Text1
'*******************************************************************
Private Sub Text1_Change()
' Comprueba que el recordset se halla creado
If rstDATOS Is Nothing Then
MsgBox " No se ha creado el recordset", vbCritical
Exit Sub
End If
' verifica que el recordset se encuentre abierto
If Not rstDATOS.State = adStateOpen Then
MsgBox " El recordset no se encuentra abierto", vbCritical
Exit Sub
End If
If Text1 <> "" Then
'Fltra por el campo especificado en la constante CAMPO_A_FILTRAR _
y tomando como valor el dato del textbox
rstDATOS.Filter = CAMPO_A_FILTRAR & " LIKE '*" + Text1.Text + "*'"
Else
' Si el textbox no tiene nada, ... se limpia el Filtro
rstDATOS.Filter = ""
' Vuelve a mostrar todos los registros en el dataGRid
Set DataGrid1.DataSource = rstDATOS
' Opcional . Mueve el recordset al primer registro
rstDATOS.MoveFirst
End If
End Sub
' Cierra el recordset y Descarga la referencia
Private Sub Form_Unload(Cancel As Integer)
' Cierra
If rstDATOS.State = adStateOpen Then
rstDATOS.Close
End If
' descarga
If Not rstDATOS Is Nothing Then
Set rstDATOS = Nothing
End If
End Sub
Lo que pasa es que el filtro para un campo fecha lo debes hacer con la fecha completa, debería ponerlo en el evento keypress del text1, para cuando termines de escribir y presiones ENTER recién haga el filtro, seria algo así:
Private Sub Text1_Keypress()
' Comprueba que el recordset se halla creado
If rstDATOS Is Nothing Then
MsgBox " No se ha creado el recordset", vbCritical
Exit Sub
End If
' verifica que el recordset se encuentre abierto
If Not rstDATOS.State = adStateOpen Then
MsgBox " El recordset no se encuentra abierto", vbCritical
Exit Sub
End If
If Text1 <> "" Then
'Fltra por el campo especificado en la constante CAMPO_A_FILTRAR _
y tomando como valor el dato del textbox
rstDATOS.Filter = CAMPO_A_FILTRAR & " = '" + format(Text1.Text,"dd/mm/yyyy") + "'"
Else
' Si el textbox no tiene nada, ... se limpia el Filtro
rstDATOS.Filter = ""
' Vuelve a mostrar todos los registros en el dataGRid
Set DataGrid1.DataSource = rstDATOS
' Opcional . Mueve el recordset al primer registro
rstDATOS.MoveFirst
End If
End Sub
No hagas caso al mensaje anterior:
Lo que pasa es que el filtro para un campo fecha lo debes hacer con la fecha completa, debería ponerlo en el evento keypress del text1, para cuando termines de escribir y presiones ENTER recién haga el filtro, seria algo así:
Private Sub Text1_Keypress()
if keyascii=13 then 'Esto es para validar cuando presiones la tecla enter
' Comprueba que el recordset se halla creado
If rstDATOS Is Nothing Then
MsgBox " No se ha creado el recordset", vbCritical
Exit Sub
End If
' verifica que el recordset se encuentre abierto
If Not rstDATOS.State = adStateOpen Then
MsgBox " El recordset no se encuentra abierto", vbCritical
Exit Sub
End If
If Text1 <> "" Then
'Fltra por el campo especificado en la constante CAMPO_A_FILTRAR _
y tomando como valor el dato del textbox
rstDATOS.Filter = CAMPO_A_FILTRAR & " = '" + format(Text1.Text,"dd/mm/yyyy") + "'"
Else
' Si el textbox no tiene nada, ... se limpia el Filtro
rstDATOS.Filter = ""
' Vuelve a mostrar todos los registros en el dataGRid
Set DataGrid1.DataSource = rstDATOS
' Opcional . Mueve el recordset al primer registro
rstDATOS.MoveFirst
End If
end if
End Sub
Bueno lo que hice fue algo como desenrrollarme del problema coloque todos los campos de tipo string en la tabla, ya que todas formas el usuario igual va a tener que teclear la fecha y hora, y así funciona fenómeno, ya lo hice ademas ahora le coloque más código para que esos registros que mande a filtrar me los muestre en una tabla pero en word y el usuario bien pueda acomodar como mejor le parezca el informe que quiera generar.
Se ve que tu respuesta tiene lógica, pero decidí hacerlo así porque como era una emergencia tenis que entregarlo hoy... bye epero seguir contando contigo para cualquier problemilla .
Gracias ... hasta pronto...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas