Cómo hacer inners joins (concatenaciones internas) con la ORM de Django

Bueno, estamos ahora aquí en un proyecto que utiliza Django como su marco de trabajo.  Y aprendiendo su ORM (mapeo objeto-relacional) me tope con la necesidad de hacer las famosas concatenaciones (joins) entre dos o más entidades.

Anteriormente he trabajado con las ORM de java (Hibernate, EclipseLink) y de .Net (Entity Framework) así que la de ORM  de Django y su QuerySet debería ser capaz de hacer concatenaciones (joins).

Para hacer concatenaciones internas en Django, utilizamos la función select_related(). Según la documentación, esta función sólo sigue relaciones de llaves foráneas (foreign-key), es decir, de tablas hijas a tablas padre o relaciones de uno a uno.

Imagina los registros en una tabla que representa los artículos vendidos de una factura. Llamaremos a la table linea_factura. Esta tabla tendrá como llaves foráneas el identificador de la factura de la tabla factura y el identificador del artículo de la tabla articulo.

Con select_related() sólo podríamos seguir las relaciones de llaves foráneas, es decir sólo podríamos relacional las lineas de la factura con la factura y/o con los artículos pero no en el sentido contrario, es decir, de la factura hacia las lineas de la factura, o de artículos  la linea de artículo. Para esto existe otra función que aún no he probado y espero tratar más adelante.

El código siguiente, que omite la definición de los modelos,  para obtener el QuerySet quedaría así:

lineas_factura = linea_factura.objects.select_related(‘factura’)
.select_relate(‘articulo’).filter(factura__no = 89)

Una vez que el programa haga referencia a la variable lineas_factura, este QuerySet lanzará la consulta sql con dos joins y cargará con los registros de linea_factura y la información relacionada de la tabla factura y de la tabla artículo, donde el número de  factura sea igual a 89. Es decir, la factura número 89 y su detalle.

Espero les sea claro. Si no, comenta el post.

¡Hasta la próxima!

 

Cómo llenar un control comboBox de Windows Forms con una colección en c# .Net

Existen muchas formas de llenar un control comboBox en Windows Forms obteniendo los datos de varias fuentes. En este artículo veremos como llenarlo a través de un objeto de tipo colección (List) conteniendo objetos  tuplas (Tuple), obteniendo los datos con el que llenaremos los tuplas de los resultados de una consulta a una base de datos. El código asume que ya se abrió una conexión a la base de datos y se ejecutó una consulta y se están leyendo los datos que arrojó la misma.

 

El código está comentado para su mejor entendimiento.

Espero les sea útil.

¡Hasta la próxima!

 

Como conectar a una base de datos Oracle 12c desde una aplicación .Net sin usar archivo tsnames.ora.

Enseguida les comparto el código en ¢# (c sharp) para hacer una conexión a una base de datos Oracle 12c desde una aplicación .Net sin usar archivo tsnames.ora externo que defina la conexión.

Antes de ejecutar el código sobra decir que debes contar con los controladores .Net (drives)  de conexión a Oracle 12c instalados en la máquina de desarrollo y el proyecto debe hacer referencia a la clase Oracle.ManagedDataAccess.

No olvides cambiar los valores de HOST (nombre o ip de la computadora donde está instalada la base de datos), PORT (puerto de conexión), SERVICE_NAME (nombre de la instancia de la base de datos Oracle), User Id (usuario) y Password (contraseña), por los valores correctos de tu base de datos.

¡Hasta la próxima!

Errores al instalar SQL Server Express 2017 en Windows 10, problemas con el idioma español (México).

Los instaladores de SQL Server traen un problema añejo con el idioma cuando está configurado como español mexicano que al parecer no se ha corregido aún.

