Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INTRODUCCIN
Aprenderemos mediante este ejemplo a crearnos un
calendario que nos mostrar las citas que hayamos
introducido en la BD de manera global, en un planning
mensual.
Hay partes del cdigo que no explicar porque requieren
unos ciertos conocimientos de VB. En estos casos slo
explicar la mecnica del cdigo, con ms o menos detalles.
De todas maneras ya sabis que tengo cierta tendencia a comentar todos los cdigos, por lo
que podris (espero) seguir las lneas y lo que hacen.
PREPARATIVOS INICIALES
Vamos a crearnos una tabla donde introduciremos los eventos o citas. Por ejemplo,
supongamos que la BD va a ser para una consulta de un mdico (si entendemos la mecnica
podremos adaptar el ejemplo para cualquier situacin de caractersticas similares). As, vamos
a crearnos una tabla que llamaremos TCitas2, con la siguiente estructura:
Rellenamos esta tabla con algunos valores para tener material de trabajo. Por ejemplo, yo he
utilizado los siguientes:
Nos vamos a crear ahora un formulario sobre TCitas, que llamaremos FCitas. Nos lo
guardamos para despus.
Creamos una tabla para los meses, que llamaremos TMeses, con la siguiente estructura:
1
2
La BD de ejemplo os la podis bajar aqu (versin Access 2003) o aqu (versin Access 2007). Tened en cuenta que
se han detectado problemas de incompatibilidad entre versiones, por lo que os recomiendo bajaros la que
corresponda a vuestra versin de Office.
El ejemplo est simplificado al mximo en cuanto a datos. Lgicamente, con las oportunas adaptaciones,
podramos complicarlo tanto como quisiramos.
Vistame en http://siliconproject.com.ar/neckkito/
Lgicamente, si utilizamos un autonumrico, debemos introducir los meses por orden, para
que nos queden correctamente los meses con su correspondiente nmero de mes.
Finalmente creamos una tabla para introducir los das
festivos del ao. A esa tabla la llamaremos TFestivos, con la
siguiente estructura simple:
Metemos algunos festivos del ao para poder ver cmo quedarn reflejados en nuestro
calendario.
Este sera el
,,, y as
txt2
sucesivamente
Es decir, seis filas de siete columnas (ah os ser muy til eso del copy-paste).
A continuacin sacamos las propiedades de las etiquetas de cada textbox y nos vamos a la
pestaa Otras Nombre, y escribimos lblX, donde X es un nmero que va del 1 al 42 (lbl1,
lbl2, , lbl42).
Hacemos lo mismo con los textbox, ponindoles de nombre txtX (txt1, txt2, , txt42).
Creo que la ilustracin de arriba es representativa de lo que os quiero decir
2
Vistame en http://siliconproject.com.ar/neckkito/
Lo que hace este cdigo simplemente es asignar valores a los controles del encabezado y
ejecutar el procedimiento asignado a cboMes_AfterUpdate().
Y qu hace cboMes_AfterUpdate()? Pues si sacamos las propiedades del combo al evento
Despus de actualizar le generamos el siguiente cdigo:
El procedimiento simplemente comprueba que los valores de los controles del encabezado sean
correctos y llama al procedimiento primeroUltimoMes(), pasndole como argumentos el ao y
el mes que se hallan seleccionados.
Vistame en http://siliconproject.com.ar/neckkito/
End Sub
Vistame en http://siliconproject.com.ar/neckkito/
4.- El procedimiento rellenoDatosCalendario lo que hace es rellenar una matriz con una cadena
vaca si no hay cita para ese da, o con una cadena seguida de la informacin de las citas. Ms
o menos as:
infoDia(1) = Cadena vaca
infoDia(2) = Spiderman \ Alergia a las araas\-----\
infoDia(3)
=
MeLoInvento
\
Rotura
brazo
\-----\MeLoInvento2 \ Rotura pie \----\
etc.
De manera que si seguimos el ejemplo el primer da de relleno del
mes de abril hemos detectado que era el 30/03/12; ergo se
establece una correspondencia entre la fecha y el ndice de la
matriz
InfoDia(1) equivalente a 30/03/12
InfoDia(2) equivalente a 31/03/12
etc.
El recorrido por la tabla con la informacin de las citas se realiza a travs de una SQL que filtra
da a da, y un recordset que recoge la informacin de cada uno de los registros.
Lgicamente, la matriz se redimensiona en funcin de si necesitamos la sexta semana o no.
A continuacin realizamos el proceso de recorrer la matriz y traspasar su informacin a los
textbox de FCalendario, estableciendo la siguiente correspondiencia:
InfoDia(1) equivalente a txt1
InfoDia(2) equivalente a txt2
etc.
Aprovechamos el proceso para recorrer tambin la tabla de festivos y, en caso de
concordancia, situamos el color de fondo el textbox cuya fecha coincida con el festivo de un
color amarillo-ocre (para no dificultar la lectura del texto interior). Esto no lo hace aqu, sino
que llama al proceso que s lo hace, y que encontraris en el punto 5 siguiente.
Como curiosidad os dir que cuando rellenamos la matriz lo hacemos utilizando la contrabarra
(\). Lo hago as para utilizar la funcin Replace(), de manera que cuando encuentra una
contrabarra la cambie por un salto de lnea. Eso hace el texto ms legible en el textbox.
Tambin decir que, acabado el recorrido de la matriz y su trasvase de informacin a los
textbox, elimino la matriz para evitar que se inicie un nuevo proceso (un cambio de seleccin
de mes, por ejemplo) y los datos, en lugar de empezar de cero, se acumulen a los existentes,
lo cual sera una autntica catstrofe.
5.- El procedimiento marcaFestivos() lgicamente lo que hace es buscar concordancias entre
los festivos informados en TFestivos y marcarlos en los textbox correspondientes a travs de la
modificacin del color de fondo.
6.- Los procedimientos ocultaSextaSemana() y muestraSextaSemana() son procedimientos
auxiliares y son, evidentemente, llamados cuando se determina si el mes tiene cinco o seis
semanas, para hacer invisible o visible la sexta semana en FCalendario.
Vistame en http://siliconproject.com.ar/neckkito/
Lgicamente es condicin sine qua non que haya un campo fecha (un calendario sin fecha es
difcil de imaginar, verdad? )
3.2.- El bloque DO UNTIL... LOOP, que dice:
Do Until .EOF
contenidoDia = contenidoDia & .Fields(0).Value
'Aado carcter que me har de salto de lnea en Replace
contenidoDia = contenidoDia & "\"
contenidoDia = contenidoDia & .Fields(1).Value
'Aado carcter que me har de salto de lnea en Replace
contenidoDia = contenidoDia & "\"
'Aado una lnea separadora
contenidoDia = contenidoDia & "-----------------------------"
'Aado carcter que me har de salto de lnea en Replace
contenidoDia = contenidoDia & "\"
6
Vistame en http://siliconproject.com.ar/neckkito/
Vistame en http://siliconproject.com.ar/neckkito/
Vistame en http://siliconproject.com.ar/neckkito/
iDate = iDate + 1
Else
Exit For
End If
End If
End If
Next ctl
'Llamo al procedimiento rellenoDatosCalendario()
Call rellenoDatosCalendario(primerDiaCalFecha, ultimoDiaCalFecha)
End Sub
'----------------------------------------------------------------------------------------------------------------------' Este procedimiento nos rellena los textbox con la informacin de la tabla TCitas, utilizando para ello
' un proceso en dos fases
' Fase 1: acumula los valores en una matriz (infoDia)
' Fase 2: traspasa los valores de la matriz a cada textbox correspondiente
'----------------------------------------------------------------------------------------------------------------------Public Sub rellenoDatosCalendario(pdc As Date, udc As Date)
'Compruebo la diferencia entre las fechas "ltimo dia calendario" (udc) y "Primer da calendario" (pdc)
'para saber si he ocultado la sexta semana o no. En funcin del resultado redimensiono mi matriz
If udc - pdc + 1 <= 35 Then
ReDim infoDia(1 To 35)
Else
ReDim infoDia(1 To 42)
End If
'Cojo el valor ms alto de la matriz que se haya creado
maxMatriz = UBound(infoDia)
'Inicializo el ndice de mi matriz infoDia
i=1
'Inicializo el contenido de los datos que contendr la variable contenidoDia
contenidoDia = ""
'Inicio un recorrido de las fechas desde el primer da del calendario (pdc) hasta
'el ltimo da del calendario (udc)
For iDate = pdc To udc
'Creo una SQL sobre la tabla TCitas, filtrada por iDate
miSql = "SELECT TCitas.NomPac, TCitas.MotivoCita" _
& " FROM TCitas" _
& " WHERE TCitas.FechCita=#" & Format(iDate, "mm/dd/yy") & "#"
'Creo un recordset sobre la SQL
Set rst = CurrentDb.OpenRecordset(miSql)
'Si no hay registros relleno el elemento i de la matriz infoDia con una cadena vaca
If rst.RecordCount = 0 Then
infoDia(i) = ""
Else
'Si hay registros los recorro y voy creando los valores que se incluirn
'en mi matriz infoDia
With rst
.MoveFirst
Do Until .EOF
contenidoDia = contenidoDia & .Fields(0).Value
'Aado carcter que me har de salto de lnea en Replace
contenidoDia = contenidoDia & "\"
contenidoDia = contenidoDia & .Fields(1).Value
'Aado carcter que me har de salto de lnea en Replace
contenidoDia = contenidoDia & "\"
'Aado una lnea separadora
Vistame en http://siliconproject.com.ar/neckkito/
10
Vistame en http://siliconproject.com.ar/neckkito/
11
Vistame en http://siliconproject.com.ar/neckkito/