Macro en un botón.

Tengo una base de datos para llevar el control de los alumnos de una escuela.
Hay un formulario llamado Ficha_Alumno con dos subformularios vinculados al código del alumno.
En uno de ellos (Subform_Contabilidad09), aparecen los meses del año y si el alumno pago y cuando. Todo esto se guarda en una tabla.
En el otro subformulario (Subform_Congelado), aparece un pequeño historial de cuando el alumno, por ejemplo en épocas de verano, deja de asistir a clase y por lo tanto, no tiene que pagar
Este subformulario tiene los siguientes campos (Código Alumno, Fecha Inicio Congelado y Fecha Fin Congelado)
Lo que quiero hacer es una macro en un botón, para que mire todos los datos de Subform_Congelado y que me marque automáticamente en el Subformulario_congelado09 una casilla de verificación de "estado congelado" en los meses correspondientes.
En el caso de que solo haya una fecha de inicio de congelado, debería marcar "estado congelado" todos los meses a partir de esa fecha. Y cuando se tuviese una fecha de vuelta, que me desmarcase las casillas correspondientes.
Quiero esto para que después, en un formulario que tengo para ver los impagados, no me aparezca la gente que dejo de ir a la escuela dos meses.
Si te hace falta alguna aclaración o algún dato más, por ejemplo un esquema de la base de datos, mandame un correo a este dirección Miguel.Nunez(arroba)gmx.net

1 Respuesta

Respuesta
1
No entendí bien si existen 2 o tres subformularios, pero para poder ayudarte haré algunas suposiciones: la primere es que tiene un subformulario que se llama Congelado09 que tiene 12 resistros que corresponden a los meses de una determinado año
Y por otro lado en el subformulario Congelado ya tienes filtrado los registros de año y esta ordenado
Entonces desde el botón, que esta en el formulario principal, en el evento al hacer click se debería escribir el siguiente código. (Utilizare una matriz para separar los procesos de lectura y marcado)
Dim Rst as Recordset
dim ini as integer
dim fin as integer
dim Mat(12) as boolean
fot i = 1 to 12
  mat(i)=false
endif
' lectura
set Rst = me.Congelado.recordset.recordclone
do not rst.eof
   ini= mounth(    rst!fecha_inicio)
   if isdate(rst!fecha_final) then
    fin = mounth(rst!fecha_final)
  else
   fin =12
  end if
  for i = ini to fin
   mat(i)=true
  next i
   rst.movenext
loop
set rst = me.congelado09.recordset.recordclone
rst.movefirst
for  i = 1 to  12
   Rst!Campo_Marca_de_Mes = mat(i)
  rst.movenext