Al ejecutar el instalador de SQL Server Express 2017 en español, descargado desde su sitio web,  arroja el error que inicia con “This SQL Server setup media does not suppor the lenguaje of the OS …” (ver mensaje completo en la imagen siguiente:

O si lo hacemos directamente ejecutando el archivo SETUP.EXE nos arroja el mensaje “No se encuentra el contrato de licencia de SQL Server para la edición seleccionada, EXPRESS. …”:

Y no permite continuar con la instalación. El instalador en español sólo reconoce el idioma español de España así que para proceder con la instalación en una máquina con lenguaje español de México, es necesario cambiar el idioma en nuestra computadora.

Para solucionar el problema hay que cambiar el idioma y región. Vamos a Inicio->Configuración para abrir el panel de Configuración:

Una vez ahí seleccionamos Hora e idioma:

Enseguida seleccionamos Región e idioma:

Cambiamos el país a España y en la sección Idiomas damos clic en Agregar un idioma:

En el panel Agregar un idioma buscamos Español y de la lista de idiomas mostrados seleccionamos el Español Español:

Nos mostrara una lista de regiones con idioma español, seleccionamos el que dice Español (España):

Una vez seleccionado nos regresa al panel anterior. ahí en Idiomas, en el idioma Español (España) seleccionamos el botón Opciones:

Damos al botón Descargar que se encuentra bajo el texto “Descargar paquete de idioma”:

Esperamos que termine la descarga del paquete de idioma y enseguida nos llevara al panel Región e idioma. En la sección Idiomas nos aparecerá Español (España) con el mensaje “Será el idioma para mostrar la próxima vez que inicies sesión”.

Procedemos a cerrar e iniciar sesión o a reiniciar nuestra computadora y una vez hecho esto podemos hacer la instalación de SQL Server 2017 Express sin problemas. Una vez instalado, podemos regresar el idioma de nuestra computadora nuevamente a nuestro idioma favorito.

Regístrate en el blog para recibir notificaciones de nuevas entradas. Cualquier comentario es bienvenido. No olvides visitar los anunciantes.

¡Hasta pronto!

 

There is a process already using the admin port 4848. Glassfish 4/CentOS 6.

El servidor de aplicaciones Glassfish 4.1 de un cliente no quería arrancar y mandaba el mensaje de error especificado en la siguiente imagen:

El servidor corre el sistema operativo CentOS 6 y al inspeccionar los puertos para ver que proceso estaba utilizando el puerto indicado en el mensaje, el 4848, indicaba que ningún proceso estaba ocupando dicho puerto. Así que quedó descartado que fuera otra instancia de Glassfish ejecutándose en la misma máquina.

El problema era que la máquina del cliente no tenía en su archivo /etc/hosts el hostname de su servidor. Para obtener el nombre del hostname.

Así que bastó con editar el archivo /etc/hosts y añadir al final de la IP 127.0.0.1 el hostname del servidor.

Con el comando hostname obtenemos el nombre del servidor. El archivo /etc/hosts debería más o menos quedar así:

Donde HOSTNAME es el nombre del servidor obtenido con el comando hostname.

¡Hasta la próxima!

 

 

Cómo añadir o restar horas, minutos o segundos a una fecha en java con la clase Calendar

A veces es necesario, en nuestros programas java, incrementar o restar de una fecha en cierta cantidad de horas, minutos o segundos. Usando la clase Calendar de este lenguaje es muy sencillo hacer este tipo de operaciones con el tiempo.

Aquí les dejo el código auto-explicativo:

Al ejecutar el código anterior dará la siguiente salida (dependiendo de la hora en que sea ejecutado):

Espero y les sea útil.

¡Hasta la próxima!

 

Microservicios

Las grandes empresas que dan servicios en la nube como Netflix, Amazon y muchas más están usando y/o migrando a Microservicios.

¿Que son los Microservicios? Los Microservicios son un patrón de Arquitectura de Sofware, es decir, una forma de cómo “construir” nuestras aplicaciones de software.

Por lo general nuestra aplicación web, desarrollada en java, la “empaquetamos” en un sólo paquete (válgame la redundancia), al que llamamos archivo .war y  que más adelante lo instalamos o desplegamos en nuestro servidor de aplicaciones. En ese único paquete van todas nuestras entidades, servicios, conexiones a base de datos, etc.; todos los objetos que conforman las diferentes capas que conforman nuestra aplicación web. Utilizamos lo que se llama una Arquitectura Monolítica.

Con la llegada de la computación en “la Nube” la Arquitectura Monolítica de las aplicaciones web empezó a ser ineficiente. A la hora de asignar más recursos computacionales y escalar este tipo de aplicaciones resultaba costoso. En ocasiones es necesario, por ejemplo, escalar sólo un proceso de nuestra aplicación y no toda la aplicación en su conjunto.

Con los Microservicios se divide la aplicación en piezas funcionales y desacopladas, donde cada una de esas piezas es una aplicación y se despliega o se instala independientemente de la otra. De esta forma se puede escalar y asignar recursos sólo una de estas aplicaciones que lleva a cabo una función específica dentro del sistema y no todas en su conjunto.

Para una explicación más detallada de lo que son los microservicios y para qué sirven, te recomiendo este sitio.

¡Saludos!

 

Primefaces: datatable editable no regresa el nuevo valor de la celda ni la rowkey en el evento CellEditEvent.

Antes que nada ¡Feliz año nuevo a todos! Que cumplan todas sus metas este año y en los venideros…

Ahora si, entremos en materia. Actualmente trabajo con la versión 5.3 de Primefaces y todo iba correctamente hasta que me topé con esta cuestión. El evento CellEditEvent no me regresaba valores en los métodos getNewValue y getRowKey. El primero se supone que me debería regresar el nuevo valor capturado en la celda y el segundo el valor único que identificaba a la fila (row) del DataTable sin embargo no era así. Así que me puse a buscar y las soluciones que daban, no funcionaban. Hasta que me puse a examinar minuciosamente los ejemplos del sitio de Primefaces (showcase) y compararlo con mi código y ahí resolví una de las incógnitas:

Mientras que el código de mi CDI bean obtenía los datos que llenaban la datatable de un método que hacía una consulta a la base de datos, en el ejemplo, la cargaban de una propiedad en el bean que era inicalizada previamente al construir el bean a través de un método etiquetado @PostConstruct; cabe aclarar que ambos bean tenian el alcance @ViewScoped. Así que procedí a agregar una propiedad en mi bean y el método que la inicializara con los datos de la base de datos  y agregar su respectivo getter y setter. ¡Vualá! El evento CellEditEvent me regresó el nuevo valor de la celda, sin embargo el valor RowKey de la fila donde se encontraba la celda editada seguía sin tener valor.  En los ejemplos no mostraban como obtener este dato, sólo mostraban como obtener el nuevo y antiguo valor.

Para resolver la segunda incógnita, volví a busca ahora algo de como obtener el RowKey en el evento pero no encontré mucha información, sin embargo en las páginas relacionaban mucho el RowKey con los métodos de selección  del DataTable así que le agregué la propiedad selectionMode=”single” a la datatable y ¡eureka! ¡el evento CellEditEvent me regresó el valor requerido!

En resumen, para solucionar el problema fue necesario agregar una propiedad local en el CDI bean que almacenara la lista de datos que llenarían el DataTable y en la definición de la datatable, en el archivo .xhtml, añadir y asignar “single” a la propiedad selectionMode.

Espero les sirva. ¡No se olviden de visitar a los patrocinadores!

java.lang.IllegalStateException: getOutputStream() has already been called for this response. Glassfish 4.1.1.

Desde hace un tiempo, utilizo Glassfish como servidor de aplicaciones en mis desarrollos web con Java. Sin embargo en el proyecto que actualmente trabajo, al descargar la última versión y querer añadir un nuevo pool de conexiones, la consola de administración gráfica de Glassfish 4.1.1 me arroja el siguiente error:

java.lang.IllegalStateException: getOutputStream() has already been called for this response.

Buscando la causa me encuentro que es un bug en esta nueva versión de Glassfish que aún no ha sido resuelto. Hay que recordar que Oracle dejó de dar soporte sobre este producto y por lo tanto, las correcciones de errores son más lentas que antes. En el misma dirección donde se reporta este bug se indica algunas soluciones.

Dentro de las soluciones, me enteré que existe una empresa que ha empezado otro desarrollo en base al código de Glassfish y realiza funciones de mantenimiento más prontas: Payara Server. Lo he descargado y funciona perfectamente hasta el momento. De ahora en adelante utilizaré este servidor de aplicaciones en futuros desarrollos.

¡Felices fiestas!

(Por favor visita a los patrocinadores).

 

Aplicación con Hibernate 5 no puede ser instalada en Glassfish 4.1.1.

No es posible hacer el deploy de una aplicación que contiene las librerías de Hibernate 5.0.3 a Glassfish 4.1.1. En ell archivo log manda el siguiente error grave:

El problema es la incompatibilidad de versiones de la librería jboss-logging.jar que usan dichas versiones de Hibernate y Glassfish. Reemplazando la librería jboss-logging.jar que se encuentra en glassfish/modules  con la librería versión 3.3.0 (jboss-logging-3.3.0.Final.jar) se soluciona el problema.

¡No olvides dar click en los anuncios!

¡Saludos!