2013-08-26

Consulta para generar una muestra aleatoria en Ms Access

Title En la entrada anterior vimos como generar números aleatorios con la función NúmAleat. Con esa función podemos generar una muestra aleatoria de nuestros datos.

Creamos una consulta, agregamos los campos deseados, en el ejemplo todos los campos de TuTabla.* Añadimos un campo con la función NúmAleat basado en un campo numérico de la tabla, ordenamos por este campo, seleccionamos en Devuelve: el número de registros de la muestra o porcentaje del total y ejecutamos la consulta.

En SQL, la sintaxis sería:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd([campo numérico]);
Si solamente tuviéramos campos de texto, usamos la función Longitud (Len en inglés) para que nos devuelva como valor el número de caracteres de la cadena de texto. La consulta sería:
En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Len([campo de texto]));

Es importante señalar que la función NúmAleat con un argumento igual a cero devuelve el último número generado. Y si es negativo, repite cada vez el mismo número aleatorio para ese valor.

La solución sería usar la función Abs, que devuelve el valor absoluto de un número:
NúmAleat(Abs([campo numérico]))

En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Abs([campo numérico]));

Otra alternativa sería usar de nuevo la función Longitud como vimos más arriba, en este caso con un campo numérico. Así forzamos a que nos devuelva un número mayor que cero,  aunque tenga un cero o un número negativo.

En SQL:

SELECT TOP 100 TuTabla.*
FROM TuTabla
ORDER BY Rnd(Len([campo numérico]));

Entradas relacionadas

2013-08-20

Generar números aleatorios entre dos valores en Ms Access

Title En Access se pueden generar números aleatorios con la función NúmAleat(). Para generar números enteros entre un intervalo, usamos la fórmula:

Int(Límite superior- Límite inferior + 1)*NúmAleat+Límite inferior)
Hacemos clic en la celda Campo de la columna donde deseemos crear el campo calculado y escribimos la expresión necesaria:

Ejemplo, número aleatorio entre 1 y 10:

Número_Aleatorio: Int((10-1+1)*NúmAleat+1) 'En la celda,o bien 
SELECT Int((10-1+1)*Rnd()+1) AS Número_Aletorio; 'en SQL
Si no necesitamos número enteros, borramos la función Int

(Límite superior- Límite inferior + 1)*NúmAleat+Límite inferior

Entradas relacionadas

2013-08-17

Lógica de Boole en lugar de la función SI- Parte 2

En la entrada anterior vimos una alternativa a los SI anidados. En aquel ejemplo evaluábamos una serie de condiciones y devolvíamos un valor. ¿Qué sucedería si quisiéramos que en lugar de un valor devuelva un texto? Por ejemplo, en una celda podemos tener: a, b, c, o d. Y en función de la letra queremos que devuelva respectivamente: primero, segundo, tercero o cuarto.

Opción 1 - SI anidados
=SI(A1="a";"primero";SI(A1="b";"segundo";SI(A1="c";"tercero";SI(A1="d";"cuarto"))))
Seguiríamos la sintaxis habitual de los SI anidados sin problema.

Opción 2 -Boole
=REPETIR("primero";A1="a")&REPETIR("segundo";A1="b")&REPETIR("tercero";A1="c")&REPETIR("cuarto";A1="d"))

En este caso no podríamos usar la estructura de la entrada anterior pues =(A1="a")*"primero" daría un error. Empleamos la función REPETIR(texto;núm_de_veces), que repite el texto indicado un determinado número de veces, 1 si la condición es verdadera o 0 si es falsa. Al encadenar las diferentes condiciones, solamente mostrará la verdadera o nulo (celda en blanco)si no se cumple ninguna. Si en lugar de nulo queremos que nos muestre un valor, habría que añadir el siguiente trozo al final.
&REPETIR("Otro";(A1<>"a")*(A1<>"b")*(A1<>"c")*(A1<>"d")
                                       'o bien
&REPETIR("Otro";NO(O(A1={"a";"b";"c";"d"})))

Entradas relacionadas:
Lógica de Boole en lugar de la función SI -Parte 1

2013-08-11

Lógica de Boole en lugar de la función SI -Parte 1

SI() es una de las funciones más útiles y utilizadas en Excel. Básicamente, comprueba si se cumple una condición y devuelve un valor si se evalúa como VERDADERO y otro valor si se evalúa como FALSO. Sin embargo, en muchas ocasiones podemos obtener los mismos resultados de una manera más sencilla: usando la lógica de Boole.

Comparamos si A3 es mayor que B1.
=SI(A3>$B$1;VERDADERO;FALSO) 'Usando la función SI
=A3>$B$1                     'Usando lógica de Boole
Ambas fórmulas nos devolverán VERDADERO o FALSO. Pero la segunda fórmula, es más corta y clara, y Excel la calcula más rápidamente.


Puede ser útil tener esas expresiones lógicas evaluadas como 1 (VERDADERO) o 0 (FALSO). Excel trata los valores de Boole como 1 o 0 cuando los combinamos con operaciones matemáticas.
=(A3>$B$1)*1   'Multiplicando por 1       
=--(A3>$B$1)   'Usando dos signos negativos (operador unario)


También podemos asignar usar la misma lógica en lugar de SI anidados. Por ejemplo, asignar una ganancia cuando las cifras anteriores alcanzan unos objetivos:


Opción 1 - SI anidados
=SI(A3>50000;1000;SI(A3>45000;750;SI(A3>35000;750;SI(A3>25000;250;0))))) 'SI
Evalua cada condición secuencialmente de izquierda a derecha, y si se cumple alguna condición se detiene.

Opción 2 -Boole
=(A3>25000)*250+(A3>35000)*250+(A3>45000)*250+(A3>55000)*250        'Boole
Evalua toda la expresión a la vez sin detenerse. Por ejemplo si A3>35000, cumple las dos primeras condiciones.
=(VERDADERO)*250 + (VERDADERO)*250 + (FALSO)*250+ (FALSO)*250




=(1)*250 + (1)*250 + (0)*250+ (0)*250 




=500
Por esa razón, porque se acumulan las condiciones cumplidas, indicamos los incrementos de la ganancia entre cada intervalo en lugar del total de la ganancia.

Esta segunda opción es más breve, más rápida de calcular por Excel, y más fácil de escribir y de leer que la función SI anidada.

Entradas relacionadas:

Lógica de Boole en lugar de la función SI -Parte 2

2013-08-05

Importar un fichero de texto en Access conservando los decimales

Es posible que al importar un fichero de texto, en alguno de los campos numéricos se trunquen los decimales. Una posible causa es que ninguno de los 25 primeros registros de ese campo incluya decimales. Access evalua las 25 primeras filas y determina el tipo de dato para los campos de la tabla. Si no encuentra ningún decimal en los 25 primeros registros de un campo sugiere como tipo de dato el entero largo, en lugar del doble.

Para corregir este comportamiento y conservar los decimales de un campo numérico al que Access asigna el tipo entero largo, tenemos dos opciones dentro del Asistente para importación de texto:

Opción1- 

Seleccionamos el campo (clic sobre la columna correspondiente) y en el desplegable Tipo de dato, escogemos Doble y presionamos Siguiente.


Opción2- 

Hacemos clic sobre Avanzado... y en el desplegable Tipo de dato, escogemos Doble, y clic sobre Aceptar.


Otra manera menos eficiente sería importar el campo como texto y luego transformarlo en numérico con una consulta.

2013-08-01

Porcentaje del total de la columna en una consulta de Access

Title En Access es muy sencillo crear una consulta agrupada por el campo que deseemos.

En este caso tenemos una tabla de ventas con diferentes campos (Negocio, Segmento, etc.) y queremos agrupar los resultados en Unidades y Ventas por Categoría. Deseamos que nos ordene los resultados de manera descendente en función de las Ventas. El resultado sería:

Adicionalmente, nos gustaría saber el porcentaje de cada categoría sobre el total de unidades y de ventas. Por ejemplo, el porcentaje que 15.740.717 de unidades de Color representa sobre el total de unidades, 43.845.549.

Para ello creamos dos campos calculados (columnas), uno para las unidades y otro para las ventas:

%Unidades: [Unidades]/DSuma("Unidades";"tbl_ventas")
%Ventas: [Ventas]/DSuma("Ventas";"tbl_ventas")
Dividimos los alias [Unidades] y [Ventas] por sus totales correspondientes. Usamos la función Dsuma ("Nombre del Campo";"Nombre de la Tabla";"Criterio") para calcular dichos totales.  Recuerda poner las dobles comillas alrededor del nombre del campo y de la tabla, así como seleccionar Expresión en Total:

El resultado final es:

Ahora, de un vistazo, sabemos exactamente el porcentaje de cada categoría en unidades y ventas sobre el total de las mismas. Además, hemos añadido el campo calculado

Contribución para conocer la contribución de ventas por unidad en cada categoría. Por ejemplo, la categoría Relojes es la que aporta más ventas por unidad vendida.

Contribucion: [Ventas]/[Unidades]

Referencias

2013-07-23

Código y datos para las ciencias sociales- Parte 5

En las entradas anteriores vimos una introducción del manual Code and Data for the Social Sciences: A Practitioner’s Guide y los capítulos dedicados a automatizar y control de versionesdirectorios y claves. Finalizamos esta serie de artículos con los capítulos dedicados a la simplificación y la documentación.

Capítulo 6- Simplificación
  1. Simplifica para eliminar redundancias
  2. Simplifica para mejorar la claridad
  3. En caso contrario, no simplifiques.
La simplificación puede llevarse demasiado lejos. Si una operación que sólo necesita ser ejecutada una vez es fácil de leer, no sería recomendable. Simplificar sin propósito puede conducir a emplear mucho tiempo en casos que  nunca aparecerán en tu trabajo. La simplificación no afecta solamente al código, es relevante en cualquier momento en el que estés repitiendo una operación.

Capítulo 7- Documentación
  1. No escribas documentación que no mantendrás
  2. El código debería autodocumentarse
Cada vez que tienes más de una representación de la misma información, corres el riesgo de que alguno de las dos entre algún día en conflicto. En el mejor caso, necesitarás trabajar para desentrañar la confusión. En el peor caso, tus resultados serán erróneos o inconsistentes internamente.

El problema de consistencia interna es especialmente grave en el caso de documentación (comentarios, notas, léemes, etc) porque no tienes que mantenerla actualizada para que funcione el código.  Es tentador hacer mejoras del código sin actualizar los comentarios del mismo en paralelo.

Cuando sea posible, debes de escribir tu código para que se autodocumente. Nombra las variables y la estructura del código para guiar al lector a lo largo de las operaciones. Ni incluso los mejores comentarios pueden desenmarañar un código confuso. Al igual que la simplificación, estos principios no se aplican exclusivamente al código sino que subyacen en varios de los capítulos anteriores.

Los comentarios pueden ser usados para aclarar algo que es correcto pero que a primera vista puede parecer erróneo. También para prevenir comportamientos no deseados. Sin embargo, si hay alguna acción que realmente quieres evitar, comentarios como "No hagas esto nunca", no son la manera de hacerlo. Escribe tu código de manera que esas acciones no se puedan ejecutar nunca.

Parte 1: Introducción
Parte 2: Automatizar y control de versiones
Parte 3: Directorios
Parte 4: Claves
Parte 5: Simplificación y documentación

2013-07-19

Google Sets en las hojas de cálculo de Google Drive

Google Sets es una característica de las hojas de cálculo que proporciona Google Drive y nos permite generar listas de elementos y búsquedas relacionadas. En cualquier hoja, tan sólo tenemos que introducir dos ejemplos de ítems relacionados, seleccionamos las dos celdas (en esta caso 6 pues creamos 3 listas a la vez), presionamos CTRL mientras hacemos clic sobre el cuadrito azul y arrastramos hacia abajo.


Los tipos de lista que se pueden generar son prácticamente ilimitados: búsquedas relacionadas, objetos, ingredientes, provincias, marcas de productos, autores, razas de perros, superhéroes, canciones de un grupo de música etc.

También se puede usar Google Sets horizontalmente (listas en filas en lugar de en columnas). Y, si deseamos generar listas en otros idiomas, cambiamos al idioma deseado en la configuración de Google Drive.

2013-07-16

Convertir horas en un número decimal en Excel

En Excel, es común que calculemos el tiempo transcurrido entre dos fechas u horarios. Si queremos convertir el formato de la hora estándar (horas: minutos: segundos) en formato decimal, multiplicamos la celda correspondiente por 24.

Ejemplo:

En la celda A1 tenemos 10:23:46 en formato hh:mm:ss.
En B1 tecleamos =A1*24 y daría como resultado en formato decimal: 10,396 (10:30:00 serían 10,5)

Para transformar en minutos =A1*24*60 y en segundos =A1*24*60*60. Para la transformación inversa bastaría con dividir, en su caso, entre horas (24), minutos (1440) o segundos (86400) el número en formato decimal.

Merece la pena recordar que, en el caso de que no fuera el correcto,  hay que dar el formato adecuado a las celdas.

1. Mediante fórmulas:
=TEXTO(B1/24;"hh:mm:ss")'Formato hora
=TEXTO(A1*24;"00,000")  'Formato decimal

2. Presiona CTRL+1 para mostrar el cuadro de diálogo Formato de celdas y aplicar el formato correspondiente (Número u Hora ).


2013-07-05

Configurar todas las páginas de un libro de Excel

Para configurar manualmente la página hacemos clic sobre el Botón de OfficeImprimir y, a continuación, clic en Vista preliminar. O bien CTRL+F2. A continuación, hacemos clic en Configurar página.


En VBA podemos configurar los atributos de la página mediante el objeto PageSetup. Es particularmente útil cuando queremos aplicar una misma configuración a todas la hojas de un libro, evitando repetir el procedimiento manualmente para cada una de las hojas.

Usamos la instrucción With para modificar sencilla y rápidamente varias propiedades simultáneamente. En el ejemplo, orientamos todas las hojas horizontalmente y ajustamos las páginas a 1 página de ancho por 1 de alto. En este caso, es necesario establecer la propiedad Zoom como False, pues si es True, se omite la propiedad FitToPagesTall y FitToPagesWide, y no se ajustaría la página correctamente.

Sub ConfigurarTodasPaginas()
Application.ScreenUpdating = False
    Dim i As Single
    For i = 1 To Worksheets.Count
            With Worksheets(i).PageSetup
            .Zoom = False 
            .FitToPagesTall = 1
            .FitToPagesWide = 1
            .Orientation = xlLandscape
            End With
    Next i
Application.ScreenUpdating = True
End Sub

Puedes alterar parte del código anterior para modificar aquellas propiedades de la configuración de la página que desees:

    With Worksheets(i).PageSetup
    [Propiedades que desees modificar]
    End With

Para acceder a todas las propiedades de configuración de la página en el editor de Visual Basic (VBE) abrimos el examinador de objetos (1), buscamos la clase pagesetup (2) y examinamos los miembros (3).




Nube de datos