Imprimir página | Cerrar ventana

Problema con formularios

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=84492
Fecha de impresión: 14/Noviembre/2019 a las 23:20


Tema: Problema con formularios
Publicado por: Momoe
Asunto: Problema con formularios
Fecha de publicación: 13/Mayo/2019 a las 14:13
Buenas tardes amigos, tengo dos problemillas con formularios que no consigo hacer lo que quiero puede que sea una tontería pero estoy atascada y no le veo la punta.
Primer problema:
Tengo un formulario que contiene botones con los meses del año, cuando pulso un botón por ejemplo enero me abre otro formulario donde se muestra el mes y el año elegidos en el anterior y tiene un subformulario que he hecho a través de una consulta de access con el siguiente codigo sql:

SELECT Clientes.Cod, Clientes.Nom, REVISION.Terminado, REVISION.Mes, REVISION.Año, Clientes.Obs11, Clientes.Obs12
FROM Clientes LEFT JOIN REVISION ON Clientes.Cod = REVISION.CodCliente
WHERE (((Clientes.Obs11)=True)) OR (((Clientes.Obs12)=True));

El problema es que no sé como indicarle al subformulario que me muestre todos los clientes (tengan o no tenga revisión creada) y de los que sí tengan revisión que aparezcan los del mes seleccionado.

Segundo problema:
En el subformulario que muestra todos los clientes tengan o no tengan revisión, he creado un botón para que si tiene revisión me abra el formulario para ver qué se le ha hecho a ese cliente. he puesto el siguiente código asignado al botón:

    stDocName = "Revision"
    stLinkCriteria = "[CodCliente]=" & "'" & Me![Cod] & "'" & "&" & "[Mes]=" & "'" & Me![Mes] & "'" & "&" & "[Año]=" & Me![Año]
    DoCmd.OpenForm stDocName, , , stLinkCriteria

pero me abre el formulario en blanco no consigo que me muestre el registro que tiene el código de cliente, mes y año indicado en el criterio.

Luego ya me pelearé para que si pulso el botón sobre un cliente que todavía no tiene registro me abra el formulario creando un registro nuevo pero ahora mismo esto me está volviendo loca pues no encuentro el error, indicaros que codigo de cliente y mes es de tipo texto mientras que año es de tipo numerico.

Gracias



-------------
Eva



Respuestas:
Publicado por: mounir
Fecha de publicación: 13/Mayo/2019 a las 14:40
Hola!

El primer problemas creo que se solucionaria con una consulta de unión. Mas o menos así:-

SELECT Clientes.Cod, Clientes.Nom, REVISION.Terminado, REVISION.Mes, REVISION.Año, Clientes.Obs11, Clientes.Obs12
FROM Clientes LEFT JOIN REVISION ON Clientes.Cod = REVISION.CodCliente
WHERE (((Clientes.Obs11)=True));
UNION
SELECT Clientes.Cod, Clientes.Nom, REVISION.Terminado, REVISION.Mes, REVISION.Año, Clientes.Obs11, Clientes.Obs12
FROM Clientes LEFT JOIN REVISION ON Clientes.Cod = REVISION.CodCliente
WHERE (((Clientes.Obs11)=True)) AND (((REVISION.Mes)=Forms![NombreFormulario]!Mes));


La segunda duda:-

stDocName = "Revision"
stLinkCriteria = "[CodCliente]= '" & Me![Cod] & "' And [Mes]= '" & Me![Mes] & "' And [Año]= " & Me![Año]
DoCmd.OpenForm stDocName, , , stLinkCriteria



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


Publicado por: Momoe
Fecha de publicación: 14/Mayo/2019 a las 11:20
Buenos días Mounir muchas gracias por tu pronta respuesta. El segundo problema me ha funcionado a la perfección, me hago un lío con lo ".
La primera no del todo. Te comento.
Al ejecutar la consulta como me has indicado me salen todos los registros que tiene la tabla REVISION  los de los clientes que no tienen registro aún. Te pongo ejemplo

