Contar el número de campos rellenos de un registro

Aquí os planteo una duda.
Tengo un formulario donde recojo los días de permiso de que solictia un trabajador al cabo del año.

Tengo una tabla con los campos nombre, apellidos, p1, p2, p3, p4..., TOTALPER, PDISFRUTADOS, PPENDIENTES

El campo totalper:es el número de días que puede coger al año,

Pdisfrutados: es los que se ha cogido,

Ppendientes: los que le quedan por disfrutar

Necesito que cada vez que rellene un campo p1, p2, p3 me vaya diciendo cuantos pdistrutados y ppendietnes le quedan.

En el formulario he creado dos cuadros de texto que se llaman txtdis (origen PDISFRUTADOS) y txtquedan (origan PPendientes)

Yo he utilizado este código pero cuando borro una fecha no me descuenta del total si no me sitúo en en campo anterior al eliminado.

Private Sub P1_AfterUpdate()
txtquedan = TOTALPER - 1
txtdis = TOTALPER - txtquedan
End Sub
Private Sub P2_Click()
txtquedan = TOTALPER - 2
txtdis = TOTALPER - txtquedan
End Sub
Private Sub P3_AfterUpdate()
txtquedan = TOTALPER - 3
txtdis = TOTALPER - txtquedan
End Sub

Seguro que hay una manera mejor de hacerlo y no tan chapuza.

1 respuesta

Respuesta
1

Sin entender del todo tu duda, creo que el problema está en que en el campo P2 has puesto el código en el evento "al hacer clic" y no en "después de actualizar" y por eso no te actualiza si borras su valor.

No.. lo he cambiado y no funciona.

Mi problema es:  relleno los campos y me va descontando en pendientes y contando en disfrutados. Los disfurtos los calculo rstando vacaciones de pendientes

Si luego los borro. el p2 no me cambia el número de pendientes y disfrutados

Si borro el p1 me descuenta 1 de pendientes y disfrutados pero tendría figurar 0 en disfrutados y 21 en pendientes ya que todos están en blanco

No sé si ahora me he explicado

Ya que desconozco muchas cosas de tu BD, una forma "sencilla" de controlarlo sería:

Private Sub P1_AfterUpdate()
If IsDate(P1) Then
txtquedan = TOTALPER - 1
Else
txtquedan = TOTALPER + 1
End If
txtdis = TOTALPER - txtquedan
End Sub

Y lo mismo con el resto de campos.

Pero ojo, este sistema tiene un fallo, si tienes P1, P2, y P3, y borras P2, el resultado no será correcto. A lo que voy es que tendrías que borrarlos del P mayor al menor, sin borrar fechas intermedias.

Otra forma, que evitaría ese "inconveniente", sería poner este procedimiento en el módulo del formulario:

Private Sub cuentaPermisos() 
Dim ctl As Control
Dim temp as integer
For each ctl In Me.Controls
   If ctl.ControlType = acTextBox AND ctl.Name Like "P*" Then
      If IsDate(ctl.Value) Then temp=temp+1
   End If
Next
txtdis = temp
txtquedan = TOTALPER - temp
End Sub

Y en cada envento "Después de actualizar de los campos P...", pones simplemente: cuentaPermisos, así:

Private Sub P1_AfterUpdate()
  cuentaPermisos
End Sub
Private Sub P2_AfterUpdate()
  cuentaPermisos
End Sub

Buenos dias:
Primero muchas gracias por tu tiempo. Estoy probando lo que tu me has indicado y me sale este mensaje cuando introduzco una fecha y me lleva a vba a

Private Sub P1_AfterUpdate()
  cuentaPermisos

¿Dónde has puesto el código del procedimiento cuentaPermisos?

Lo tienes que poner en el mismo módulo que tienes los Pivate Sub P1 AfterUpdate y demás

No te entiendo muy bien pero no es porque te expliques... es por mi desconocimiento por el tema.

Te digo lo que hecho.

1. He creado el módulo que me decías en la bese de datos

2. En el formulario he pinchado en el campo p1 y en evento después de actualizar he pegado el código siguiente

Private Sub p1_AfterUpdate()
CuentaPermisos
End Sub
Private Sub p2_AfterUpdate()
 CuentaPermisos
End Sub
Private Sub p3_AfterUpdate()
CuentaPermisos
End Sub

Vale, no tenías que haber creado un módulo nuevo con el código, sino pegar el código en el mismo módulo en que tienes programados los eventos. Es decir, en tu BD tendrás un módulo "de formulario", con los eventos :

Private Sub p1_AfterUpdate()
CuentaPermisos
End Sub
Private Sub p2_AfterUpdate()
 CuentaPermisos
End Sub
Private Sub p3_AfterUpdate()
CuentaPermisos
End Sub

A continuación de todos esos eventos, pega el otro código:

Private Sub cuentaPermisos() 
Dim ctl As Control
Dim temp as integer
For each ctl In Me.Controls
   If ctl.ControlType = acTextBox AND ctl.Name Like "P*" Then
      If IsDate(ctl.Value) Then temp=temp+1
   End If
Next
txtdis = temp
txtquedan = TOTALPER - temp
End Sub

Y para que no haya conflictos, borra el módulo nuevo que has creado.

Al final te tiene que quedar algo como este ejemplo: http://www.filebig.net/files/rGY384rRZm 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas