Restar registros de un mismo campo en Access

No manejo VB y no sé si se puede hacer mediante consultas o sacando un informe. Mi pregunta es la siguiente, tengo una BD con varios individuos que acuden en días distintos al médico, necesito saber los días transcurridos entre cada visita.

La tabla tiene una forma así:

[Paciente] [Visita] [Fecha]

1 1 04/02/2013

1 2 06/02/2013

¿Hay alguna manera de tener un 4º campo, informe o consulta con los días trasncurridos?

1 Respuesta

Respuesta
1

Como tu consulta es "relativamente" compleja te remito a este archivo, donde tienes una BD de ejemplo y un pdf explicativo: http://www.filebig.net/files/dsWxD28rMF

Ya me comentarás qué tal te ha ido.

Si no puedes con el error te agradecería que me indicaras: el número de error y su descripción, y cuando le das a "depurar", qué línea se te marca en amarillo.

A ver si lo puedes arreglar.

Hola!

Muchas gracias, uso Access 2007, me da un error, pero seguiré intentándolo.

Un saludo

El campo SUBID, por lo que veo, debe ser de tipo texto. ¿Me lo puedes confirmar?

Hola!

Te copio el error y el orden de mi tabla, ¿puede ser que el error se deba a que en la primera visita aún no tienen código de paciente y tengo que coger a partir de la visita 2?

Mi tabla queda así:

ALLSUB : nombre de la tabla

Id SCREENID SUBID VISITNR VISDAT DiasEntreVisitas
1 01 1. Selección 12/ene/2013
2 01 2.V1/Día -1 21/ene/2013
3 01 3.V1/Día 1 22/ene/2013

Mis campos con tu ejemplo se corresponden así:

Subid= Paciente

VISITNR=Visita

VISDAT= Fecha

El error es el 3075

y la línea que marca la siguiente: Set rst = CurrentDb.OpenRecordset(miSql)

Gracias por tu tiempo

Sí, SUBID es tipo texto, no me había dado cuenta.

En primer lugar es imprescindible que SUBID esté informado en la primera visita. Una parte del proceso consiste en "identificar" quién es el paciente, y si no está identificado...

De hecho, te recomiendo muchísimo que todos los campos de tu tabla estén informados, si realmente hay valor, porque te evitará muchos problemas. Por ejemplo, si intentas hacer una consulta por el número de paciente te saldrá siempre mal porque Access buscará por ese número, y si no está evidentemente no te lo mostrará.

Por otra parte, y dando por supuesto que tienes la primera visita con el SUBID correctamente informado, cambia el código que tienes por este otro:

...

Private Sub cmdAbreRDatos_Click()
'Declaramos las variables
Dim miSql As String
Dim miSqlPacientes As String
Dim vDias As Long
Dim vFecha As Date
Dim rst As DAO.Recordset
Dim rstSql As DAO.Recordset
'Inicializamos vDias
vDias = 0
'Creamos la SQL con la lista de pacientes
miSqlPacientes = "SELECT DISTINCT ALLSUB.SUBID FROM ALLSUB"
'Creamos el recordset sobre la SQL
Set rstSql = CurrentDb.OpenRecordset(miSqlPacientes)
'Nos movemos al primer registro
With rstSql
.MoveFirst
'Recorremos los registros hasta el final
Do Until .EOF
'Creamos una nueva SQL para ir calculando los días
miSql = "SELECT * FROM ALLSUB" _
& " WHERE ALLSUB.SUBID='" & .Fields(0).Value & "'" _
& " ORDER BY ALLSUB.VISDAT"
'Creamos el recordset sobre la consulta
Set rst = CurrentDb.OpenRecordset(miSql)
'Iniciamos el proceso de rellenado de datos
rst.MoveFirst
'Rellenamos el primer registro y cogemos el dato de la fecha
rst.Edit
rst.Fields("DiasEntreVisitas").Value = vDias
rst.Update
vFecha = rst.Fields("VISDAT").Value
'Nos movemos al siguiente registro
rst.MoveNext
Do Until rst.EOF
'Calculamos los días transcurridos
vDias = rst.Fields("VISDAT").Value - vFecha
'Escribimos el valor del número de días transcurrido
rst.Edit
rst.Fields("DiasEntreVisitas").Value = vDias
rst.Update
'Cogemos el valor de la fecha
vFecha = rst.Fields("VISDAT").Value
'Reinicializamos vDias
vDias = 0
'Nos movemos al siguiente registro
.MoveNext
Loop
End With
'Abrimos el informe en vista previa
DoCmd.OpenReport "RDatos", acViewPreview 'Si lo dejas en <DoCmd.OpenReport "RDatos">
'te lo enviará directamente a la impresora predet.
'Cerramos conexiones y liberamos memoria
rstSql.Close
rst.Close
Set rstSql = Nothing
Set rst = Nothing
End Sub

...

He cambiado un poco la mecánica de trabajo respecto a filtros y ordenaciones para ajustarla a lo que tienes en tu BD.

A ver si así te funciona.

Hola,

Lo intentaré, pero creo que en este caso entonces igual no me sirve, porque no es hasta la segunda visita cuando se da código definitivo, por la manera de trabajar. Aún así, voy a probar el nuevo código que me has escrito y ver si puedo cambiar la base de datos e identificar al paciente desde el primer momento.

Una vez más gracias.

Un saludo

Es un problema con la base de datos.

Si abro la que me has enviado funciona.

Si creo una tabla nueva en mi base de datos y a partir de ella sigo los pasos que me has indicado, me da el error 3027 "Base de datos u objeto solo lectura", le he quitado la contraseña pero me da el mismo error.

Un saludo

Si quieres puedo modificarte el código de manera que no tenga en cuenta la primera visita. Eso significaría que lo que llamaríamos "la primera fecha" empezaría a contar desde el momento en que hay una asignación de número de paciente

Eso lo podrías conseguir cambiando las líneas de código:

...

'Creamos la SQL con la lista de pacientes
miSqlPacientes = "SELECT DISTINCT ALLSUB.SUBID FROM ALLSUB"

...

Por estas otras.

...

'Creamos la SQL con la lista de pacientes
miSqlPacientes = "SELECT DISTINCT ALLSUB.SUBID FROM ALLSUB" _

& " WHERE not isnull(ALLSUB.SUBID)"

Por otra parte lo que me comentas de "sólo lectura", ciertamente, no sé por qué te pasa eso. Ahí sí que no sé darte una solución. Entiendo que habría que analizar la propia BD para ver si existe posibilidad de detectar el problema, pero eso en ocasiones es muy difícil salvo que "suene la campanilla".

Bueno. Ya me comentarás si te parece bien la idea del primer párrrafo (y si logras hacerla funcionar).

Sólo quería interesarme por si has podido solventar los "problemillas" con tu BD.

Ya me comentaras.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas