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

Quitar caracteres como Enter y Tabulado

Varios usuarios han reportado problemas al generar un reporte, mediante una consulta SQL, donde el resultado de cada fila lo entrega en dos o más líneas. También las columnas quedan desplazadas, apareciendo filas con más columnas que las debidas.

La mayoría de las veces este problema se debe a que un dato extraído en el reporte contiene los caracteres de control Enter y/o Tabulado.

Para evitar este problema se debe de reemplazar el o los caracteres de control por un espacio o cualquier otro carácter (puede ser incluso carácter nulo).

El Enter está formado por un salto de línea (carácter 13) y un retorno de carro (carácter 10). Para quitarlo se debe de reemplazar esta secuencia de caracteres por un espacio o cualquier texto que se desee.

El Tabulado es representado con el carácter número 9, por lo que para quitarlo se reemplaza por un espacio o el carácter deseado.

Quitar caracteres de control (Enter y Tabulado) de columnas en una consulta con Oracle:


En esta consulta se extraen el o los datos sin problemas, y los datos con problemas se extraen en 3 formas: quitando solo el Enter, quitando solo el Tabulado y por último quitando Enter y Tabulado. Se utilizan las funciones REPLACE para sustituir los caracteres, y CHR para obtener la representación del carácter. Los caracteres se concatenan con el operador ||.

Quitar caracteres de control (Enter y Tabulado) de columnas en una consulta con Microsoft Access:


Al igual que en Oracle, esta consulta se extraen el o los datos sin problemas, y para los datos que tienen problemas se extraen en 3 formas: solo Enter, solo Tabulado y por último Entero y Tabulado.

Se utilizan las funciones REPLACE para sustituir los caracteres, y CHR para obtener la representación del carácter. La diferencia es que el texto se concatena con el operador +.

La solución presentada corrige el problema, pero es preferible evitarlo. Antes que nada se debe de analizar si el campo en cuestión debería o no almacenar estos caracteres de control. Por ejemplo si se trata de nombre del cliente no lo debería tener, pero si se trata de observaciones es válido que lo tenga.

En caso de que no sea válido, es preferible corregir el problema de raíz. Si el sistema con que se introducen los datos permite caracteres de control, se recomienda modificar dicho sistema de manera de que antes de grabar se realice la “limpieza” del texto.

Una vez controlado el ingreso de los datos, se deberá corregir los datos que ya están almacenados con caracteres de control, para esto se utiliza una simple sentencia UPDATE con las funciones antes mostradas.

Quitar caracteres de control (Enter y/o Tabulado) con Oracle:

Quitar el carácter Enter con Oracle:


Quitar el carácter Tabulado con Oracle:


Quitar ambos caracteres:


Quitar caracteres de control (Enter y/o Tabulado) con Microsoft Access:

Quitar el carácter Enter con Microsoft Access:


Quitar el carácter Tabulado con Microsoft Access:


Quitar ambos caracteres con Microsoft Access:


Si se desea quitar algún otro carácter de control, primero se deberá de identificar de cual carácter se trata y seguir los pasos presentados.

Identificar o eliminar repetidos con Microsoft Access

Como complemento a la publicación anterior, donde se muestra como identificar registros repetidos en hojas de cálculo, se dearrollaron técnicas similares para bases de datos. Este es el turno de Microsoft Access.

Como ejemplo se utilizará una supuesta tabla "nombre_tabla", que contiene al menos los campos "campo1", "campo2" y "campo3", y se considera que un registro está duplicado cuando estos tres campos son iguales.

Esta operación no se pude realizar directamente con Microsoft Access (o se desconoce) pero si se logra realizando un par de pasos intermedios.

Primero se debe de crear un nuevo campo al que se le llamará "rownum" de tipo Autonumérico (se selecciona la tabla "nombre_tabla", se presiona Vista de Diseño, y se agrega el campo al final).

Al confirmar la operación, Microsoft Access creará la nueva columna "rownum" y la completará con números del 1 hasta la cantidad de filas que tenga la tabla.

