Mostrar Acumulado en un formulario de detalle

Tengo una bd y en uno de sus formularios registro unas lecturas de unos contadores de copias de impresoras. El formulario está hecho como si fuesen líneas de presupuesto o líneas de factura. Dentro de ese formulario de detalle de lecturas tengo el campo "Lectura Anterior Contador" y el campo "Lectura Actual Contador". Estos dos campos se rellenan a mano. Necesito saber cómo hacer para que cuando introduzca la siguiente línea de lecturas el valor del campo "Lectura Actual Contador" de la línea anterior pase a ser el valor del campo "Lectura Anterior Contador". Es decir, con cada nueva línea el campo "Lectura Anterior Contador" debe ser el "Lectura Actual Contador" de la línea inmediatamente anterior. Se que parece una tontería pero me ahorraría mucho tiempo reescribiendo lecturas. La base de datos no la hemos hecho nosotros, por si necesitais algún dato mas.

2 Respuestas

Respuesta
2

Una forma sencilla sería usar la función DMax() para que te devuelva al valor más alto del campo (es de suponer que nunca contará hacia atrás...). Si tienes más de un equipo, ponle un filtro a la función para que devuelva el correspondiente a ese equipo.

Lo puedes programar en el evento "Al recibir el enfoque" o "al entrar" del campo a rellenar, o en "al activar registro" del formulario. Mi consejo es que antes de pasarle un valor compruebes que el campo no tiene ya uno o que estás en un registro nuevo, para que no te sobreescriba los valores existentes.

Un saludo.


¡Gracias! La verdad es que no se como programar esa función dmax ni como aplicar el filtro, hay algún ejemplo que pueda guiarme? Mil gracias de nuevo

El primer sitio que debes consultar para obtener información de las funciones, propiedades y eventos es la propia ayuda de Access, pues realmente sirve de ayuda y suele venir acompañada de ejemplos.

Si tu tabla se llama "TControl", y los campos "LecturaAnterior" y "LecturaActual", en tu formulario, en el evento "Al recibir el enfoque" del campo LecturaAnterior le generas este código:

Private Sub LecturaAnterior_GotFocus()
If Nz(Me.LecturaAnterior,-1)=-1 Then  'Si el campo aún no tiene datos
Me.LecturaAnterior=DMax("LecturaActual","TControl")
End If
End Sub

Tendrás que adaptarlo a tus nombres, y como te decía antes, si registras datos de varios equipos, habrás de ponerle un filtro a la función, por ejemplo, si tienes el campo "Equipo" de tipo texto:

Me.LecturaAnterior=DMax("LecturaActual","TControl","Equipo='" & Me.Equipo & "'")

¡Gracias! Ahora si me quedó claro, poco a poco voy aprendiendo.

He puesto el código como me has pasado, pero me coloca el valor de esa mismo registro. Es decir, he puesto este código en el evento Al recibir enfoque de mi campo Lecturaanteriorcolor:

Private Sub Lecturaanteriorcolor_GotFocus()
If Nz(Me.Lecturaanteriorcolor, -1) = -1 Then 'Si el campo aún no tiene datos
Me.Lecturaanteriorcolor = DMax("Lecturaactualcolor", "Lecturas")
End If
End Sub

Lo que me hace es que cuando creo una línea de registro me devuelve el valor del campo Lecturaactualcolor al campo Lecturaanteriorcolor. Lo que necesito es que me devuelva ese mismo valor pero del registro anterior (el valor de Lecturaactualcolor del registro inmediatamente anterior al que estoy editando).

Saludos.

Pues no sé lo que has hecho, pero a mi me funciona el código. Te dejo el ejemplo en el que lo comprobé: http://filebig.net/files/n54JSjiNVA 

Te van dos formularios, con dos códigos programados en dos eventos distintos, ambos funcionando perfectamente...

Además, aprovecho el ejemplo para señalar un "problema potencial" con la solución de Icue: siempre que busques una valor máximo (o mínimo) es conveniente usar la función DMáx (o DMín) en vez de DLast (o DFirst), pues si bien cuando los registros se guardan secuencialmente devuelven los mismos datos, en caso contrario no (en el primer caso siempre te devolverá el máximo del campo, en el segundo el valor del campo del último registro).

Lo puedes comprobar fácilmente cambiando en cualquiera de los formularios la función DMax por DLast y añadir un nuevo registro para el Equipo C (en la tabla se "olvidó" de registrar el primer movimiento de copias para ese equipo, y se hizo "en un momento posterior", cuando ya iban por 600 copias )

Respuesta
2

Supongamos que tienes una tabla Lecturas con Idlectura, Contador, LecturaAnterior y LecturaActual. Yo le añadiría un campo Diferencia porque nunca se sabe si te puede servir el hecho de comprobar la diferencia entre lecturas. Supongamos también que el formulario lo tiens como en la imagen

En el evento Después de actualizar del cuadro de texto Contador pondría

If IsNull([LecturaAnterior]) Then
LecturaAnterior = Nz(DLast("lecturaactual", "lecturas", "contador = '" & Me.Contador & "'"))
End If

Y en el evento Después de actualizar del cuadro de texto LecturaActual poner

Diferencia = LecturaActual - LecturaAnterior

¡Gracias! Como siempre una excelente respuesta!! Gracias amigo.

He escrito el comando adaptándolo a mis campos pero no me funciona. Te paso el código con los nombres correctos de los campos por si he escrito algo mal. El filtro está en el campo texto "Nº de Serie"

Private Sub Nº_de_Serie_AfterUpdate()
If IsNull([Lecturaanteriorcolor]) Then
Lecturaanteriorcolor = Nz(Dlast("Lecturaactualcolor", "Lecturas", "Nº de Serie = "" & Me.Nº de Serie & ""))
End If
End Sub

No sé si te lo habré dicho antes, pero por si no permíteme un consejo. Nunca le pongas a los campos, controles, etc nombres separados, el nombre correctamente escrito ya se lo pondrás en las etiquetas. Se puede dar el caso de que por error a un campo le pongas Nombre Cliente y te puedes volver loco al ver que te da fallo. Si lo compruebas verás que entre Nombre y Cliente hay dos espacios. Además al ponerlo separado en VB tienes que encerrarlo entre corchetes o comillas. Sería

Nz(Dlast("Lecturaactualcolor", "Lecturas", "[Nº de Serie] = "" & Me.[Nº de Serie] & ""))

Cuando una variable es texto se pone

....'" & me..... & &"'"   o sea apostrofe comillas y cierra comillas apostrofe comillas

Si la variable es numérica

....." & me.... & ""

Si fuera tipo fecha

....#" & me.... & "#"

¡Gracias! Gracias por el consejo, el problema es que esta base de datos con la que trabajamos no la hice yo y tiene muchos errores de este tipo, sobre todo en el nombre de los campos. Las que yo hago siempre llevan los nombres juntos, identificables para que sea más fácil aplicarles código, etc....gracias de nuevo.

Cuando puse lo de Nombre Cliente, lo había puesto separado por dos espacios, pero el puto corrector de texto lo ha puesto con un espacio.

Lo he puesto al cual me lo has pasado en el VB me sale este error:

Error de compilación, se esperaba separador de listas o )

y la expresión del Nz se queda toda en rojo

Lo único que se me ocurre es que los cuadros de texto no se llamen así. Mira en sus propiedades-otras-Nombre.

De todas formas me parece que tienes mi correo, si no es así es [email protected]

Si quieres, repito, si quieres mándame un mensaje(sólo el mensaje) y te mando un ejemplo con tus datos. Si lo haces, en el asunto del mensaje pon tu alias La Pobla ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas