El otro día oí en la televisión que el futbolista Cristiano Ronaldo cobraba 35.000 € al día. Después de recuperarme del shock decidí hacer unos cálculos para ver cuánto ganaba este tipo al mes. Así que, si en un mes estándar de 30 días, le quitamos los sábados y domingos [que habrán 8 por mes], nos quedaría 22 días de trabajo en los que cobraría esa cantidad, así que, 35.000 € x 22 = 770.000 €. Pensando cómo están los salarios en españa y por redondear, podríamos decir que se está llevando el sueldo de 770 personas. Esto dicho así impacta, pero no demasiado así que vamos a verlo de una manera más visual. Ésta es la cantidad de personas que podrían estar cobrando un sueldo de 1000 € con el del tipo ese:

¿Es o no es una pasada?
Como se suele decir "es de bien nacido el ser agradecido" y yo estoy realmente agradecido a internet en general por todo lo que me ha aportado en estas últimas semanas en las que he tenido que trabajar con Access 2007 [el cual solo había utilizado para hacer prácticas de SQL y ni si quiera era en esa versión]. Por ello, me gustaría devolver el favor a la comunidad recopilando todas las dudas y soluciones que encontré en una única entrada de tal forma que si alguien llega aquí con las mismas dudas no tenga que andar buscando más.
Seguiré el mismo orden en el que me aparecieron los problemas [o por lo menos lo intentaré]:
¿Cómo puedo hacer que un formulario aparezca según abro el Access?
Muy fácil. Nos vamos al botón del office [el de la esquina superior izquierda], Opciones de Access, Base de datos actual y en la lista de opciones de la derecha desplegamos el menú "Mostrar formulario" para elegir el que queremos que se muestre al abrir el Access.
¿Dónde indicar que guarde el contenido de un cuadro de texto en una tabla?
Nos vamos a la hoja de propiedades del cuadro de texto y en la pestaña "Datos", desplegamos el menú "Origen de control" para elegir el campo en el que queremos que se guarde el valor del cuadro de texto. También podemos hacerlo directamente si hacemos clic en el botón "Agregar campos existentes" de la pestaña "Diseño" en el menú superior. De esta forma podremos arrastrar el nombre de un campo de la tabla al formulario con lo que nos añadirá un cuadro de texto configurado automáticamente para que guarde el valor en el campo correspondiente.
¿Cómo puedo hacer un menú desplegable en el que el usuario elija entre las opciones que yo le dé o entre los valores de un campo de una tabla?
El menú desplegable en Access se llama Cuadro Combinado [en inglés creo que es ComboBox]. Cuando insertamos uno en nuestro formulario nos saldrá un asistente que nos dará tres opciones
1 Deseo que el cuadro combinado busque los valores en una tabla o consulta
2 Escribiré los valores que desee
3 Buscar un registro en el formulario según el valor que he seleccionado en el cuadro combinado
1 Permite coger los valores de un campo y colocarlos en el menú desplegable
2 Permite crear una lista propia para que el usuario escoja
3 Supongo que sirve para realizar búsquedas [eliges un valor y el resto del formulario se llenará con el resto de campos de esa fila]
No hay más que seguir los pasos del asistente para conseguir cualquiera de nuestros dos objetivos.
¿Cómo puedo limpiar un formulario al cargarse?
Esto lo descubrí jugando con los botones. Si creáis un botón con el asistente y elegís que sea para Agregar un nuevo registro, al salir del asistente, si os dirigís a la hoja de propiedades pestaña Eventos, podréis ver la macro asociada al evento "Al hacer clic". Dicha macro os puede servir para limpiar el formulario, solo tenéis que copiarla y luego en la misma hoja de propiedades, encima de las pestañas, elegir "formulario" que será el nombre que tenga por defecto vuestro formulario, ir a la pestaña eventos y al evento "Al cargar" añadirle la macro que habéis copiado.
¿Cómo puedo guardar y limpiar el formulario para añadir un nuevo registro?
Igual que antes, crea un botón guardar y mira la macro asociada. Solo tienes que añadirle la macro de "agregar nuevo registro" después de la que tiene. De esta forma guardará y limpiará el formulario.
Con esto y algunos conocimientos de programas parecidos ya podía manejarme con cierta soltura en los formularios, por lo menos para meter datos en las tablas. Luego me surgió la necesidad de operar esos datos para obtener unos resultados. Para ello Access no tenía ningún asistente que te resolviera la vida [o por lo menos yo no lo encontré] así que tuve que enfrentarme al Visual Basic para jugar con los eventos de los objetos del formulario y sacar la información tal y como yo la quería.
¿Cómo cojones se trabaja en el Visual Basic de Access?
Era la primera vez en mi vida que veía el Visual Basic. Había oído hablar de él pero nunca lo había trabajado. Su sintaxis me recordaba a Ada [otro gran olvidado en mi cabeza] pero aún así tenía sus diferencias. ¿Por dónde empezar? bueno, yo tenía claro que quería que, tras actualizar un cuadro combinado, me mostrase información en el resto de campos. Eso es trabajar con el evento "Después de actualizar" [after update en inglés]. Así que piqué en él [no hace falta que os diga como acceder al apartado eventos de un cuadro combinado ¿no?] y le dije que quería "Generar código" [para que salga esa opción hay que hacer clic en el botón con puntos suspensivos, tras hacer clic por primera vez dentro del espacio blanco que hay en el evento].
Me abrió una ventana nueva con la cabecera y el final del procedimiento/método/loquesea lista para que trabajase con él. Aquí os contaré un pequeño truco universal para cualquier lenguaje que lo permita y no tengáis depurador a mano: lanzad mensajes. Puede parecer una chorrada pero si metéis mensajes en medio del código, cuando ejecutéis el programa y vayáis leyendo los mensajes podréis saber por dónde está pasando vuestro programa y en que punto se queda parado. La función maestra para lanzar mensajes en Visual Basic es MsgBox("mensaje" o Variable). Eso os permitirá comprobar si el valor de un cuadro de texto es realmente el que pone [ya lo veremos más adelante], el valor de una variable o simplemente lanzar mensajes para asegurarte de que el programa pasa por donde tú crees que está pasando.
Una vez sabemos esto podemos darnos de cabezazos con Visual Basic.
¿Cómo me creo una variable?
A pesar de todo, Visual Basic tiene sus puntillos y te puedes llevar alguna alegría al saber que te ahorras código que en otros lenguajes no te ahorrarías. Para declarar una variable debemos escribir:
Dim Nombre As Tipo [la opción de autocompletar ayuda bastante para saber cómo se llaman los tipos que utiliza Access]
¿Y los comentarios?
Es posible que a estas alturas no estés interesado en los comentarios y sí en salvar el pellejo resolviendo el problema que tienes entre manos pero recuerda que los comentarios son tus Post-it del futuro, los que, de la misma forma que esta entrada, podrían ahorrarte mucho tiempo de búsqueda que ya has gastado. En Visual Basic los comentarios son de este tipo:
'Esto es un comentario
Si queremos que tenga más de una línea debemos añadir un espacio al final y un sub-guión
'Primera linea _
Segunda linea
Prefiero el /**/ de C, queda mucho más bonito pero bueno, tenemos que apañárnoslas con lo que tenemos.
Vale, variables y comentarios ¿empezamos a trastear?
Ok, ya tenemos las variables. Para operar con ellas es:
Variable = Variable/Valor Operador Variable/Valor
O lo que es lo mismo:
P = i + 2
Ya que estamos, aclaremos también como se escribe un if, while y for:
if condicion then
...
end if
if x = 3 And y <> 4 Then
...
End If
He añadido varios detalles más que dependiendo del lenguaje del que vengas te imaginarás o no. Puedes ver como he unido dos condiciones con el And, se te pondrá en azul después de darle al enter lo que te confirmará que es una palabra clave del lenguaje [también está el Or]. Otro detalle importante es que se compara con el = sin ningún añadido, lo que quiere decir que tanto para la asignación como para la comparación se usa el =. Y el distinto, en este caso, es el <>. Tenlo presente ya que lenguajes como C tienen más símbolos o símbolos distintos.
While Condicion
...
Wend
While Not x = y
...
Wend
Fíjate aquí también que para negar usamos el Not. Un detalle curioso para mí fue descubrir el Wend. Es la primera vez que lo veía y tenía la esperanza que para el for fuese el Fend pero no fue así.
For Variable = Valor To Variable/Valor
...
Next Variable
For i = 0 To 20
...
Next i
Que yo sepa, para el for hay que tener la variable ya creada pero tampoco experimenté mucho así que no sé si se puede crear dentro directamente.
Bien, conocemos las instrucciones básicas así que ahora podemos movernos con cierta soltura dentro del código. Para hacer pruebas lo mejor es ejecutar el evento del formulario que tiene asociado el código que estamos creando. Por ejemplo, actualizar el valor de un Cuadro Combinado.
Vale, problema ¿cómo hago yo para usar el valor de un objeto del formulario, por ejemplo de un cuadro de texto?
Pongamos que quieres sumar el valor de dos cuadros de texto. La idea general sería Cuadro_de_texto3 = Cuadro_de_texto1 + Cuadro_de_texto2. En la práctica hay que tener en cuenta dos cosas:
- Los objetos del formulario [cuadro de texto, cuadro combinado, etc] se referencian en el código metiendo sus nombres entre corchetes. Por ejemplo [Nombre]
- Para acceder al valor de un objeto hay que escribir su nombre entre corchetes punto Texto. Por ejemplo [Nombre].Texto
Haced la prueba. Yo estaba intentando comparar dos valores de dos objetos y no salía verdadero. Usé el MsgBox para ver qué valían y donde yo creía que había texto en realidad habían números. Al acceder a la ¿propiedad? Texto vamos directos al valor del objeto y podemos compararlos correctamente.
Por cierto, hablando de texto: Para asignarle uno a un cuadro de texto no es necesario poner el .Texto [de hecho creo que da error] y si queremos meterle el contenido de una variable [tipo string por ejemplo] más algo extra hay que usar el & [ampersand] "texto".
Al fin puedo rellenar el formulario por mi cuenta pero... un momento ¿cómo accedo a los valores de una tabla?
Bien, esto son palabras mayores. Queremos acceder a los valores de una tabla. Yo no requerí de modificarlos así que lo que viene a continuación son solo consultas y comparaciones.
Para cargar una tabla y poder trabajar con ella requeriremos lo que se conoce como Recordset. Mi variable la creé así:
Dim Variable As DAO.Recordset
Por lo que tengo entendido, en el Recordset se mete una copia de la tabla [o quizá es un acceso a la misma, como no la modifiqué no lo sé] y gracias a sus métodos asociados podemos recorrerla y extraer valores de sus campos para compararlos con otros valores.
Lo que viene ahora me trajo más de un dolor de cabeza ¿Cómo hago referencia a mi propia BD dentro del código? la respuesta es tan chorra como difícil de imaginar:
Set Variable = CurrentDb.OpenRecordset("Consulta")
Set MiRecordset = CurrentDb.OpenRecordset("SELECT * FROM Clientes")
Set es como una orden, está diciendo mete en esta variable lo que yo te voy a decir a continuación. CurrenDb Base de Datos actual [gracioso ¿no?] y la consulta SQL que nos permitirá copiar/asignar toda la tabla Clientes a nuestro Recordset.
Ahora que la hemos cargado podemos movernos por ella con los métodos del Recordset:
MiRecordset.MoveFirst - Ir al primer registro
MiRecordset.MoveNext - Ir al siguiente
MiRecordset!Campo - Hace referencia a un campo de la tabla, por ejemplo: MiRecordset!NombreCliente
MiRecordset.EOF - Final de la tabla [como con los ficheros]
MiRecordset.Close - Cerrar el Recordset [por si acaso no lo hace el programa solo, mejor hazlo]
El código se me queda corto ¡necesito funciones!
Vale, te las manejas más o menos bien pero te das cuenta de que hay código que te podrías ahorrar metiéndolo en una función/procedimiento. Te puedes hacer una idea viendo la cabecera del procedimiento en el que estás trabajando. Sin embargo tiene un detallito bastante molesto:
Sub Procedimiento (Variable As Tipo, Variable As Tipo)
...
End Sub
Ya la hemos creado y queremos llamarla. Adelante, hazlo... ¿ya? ¿viste que error más bonito? eso se debe a que para hacer una llamada al procedimiento hay que meterle un Call delante:
Call Procedimiento(Variable1, Variable2)
Con las funciones no hace falta eso pero también tienen su pijería molesta:
Function Nombre (Variable As Tipo) As Tipo
...
Nombre = Valor [valor devuelto] o en caso de que queramos cortar la función Exit Function
End Function
Nos vamos acercando al final. Ya controlamos varias cosas con las que se puede hacer bastante. Hemos trabajado con Cuadros de Texto y ahora queremos pasar a otros objetos. Vamos a ver el cuadro combinado y el cuadro de lista.
¿Cuadro combinado? ¿Cuadro de lista? ¡¡¡help!!!
CC y CL para simplificar. Ambos tienen varias funciones útiles a la hora de añadir o eliminar valores.
CC.AddItem(Variable/"Valor") - Añadimos un valor a la lista desplegable. Creo que hace falta añadir ; al final ya se use variable o valor [por dentro del paréntesis quiero decir]
CL.AddItem(Variable1/"Valor1" & ";" & Variable2/"Valor2" & ";") - En el cuadro de lista podemos tener varias columnas. Para meter un valor en cada columna [en la misma fila] podemos usar esa forma para conseguirlo.
CC/CL.ListCount - Número de elementos que hay dentro del objeto
CC/CL.RemoveItem(indice) - Utilizando ListCount podemos saber cuántos elementos hay y así poder eliminarlos [ya que, que yo sepa, no tiene un método para vaciar el objeto automáticamente]
Y por último dos detalles pequeños pero incisivos cual colmillos:
IsNull(Variable) - Función para saber si un campo u objeto está vacio
Objeto.SetFocus - Al intentar trabajar con las propiedades de otro objeto en un evento nos dará un error de que no tenemos el control del mismo o algo así. Eso se soluciona con SetFocus con lo que recuperamos el control de dicho objeto.
Bueno, quizá me haya dejado algo pero por lo menos espero haberos ahorrado el mismo tiempo que tardé yo en recopilar toda esta información. Si ésto os resulta útil, la mejor forma de agradecérmelo es hacer lo mismo, aprovechad el alcance de internet para compartir los conocimientos nuevos que habéis adquirido. Quién sabe si un día me estaréis echando una mano a mí ;).
Aunque llevo desde principios de año [un poquito antes en realidad] en eso del twitter [y más o menos la misma cantidad de tiempo con un enlace desde mi journal] nunca había hecho promoción del mismo. Como hay veces que no hay tiempo o ganas de desarrollar una entrada entera pues hago uso del twitter para cualquier chorrada pensamiento filosófico que se me ocurra y así practico lo de sintetizar en pocas palabras una idea. No lo actualizo cada 10 minutos como muchos por ahí pero poco a poco ha ido creciendo, alimentándose de fracesillas que se me van ocurriendo. Si esto os ha picado la curiosidad, podéis echarle un vistazo en aquí.
O por lo menos eso me pareció ver. Había oído que Patricia Conde había hecho una parodia del videoclip de Shakira y como no he visto ni lo uno ni lo otro lo busqué en youtube para verlo.
Realmente no me hubiera dado cuenta si no fuera por su propio gesto. Si veis la escena os fijaréis que parece como que alguien le dice/señala algo, ella mira hacia abajo, mira más abajo, levanta la cabeza y pone morritos. Fue un gesto que no iba con la situación y al volver a verlo me fijé que sí que se ve algo. Mi mente calenturienta piensa que es el pezón, lo mismo me equivoco y es una sombra pero bueno, ahí queda a la opinión de cada uno.
La escena que comento es justo ésta [con lo que además pruebo lo de poner un momento exacto en un vídeo de youtube que no lo había hecho nunca :D].
Para todos los adolescentes superhormonados, tranquilos, no tenéis que darme las gracias xDDDD
"Penny: Yo soy sagitario, lo que os dirá más de lo que necesitáis saber.
Sheldon: Sí, nos dice que participas en ese engaño masivo de nuestra cultura de que la posición aparente del sol con respecto a unas constelaciones definidas arbitrariamente en el momento en que naciste puede afectar a tu personalidad"
The Big Bang Theory Capítulo 1
Últimamente estoy intentando echar a patadas metafóricas la rutina que tan arraigada tenía, tratando de hacer más cosas para sentir que aprovecho mejor el tiempo y me he dado cuenta de lo difícil que es. Aunque sé que no debería compararme, leo, veo y oigo lo que suele hacer la gente por ahí y no paro de preguntarme de dónde sacan el tiempo para hacer tantas cosas, a mí se me va volando el día y apenas he hecho la mitad de las cosas que me hubiera gustado hacer.
Lo peor, en mi opinión, es tener que compaginar la vida real con el mundo virtual [y eso que no juego a ningún MMORPG] hay muchas cosas que quiero aprender o practicar como tutoriales de photoshop [a ver si me despiertan la creatividad que la tengo completamente dormida] que requieren de sus buenas horas de trabajo y a veces, cuando tengo un momento libre lo que me apetece es tirarme en la cama a dormir.
Me lo estoy tomando con calma pero con constancia porque sé que esto es como las dietas, que mientras más estricta sea antes te cansas de seguirla [a menos que se tenga mucha voluntad]. ¿Y a vosotros que tal os va? ¿os da el día para hacer todo lo que queréis?

Si esta entrada llevara un subtítulo seguramente sería "Cuanto daño ha hecho Hajime no Ippo por aquí".
Los juegos de boxeo nunca me han interesado demasiado, los pocos que probé en su día eran complicados de manejar así que dejé de interesarme por ellos [creo que el último que probé fue uno de gameboy en el que solo se veían los guantes]. Hace poco, visitando un foro leí que iba a salir este juego "Fight Night Round 4" [o como yo lo llamo, para abreviar y aunque no tenga nada que ver "Fighting Force" xD] y seguramente, si no hubiese sido por la serie de Ippo ni si quiera le habría prestado atención pero lo hice, busqué un vídeo por ahí del juego y me quedé alucinando por el realismo que tiene. Los boxeadores parecen de verdad, la cara se les va amoratando mientras pasan los combates e incluso les sangra, cada vez que reciben un golpe fuerte se ven las gotitas de sudor volando, se les deforma la piel,... es increíble. Así que decidí estar atento a la demo para comprobar si realmente era así o simplemente estaban vendiendo humo.
Pasó el tiempo y por poco no pruebo la demo [me daba pereza bajar la demo de 1 Giga y pico] pero aprovechando un día en el que probamos otras demos pusimos esa a descargar [casi nos hemos conseguido todos los logros del juego que trae la consola de hacer flores con los hexágonos de colores xD]. Nos sorprendimos de que la demo no solo permitiese jugar un combate completo [con Ali y Tyson nada menos] sino que además permitía jugar 2 jugadores. Mi hermano desde que lo vio cogió el otro mando y nos pusimos a jugar.
Solo decir que los vídeos no le hacen justicia al juego, es muchísimo más divertido. Para colmo [y sin querer], mi hermano se ha especializado en las contras mientras que a mí se me da mejor esquivar golpes haciendo círculos con la cabeza... imaginaros como hemos acabado xD [para los que no han visto la serie esos son los movimientos principales de Miyata e Ippo, ambos protagonistas y rivales]. Como todavía no he jugado al juego completo no sé cómo será la dificultad que alcanza pero por lo menos para echar unos piques está genial.
Una vez más encuentro una canción que vale la pena tanto por su letra como por su videoclip. A ésta le acompaña una elaboradísima composición de tipografías que enlaza cada frase de la canción creando una animación muy creativa.
( Lyric )