next i
Me. Congelado09. Requery ' para actualizar
...
...
Como te habrás imaginado soy un poco novato en Access. En cuanto lo que quiero hacer se sale un poco de lo facilito, me pierdo, y sobre todo en Visual Basic. Te intento explicar un poco mejor lo que tengo.
Tabla / Formulario Contabilidad09 tiene las siguientes columnas (Total 18)
Ene09 ... Tipo:(Si/NO)
Ing_Enero09 ... Tipo (Fecha)
Feb09
Ing_Feb09
....
Ing_Dic09
(Las columnas que después se vinculan a la lista de impagados, es la de tipo SI/NO, así que la de tipo fecha es meramente informativa)
También voy a crear otra tabla igual para Contabilidad10, Contabilidad11 ....
Tabla/Formulario Congelado con las siguientes columnas (Total 3)
Codigo
Fecha_Inicio_Congelado
Fecha_Fin_Congelado
Formulario Ficha_Alumno
Código
Nombre
...
Subformulario Contabilidad 09, Contabilidad2010, ... que se muestran en pestañas, una por cada año
Subformulario Congelado
Al buscar un alumno en la ficha, se me actualizan automáticamente los subformularios de acuerdo con el código en cuestión
Lo que pretendo es poner un botón en el formulario Ficha_Alumno tal que al pulsarlo, me revise la lista de congelación: (Código / Fecha Inicio Congelado / Fecha Fin Congelado)
* Si solo existe un valor en Fecha Inicio Congelado, entonces debería marcar todos los meses (a partir del de fecha de inicio) del formulario Contabilidad09 como "estado congelado" (otra columna del tipo SI/NO)
* Si existe un valor en Fecha Inicio Congelado y otro en FechaFin Congelado, debería marcar en Contabilidad09 los meses entre el inicio y el fin como "estado congelado"
* Ten en cuenta que podría darse el caso de que un alumno pase varias veces por el estado congelado, ejemplo: de Abril a Junio no asiste a los cursos y después de Diciembre a Febrero del 2010 tampoco asiste.
* En el caso de que por ejemplo la fecha de inicio de congelación sea Diciembre de 2009 y la de fin Febrero de 2010, debería marcar como congelado en dos tablas distintas (Contabilidad 09 y 2010)
Si tu crees que hay una manera más sencilla de hacerlo, aunque sea modificar tablas, etc... dímelo
Espero haberme explicado un poco mejor
Gracias
Miguel
Seria bueno hacer alguno cambios a tus tablas, lo que te sugiero:
Tabla / Formulario Contabilidad tiene las siguientes columnas
Código
SwMes ... Tipo: entero donde 0:pendiente:1;pagado;2 congelado
Mes ... Tipo (Fecha)
(Las columnas que después se vinculan a la lista de impagados, es la de tipo SI/NO, así que la de tipo fecha es meramente informativa)
Ya no necesitas Contabilidad10, Contabilidad11 ...
Tabla/Formulario Congelado esta ok)
Código
FecIni
FecFin
Formulario Ficha_Alumno esta ok
Entonces al iniciar cada gestionen ves de crear una tabla creas 12 registros que corresponden a la gestión con el valor SwMes igual a no; con el trascurso del tiempo algunas se irán pagando entonces tentran el valor si.
En caso de realizar un congelamiento, se deberia actualizar la tabla contabilidad con la siguiente consulta
select contabilidad inner join congelado on contabilidad.codigo=congelado.codigo
set swmes=2 where codigo= [codigo del alumno que congelos]
and contabilidad.mes >= congelado.fecini
and contabilidad.mes<= iif(isdate(congelado.fecfin),congelado.fecfin, cdate("12/31/" & year(congelado.fecini))
No me ha quedado muy claro como modificar la tabla contabilidad.
La he modificado y ahora la tengo como sigue:
Código,, SwMes (Tipo: Asistente para búsqueda con tres posibles valores: Pendiente, Pagado y Congelado),, Mes (Tipo Fecha)
Si abro la tabla en vista hoja de datos, puedo ver todos los alumnos en la primera columna y después otras dos columnas (SwMes y Mes). ¿Cómo se supone que puedo poner los datos de varios meses? ¿Tengo qué crear un total de 12 columnas de cada Mes?
El resto de lo que propones no lo he probado porque sin resolver esta duda, no lo puedo intentar hacer.
Espero tu respuesta
Gracias
Miguel
No es necesario crear columnas, se deben crear filas, porque mediante las filas puedes agregar resultados.
Supongamos que tienes esta tabla, usare 0,1,2 para swmes:
Codigo swmes mes
1         1      01/01/2009
1         1      01/02/2009
1         2      01/03/2009
1         0      01/04/2009
..
1         0      01/12/2009
Para saber cuantas cuotas pagadas por alumno en la gestión 2009 la consulta seria esta:
Select  codigo, count(codigo) as Nro_Cuotas from contabilidad group by codigo
where year(mes)=2009 and swmes=1
Para poder ver el resumen por alumno en una sola fila se puede usar una consulta de referencias cruzadas, y te mostrara algo similar a la estructura que tenias anteriormente
TRANSFORM First(SWMES) AS ESTADO_DEL_MES
SELECT CODIGO
FROM CONTABILIDAD GROUP BY CODIGO
PIVOT FORMAT(MES,"YYYY/MMM") WHERE year(mes)=2009
esta otra consulta pude mostrarte un resumen por columnas de cuantas cuotas pagas, pendientes y congeladas por alumno de una gestion,
 TRANSFORM count (codigo) AS cuotas
SELECT CODIGO
FROM CONTABILIDAD GROUP BY CODIGO
PIVOT swmes WHERE year(mes)=2009
Hola otra vez
Estoy intentando hacer lo que tu me propones pero a la vez me surgen otras ideas que no se solucionar.
Estoy haciendo un botón dentro del formulario de las fichas de los alumnos. Pretendo que al pulsarlo, se me añadan automáticamente 12 registros a la tabla contabilidad, con el código del alumno que aparece en ese formulario (es un form con un buscador de alumnos), y que automáticamente me ponga los valores SwMes=1 y fecha=01/01/09, 01/02/09, ... etc.
Para abrir la tabla estoy usando lo siguiente
DoCmd.OpenTable ("Contabilidad")
DoCmd.RunCommand acCmdRecordsGoToNew
Pero no se como hacer que me escriba los valores automáticamente. Seguro que lo que estoy haciendo esta mal y que hay alguna forma mejor para hacerlo.
Para poner las fechas, pensaba en un
STATIC (Dias(12) AS INTEGER
Dias(0)=0, Dias(1)=31, Dias(2)=28, ...
y hacer con i=0 to 12
Fecha=01/01/2009
Fecha=fecha+Dias(i)
¿Podría salir?
Como ves, soy un completo novato :-)
Gracias
A esta función podrías llamar desde el botón
Sub AgregarMes (anio as integer, Cod as codigo)
dim i integer
DIM Qry as string
for i = 1 TO 12
   Qry = "INSERT INTO CONTABILIDAD(codigo,swmes, mes)"
   Qry  = Qry & " values (" & Cod & ",1,#" & i &"/01/" & anio & "#)"
    DoCmd.RunSQL QRY
NEXT I
Luego del llamar al procedimiento pones esta instrucción
me. Requery 'para actualizar el formulario
Ya he hecho esta ultima parte y funciona bien. Solo tuve que cambiar una las variables de la función así:
Private Sub AgregarMes(anio As Integer, cod As Integer)
Sino no funcionaba.
Ahora me pondré con la otra parte a ver que me sale.
Si quieres, te puntúo esta solución y cuando vuelva a tener otra duda, que sera mañana o pasado, te vuelvo a preguntar.
Como tu quieras.
Saludos
Si tiene que ver con el mismo tema, continuamos, si no, no le servirá a otra gente que busca entre las respuestas ya respondidadas...
Perdón por la tardanza pero el trabajo es lo primero :-)
Ya he conseguido hacer un botón con una macro para que me cree 12 registros en la tabla contabilidad con SwMes=Pendiente.
Estuve probando a poner el código que me decías para que me lea la tabla congelados y me actualice la tabla Contabilidad pero me da un error. Te transcribo lo que puse:
select Contabilidad inner join Ficha Congelados on Contabilidad.Codigo=Ficha Congelados.Codigo
set swmes=2 where Codigo= [Ficha Congelados.Codigo]
and contabilidad.mes >= Ficha Congelados.Congelado Fecha Inicio
and contabilidad.mes<= iif(isdate(Ficha Congelados.Congelado Fecha Fin),Ficha Congelados.Congelado Fecha Fin, cdate("12/31/" & year(Ficha Congelados.Congelado Fecha Inicio))
Lo que hice fue crear una consulta en vista SQL y ponerle ese código pero al guardar me sale el error: "Error de sintaxis (falta operador) en la expresión de consulta 'Contabilidad inner join ...
y me deja marcada la palabra inner join.
Si lo pongo de la siguiente manera:
SELECT Contabilidad.*, [Ficha Congelados].*
FROM [Ficha Congelados] RIGHT JOIN Contabilidad ON [Ficha Congelados].Codigo = Contabilidad.Codigo;
set swmes=2 where Codigo= [Ficha Congelados.Codigo]
and contabilidad.mes >= Ficha Congelados.Congelado Fecha Inicio
and contabilidad.mes<= iif(isdate(Ficha Congelados.Congelado Fecha Fin),Ficha Congelados.Congelado Fecha Fin, cdate("12/31/" & year(Ficha Congelados.Congelado Fecha Inicio))
Me sale el error, justo antes de Set SwMes "Se encontraron caracteres después del final de la instrucción SQL"
¿Puede ser problema con las relaciones?
Las relaciones que tengo son:
Ficha Alumno. Código ---> Contabilidad. Código
Ficha Alumno. Código ---> Ficha Congelados. Código
Como no había relación entre Contabilidad y Ficha Congelados, cree otra relación Código --> Código entre las dos tablas.
Gracias por tu ayuda
Miguel
existe un regla, en SQL para los nombres de tablas y los nombres de campos que no deberian tener caracteres en blanco ni especiales, por lo que si las tablas tienen estos caracteres tienen que estar necesarimente entre corchetes, entonces tu consulta seria
select Contabilidad inner join [Ficha Congelados] on Contabilidad.Codigo=
[Ficha Congelados].Codigo
set swmes=2 where Codigo= [Ficha Congelados].[Codigo]
and contabilidad.mes >= [Ficha Congelados].[Congelado Fecha Inicio]
and contabilidad.mes<= iif(isdate([Ficha Congelados].[Congelado Fecha Fin]),
[Ficha Congelados]. [Congelado Fecha Fin], cdate("12/31/" &
year([Ficha Congelados].[Congelado Fecha Inicio]))
Hola,
¿Me sigue dando el error de sintaxis en "inner join" (Falta operador)?
Modifica: select contabilidad inner............
por : update contabilidad inner............
Si pongo UPDATE CONTABILIDAD .....
Error de sintaxis en la expresion UPDATE
Estuve probando otras formas y si por ejemplo lo pongo asi:
SELECT Contabilidad.Codigo, [Ficha Congelados].Codigo
FROM [Ficha Congelados] RIGHT JOIN Contabilidad ON [Ficha Congelados].Codigo = Contabilidad.Codigo;
set swmes=2 where Codigo= [Ficha Congelados].[Codigo]
and contabilidad.mes >= [Ficha Congelados].[Congelado Fecha Inicio]
and contabilidad.mes<= iif(isdate([Ficha Congelados].[Congelado Fecha Fin]),
[Ficha Congelados].[Congelado Fecha Fin], cdate("12/31/" &
year([Ficha Congelados].[Congelado Fecha Inicio]))
Me sale error en SET, me dice que se encontraron caracteres después del final de la instrucción SQL
Una pregunta: ¿En la vista SQL de una consulta se puede usar la expresión SET? Yo creí que esto solo se podía usar en el generador de código de por ejemplo un botón.
Ya me funciona, faltaban algunos parentesis y por ejemplo en Codigo=[Ficha Congelados]... puse [Contabilidad].[Codigo]=...
Me puedes explicar este trozo de funcion:
contabilidad.mes<= iif(isdate([Ficha Congelados].[Congelado Fecha Fin]),
[Ficha Congelados].[Congelado Fecha Fin], cdate("12/31/" &
year([Ficha Congelados].[Congelado Fecha Inicio])
No se porque pero cuando actualizo la tabla contabilidad, si la fecha de inicio de congelado es 05/03/09 y fin 06/06/09 me actualiza a congelado los meses Abril Mayo y Junio, pero no el mes de Marzo. Supongo que sera algo en la parte de la función que no entiendo.
Saludos
Si [Ficha Congelados].[Congelado Fecha Fin] Es una dato tipo fecha:
Entonces: compara mes con esa fecha ([Ficha Congelados].[Congelado Fecha Fin])
De los contrario: compara con el 31de dic del mismo año de la fecha de inicicio
(year([Ficha Congelados].[Congelado Fecha Inicio]))
Es Actualiza hasta la fecha final y si no existe hasta el ultimo mes del año de la fecha de inicio.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas