Mostrando entradas con la etiqueta oracle. Mostrar todas las entradas
Mostrando entradas con la etiqueta oracle. Mostrar todas las entradas

lunes, 10 de septiembre de 2018

¿Cómo genero una llave GUID en Excel?


Cuando diseño bases de datos, generalmente uso llaves subrogadas para identificar de manera única los registros e índices únicos para definir como única la entidad (lógica del registro), sin embargo, hasta hace algún tiempo venia empleando llaves subrogadas numéricas como identificador de los registros y dejaba la carga a la base de datos de generarlos como por ejemplo: Secuencias para Oracle, Identity para SQL Server o Seriales para PostgreSQL, sin embargo, hace poco comencé a usar los GUID y estoy encantado con uso.

Algunas ventajas de uso:

  • ·         No requiero Scripts complejos para trasladar información entre tablas.
  • ·         Son casi que irrepetibles es 10^38.
  • ·         Los puedo generar desde el aplicativo, adiós a las secuencias.
  • ·         Facilita la migración del modelo entre Bases de Datos.

Los inconvenientes que le veo son:
  • ·         Dificulta la búsqueda de un registro por consultas creadas a mano (depuración)
  • ·         Genera un mayor consumo en Bases de Datos  (No tan relevante hoy en día)
  • ·         Puede disminuir el rendimiento de las consultas.


Ahora si te interesa llaves GUID y necesitas cargar datos, por ejemplo: cargar un listado de datos desde un Excel. 

Aquí te dejo la formula para crear GUID desde Excel.
=MINUSC(CONCATENAR(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);"-";EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;4);"-";EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;4);"-";EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;4);"-";EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;6);EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;6)))

Para finalizar les recuerdo:

·         Cada quien tiene su forma de matar pulgas, así que puede haber una gran cantidad de maneras de hacer el mismo trabajo.
·         Estos artículos son ejemplos; así que, si tienes una mejor manera de hacerlo, o puedes colaborarme con alguna observación, tu comentario es bienvenido.
·         No asumo ninguna responsabilidad por el uso de lo expuesto.
·         Si los artículos te son de utilidad, no olvides un “Me Gusta”, o dejar algún comentario.


viernes, 30 de enero de 2015

Traer el último registro de un grupo de registros


Traer el último, primer, etc.  registro de un grupo de registros

En algún momento necesite consultar el último registro ingresado en una tabla detalle por cada registro de la tabla padre, No es traer los primer registro de una consulta “TOP 1”. Para hacerme entender, he creado el siguiente ejemplo:

Tabla maestra “Cliente”
IdCliente
Cliente
1
Homero
2
Barth
3
Lisa
4
Batman
5
Superman

Tabla detalle “Factura”
IdFactura
IdCliente
Valor
Fecha
1
1
50
01/01/2015
2
1
55
01/01/2015
3
1
45
03/01/2015
4
2
38
03/01/2015
5
2
45
03/02/2015
6
3
60
01/02/2015
7
4
54
15/01/2015
8
4
66
03/02/2015
9
5
70
02/02/2015
10
5
62
03/01/2015
11
5
33
02/01/2015

La consulta de todos los datos:
Select Cliente.IdCliente
       ,Cliente.Cliente
       ,Factura.IdFactura
       ,Factura.Fecha
        ,Factura.Valor
From Cliente
     Inner Join Factura On Cliente.IdCliente = Factura.IdCliente

El resultado:
IdCliente
Cliente
IdFactura
Fecha
Valor
1
Homero
1
01/01/2015
50
1
Homero
2
01/01/2015
55
1
Homero
3
03/01/2015
45
2
Barth
4
03/01/2015
38
2
Barth
5
03/02/2015
45
3
Lisa
6
01/02/2015
60
4
Batman
7
15/01/2015
54
4
Batman
8
03/02/2015
66
5
Superman
9
02/02/2015
70
5
Superman
10
03/01/2015
62
5
Superman
11
02/01/2015
33


Ahora necesito extraer la última factura registrada por cada cliente, para eso necesitamos traer el máximo IdFactura por cliente. Para lo anterior utilizo una sub consulta en el Inner Join que me permita traer el máximo IdFactura ingresado por cliente y posteriormente lo incluyo como parte de un segundo Inner Join para poder traer la data como se puede apreciar en la siguiente tabla.

IdCliente
Cliente
IdFactura
Fecha
Valor
1
Homero
3
03/01/2015
45
2
Barth
5
03/02/2015
45
3
Lisa
6
01/02/2015
60
4
Batman
8
03/02/2015
66
5
Superman
11
02/01/2015
33

A continuación la consulta.
Select Cliente.IdCliente
,Cliente.Cliente
,Factura.IdFactura
,Factura.Fecha
       ,Factura.Valor
From Cliente
Inner Join (Select Max(IdFactura) As Id, IdCliente From Factura Group By IdCliente) As Fact On Cliente.IdCliente = Fact.IdCliente
        Inner Join Factura On Cliente.IdCliente = Factura.IdCliente  And Fact.Id = Factura.IdFactura
Order By IdCliente

No es la más eficiente pero es una manera de consultar muy sencilla.

Entrada destacada

Arquitectura de N-Capas con Visual Studio .NET y AngularJS

Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas. La Arquitectura ...