Imprimir página | Cerrar ventana

Informe con valores repetidos

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=85939
Fecha de impresión: 22/Abril/2021 a las 12:11


Tema: Informe con valores repetidos
Publicado por: damian_colomb
Asunto: Informe con valores repetidos
Fecha de publicación: 08/Abril/2021 a las 01:35
Hola, perdón por lo poco claro del título, pero no sabía expresarlo de otra manera.
Tengo varios formularios de informes, donde voy cargando datos para el informe de una endoscopía, valga la redundancia. El mismo cuenta con varios pasos
1° paso: cargo los datos del informe y agrego el DNI del paciente, tras lo cual se genera un cod_informe para ese paciente
2° con varios formularios voy cargando las distintas características, motivos de consulta, protocolo, diagnósticos. Todos los datos estan relacionados a través del cód_informe.
3° Generé una consulta, para poder ver todos los valores agrupados con el fin de imprimir un informe
4° En la consulta, después de agregar todos los valores, en el campo cod_informe, escribí el criterio DMáx("cod_informes_veda";"Informes_veda") para poder ver el último registro.
5° ahora cuando paso estos datos al informe y pongo como origen la consulta se me generan varias hojas. Les dejo una foto de como quedan los datos en la consulta y como se ven en el informe.

Consulta:
https://ibb.co/0Vk0Dtq

Informe en modo diseño:
https://ibb.co/sQ0fGvF

Informe en modo vista previa:
https://ibb.co/tz2Zcwm

Muchas gracias por la ayuda de siempre!
Saludos




Respuestas:
Publicado por: mounir
Fecha de publicación: 08/Abril/2021 a las 15:43
Hola!

¿Has intentado crear el informe agrupando por Nombre y DNI?

-------------
Un Saludo.


Publicado por: damian_colomb
Fecha de publicación: 08/Abril/2021 a las 20:04
Hola!
Decís que el ID max se lo de al campo apellido y nombre?


Publicado por: mounir
Fecha de publicación: 08/Abril/2021 a las 20:37
Hola!

Damián me cuesta mucho seguirte y entender lo que quieres hacer, lo siento.

-------------
Un Saludo.


Publicado por: damian_colomb
Fecha de publicación: 09/Abril/2021 a las 00:16
Hola! Perdón por no expresarme mejor, voy a intentar ser lo más detallado posible, solo que me cuesta por ahí expresarme con lenguaje técnico porque me estoy iniciando en este mundo.
Estoy diseñando una aplicación para mi trabajo, con su ayuda y con material que he estado viendo y  leyendo en internet, pude armar algo que hace más o menos lo que quiero.
Hago estudios endoscópicos, por lo que estoy interesado en realizar una aplicación que facilite mi trabajo para imprimir un informe con los detalles del estudio para darle al paciente y por otro lado se me guarden los datos para poder procesarlos estadísticamente.
El primer formulario para que esto funcione carga los datos del paciente:

FormRegistrarPaciente:
Nombre, apellido, DNI, Fecha de nacimiento, Seguro social, Nacionalidad, Localidad, Email, Teléfono, observaciones.
Los datos se cargan en cuadros de texto y se agregan a la tabla pacientes en la cual se va generando un cod_id con cada nuevo registro.

Los estudios endoscópicos son 3, VEDA (Video endoscopía digestiva alta), VCC (Videocolonoscopía), CPRE (Colangiopancreatografía retrógrada endoscópica), todos van a funcionar de la misma manera, por ahora pude armar el primero, VEDA.

Para registrar los datos de la VEDA, tengo varios formularios, porque son varios datos. No se llaman form, los nombro así para que sea más fácil leerlo.

Form1: 
En este formulario tengo un cuadro combinado  donde se encuentran los DNI (existe un solo dni por paciente). Al colocarlo, me trae a la vista el nombre, apellido, el seguro social, etc, me calcula la edad y se genera un "id del informe". los datos de este formulario se guardan en la tabla informe_veda, la cual se relaciona con la tabla pacientes a través de un campo llamado cod_pacientes.
Imagen 1:
https://ibb.co/kH8JwxH

Al dar click en aceptar  se guarda la información del form1 en la tabla informes_veda y se genera un id autonúmerico, único por estudio y se abre el form 2.

Form2:
En este formulario agrego los motivos de consulta, los cuales se encuentran en 3 cuadros combinados y se basan en una tabla, donde los cargué. Son 3 que se muestran en pantalla y cuando le doy a aceptar, me pregunta si quiero agregar más, en caso de ser SI, se guardan los motivos que cargue y vuelve abrir el formulario vacio, en caso de ser NO, pasa al form 3. 
Al guardar los datos, se registran en la tabla motivos_veda, la cual se encuentra relacionada con la tabla registros pacientes, a través del campo cod_informe (es el numerito que traigo siempre al formulario arriba a la izquierda). 
https://ibb.co/72TzNy7

Form3:
En este formulario escribo el protocolo es decir el detalle de lo que veo en el esófago, estómago o duodeno. Muchas estudios son normales y para no escribir siempre lo mismo y ahorrar tiempo, arme un cuadro de lista a la izquierda y un cuadro de texto a la derecha.
En el cuadro de lista de la izquierda voy a tener diferentes opciones, a las cuales si les doy doble click, se insertan en el cuadro de texto de la derecha la descripción, la cual puedo editar si quiero agregar o quitar algo.
Los datos en este formulario, se guardan en la tabla protocolo_veda, y se relaciona con la tabla del form1, cod_informe_veda y se abre el form4.
Imagen3:
https://ibb.co/60VvVNC

Form4:
En este formulario agrego los diagnósticos del esófago, estómago y duodeno y se encuentran en cuadros combinados. Al guardar se registran los datos en la tabla diagnosticos_veda y se relacionan a través del cod_informe_veda con la tabla del form1. Para evitar limitar los diagnósticos a cargar, utilizo el mismo sistema que en el form2, un msgbox si/no, que me pregunta si quiero cargar más. De decir NO, se abra el form5.
Imagen 4:
https://ibb.co/vqxP9xr

Form5:
Este es el último formulario, donde registro si realicé alguna terapéutica y si tome una biopsia para anatomía patológica.
Los datos de terapéutica se encuentran en cuadros combinados, de la misma manera que lo vengo haciendo en otros formularios y el dato de anatomía patológica se tilda o no a través de un cuadro de verificación. Se guardan en una tabla y de la misma manera, a través del cod_informe_veda, se relaciona con la tabla del form1. 
Imagen5:
https://ibb.co/k0JrxDX

Ahora bien una vez registrado todos los datos y relacionados entre si, genero una consulta en la cual agrego los datos de todas las tablas que necesito para generar un informe.
El primer problema que tuve es que al cargar todos los datos, en la consulta me aparecían todos los registros de informes que haga. Como yo voy a imprimir en este caso el último que estoy haciendo, se me ocurrió agregar el campo cod_informe_veda y agregarle el criterio dmax, de manera que me traiga el último informe.
De esta manera tengo todos los datos que quiero para imprimir el informe. El problema me surge cuando quiero diseñarlo, tengo todos los datos duplicados. (como mostré en las fotos de mi post más arriba)
Estoy trabado con esto y no puedo avanzar.
Espero haber sido un poco más claro, los link abajo de imagen, son las fotos que esquematizan lo que trato de describir.

Muchas gracias por contestarme y la predisposición de siempre.

Saludos
Drop here!


Publicado por: mounir
Fecha de publicación: 09/Abril/2021 a las 11:12
Hola!

La duda que tengo es, si en el mismo día se le ha hecho los tres estudios (esófago, estómago o duodeno)?

-------------
Un Saludo.


Publicado por: damian_colomb
Fecha de publicación: 09/Abril/2021 a las 12:23
Buen día!
Si, siempre se miran y describen los 3 organos en el mismo estudio. Puede haber varios diagnósticos,varios motivos de consulta y varias terapéuticas en un mismo informe, en cambio los otras variables van a ser siempre una


Publicado por: mounir
Fecha de publicación: 09/Abril/2021 a las 13:00
Hola!

Yo lo que haría es una consulta de Unión entre los tres estudios.

Prueba una consulta de selección primero con Protocolo_Veda de esófago y caundo consigues lo que quieres puedes utilizar el predicado ( https://docs.microsoft.com/es-es/office/vba/access/concepts/structured-query-language/all-distinct-distinctrow-top-predicates-microsoft-access-sql" rel="nofollow - Top ) para traer sólo un unico registo


Select Top 1 DNI, Nombre, Fecha, Endoscopista, protocolo_VedaEsofago From Tabla
UNION
Select Top 1 DNI, Nombre, Fecha, Endoscopista, protocolo_VedaEstomago From Tabla
UNION
Select Top 1 DNI, Nombre, Fecha, Endoscopista, protocolo_VedaDuodeno From Tabla


No comentas.



-------------
Un Saludo.


Publicado por: damian_colomb
Fecha de publicación: 09/Abril/2021 a las 13:25
Muchas gracias mounir!!
Voy a ver si me puedo poner a probar esa idea entre hoy y mañana!
Te cuento si me salion!!


Publicado por: damian_colomb
Fecha de publicación: 10/Abril/2021 a las 16:18
Buen día!!
Hace unas horas que estoy probando diferentes formas de unirla y no he podido!
Tengo 2 problemas principalmente (Exceptuando la limitación lógica de mi escaso conocimiento)
El primero es que los campos DNI, nombre, fecha, endoscopista se encuentran en una tabla y los datos del protocolo_veda_esofago se encuentran en otra. Son varias tablas, relaciaonadas por un mismo campo, dejo foto a continuación:
https://ibb.co/7jCbhyb

El otro problema que tengo es la variabilidad en la cantidad de datos que se van a insertar en ciertos campos, es el caso de motivo de consulta, terapéutica y diagnósticos
A veces puede ser 1 solo motivo de consulta, 1 solo diagnóstico y  1 sola terapéutica, o a veces una cantidad variable de los 3 campos.

Esto no se si lo voy a pode resolver seleccionando una única fila, porque va a ser variable, a veces va a necesitar 2,3 o cualquier número, dependiendo los datos que se ingresen.

No se si me expresé bien en esta ocasión!

Saludos muchas gracias




Publicado por: mounir
Fecha de publicación: 10/Abril/2021 a las 17:19
Hola!

No veo ningún problema respecto a que la información esta en varias tablas.
Debes crear una consulta de selección con todos los datos que necesitas pero para un protocolo luego los filtras por la fecha más reciente utilizando "Last" o "Max". Una vez conseguido haces el resto de los protocolos y después los unes.

-------------
Un Saludo.


Publicado por: damian_colomb
Fecha de publicación: 10/Abril/2021 a las 18:48
Perdón por ser tan duro mounir! Pero no lo puedo resolver. 
Las variables con los códigos SQL, a ver si te das cuenta cual es mi error

Si yo no agrego un campo nuevo y uno los códigos, el resultado es este:
código:
SELECT distinct Informes_veda.cod_informes_veda, Pacientes.Apellido, Pacientes.Nombre, Pacientes.DNI, Pacientes.[Obra social], Informes_veda.[Servicio que solicito], Informes_veda.Endoscopista, Informes_veda.[Fecha del estudio], Informes_veda.Edad, ProtocolosVeda.Esofago
FROM Pacientes INNER JOIN ((((Informes_veda INNER JOIN motivos_informe_veda ON Informes_veda.cod_informes_veda = motivos_informe_veda.cod_informe_veda) INNER JOIN PatologiaVeda ON Informes_veda.cod_informes_veda = PatologiaVeda.cod_informe_veda) INNER JOIN ProtocolosVeda ON Informes_veda.cod_informes_veda = ProtocolosVeda.cod_informe_Veda) INNER JOIN terapeuticaVeda ON Informes_veda.cod_informes_veda = terapeuticaVeda.cod_informe_veda) ON Pacientes.cod_paciente = Informes_veda.cod_pacientes
WHERE (((Informes_veda.cod_informes_veda)=DMax("cod_informes_veda","Informes_veda")) AND ((ProtocolosVeda.Esofago)=DMax("esofago","ProtocolosVeda")));
UNION
SELECT DISTINCT Informes_veda.cod_informes_veda AS Expr1, Pacientes.Apellido, Pacientes.Nombre, Pacientes.DNI, Pacientes.[Obra social], Informes_veda.[Servicio que solicito], Informes_veda.Endoscopista, Informes_veda.[Fecha del estudio], Informes_veda.Edad, ProtocolosVeda.Estomago
FROM Pacientes INNER JOIN ((((Informes_veda INNER JOIN motivos_informe_veda ON Informes_veda.cod_informes_veda = motivos_informe_veda.cod_informe_veda) INNER JOIN PatologiaVeda ON Informes_veda.cod_informes_veda = PatologiaVeda.cod_informe_veda) INNER JOIN ProtocolosVeda ON Informes_veda.cod_informes_veda = ProtocolosVeda.cod_informe_Veda) INNER JOIN terapeuticaVeda ON Informes_veda.cod_informes_veda = terapeuticaVeda.cod_informe_veda) ON Pacientes.cod_paciente = Informes_veda.cod_pacientes
WHERE (((Informes_veda.cod_informes_veda)=DMax("cod_informes_veda","Informes_veda")) AND ((ProtocolosVeda.Estomago)=DMax("estomago","ProtocolosVeda")));

UNION
SELECT DISTINCT Informes_veda.cod_informes_veda AS Expr1, Pacientes.Apellido, Pacientes.Nombre, Pacientes.DNI, Pacientes.[Obra social], Informes_veda.[Servicio que solicito], Informes_veda.Endoscopista, Informes_veda.[Fecha del estudio], Informes_veda.Edad, ProtocolosVeda.Duodeno
FROM Pacientes INNER JOIN ((((Informes_veda INNER JOIN motivos_informe_veda ON Informes_veda.cod_informes_veda = motivos_informe_veda.cod_informe_veda) INNER JOIN PatologiaVeda ON Informes_veda.cod_informes_veda = PatologiaVeda.cod_informe_veda) INNER JOIN ProtocolosVeda ON Informes_veda.cod_informes_veda = ProtocolosVeda.cod_informe_Veda) INNER JOIN terapeuticaVeda ON Informes_veda.cod_informes_veda = terapeuticaVeda.cod_informe_veda) ON Pacientes.cod_paciente = Informes_veda.cod_pacientes
WHERE (((Informes_veda.cod_informes_veda)=DMax("cod_informes_veda","Informes_veda")) AND ((ProtocolosVeda.Duodeno)=DMax("duodeno","ProtocolosVeda")));

El resultado es este:
https://ibb.co/6YPLVXG
La información se agrega en un último campo, en este caso esófago y coloca los datos provenientes de estómago y duodeno abajo.
Aclaro que si escribo el código por separado, es decir sin las uniones, cada uno funciona bien y agrega una sola fila. De esta forma interpreté el ejemplo que me diste vos.


Ahora bien, pensé que por ahí debería agregar los campos a la consulta y despues hacer la unión.
El código es el siguiente:
SELECT DISTINCT Informes_veda.cod_informes_veda, Pacientes.Apellido, Pacientes.Nombre, Pacientes.DNI, Pacientes.[Obra social], Informes_veda.[Servicio que solicito], Informes_veda.Endoscopista, Informes_veda.[Fecha del estudio], Informes_veda.Edad, ProtocolosVeda.Esofago, ProtocolosVeda.Estomago, ProtocolosVeda.Duodeno
FROM Pacientes INNER JOIN ((((Informes_veda INNER JOIN motivos_informe_veda ON Informes_veda.cod_informes_veda = motivos_informe_veda.cod_informe_veda) INNER JOIN PatologiaVeda ON Informes_veda.cod_informes_veda = PatologiaVeda.cod_informe_veda) INNER JOIN ProtocolosVeda ON Informes_veda.cod_informes_veda = ProtocolosVeda.cod_informe_Veda) INNER JOIN terapeuticaVeda ON Informes_veda.cod_informes_veda = terapeuticaVeda.cod_informe_veda) ON Pacientes.cod_paciente = Informes_veda.cod_pacientes
WHERE (((Informes_veda.cod_informes_veda)=DMax("cod_informes_veda","Informes_veda")) AND ((ProtocolosVeda.Esofago)=DMax("esofago","ProtocolosVeda")));

UNION
SELECT DISTINCT Informes_veda.cod_informes_veda, Pacientes.Apellido, Pacientes.Nombre, Pacientes.DNI, Pacientes.[Obra social], Informes_veda.[Servicio que solicito], Informes_veda.Endoscopista, Informes_veda.[Fecha del estudio], Informes_veda.Edad, ProtocolosVeda.Esofago, ProtocolosVeda.Estomago, ProtocolosVeda.Duodeno
FROM Pacientes INNER JOIN ((((Informes_veda INNER JOIN motivos_informe_veda ON Informes_veda.cod_informes_veda = motivos_informe_veda.cod_informe_veda) INNER JOIN PatologiaVeda ON Informes_veda.cod_informes_veda = PatologiaVeda.cod_informe_veda) INNER JOIN ProtocolosVeda ON Informes_veda.cod_informes_veda = ProtocolosVeda.cod_informe_Veda) INNER JOIN terapeuticaVeda ON Informes_veda.cod_informes_veda = terapeuticaVeda.cod_informe_veda) ON Pacientes.cod_paciente = Informes_veda.cod_pacientes
WHERE (((Informes_veda.cod_informes_veda)=DMax("cod_informes_veda","Informes_veda")) AND ((ProtocolosVeda.Estomago)=DMax("estomago","ProtocolosVeda")));

UNION
SELECT DISTINCT Informes_veda.cod_informes_veda, Pacientes.Apellido, Pacientes.Nombre, Pacientes.DNI, Pacientes.[Obra social], Informes_veda.[Servicio que solicito], Informes_veda.Endoscopista, Informes_veda.[Fecha del estudio], Informes_veda.Edad, ProtocolosVeda.Esofago, ProtocolosVeda.Estomago, ProtocolosVeda.Duodeno
FROM Pacientes INNER JOIN ((((Informes_veda INNER JOIN motivos_informe_veda ON Informes_veda.cod_informes_veda = motivos_informe_veda.cod_informe_veda) INNER JOIN PatologiaVeda ON Informes_veda.cod_informes_veda = PatologiaVeda.cod_informe_veda) INNER JOIN ProtocolosVeda ON Informes_veda.cod_informes_veda = ProtocolosVeda.cod_informe_Veda) INNER JOIN terapeuticaVeda ON Informes_veda.cod_informes_veda = terapeuticaVeda.cod_informe_veda) ON Pacientes.cod_paciente = Informes_veda.cod_pacientes
WHERE (((Informes_veda.cod_informes_veda)=DMax("cod_informes_veda","Informes_veda")) AND ((ProtocolosVeda.Duodeno)=DMax("DUODENO","ProtocolosVeda")));

El resultado es este:
https://ibb.co/RYdwPwB
Me agrega en la consulta una fila para esófago, una para estómago y una para duodeno.
Aclaro que acá también si escribo los códigos por separado funciona bien y coloca los datos donde tiene que colocarlos, en una sola fila.



Drop here!


Publicado por: mounir
Fecha de publicación: 10/Abril/2021 a las 19:20
Hola!

En vez de "UNION" poner "UNION ALL", a ver si funciona así.

-------------
Un Saludo.


Publicado por: damian_colomb
Fecha de publicación: 10/Abril/2021 a las 19:26
Si le agrego el all, me sigue devolviendo lo mismo con las dos formas


Publicado por: mounir
Fecha de publicación: 10/Abril/2021 a las 19:36
Hola!

Utilizas la función "DMax" para los protocolos cuando se debe aplicar sobre la fecha. Además intenta agrupar las consultas por separado, utiliza "Max" o "Last" en totales para la fecha y cuando te cuadre el resultado los unes. a ver que pasa.

-------------
Un Saludo.


Publicado por: damian_colomb
Fecha de publicación: 10/Abril/2021 a las 23:09
No puedo resolverlo, creo que es porque todavía no comprendo la nomenclatura del sql. Voy a tratar de Leer un poco y ver si puedo escribirlo yo, por ahí lo que hincha es el in join!
De todas maneras gracias!! Si puedo descrifrar mi error lo subo acá y sino vuelvo con alguna otra idea


Publicado por: damian_colomb
Fecha de publicación: 11/Abril/2021 a las 23:24
Perdón que vuelva a insistir con el post, por ahí con un video puedo ser más explícito de lo que estoy haciendo y a donde apunto. 
Este es el modelo de como está funcionando, te muestro desde que cargo un paciente hasta que le hago el informe y muestro las tablas donde se guardan.}
Al final te agrego la foto de como se vería el informe de la consulta

