Problema con validación en visual basic

Hola como stan, de antemano gracias a tomarse la molestia de leer este mensaje, soy nueva en lo que es visual basic y necesito ayuda urgente, les comento de que se trata.
Estoy haciendo un sistema de control de asistencia, okas en el cual tengo un form qtiene un textbox idpersonal, txtnombre, un label que me muestra la hora, otro que me muestra la fecha, y 2option, los cuales son HIngreso y HSalida, okas. Esto funciona de la siguiente manera, al momento de yo ingresar el id, me carga en los cuadros de texto los datos de esa persona, entonces paso a hacer clic en HI y guarda oas hasta allí todo xvere, pero que pasa si al momento de queré registrar mi Hora de salida por equivocación elijo hora de ingreso, me tendría que mostrar un mensaje en el que diga que ya esta registrado al menos en ese día, tengo ese problema que si elijo 2 hasta 3 veces HIngreso me lo registrar normal, por favor necesito ayuda si

1 respuesta

Respuesta
1
Primero que nada te recomendaría que reanalizaras tu proceso ya que un sistema debe de ser diseñado para usuarios que en su vida han tenido contacto con equipos de computo.
Y bueno si consideras que esta bien te recomiendo lo siguiente, realiza un procedimiento en donde se haga una consulta a tu base de datos y valide cual fue el ultimo registro del empleado, es decir, en que campo esta entrada o salida, de esta forma podrás deducir que campo debe de grabarse en ese momento.
Espero haberte ayudado, de lo contrario estoy a tu ordenes.
Muchas gracias por haberte molestado en contestar mi pregunta, algo así estaba pensando en hacer una consulta. Ahora aquí te presento el código para que lo puedas revisar si:
Private Sub Form_Load()
Me.lbltime = Date
  Set rsPersonal = New ADODB.Recordset
   rsPersonal.ActiveConnection = Cn
   rsPersonal.CursorType = adOpenStatic
   rsPersonal.LockType = adLockOptimistic
   rsPersonal.Open "select * from Personal"
Set rsAsistencia1 = New ADODB.Recordset
  rsAsistencia1.ActiveConnection = Cn
  rsAsistencia1.CursorType = adOpenStatic
  rsAsistencia1.LockType = adLockOptimistic
rsAsistencia1.Open "select top 1 * from Asistencia where codigo='" & txtcodigo.text & "'
order by fecha desc"(este es el código que e puesto para que me haga la consulta espero este bien)
Ahora en mi botón de guardar el registro(en este caso se llama aceptar) tengo el siguiente código para que me pueda guardar lo que haya registrado:
Private Sub cmdAceptar_Click()
If Me.OpcEntrada.Value And Me.CboTurno.Text <> "" And Me.txtCodigo.Text <> "" _
 And Me.txPaterno.Text <> "" And Me.txtMaterno.Text <> "" _
 And Me.txtNombre.Text <> "" Then
 With rsAsistencia
  .AddNew
  .Fields("Codigo") = Me.txtCodigo.Text
  .Fields("Paterno") = Me.txPaterno.Text
  .Fields("Materno") = Me.txtMaterno.Text
  .Fields("Nombre") = Me.txtNombre.Text
  .Fields("Turno") = Me.CboTurno.Text
  .Fields("fecha") = Me.lbltime
  .Fields("HoraI") = Me.txtHora.Text
  .Fields("Obs") = Me.txtObervacion.Text
  .Update
  MsgBox "Registro: " & txtCodigo.Text, vbInformation, "Formulario Asistencia"
  limpiar
  Me.txtCodigo.SetFocus
 End With
Else
 If Me.OpcSalida.Value And Me.CboTurno.Text <> "" And Me.txtCodigo.Text <> "" Then
   With rsAsistencia1
   .AddNew  // nose si esta sea la sentencia para actualizar un registro ya guardado
   '.Fields("Codigo") = Me.txtCodigo.Text // 
  '.Fields("Paterno") = Me.txtCodigo.Text //este codigo loe kitado 

'.Fields("Nombre") = Me.txtNombre.Text //este codigo loe kitado 
   '.Fields("Turno") = Me.CboTurno.Text//este codigo loe kitado
   '.Fields("fecha") = Me.lbltime//este codigo loe kitado
   .Fields("HoraS") = Me.txtHora.Text
   '.Fields("Obs") = Me.txtObervacion.Text//este codigo loe kitado

   .Update
   MsgBox "Registro: " & txtCodigo.Text, vbInformation, "Formulario Asistencia"
   limpiar
   Me.txtCodigo.SetFocus
 End With
 Else
   MsgBox "Falta datos", vbInformation, "Formulario Asistencia"
   Me.txtCodigo.SetFocus
 End If
End If
End Sub
En lo que esta de negrita en la parte de arriba como te digo allí solo estoy considerando ahora código y hora ya que estoy estaría acorde con la consulta me parece. Ahora al momento de guardar estoy usando .Addnew este código me crea nuevo registro más no me actualiza noc si me puedes ayudar diciendo cual es ese código y los parámetros, si por favor. Porque al momento de ejecutar el programa con estos códigos lo que hace al momento de elegir salida me guarda un nuevo registro más no me lo busca y me pone el dato en HSalida, espero me hayas podido entender cualquier cosa me escribes y te responde. Muchas gracias por tu atención espero puedas seguir ayudándome bye
Ok, sigo insistiendo en rehacer tu ingeniería de software, pero al parecer no estas de acuerdo je je ;)
Bueno analicemos...
Que te parece si hacemos esto:
Private Sub cmdAceptar_Click()
'Aqui agregamos unos "trim"para que no tome encuenta los espacios en blanco en tus textbox.....
If Me.OpcEntrada.Value And trim(Me.CboTurno.Text) <> "" And trim(Me.txtCodigo.Text) <> "" _
 And trim(Me.txPaterno.Text) <> "" And trim(Me.txtMaterno.Text) <> "" _
 And trim(Me.txtNombre.Text) <> "" Then
'Esta parte hace lo que quieres.....es decir esta OK, pero solo para el caso de agregar un nuevo registro....
 With rsAsistencia
  .AddNew
  .Fields("Codigo") = Me.txtCodigo.Text
  .Fields("Paterno") = Me.txPaterno.Text
  .Fields("Materno") = Me.txtMaterno.Text
  .Fields("Nombre") = Me.txtNombre.Text
  .Fields("Turno") = Me.CboTurno.Text
  .Fields("fecha") = Me.lbltime
  .Fields("HoraI") = Me.txtHora.Text
  .Fields("Obs") = Me.txtObervacion.Text
  .Update
  MsgBox "Registro: " & txtCodigo.Text, vbInformation, "Formulario Asistencia"
  limpiar
  Me.txtCodigo.SetFocus
 End With
Else
 ' Es aqui donde esta mal ya que no vamos a agregar sino a actualizar solamente...
'Entonces lo cambiamos por esto:
 If Me.OpcSalida.Value And Me.CboTurno.Text <> "" And Me.txtCodigo.Text <> "" Then
   With rsAsistencia1
      .Fields("HoraS") = Me.txtHora.Text
      .Update
   MsgBox "Registro: " & txtCodigo.Text, vbInformation, "Formulario Asistencia"
   limpiar
   Me.txtCodigo.SetFocus
 End With
 Else
   MsgBox "Falta datos", vbInformation, "Formulario Asistencia"
   Me.txtCodigo.SetFocus
 End If
End If
Es decir solo quitamos los campos que ya tenemos guardados en la BD y sobre todo quitamos el .addnew ya que eso nos agrega un nuevo registro.
Compredamos lo que estamos haciendo....
RsAsistencia1 nos trae un solo registro, ten cuidado ya que traes solo el top 1 que no siempre sera el ultimo registro del empleado ¡Aguas!, te recomendaría hacer una selección mejor, ¿me imagino que tu tabla Asistencia tiene indice único... así que el ultimo registro es el registro con el indice más alto que corresponda al empleado no? Bueno entonces porque no pruebas con:
select * from registros where tu_indice_unico =(
select max(tu_indice_unico) from Asistencia where codigo='" & txtcodigo.text & "' )
Eso te va a asegurar que estas viendo el ultimo registro del empleado en cuestión...
Ok, ahora que nos aseguramos que tenemos el registro correcto solo lo actualizamos con un simple update SIN EL ADDNEW como en el ejemplo que te deje.
Bueno espero que te haya ayudado, y seguiré insistiendo... cambia tu análisis es muy complejo para un usuario final... :D
Cuídese.
Lo siento!
La instrucción SQL debe ser así:
select * from Asistencia where tu_indice_unico =(
select max(tu_indice_unico) from Asistencia where codigo='" & txtcodigo.text & "' )
Je je te deje la sentencia anterior con una tabla llamada registros ja es que tengo en la cabeza otras cosas!
¿No olvides cerrar tu pregunta y calificar ok?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas