Mostrando entradas con la etiqueta Access Avanzado. Mostrar todas las entradas
Mostrando entradas con la etiqueta Access Avanzado. Mostrar todas las entradas

viernes, 14 de noviembre de 2014

Complementos para formularios más eficientes en Access con Macros


Se presenta una descripción de como emplear complementos para los formularios de Access. Para ejemplificar lo anterior, se crea una base de datos y formulario que permite el registro de alumnos de un colegio. 
Los complementos permiten habilitar ciertas preguntas según algún criterio establecido en la macro.
Lo anteriormente descrito se puede ver en el video que les dejamos a continuación:







Leer más...

jueves, 23 de enero de 2014

Complemento para generar formularios más funcionales en Access usando Macros

El propósito de esta publicación es dar una lección formativa, vía Macros, que permita complementar la creación y edición de los formularios en Access. En lo puntual, se mostrará el paso a paso de la habilitación de preguntas que se encuentran anidadas o que las respuestas de una de ellas estén condicionadas a las de otra pregunta. Esto te permitirá generar mejores formularios, más funcionales y coherentes con las exigencias de los mismos. 

Introducción y definiciones previas


Access se ha transformado en una herramienta sencilla de usar, que permite alojar datos y crear aplicaciones de base de datos por medio de sistemas y funciones especializadas para ello. Hoy por hoy, se dice que este representa más que un mantenedor de bases de datos y se impone como una herramienta de gestión fundamental para las empresas del nuevo siglo, ya que ha permitido la creación de programas computacionales a medida que se ajustan a las problemáticas y necesidades coyunturales de las organizaciones actuales, permitiendo el aumento de la eficiencia y eficacia en el trabajo. Cabe mencionar que Access resulta el programa medular de este post.

Por otro lado, el análisis y la administración de datos han crecido notablemente el último tiempo. Por lo mismo, para lograr el manejo óptimo de las estructuras de orden, procedimientos y tareas, se han desarrollado herramientas que permiten automatizar un grupo de órdenes escritas. Las Macros son un conjunto de instrucciones escritas que permiten automatizar y llevar a cabo tareas complejas. Muchas veces, basta tan sólo dar un click a un botón. Macros opera bajo el lenguaje de programación Visual Basic (VBA), el cual resulta elemental para las herramientas de Excel y otros programas de Microsoft Office. Se debe tener presente que manejar esta herramienta representa una ventaja comparativa en el vertiginoso mundo de los negocios.

A continuación se entrega una secuencia lógica, usando Macros, sobre un objeto de base de datos que puede utilizarse para escribir, modificar y mostrar datos de una consulta o de una tabla, es decir, un formulario. En esta lección, se enseñará a habilitar preguntas anidadas y condicionadas a la(s) respuesta(s) de otra pregunta. Primero, resulta útil revisar ciertas estructuras que encontramos en lenguaje VBA, las cuales serán fundamentales para el correcto entendimiento del contenido medular de este post. Tener en cuenta que el contenido presente en esta publicación requiere un nivel intermedio de uso de formularios en Access y Macros

Estructuras Condicionales

En Visual Basic para Aplicaciones (VBA) existen dos tipos de estructuras clásicas, las del tipo condicional y las reiterativas. Para efectos de esta publicación, sólo será necesario detallar la primera. Ahora bien, se mostrará principalmente su sintaxis y lógica, los aspectos más teóricos y elementales exceden el propósito de este post y, por lo tanto, representa labor del lector ahondar en estos contenidos.
Las estructuras condicionales son instrucciones de programación que tienen como propósito evaluar si una condición es verdadera (True) o falsa (False) y posteriormente permiten especificar instrucciones a seguir según el resultado de la condición. Se debe tener presente que este tipo de estructura cumple con las propiedades de Operación Lógica. Además, para usar más de una condición, podemos hacer uso de las operaciones Or en el caso de la conjunción disyuntiva (O) y el And  para la conjunción copulativa (Y). 

La estructura condicional If <cond> Then … End If  se compone de la forma que se muestra en la Ilustración I adjunta:


Observaciones:

  • Sub y End Sub indican el inicio y el final de la Macro de nombre “estructuras_condicionales”.
  • Or  puede ser reemplazado por And  si se quiere imponer estrictamente el cumplimiento de varias sentencias a la vez.
  •  Si va una sola condición, no se imponen los operadores lógicos (And y Or).
  • La Ilustración I muestra que si se cumple lo que se impone después del If, entonces (Then) se ejecutarán las sentencias seguidas de esta. En otro caso, se ejecutarán las que se encuentren luego de Else.
  • Se sugiere al lector ampliar los contenidos y buscar el segundo tipo de estructura condicional: Select Case, lo que es equivalente a tener un If… End if de forma anidada.

Macro para pregunta con check list de formulario en Access

Nivel de dificultad: Intermedio.

Objetivo: Habilitar pregunta(s) anidada(s) a otra(s) pregunta(s) utilizando una Macro para formulario en Access.

Tal cual se indicó en la primera parte, el principal propósito de esta publicación es dar una lección formativa, vía Macros, que permita complementar la creación y edición de los formularios en Access. En lo puntual, se mostrará el paso a paso de la habilitación de preguntas que se encuentran anidadas o que las respuestas de una de ellas estén condicionadas a las de otra pregunta. Esto te permitirá generar mejores formularios, más funcionales y coherentes con las exigencias de los mismos.

Es un probable que hayas, en más de una oportunidad, utilizado un check list o lista de verificación. Esta permite analizar, comprobar y verificar una lista. El ejemplo que se presenta para mostrar esta Macro, es un formulario de ingreso de un alumno a la base de datos de cierto establecimiento educacional. El módulo de interés es “Antecedentes Escolares”, puntualmente los campos “¿Ha repetido algún curso?” y “Curso que ha repetido”. Luego, se pretende habilitar el campo “Curso que ha repetido” solamente en el caso que el alumno haya repetido algún curso.  Esto último se muestra en la Ilustración II adjunta, en la que se activa una lista desplegable que permite indicar el curso reprobado por el alumno a partir del “sí” de la pregunta “¿Ha repetido algún curso?”.


“Paso a paso” para lograr la Macro

  1. Tener las etiquetas de los campos y las preguntas que deseas que posea el formulario en cuestión.
  2. Inhabilitar la(s) pregunta(s) que buscas anidar a la(s) respuesta(s) de otro campo. En este caso se debe inhabilitar la lista desplegable asociada a “Curso que se ha repetido”.
    -          Formulario en “modo diseño”.
    -          Seleccionar (pinchar) lista desplegable asociada a “Curso que ha repetido”.
    -          Ir a “hoja de propiedades” (ALT+ENTER) de la lista y seleccionar la pestaña “Datos”.
    -          Modificar “” por “No” en opción “habilitado” (ver Ilustración III adjunta). 


  3. Programar Macro sobre check list asociado a la pregunta “¿Ha repetido algún curso?” y automatizar orden de habilitar lista desplegable de “Curso que ha repetido” en caso de que la respuesta a la primera pregunta sea afirmativa.
    -          Formulario en “modo “diseño”.
    -          Seleccionar el check list en cuestión.
    -          Ir a “hoja de propiedades” (ALT+ENTER) de la lista y seleccionar la pestaña “eventos”.
    -          Hacer click sobre botón que contiene 3 puntos suspensivos en su interior (“…”) en la opción “Al hacer click” (primera fila de opciones de la pestaña “eventos” de la “hoja de propiedades”).  Esto permite especificar la forma en que el evento dará inicio a la automatización buscada. Se abrirá el cuadro “elegir generador”, el que ofrece 3 alternativas para crear el evento.  Debe pinchar la opción “generador de código” para esta Macro. Presione “aceptar” (ver Ilustración IV adjunta).
    -          El paso anterior abrirá una ventana que permitirá programar la Macro en lenguaje VBA. Ahora es cuando le será útil haber aprendido la sintaxis y uso de las estructuras condicionales (primera parte de esta publicación).
    -          Finalmente, la Macro se computa como muestra la Ilustración V adjunta. Luego, se cierra la ventana VBA y la automatización está terminada. Se cambia a “vista formulario” y se chequea que la Macro funcione.

    Observaciones a partir de la Ilustración V:

  • En (1) se indica que si el chek list relacionado con “¿Ha repetido algún curso?” es “” (True), entonces se ejecutará la sentencia especificada en (2). Notar que para aludir al check list, se invoca a través de su nombre luego de “Me.”.
  • La sentencia de (2) permite habilitar la lista desplegable asociada al “Curso que ha repetido” (recordar que previamente se había inhabilitado) agregando “.Enabled =  True” luego de “Me.” y el nombre de la lista desplegable (en este caso “Cuadro_combinado163”).   
  • Las sentencias que se especifican después del Else, se ejecutarán en caso que no se active el check list (False de (1)). De esta forma, se ejecutarán las sentencias (3) y (4).
  • Tener presente que se debe terminar con el comando End If para computar la Macro
---------------------------------------------------------------------------------------------------------------------
Y este es el final de esta lección educativa que buscaba, vía Macros, complementar la creación y edición de los formularios en Access. Se mostró el paso a paso de la habilitación de preguntas que se encuentran anidadas o que las respuestas de una de ellas estén condicionadas a las de otra pregunta. Esto te permitirá generar mejores formularios, mucho más funcionales y te dará una ventaja comparativa entre tus colegas. 

¡Queda pendiente subir un link de descarga del archivo para que puedas ahondar los contenidos y practicar con el archivo adicional!

Slds!

Descargar Archivo
Leer más...

lunes, 25 de junio de 2012

Cómo crear formularios y subformularios en Access


Un formulario permite escribir, mostrar o modificar datos de una base a través de una consulta o tablas, cuando trabajamos con bases de datos es muy útil usar formularios ya que permiten organizar de mejor manera el trabajo, aquí veremos cómo se crea un formulario.
El primer paso para crear un formulario es tener definida la base de datos a utilizar, las tablas y la información necesaria, una vez que ya tenemos esto, hay que ir a crear, “más formularios”, “asistente para formularios” y ahí seleccionamos las tablas que utilizaremos, si queremos un formulario con subformulario, por ejemplo para que pedidos muestre a los clientes y los detalles del pedido, seleccionamos los campos de las dos tablas.


Luego que hemos seleccionado los campos, vemos en qué orden queremos verlos, en este caso queremos que el formulario sea en base a los clientes y el subformulario al detalle de los pedidos.


A continuación seleccionamos lo referente a la forma en que se muestra y el formato del subformulario, finalmente nos quedará:


Ahora para que uno de los campos genere una lista desplegable en el que aparezcan las opciones, y que a su vez este campo “rellene” los demás campos relacionados lo que hacemos es ir a la vista diseño, borrar el campo que queremos se genere como lista desplegable e insertamos un cuadro combinado (como aparece en la imagen).



A continuación seleccionamos el campo que nos interesa, en este caso era nombre, escogemos la tercera opción. Finalmente nos quedara algo así:


Cuando seleccionemos el nombre, los demás campos relacionados cambiarán de acuerdo a este.

Ahora si lo que queremos en las listas desplegables no son los valores de una tabla determinada sino que son valores que ingresaremos “manualmente” hago lo mismo que el caso anterior, pero en origen de la fila pongo los valores que necesitamos, en este caso en Estado queremos los valores: “En proceso” y “Terminado”, por lo que rellenamos con estos valores.


Si ahora lo que buscamos es que en cada ítem nos entregue el total de los pedidos de acuerdo al precio, cantidad y descuento, lo que hacemos es en la pestaña datos, en origen del control insertar la fórmula que define nuestro total, en este caso: “=[Cantidad]*[Precio]*((100-[Descuento])/100)”.




Leer más...

miércoles, 2 de mayo de 2012

Listas Desplegables Anidadas en Access

Listas Desplegables Anidadas en Access

Sin duda que Access es una herramienta muy util para el manejo de bases de datos, dentro del cual podemos realizar diferentes  cosas que ayudan a que la base pueda ser más amigable con el usuario. Dentro de ellas encontramos los Formularios, que permiten mejorar el aspecto que presentan las tablas dentro de la base.
Dentro de los formularios, se pueden presentar diferentes campos, unos en donde el usuario ingrese los datos, otros donde tenga que activar alguna opción y también se presentan listas desplegables con una serie de opciones. Esta última opción es muy útil ya que permite mostrar una lista de opciones donde la persona sólo debe seleccionar la adecuada, de esa forma se evita que existan muchos datos que significan lo mismo, pero que por estar en diferentes formatos, se almacenan muchas veces.

Pero además de estas listas desplegables normales, se pueden crear listas desplegables anidadas o dependientes de otras listas. Un ejemplo de esto puede ser el caso de provincias, ya que podemos crear una lista desplegable en donde se muestren todas las provincias de una determinada región, y en otra lista me muestre las comunas pertenecientes a esas provincias. El punto es que yo quiero que me muestre sólo las comunas asociadas a la provincia que yo seleccioné y no todas las comunas de todas las provincias. Para poder hacer esto utilizamos consultas en access.

 Continuando con el ejemplo anterior, tenemos dentro del formulario una lista desplegable con la Provincia y otra lista desplegable con la comuna, tal como se muestra en la siguiente imagen:

Al hacer estas listas uno tiene la opción de poder elegir la provincia que desea, pero el problema es que en la segunda lista se muestran todas las comunas correspondientes a todas las provincias, no se hace un filtro en donde sólo me muestre las comunas correspondientes a la provincia seleccionada. Para que esto suceda uno tiene que posarse sobre la lista que depende de la otra, que en este caso es la de comunas, se hace doble clic y aparece un cuadro de opciones como se muestra en el cuadro rojo de la siguiente imagen:


Después de eso, nos posicionamos sobre la celda que dice Origen de la fila y volvemos a hacer doble clic donde se despliega una nueva ventana que nos permite poder hacer la consulta.

Ya en esta etapa, comenzamos a hacer la consulta que permite que la lista de comunas dependa de la lista de provincias. Para poder hacer hacer esto, nos vamos a la barra de herramientas a una pestaña que dice Generador, después se selecciona la opción de Formularios y se ve la opción provincias, que permite poder crear esta relación, ya que se va a convertir en el criterio de la columna Provincias, dentro de la consulta. Esto se puede ver a continuación:

Pero esto no soluciona del todo el problema ya que además debemos hacer algunos cambios en la configuración de la lista de provincias, en donde tenemos que ir a ver el generador de código para poder actualizar la tabla de comunas, y para hacer esto se pone comuna.requering. Al hacer esto ya queda solucionado el problema. Todo este proceso se puede ver en el siguiente video:

Existe otra forma de poder hacer esto, por medio puramente de consultas en las tablas correspondientes utilizando diversas fórmulas dentro de las cuales encontramos:
SELECT * FROM: me permite seleccionar algo de una determinada tabla
SELECT: me permite escoger algo de la tabla en la que estoy trabajando.
ORDER BY: me permite ordenar de acuerdo a un criterio.
WHERE: me permite establecer criterios de comparación en donde puedo igualar cosas o ver las diferencias.
Utilizando estos criterio podemos crear fórmulas que permiten poder crear la dependencia entre las listas desplegables, bajo un proceso detallado en el cual se van llamando criterios, comparándolos, etc.

Sin duda esto facilita aún más el uso de la base de datos, específicamente de los formularios, ya que permite filtrar criterios de la segunda lista, al momento de hacer una selección en la primera lista.
Leer más...

Uso de función Unión e Intersección y sus Ventajas

Antes de comenzar con este tema, creo necesaria una pequeña introducción a SQL para que la lectura de esta publicación sea un tanto más amigable.
SQL es la sigla para “Lenguaje de Consulta Estructurado” (Structured Query Language). Este lenguage nos permite realizar consultas de distintas complejidades en una base de datos.
La estructura básica de una consulta realizada en Access es la siguiente.


 Tenemos estas 3 tablas a modo de ejemplo, E (Empleado), S (Sucursal) y C (Cargo). De estas tablas queremos saber el RUT, Nombre, Apellido (tabla Empleado), junto a su Nombre_Cargo (tabla Cargo y cargo especificado) de la Dirección de Sucursal (tabla Sucursal) “Huerfanos #78”. Al general la consulta con el asistente, también podemos ver el código SQL asociado (toda consulta realizada tiene un código SQL generado). El de la que queremos hacer en esta ocasión lo podemos ver a continuación:


SELECT E.RUT, E.Nombre, E.Apellido, S.Dirección, C.Nombre_Cargo
FROM SUCURSAL AS S, EMPLEADO AS E, CARGO AS C
WHERE (((S.Dirección)="Huerfanos #78") AND ((C.Nombre_Cargo)="Analista") AND ((S.Id_Sucursal)=[E].[Id_Sucursal]) AND ((E.Id_Cargo)=[C].[Id_Cargo]));

 



Vemos que la primera línea, SELECT, nos muestra TABLA.ATRIBUTO (nombre de la tabla junto al atributo que queremos rescatar de esta). En la línea FROM en este caso se hace referencia a las tablas a utilizar (es común usar abreviaturas como S para llamar a la tabla SUCURSAL  con la finalidad de minizar el código a utilizar, lo que hace esto es renombrar la tabla para una mayor facilidad en el manejo de los datos). En la última línea, WHERE, se dan las especificaciones que necesitamos para que nuestra consulta sea lo más certera posible (en este caso, se especifica que la dirección es Huerfanos #78 y el nombre del cargo es Analista. También se define como se relacionan las tablas entre si (atributo llave, por ejemplo con S.Id_Sucursal)=[E].[Id_Sucursal] decimos que el atributo Id_Sucursal de la tabla S en donde es llave, es el mismo Id_Sucursal de la tabla E y es la forma en que ambas tablas se relacionan).
Esta consulta nos arroja el siguiente resultado en Access:


UNION

Lo que hace la función unión es otorgar una forma sencilla para poder trabajar con dos consultas y relacionarlas entre si.
Su estructura SQL básica sería más menos como lo siguiente:


SELECT  T1.AtributoA, T1.AtributoB, T2.AtributoC
FROM   Tabla1 AS T1, Tabla2 AS T2
UNION
SELECT  T3.AtributoA, T4.AtributoB, T3.AtributoC
FROM   Tabla3 AS T3, Tabla4 AS T4
 

En esto podemos ver claramente como se UNEN 2 consultas que son independientes entre si.

Según los manuales de Microsoft, “Las consultas de selección que se combinan en una consulta de unión deben tener el mismo número de campos de resultados, en el mismo orden y con tipos de datos idénticos o compatibles. Cuando se ejecuta una consulta de unión, los datos de cada conjunto de campos correspondientes se combinan en un solo campo de resultados, de modo que los resultados de la consulta tienen el mismo número de campos que cada una de las instrucciones SELECT”.

Ejemplo: Sean las siguientes consultas SQL

Consulta 1: 
SELECT [Nombre de compañía], [Ciudad]

FROM [Proveedores]
WHERE País="Argentina"

Consulta 2:
SELECT [Nombre de compañía], [Ciudad]
FROM [Clientes]
WHERE País="Argentina";

Al usar la función UNION, deberíamos obtener los nombres de compañía y ciudades que se encuentran tanto en la tabla Proveedores como en la tabla Clientes y que son de Argentina.


INTERSECCION

Esta función, a diferencia de la anterior, funciona como un Y en lógica (la función UNION funciona como un O lógico). Para clarificar su uso veamos el siguiente ejemplo.
Supongamos que poseemos las siguientes tablas:

Tienda
Ventas
Fecha
Local 1
$15.000.000
21-04-2012
Local 2
$25.400.000
12-02-2012
Local 3
$30.000.000
15-03-2012
Local 4
$6.000.000
1-03-2012
 Tabla de Información de tiendas



Fecha
Ventas
17-03-2012
$5.350.000
15-03-2012
$2.340.000
27-04-2012
$12.750.000
Tabla de Ventas por Internet


Lo que haremos en este ejercicio será ver en que fecha se realizaron ventas tanto en el local físico como en internet, para lo cual debemos intersectar ambas tablas. Como aprendimos en conjuntos, al realizar una intersección, lo que rescatamos son los elementos en común en ambos conjuntos, lo que en este caso sería la fecha que se encuentre en ambas tablas. El resultado de dicha intersección es el siguiente:


Fecha
15-03-2012


El código SQL asociado a esta consulta es el siguiente:



SELECT Fecha
FROM Info_Tienda
INTERSECT
SELECT Fecha
FROM Venta_Internet
 




                                                                                                                                                






Leer más...

lunes, 19 de diciembre de 2011

Control de datos con Máscara de Entrada en Access



Las bases de datos cuando son manipuladas por un gran número de personas están expuestas a que los datos ingresados no sean coherentes con lo que previamente se definió. Por ejemplo cuando se debe ingresar el RUT, siempre existe la duda si poner puntos y guión o simplemente los números. Para este problema existen las máscaras de entrada, utilizadas en Access.


¿Para qué se utilizan las máscaras de entrada?

Permiten controlar el ingreso de datos en los campos de las tablas que conforman la base de datos. Su función específica es entregar un formato a los datos, para así, otorgar control sobre que valores se pueden introducir. Así, proporcionan una validación de datos e impide que los usuarios ingresen datos no válidos y finalmente, entrega a la base de datos facilidad de búsqueda de datos.

¿Cómo funcionan?

La máscara de entrada comprende tres secciones, las cuales son separadas por un punto y coma. Posee caracteres que indican como se debe rellenar el campo de la tabla.

Para explicarlo de mejor forma, se puede utilizar la máscara de entrada de un número telefónico para Chile, el que corresponde a (00)-(0)-(0000000);1;-.

Lo que se encuentra antes del primer ; corresponde a la primera sección, la cual es obligatoria. Esta contiene los caracteres que deberán ser introducidos en el campo de la tabla, además de marcadores de posición y datos literales. En el ejemplo se identifica que se debe introducir el código del país y de la ciudad, y a continuación ingresar el número de teléfono particular.

La segunda sección (entre ambos ; ) es opcional e indica el modo de almacenamiento dentro del campo. Si es 0, los caracteres de la máscara (en el ejemplo los paréntesis y guiones ubicados en la primera sección) se almacenan con los datos. Si es 1, los caracteres no serán almacenados con los datos, sólo se mostrarán. De esta forma, se ahorra espacio de almacenamiento en la base de datos. En el ejemplo, la sección dos tiene 1, por lo tanto los paréntesis y guiones sólo se mostrarán.

Finalmente, la última sección también es opcional. Esta indica el marcador de posición que se utilizará. En el ejemplo se utiliza guión en el medio para separar los códigos de país y región. Si no se escribe un carácter, de forma predeterminada se usará el guión bajo.

En la siguiente tabla, se muestran algunos significados de caracteres para la creación de la máscara.












¿Cómo crear una máscara de entrada?

Para crear una máscara de entrada es necesario contar con las tablas de las bases de datos. A continuación se presenta paso a paso lo que se debe ejecutar para la creación.

  • Click con botón izquierdo en la tabla y seleccionar VISTA DISEÑO.
  • Elegir el campo que requiere máscara de entrada, clic en TIPO DE DATOS, al lado del campo seleccionado.
  • En la parte baja de la pantalla PROPIEDAD DE CAMPO, luego GENERAL, luego MASCARA DE ENTRADA
  • Click en el boton que se encuentra al lado derecho del campo, como muestra la imagen.









  • Seleccionar que tipo de máscara se utilizará y los marcadores de posición. (Se puede utiliz ar la opción de PROBAR, donde se muestra como se ve la máscara.)











  • Si no se requiere hacer cambios, click en SIGUIENTE
  • Seleccionar como se desean guardar los datos en la base (con los marcadores de posición o sin ellos) y click en SIGUIENTE
  • Click en FINALIZAR

Video: ¿Cómo funciona una máscara de entrada?

Ejemplo Práctico
Para las empresas y algunos comerciantes pequeños, es de suma utilidad contar con esta clase de mecánismo para almacenar los datos de los clientes, proveedores y otros. Como se sabe, la particularidad de cada sujeto es su RUT o RUN es necesario ingresarlo a la base de datos de tal forma que se almacenen y muestren de una misma forma. Por lo tanto las máscaras de entrada son una herramienta muy útil para mantener el orden de estas, sin correr el riesgo de que sean ingresadas bajo otros criterios.

Como se señaló anteriormente en la creación de una máscara de entrada los primeros cuatro pasos se mantienen igual, lo que varía son los caracteres que se deben ingresar para crear la herramienta para el RUT o RUN. La cual corresponde a: 99.000.000-0, aquí se indica que los dos primeros dígitos no son obligatorios de ingresar, debido a que existen Rut inferiores al millón. Por otra parte el número verificador se define como un número por lo que si corresponde a "k", se transforma a "0".

Como se pudo apreciar en el artículo, para una base de datos en Access manipulada por un gran número de personas que ingresan datos, es de gran utilidad las máscaras de entrada, ya que mantienen la coherencia de los datos y les permite buscarlos de manera ágil y certera.

LINKS

Autor: Camila Gallardo C.


Leer más...