Video: (perdón que lo hice con zoom, pero no tenía otro programa para grabarlo)
https://mega.nz/file/thtnhAYI#kSVIOzaNUdhvBjJ0vXW9pU_LJbpkEYg03ndM7HeUpdI

Foto del informe: (aclaro que en la consulta solo puse los datos generales y los protocolos y ya se repiten 3 veces las filas) imagínense si tengo 3-4 motivos de consulta, 3-4 diagnósticos para esófago, estómago y duodeno y 2 o 3 terapéuticas, se hacen muchísimas filas)

Hoja 1:
https://ibb.co/xmp3VHY

Hoja2:
https://ibb.co/0sh6x9h


Saludos y nuevamente muchas gracias



Publicado por: damian_colomb
Fecha de publicación: 19/Abril/2021 a las 05:13
No pude resolverlo de la manera que pretendía porque se repetían los valores.
Drop here!
Mounir me dió la solución, la idea y el código así que agradezco mucho su ayuda y la comparto con ustedes.
Reemplazó los cuadros combinados por cuadros de lista, con selección múltiple, cuyo origen de datos era una consulta idéntica a la que tenía el cuadro combinado.
A un botón le colocó el siguiente código:

Dim strList As String
Dim varItm As Variant


    For Each varItm In Me.LstMotivoVeda.ItemsSelected
       strList = strList & Me.LstMotivoVeda.Column(0, varItm) & ", "

    Next varItm
    If strList <> "" Then
strList = Left$(strList, Len(strList) - 2)
End If
Me.TxtMotivoVeda = strList & "."

DoCmd.SetWarnings False 

Este código toma los valores seleccionados en el cuadro de lista Lst.MotivoVeda (en rojo) y los pega en el cuadro de texto TxtMotivoVeda (en verde), separado por "," y al final le coloca un "."

De esta manera cuando generas la consulta, se inserta en una sola fila y no se duplican los registros, entonces cuando generas un informe de la consulta, como están los datos en una sola fila, no hay valores duplicados.

Muchísimas gracias!! Se puede cerrar esta discusión.
Saludos 



Imprimir página | Cerrar ventana