Luego se debe de crear una consulta de actualización sobre esta tabla (dentro de las consultas, se selecciona nueva consulta en vista de diseño, se selecciona la tabla "nombre_tabla" o cualquier otra, se presiona el botón SQL, y se cambia lo que está escrito por la siguiente sentencia:


Esta sentencia borrará los registros que para iguales campos 1 al 3 tengan el valor de rownum mayor al mínimo.

Al ejecutarla se deberá confirmar la operación (indicará la cantidad de registros borrados).

En caso de que no se desee borrar los registros duplicados, sino solamente marcarlos se deberá de crear otro campo adicional por ejemplo de tipo texto con largo 2, en este ejemplo con nombre "EsRepetido".

Al crear el campo, si no se especifica un valor predeterminado para los registros ya existentes, Microsoft Access le asigna el valor nulo. Si se desea se le puede asignar como valor predeterminado el texto No. O de lo contrario ejecutar la siguiente consulta de actualización:


Aquí se está inicializando el atributo que indica el registro está o no repetido.

Posteriormente se ejecuta la siguiente consulta de actualización para marcar los repetidos.


Esta actualización utiliza el mismo criterio que el borrado.

En el caso que se requiera marcar los no repetidos se logra con la siguiente consulta de actualización:


Para este caso se marcan como no repetidos aquellos registros que su "rownum" sea igual al mínimo que existe entre todos los registros que tengan mismo campos 1 al 3.

El nuevo campo "rownum" se puede eliminar o dejarlo para posteriores depuraciones.

Separar los componentes de nombres de personas

Extraer los componentes de nombres de personas no es una tarea sencilla, aquí se mostrará una manera muy básica de separar los nombres propios en sus dos apellidos y nombres.

Para este caso se parte de la premisa que los componentes del nombre están separados por espacios, e ingresados siempre en el mismo orden: apellido uno, apellido dos, y nombres.

La idea del proceso es extraer el primer apellido a partir de la primer posición del nombre completo hasta antes de la primer ocurrencia del espacio.

Para extraer el segundo apellido se parte del texto que se encuentra a partir del primer espacio hasta la ubicación del siguiente espacio.

Y por ultimo para extraer los nombres se parte desde la posición siguiente al segundo espacio (largo del primer apellido + largo del segundo apellido + 2 espacios + 1) hasta el final de la cadena de texto.

Este método tiene grandes limitantes tales como:

  • No extrae apellidos o nombres compuestos (ej: DEL CAMPO).
  • El orden de los componentes es fijo para todos los casos.
  • Genera anomalías cuando no existen algunos de los apellidos o nombres.

Separar nombres con Microsoft Excel en español:


Partiendo de que el nombre completo se encuentra en la columna A, se dejará el primer apellido en la columna B, el segundo apellido en la columna C, y los nombres en la columna D.

Primer Apellido (B2)_


Segundo Apellido (C2):


Nombres (D2):


Separar nombres con Microsoft Excel en inglés, Google Docs, OpenOffice.org Calc, Numbres:

Se parten de las mismas premisas que en ejemplo anterior.

Primer Apellido (B2):


Segundo Apellido (C2):


Nombres (D2):


Separar nombres con Oracle:

Se realizará una consulta con una lógica similar a la de las hojas de cálculo, la diferencia más importante radica en que no se dispone del valor de la celda anterior para conocer su largo.


Esta sentencia es para prueba, cuando se disponga de una tabla cambiar el contenido del from por la tabla donde se encuentre el nombre a procesar, y modificar los nombres de campos.

Separar Nombres con Microsoft Access:

Se realizará una consulta similar a la planteada en Oracle.


Tomando los datos de una tabla llamada tabla_nombres que tiene un campo nombre_completo con contiene la información a dividir.

Otras alternativas:

Vale la pena comentar que otra forma muy básica de hacer este proceso es utilizar la herramienta de Microsoft Excel de separar texto en columnas. Aparte de ser muy básica esta operación se debe de hacer por procesos y no definida en formulas como la que aquí se presenta.

Próximamente se publicarán maneras más completas de realizar estas operaciones. Soluciones con mayor inteligencia son realizadas con algoritmos más complejos basados en árboles de decisión y redes neuronales.

Aprovecho el tema para ofrecer mis servicios profesionales para la normalización de nombres propios en bases de datos a gran escala, utilizando algoritmos que interpretan los componentes sin importar el orden, formato y cantidad de componentes del mismo. Lo complementan operaciones adicionales como la identificación del sexo, e identificación nombre repetidos aun cuando estén definidos en formas diferentes (nombres completos vs iniciales, con faltas de ortografía, por sonido, etc.).

Por consultas realizarlas por este correo

Contar cantidad de domingos entre dos fechas o cualquier otro dia de la semana

La formula para calcular la cantidad de un determinado día de la semana (lunes, martes, miércoles, etc.) entre de dos fechas es la siguiente:

Truncar(( Fecha_Final – Fecha_Inicial – DiaDeLaSemana(Fecha_Final-X) + 8) / 7)

Donde X es el número del día de la semana: 0 = Domingo, 1 = Lunes, …, 6 = Sábado.

Esta fórmula puede utilizarse para calcular la cantidad de días laborales entre dos fechas tomando en cuenta los sábados (cosa que las funciones tradicionales no contemplan).

Cálculo en Microsoft Excel en español:

Contar la cantidad de domingos:


Contar la cantidad de lunes:


En B3 se encuentra la fecha final y B2 la fecha inicial.

Cálculo en Google Docs, OpenOffice.org, Calc, Microsoft Excel en inglés:

Traduciendo la fórmula al inglés queda de la siguiente manera:

Contar la cantidad de domingos:


Contar la cantidad de lunes:


Aquí encontrarán un ejemplo al respecto realizado en Google Docs.

Cálculo en Oracle:

Calcular la cantidad de martes que hay entre dos fechas:


Cantidad de martes entre el 2 de enero de 2009 y hoy:


Cálculo en MySQL:

Calcular la cantidad de martes que hay entre dos fechas:


Aquí los cálculos cambian debido a que Weekday retorna 1 para lunes hasta 6 domingo. Para variar el día de la semana se deberá sustituir el 2 que se encuentra en "interval (-2 + 1)" por el número correspondiente con mismo criterio que antes 0: domingo, 1: lunes, etc.

Cálculo en Microsoft Access:

Cantidad de sábados entre ambas fechas.


Cantidad de sábados entre el 2 de enero de 2009 y hoy


NOTA: Tomada de una supuesta tabla "datos".

Ordenar datos por criterios externos arbitrarios

A continuación se mostrará una forma sencilla de ordenar una serie de datos por un criterio totalmente arbitrario, y que éste se pueda modificar según las necesidades del momento.

La idea del proceso es la siguiente:

  • Crear una tabla que contenga al menos una columna los datos que se deben de ordenar, y en una segunda valores numéricos en la donde se definirá el orden.
  • Cruzar la información a ordenar con la nueva tabla de manera de agregar una columna adicional con la información del orden.
  • Ordenar los datos por la nueva columna.
  • En caso que en el futuro se requiera modificar el orden, simplemente se cambia la numeración de la tabla donde está definido.
Solución para hojas de cálculo:

A modo de ejemplo se mostrará una lista de productos que cada uno de ellos tiene una categoría, se ordenarán los productos según un orden cualquiera que se le asignará a cada categoría. : El mismo está disponible en la siguiente dirección de Google Docs.
Para que se puedan ver las fórmulas ha quedado de libre edición, por lo que si ves algo extraño accede a la versión original (Archivo / Historial de Revisiones).
Para verlo en Microsoft Excel (español) se debe de exportar el documento como xls (Archivo / Exportar).

Los pasos son los siguientes:


  1. Crear la lista donde se definirá el orden a aplicar. En el ejemplo se trata de la lista que se encuentra en la hoja Categorías. Definir el orden.
  2. Crear una nueva columna en la lista de datos originales para posteriormente cruzar la información (columna Orden Externo).
  3. Cruzar la información entre las dos tablas de manera de obtener el valor del orden de la segunda hoja. Esto se realizará utilizando la función BUSCARV (VLOOKUP en ingles):

    La formula para la busqueda es la siguiente:

    Versiones en español:


    Versiones en inglés:


    Siendo C la columna donde se encuentra la clave de búsqueda. En las columnas B y D de la hoja Categorias estarían la clave a buscar y dato resultante respectivamente.

  4. Ordenar la tabla por la nueva columna calculada, adicional a este orden se le puede incluir otros. Para el caso del ejemplo el orden está definido por la columna Orden Externo y posteriormente Nombre Producto.
Solución para base de datos (SQL):

A nivel de base de datos la solución es más fácil, una vez creada la tabla (supongamos con los mismos nombres que la planilla de cálculo mostrada).
Simplemente se debe de hacer un Join entre ambas tablas y ordenar el resultado por el dato del orden.


Comparar o Restar horas de diferentes fechas

En varias ocasiones he visto problemas al realizar operaciones con fechas y horas, más precisamente cuando las horas son de diferentes fechas.

Por ejemplo, al restar dos horas cuando las fechas son diferentes, si intentas comparar las fechas y luego las horas restando unas y otras lo puedes hacer pero lleva un poco de lógica algo compleja.

La solución es extremadamente simple: la fecha y hora se deben de sumar generando un único dato del tipo fecha hora.

Esto se debe a que la mayoría de los sistemas para el almacenar un dato que contiene una fecha o una hora utilizan un mismo tipo de dato que contiene la fecha y hora integrada, y de manera visual por formatos se diferencian uno de otro.

Facilitará operaciones tales como:

- Calcular el tiempo transcurrido entre dos horas de igual o distintas fechas.

- Comparar dos horas de igual o distintas fechas.

- Obtener la fecha y hora máxima de un rango.

- Obtener la fecha y hora mínima de un rango.

- Obtener la fecha y hora media de un rango.

Cálculo en Microsoft Excel, Google Docs, OpenOffice.org Calc, Base de Datos:

Diferencia entre fechas (tiempo transcurrido desde la Hora Inicio de la Fecha Inicio hasta la Hora Fin de la Fecha Fin).


Comparar fechas, por ejemplo saber si la Hora de Fin es mayor a la Hora de Inicio.


En programa que tanto las fechas como las horas se almacenan en cadenas de caracteres, a la fecha se le debe de concatenar la hora para poder compararlas.

Generar reportes por rangos variables

Una operación muy común al momento de recuperar datos es clasificar el resultado por rangos de valores dependiendo de un determinado criterio, ya sea para posteriormente agruparla o simplemente para saber en que categorías se encuentra.

Dentro de la Minería de Datos (datamining), podemos decir que estas operaciones están incluidas en las técnicas de Limpieza y Transformación de datos.

El proceso para identificar y agrupar los rangos es el siguiente:

1. Identificar el rango al que pertenece cada dato.

2. Agrupar por los criterios necesarios más la información del rango (paso opcional).

3. Realizar los cálculos de agregación de información necesarios (Suma, cuentas, promedios, máximos, mínimos, etc).

La forma "tradicional" de identificar el rango es hacer tantas condiciones como rangos existan, lo que lleva a un reporte complicado que depende de la cantidad de rangos, y ni hablar cuando hay que hacer cambios.

Como alternativa podemos realizar dicha operación utilizando una tabla auxiliar (lista) donde se definen los rangos, y luego mediante una misma consulta preguntar a que rango de dicha tabla pertenece cada valor.

Para cada rango se debe de realizar la siguiente pregunta:

valor_a_buscar "mayor o igual" rango_minimo Y valor_a_buscar "menor" rango_minimo

Cuando el resultado es verdadero se debe a que lo encontramos. Es muy importante no dejar huecos entre los rangos ni superponerlos para evitar perder información ni duplicarla respectivamente.

Solución para hojas de cálculo:

1. Se crea una nueva hoja, por ejemplo llamada RANGOS, donde tendremos tres columnas: A tendrá el rango mínimo, B el rango máximo, y C el nombre del rango.

2. Para buscar los rangos se debe de utilizar la BUSCARV (VLOOKUP en ingles), utilizando la característica del cuarto parámetro la cual habilita la búsqueda en rangos. Buscará el dato en la lista, de no encontrarlo nos dará el dato correspondiente al menor valor superior al que estamos buscando, aquí es muy importante tener ordenada la lista ya que de lo contrario no nos funcionará.

En la hoja donde tenemos nuestra información, se crea una nueva columna llamada Rango donde se ingresará la siguiente formula:

2.a. Formula en Microsoft Excel en Español:


2.b. Fórmula en Google Docs, OpenOffice.org Calc, Microsoft Excel en inglés:


3. En caso de necesitar agrupar la información, una vez identificado el rango, se crea una tabla dinámica que incluya esta nueva columna y se realiza el reporte. Las operaciones de agregación son provistas por la tabla dinámica (en caso de utilizar Microsoft Excel).

Hice un ejemplo con una lista de países agrupando según la información de su población y superficie, aquí queda disponible un documento de Google Docs

Para que se puedan ver las fórmulas ha quedado de libre edición, por lo que si ven algo extraño accede a la versión original (Archivo / Historial de Revisiones).

Solución para manejadores de base de datos:

1. Se crea la tabla para que contenga los rangos como mínimo con los campos que de la tabla de rangos.

2. Definir la información de los rangos ingresando los datos en la nueva tabla.

3. Al reporte (consulta) que se tenga simplemente se le debe de agregar la tabla de rangos y unirla (join) mediante:


O como un colaborador mencionó en sus comentarios:


Ejemplo de reporte detallado:


4. En caso de requerir las agrupaciones, se deben de agrupar los datos y utilizar las operaciones de agregación necesarias.


Como siempre si desean mayor información o aclarar algún tema no duden en comunicarse.

Calcular primer y último día de la semana

Una necesidad frecuente es identificar el primer y/o ultimo día hábil de la semana (en curso, o especificada por una fecha), esto se resume a identificar la fecha que corresponde a determinado día de la semana.

El proceso para hallar el día es:

1. Identificar el día de la semana que "estamos parados" (ya sea la fecha actual o determinada fecha).
2. Sabiendo que una de las numeraciones para identificar los días de las semanas es 1: Domingo, 2: Lunes, 3: Martes, ..., 6:Viernes, 7: Sábado.
3. Se quitan los días que han transcurrido hasta la fecha en cuestión, así obtenemos la fecha correspondiente al sábado anterior.
4. Sumamos el número del día de la semana que queremos calcular, por ejemplo 2 para el lunes.

A nivel de fórmulas queda de la siguiente manera:

Cálculo en Microsoft Excel en español:

Lunes:
=A1 + 2 - DIASEM(A1; 1)

Viernes:
=A1 + 6 - DIASEM(A1; 1)

NOTA: Estos ejemplos se calculan según una fecha que se encuentra en la celda A1.

Lunes:
=HOY() + 2 - DIASEM(HOY(); 1)

Viernes:
=HOY() + 6 - DIASEM(HOY(); 1)

Cálculo en Google Docs, OpenOffice.org, Calc, Microsoft Excel en inglés:

Lunes:
=A1 + 2 - WEEKDAY(A1; 1)

Viernes:
=A1 + 6 - WEEKDAY(A1; 1)

NOTA: Estos ejemplos se calculan según una fecha que se encuentra en la celda A1.

Lunes:
=TODAY() + 2 - WEEKDAY(TODAY(); 1)

Viernes:
=TODAY() + 6 - WEEKDAY(TODAY(); 1)

NOTA: Estos ejemplos se calculan según una fecha actual (la que tenga la máquina).

Cálculo en Oracle:

Identificar el primer y último día de la semana según fecha actual:


Cálculo en Microsoft Access:


NOTA: Tomada de una supuesta tabla "datos".

Estas funciones se pueden utilizar para calcular cualquier día de la semana

Si requieres mas información al respecto hazlo saber, y como siempre si crees conveniente que se deba desarrollar sobre un tema en particular hazlo saber que se tomará en cuenta.