Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: leopola en 08 de Julio 2014, 21:49
-
Antes que nada me presento.
Mi nombre es Leopoldo Miracco. Soy de Argentina, Pcia. de Bs. As, ciudad de Azul.
Estoy dando mis primeros pasos en Visual Basic.Net. Me ha ido bastante bien y le he tomado la mano bastante.
Hasta que por necesidad me metí con bases de datos y se complica un toque...
Tengo la siguiente problemática:
Estoy con una única tabla en access, con VB.Net.
He logrado editar y guardar en tiempo de ejecución los datos mostrados en el datagridview.
De todas formas para ingresar un nuevo registro lo hago a través de otro Form.
Y en él, no aparece el textbox EDAD, ya que al ingresar la fecha de nacimiento con el cálculo obtengo la edad y se graba con el resto del registro, apareciendo en el datagridview.
Ahora bien, en primer instancia dejo deje de solo lectura las columnas EDAD y FECHA DE NACIMIENTO.
Pero pregunto ¿es posible, editar en el datagridview como hago con el resto de los datos, la fecha de nacimiento y que al grabar, en la columna EDAD de su respectiva Fila se actualice la edad, en tiempo de ejecución?
Es decir, no se cómo hacerlo, si debo borrar antes el valor en la celda EDAD, y tampoco se cómo recorrer el datagridview... Pensaba en la posibilidad de cada vez que oprimo Guardar de una edición, actualizar toda la columna EDAD, digo porque saber en el momento que se esta editando que celdas de la columna fecha de nacimiento se han editado quizás sea mucho mas complejo. En fin, si no me hice entender me dicen sin problemas, que rehago la consulta. Ustedes me van a saber decir que es lo que me conviene y lo que no.
Desde ya muchas gracias!!! Saludos desde Argentina! Leopoldo.
-
Hola Leopoldo y bienvenido por estos foros donde habemos personas desde España hasta la Patagonia hablando de programación y no sólo de eso, también de todo un poco.
Por lo que he entendido:
La edad se calcula automáticamente al ingresar la fecha de nacimiento
Tienes Edad y Fecha de nacimiento como de sólo lectura.
Sobre la pregunta: ¿es posible, editar en el datagridview como hago con el resto de los datos, la fecha de nacimiento y que al grabar, en la columna EDAD de su respectiva Fila se actualice la edad, en tiempo de ejecución?
La respuesta es sí: para ello lo que tendrías que hacer es detectar el evento de cambio de la celda Fecha de Nacimiento, y en ese momento cambiar el atributo Edad.
Tal y como yo lo entiendo, tendrías que quitar la propiedad de solo lectura a los atributos para que puedas modificarlos.
Es decir: cada vez que se modifique la celda Fecha de nacimiento del datagridview, actualizar la celda Edad correspondiente.
Saludos cordiales
-
Hola javi in the sky!!!
Desde ya muchas gracias! por responder, a uno del otro lado le da muchas ganas de meterle a esto de la programación.
El tema es que no me he explicado bien, perdón!
Los datos los ingreso desde otro Form, es decir a través de textbox's pero el textbox EDAD no, porque a partir de la fecha de nacimiento que ingresan en el textbox "Fecha de nacimiento" calculo la edad y al presionar Guardar se agrega el registro, aparece el datagridview actualizado con la edad correspondiente automáticamente.
Así:
Dim fecha As Date
Dim hoy As Date = Now
Dim dias As Integer
Dim Edad As Integer
fecha = TextBoxFechaNacimiento.Text
dias = DateDiff(DateInterval.Day, fecha, hoy)
'FIX toma la parte entera
Edad = Fix(dias / 365.25)
Dim comand As New OleDbCommand
comand.Connection = conexion
comand.CommandText = "insert into Alumnos (APELLIDO,NOMBRES,DNI,EDAD,CURSO,TURNO,DOMICILIO,TELEFONO,SEXO,MODALIDAD,FECHA_DE_NACIMIENTO,LUGAR_DE_NACIMIENTO,ESCUELA_DE_PROCEDENCIA,ES_REPITENTE_SI_NO,ADEUDA_MATERIAS,MATERIAS_QUE_ADEUDA,OBSERVACIONES) values ('" & TextBoxNuevoApellido.Text & "', '" & TextBoxNuevoNombres.Text & "', '" & TextBoxNuevoDni.Text & "', '" & Edad & "', '" & TextBoxCurso.Text & "', '" & TextBoxTurno.Text & "', '" & TextBoxDomicilio.Text & "', '" & TextBoxTelefono.Text & "', '" & TextBoxSexo.Text & "', '" & TextBoxModalidad.Text & "', '" & TextBoxFechaNacimiento.Text & "', '" & TextBoxLugarNacimiento.Text & "', '" & TextBoxEscuelaProcedencia.Text & "', '" & TextBoxEsRepitente.Text & "', '" & TextBoxAdeudaMaterias.Text & "', '" & TextBoxMateriasAdeuda.Text & "', '" & TextBoxObservaciones.Text & "')"
comand.ExecuteNonQuery()
MsgBox("Alumno Cargado")
Form1.mostrardatos()
Ahora bien, mientras estamos mirando el datagridview tengo dos botones 1 Editar, 2 Guardar edición.
Para poder editar los datos ingresados desde el otro Form a partir de los textbox, la diferencia es que los edito y los guardo en el mismo datagridview.
El tema es que si modifico la "Fecha de Nacimiento" previamente dejando la opción de sólo lectura en FALSE, no se me actualiza la EDAD obviamente porque no lo he contemplado y no se cómo hacerlo...
Con este botón edito:
Private Sub ButtonEditarGuardar_Click(sender As Object, e As EventArgs) Handles ButtonEditar.Click
DataGridView1.ReadOnly = False
DataGridView1.Columns("FECHA_DE_NACIMIENTO").ReadOnly = False
DataGridView1.Columns("EDAD").ReadOnly = True
End Sub
Con este Guardo en el mismo datagridview
Private Sub ButtonGuardarEdicion_Click(sender As Object, e As EventArgs) Handles ButtonGuardarEdicion.Click
Try
If Not conexion.State = ConnectionState.Open Then
conectar()
'aca si no esta abierta la base de datos la abrimos
End If
Dim GuardarEdicion As OleDbCommandBuilder
GuardarEdicion = New OleDbCommandBuilder(da)
da.Update(dt)
MsgBox("Se han Actualizado los Datos Modificados")
TextBoxFiltrarApellido.Text = ""
TextBoxFiltrarDni.Text = ""
DataGridView1.ReadOnly = True
dt.Dispose()
conexion.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
lo que no se es precisamente editar la fecha de nacimiento en el datagridview y que me actualice la EDAD.
Desde ya muchas gracias!!!!! Leopoldo
-
La idea que me parece podría funcionar es la siguiente: justo antes de guardar, actualizar el valor de EDAD. De este modo, se guardará el valor de EDAD actualizado.
Sería esto (no lo he probado, pero es la idea):
Private Sub ButtonGuardarEdicion_Click(sender As Object, e As EventArgs) Handles ButtonGuardarEdicion.Click
DataGridView1.Columns("EDAD").Value =
Fix (DataGridView1.Columns("FECHA_DE_NACIMIENTO").Value / 365.25)
Try
... resto del código que da lugar al guardado de los cambios
Si de esta manera logras actualizar el valor de edad justo antes de guardar, ya tendrás la actualización hecha de forma automática cada vez que realices una modificación.
Saludos
-
Hola javi!
Ya lo estoy probando y te cuento! antes de probar ya le veo buena pinta!
En algunas horas cuento el resultado!
Desde ya muchas gracias!!!!!
-
Bueno, gracias a Javi! a partir del puntapié inicial que me dio, lo adapte para mis necesidades y salió bien, quedó algo así! por si alguien también lo necesita!
Dim fecha As Date
Dim hoy As Date = Now
Dim dias As Integer
Dim Edad As Integer
For Fila As Integer = 0 To DataGridView1.Rows.Count - 1
If DataGridView1.Rows(Fila).Cells("FECHA_DE_NACIMIENTO").Value = Nothing Then
Exit For
Else
fecha = DataGridView1.Rows(Fila).Cells("FECHA_DE_NACIMIENTO").Value
dias = DateDiff(DateInterval.Day, fecha, hoy)
'FIX toma la parte entera
Edad = Fix(dias / 365.25)
Me.DataGridView1.Rows(Fila).Cells("EDAD").Value = Edad.ToString
Me.DataGridView1.Rows(Fila).Cells("ESTADO").Value = "ACTIVO"
End If
Next
Try
Dim GuardarEdicion As OleDbCommandBuilder
GuardarEdicion = New OleDbCommandBuilder(da)
da.Update(dt)
MsgBox("Se han Actualizado los Datos Modificados")
TextBoxFiltrarApellido.Text = ""
TextBoxFiltrarDni.Text = ""
TextBoxFiltrarCurso.Text = ""
TextBoxFiltrarTurno.Text = ""
TextBoxFiltrarSexo.Text = ""
TextBoxFiltrarRepitente.Text = ""
TextBoxFiltrarAdeudaMaterias.Text = ""
DataGridView1.ReadOnly = True
dt.Dispose()
conexion.Close()
Catch ex As Exception
MsgBox(ex.Message)
End Try
Desde ya muchas, pero muchas gracias! Abrazo y seguro después sigo molestando con alguna otra cuestión!!!!
-
Siempre es de agradecer saber qué ocurrió y cómo quedó el código, gracias por tu respuesta. Igualmente un abrazo y nos vemos!