codRev Cliente mes año Terminado
1 00000 mayo 2019
2 00001 (este cliente aún no tiene registros en revision

Cuando pulso el botón del mes de Enero me tendría que salir

codRev Cliente mes año Terminado
1 00000 (este cliente aunque tiene en mayo un registro no lo tiene en el mes de enero)
2 00001

Y me sale lo anterior y el registro que el cliente 000000 tiene en mayo junto con todos los clientes que no tengan registro en mayo me tendría que salir al pulsar el botón de Mayo 

pero pulse el botón del mes que sea me sale mayo en todos los meses.

Quizás es que no puede hacerse?.
Gracias



-------------
Eva


Publicado por: mounir
Fecha de publicación: 14/Mayo/2019 a las 13:04
Hola!

Prueba así:

SELECT Cliente.Cod, Cliente.Nom, REVISION.Terminado, REVISION.Mes, REVISION.Año, Cliente.Obs11, Cliente.Obs12
FROM Cliente LEFT JOIN REVISION ON Cliente.Cod = REVISION.CodCliente
WHERE (((REVISION.Mes)<>"Mayo") AND ((Cliente.Obs11)=True)) OR (((Cliente.Obs12)=True));
UNION
SELECT Cliente.Cod, Cliente.Nom, REVISION.Terminado, REVISION.Mes, REVISION.Año, Cliente.Obs11, Cliente.Obs12
FROM Cliente LEFT JOIN REVISION ON Cliente.Cod = REVISION.CodCliente
WHERE (((REVISION.Mes)="Mayo") AND ((Cliente.Obs11)=True)) OR (((Cliente.Obs12)=True));


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


Publicado por: Momoe
Fecha de publicación: 14/Mayo/2019 a las 14:02
Hola de nuevo, gracias por tus esfuerzos pero no consigo que funcione. 
Estos son los registros de clientes que tengo

Cod Obs11 Obs12
000000 -1 0
000001 -1 0
000022 -1 0
000029 -1 0
000035 -1 0
000037 -1 0
000038 -1 0
000059 -1 0
000061 -1 0
000068 -1 0
000072 -1 0
000073 -1 0
000094 -1 0
000098 0 -1

Estos son los clientes que tienen partes de revisión creados

CodRevision CodCliente Obs11 Obs12 Mes Año FREVISION Terminado
1 000072 -1 0 mayo 2019 07/05/2019
2 000000 -1 0 mayo 2019 07/05/2019 No

He modificado la consulta que me has puesto para que coja el mes del formulario. Quedaría así:

SELECT REVISION.CodRevision,Clientes.Cod, REVISION.Terminado, REVISION.Mes, REVISION.Año, Clientes.Obs11, Clientes.Obs12
FROM Clientes LEFT JOIN REVISION ON Clientes.Cod = REVISION.CodCliente
WHERE (((REVISION.Mes)<>Forms!ResultadoBusquedaRevision!MesBuscado) AND ((Clientes.Obs11)=True)) OR (((Clientes.Obs12)=True));
UNION 
SELECT REVISION.CodRevision,Clientes.Cod, REVISION.Terminado, REVISION.Mes, REVISION.Año, Clientes.Obs11, Clientes.Obs12
FROM Clientes LEFT JOIN REVISION ON Clientes.Cod = REVISION.CodCliente
WHERE (((REVISION.Mes)=Forms!ResultadoBusquedaRevision!MesBuscado) AND ((Clientes.Obs11)=True)) OR (((Clientes.Obs12)=True));

Y esto es lo que sale cuando pulso el botón de Enero o cualquier otro (incluido mayo)

CodRevision Cod Nom Terminado Mes Año Obs11 Obs12

000098 xxxxx 0

0 -1


y si pongo el texto "Mayo" en lugar del campo del formulario que muestra el mes me sale en cualquier mes

CodRevision Cod Nom Terminado Mes Año Obs11 Obs12

000098 xxxx 0

0 -1
1 000072 zzzz -1 mayo 2019 -1 0
2 000000 yyyyy 0 mayo 2019 -1 0

¿qué puedo hacer?. No hay manera?


-------------
Eva


Publicado por: mounir
Fecha de publicación: 14/Mayo/2019 a las 15:51
Publicado originalmente por Momoe Momoe escribió:

El problema es que no sé como indicarle al subformulario que me muestre todos los clientes (tengan o no tenga revisión creada) y de los que sí tengan revisión que aparezcan los del mes seleccionado.



Explícame esto para poder ayudar.

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


Publicado por: Momoe
Fecha de publicación: 14/Mayo/2019 a las 16:24
hola Mounir a ver si consigo explicarme bien.
La tabla de clientes tiene 14 clientes y estos a lo largo del año tendrán un registro de revisión por mes por lo tanto cada cliente cuando finalice el año tendrá 12 registros (uno por mes)
En enero si no se le ha hecho ninguna revisión a ningún cliente en el subformulario deberán salir los 14 clientes (no tendrá Codigo de revisión puesto que todavía no tiene ningun registro creado

Ej. CodRevision CodCliente ........ (mes enero sin registros en tabla Revision)
       ___ 000000
       ___ 000072
.... y así hasta los 14 clientes que hay de momento

Ahora si en el mes de enero alguno tuviera ya registro de revision en el subformulario saldría

CodRevision CoCliente .......
     1 000000
   _____ 000072
y así sucesivamente.

Mis jefes quieren un formulario con botones con los meses del año y que cuando pulsen un mes puedan saber viéndolo en ese formulario a qué clientes ya les han hecho la revisión y cuales quedan por revisar.

Espero haberme explicado


-------------
Eva


Publicado por: lbauluz
Fecha de publicación: 14/Mayo/2019 a las 18:41
A ver si he entendido lo último

Quieres que aparezcan TODOS los clientes y en aquellos que han tenido una revisión en el mes indicado, debe aparecer además el código de revisión.

Es decir, si el cliente ha tenido una revisión, pero en un mes distinto al seleccionado, NO de be aparecer el código de revisión.

¿Es eso?

Luis


-------------
El Búho es mi ídolo caido


Publicado por: Momoe
Fecha de publicación: 14/Mayo/2019 a las 19:01
Si eso es.
al final en la tabla de revisión habrá 12 registros por cada cliente pero claro cuando llegue su mes de revisión podrá hacerse a lo largo de todo el mes por ello tengo si pulso enero veré los que ya tengan en enero revisión y todos los demas que no la tenga. pero si un cliente tiene una revisión en febrero no me tiene que aparecer en enero con codigo de revisión puesto que en enero ese cliente aún no la tiene.

Creo que lo lío más que lo aclaro pero no sé como expresarlo para que se entienda.

Muchas gracias


-------------
Eva


Publicado por: lbauluz
Fecha de publicación: 16/Mayo/2019 a las 15:22
Hecho a ojo y sin probar.

SELECT Cliente.Cod, Cliente.Nom, REVISION.Terminado, 
switch (REVISION.Mes = "Mayo", "Mayo",
TRUE, "")
REVISION.Año, Cliente.Obs11, Cliente.Obs12
FROM Cliente, REVISION 
where Cliente.Cod = REVISION.CodCliente;


Luis


-------------
El Búho es mi ídolo caido


Publicado por: Momoe
Fecha de publicación: 17/Mayo/2019 a las 14:28
Hola Luis me funciona pero con reservas. me explico.

He modificado la consulta que me has puesto para buscar por todos los meses quedando así:

SELECT REVISION.CodRevision, Clientes.Cod, Clientes.Nom, REVISION.Terminado, Switch([REVISION].[Mes]="Enero","Enero",[REVISION].[Mes]="Febrero","Febrero",[REVISION].[Mes]="Marzo","Marzo",[REVISION].[Mes]="Abril","Abril",[REVISION].[Mes]="Mayo","Mayo",[REVISION].[Mes]="Junio","Junio",[REVISION].[Mes]="Julio","Julio",[REVISION].[Mes]="Agosto","Agosto",[REVISION].[Mes]="Septiembre","Septiembre",[REVISION].[Mes]="Octubre","Octubre",[REVISION].[Mes]="Noviembre","Noviembre",[REVISION].[Mes]="Diciembre","Diciembre",Isnull([REVISION].[Mes])," ") AS Mes, REVISION.Año, Clientes.Obs11, Clientes.Obs12 FROM Clientes LEFT JOIN REVISION ON Clientes.Cod = REVISION.CodCliente WHERE (((Clientes.Obs11)=True)) OR (((Clientes.Obs12)=True));

 Cuando abro el formulario que tiene los botones de los meses y pulso "Enero" me sale tanto los que tienen parte de revision (sea del mes que sea) como los que aún no tiene revision. Te pongo ejemplo para ver si queda más claro, si quieres que te envíe copia de la base de datos para poder verlo más concreto me dices como hacerlo y te la envío.

Mi tabla de clientes:

Clientes

Cod

nom

ema

obs11

obs12

000000

cliente de contado

1@1.es

No

000001

Carlos Ballesta

2@2.es

No

000022

Santiago Puerta

3@3.es

No

000029

Rosa Benito

4@4.es

No

000035

Amadeo López

5@5.es

No

000037

Marta Garrido

6@6.es

No

000038

Maria Eugenia Santos

7@7.es

No

000061

Eva Moreno

8@8.es

No

000068

Marta Serrano

9@9.es

No

000073

Eusebio Gómez

10@10.es

No

000075

Pedro Perez

11@11.es

No

000078

Alfonso Guerra

12@12.es

No

000094

Jose Requena

13@13.es

No

000098

Jose Carlos Puentes

14@14.es

No

 Mi tabla de revisiones (que muestra los registros de los clientes que ya tienen alguna revisión (tiene más datos pero ocupa mucho y he dejado sólo los que debería mostrar el formulario cuando pulso el botón del mes que quiero

CodRevision

CodCliente

Mes

Año

Terminado

1

000072

mayo

2019

2

000000

mayo

2019

No

3

000001

Enero

2019

No

4

000022

Enero

2019



Publicado por: Momoe
Fecha de publicación: 17/Mayo/2019 a las 14:29

Si pulso el botón "mayo" me tendría que salir lo siguiente:

 CodRevision

CodCliente

Mes

Año

Terminado

1

000072

mayo

2019

2

000000

mayo

2019

No

000001

 

 

 

 

000022

 

 

 

 

000029

 

 

 

 

000035

 

 

 

 

000037

 

 

 

 

000038

 

 

 

 

000059

 

 

 

 Los dos primeros como tienen hecha revisión en mayo tienen que salir pero el resto de clientes que no tiene revisión para mayo debería de salir sin Código de Revisión, ni mes, ni año, ni terminado pues no existe registro de revisión para el mes de mayo.

En cambio me sale

CodRevision

CodCliente

Mes

Año

Terminado

1

000072

mayo

2019

2

000000

mayo

2019

No

3

000001

Enero

2019

No

4

000022

Enero

2019

No

5

000029

Enero

2019

No

6

000035

Enero

2019

No

7

000037

Enero

2019

No

8

000038

Enero

2019

No

9

000059

enero

2019

No

 Por lo que en mayo me salen registros de enero que no tendrían que salir puesto que esos registros son de enero

Espero haberme explicado. Muchas gracias


(lo he puesto en 2 mensajes puesto que me daba error al mandarlo todo en uno)



-------------
Eva


Publicado por: lbauluz
Fecha de publicación: 19/Mayo/2019 a las 22:46
prueba lo que te he puesto, pero cuando pulsan mayo, pones
switch (REVISION.Mes = "Mayo", "Mayo",  TRUE, "")

Si pulsan junio pones
switch (REVISION.Mes = "Junio", "Junio",  TRUE, "")

Es decir, creas la query de forma dinámica

Luis


-------------
El Búho es mi ídolo caido


Publicado por: Momoe
Fecha de publicación: 22/Mayo/2019 a las 13:52
Buenos días Luis, he hecho lo que me has dicho de la consulta dinámina de la siguiente forma:
en el formulario que tiene los botones de meses en cada uno he escrito el siguiente código (personalizando el mes en cada caso):

Sql = "SELECT REVISION.CodRevision, Clientes.Cod, Clientes.Nom, REVISION.Terminado, switch (REVISION.Mes = 'Enero', 'Enero',  TRUE, '""'), REVISION.Año, Clientes.Obs11, Clientes.Obs12 FROM Clientes LEFT JOIN REVISION ON Clientes.Cod = REVISION.CodCliente WHERE (((Clientes.Obs11)=True)) OR (((Clientes.Obs12)=True));"
stDocName = "ResultadoBusquedaRevision"
DoCmd.OpenForm stDocName, , , , , , Sql

He pasado la consulta como OpenArgs al formulario que me tiene que mostrar el Resultado (ResultadoBusquedaRevision).

Este formulario tiene dos campos que muestran el mes y el año y un subformulario que mostrará el resultado por lo que al abrir el formulario ResultadoBusquedaRevision he puesto el siguiente código:

Sql = Me.OpenArgs
Me.Clientes.Form.RecordSource = Sql
Me.Clientes.Form.Requery

El problema es que me carga todos los registros de Revision sean del mes que sean y si un cliente tiene una revisión hecha en Enero y en Mayo me aparecen las dos cuando pulso Enero.

Había pensado en que el subformulario que tiene que mostrar los datos (es de tipo hoja de datos) hacerlo sólo de la ficha de clientes y rellenar los campos de CodRevision, Mes, Año y Terminado (ahora serían independientes) con los datos de la tabla revisión buscándolos cuando se carga el subformulario pero se me queda colgado imagino que estoy haciendo algo mal, tampoco sé si esto se puede hacer o no.

En fin estoy ya por tirar la toalla 



-------------
Eva



Imprimir página | Cerrar ventana