Proyecto Multiplataforma – Episodio 3 (Aplicación Cliente «Windows/Linux»)

Hola amigos.

En este Episodio vamos a crear nuestra Aplicación Cliente la cual enviará las peticiones http GET a nuestro Servidor Datasnap para obtener información de los métodos Usuario y Habitaciones.

Escribiremos el código necesario para procesar los dos tipos de RESPONSE que vimos en el Episodio 2.2 y mostraré las diferencias de serializar los objetos JSONObject y FDJSONDataSets. Esto lo haremos en dos aplicaciones independientes que nos servirán de prueba para después implementar el código realizado en la Aplicación Cliente principal.

***En el siguiente video vamos a consumir los métodos Usuario() y Habitaciones() que nos regresarán la clase TJSONObject.

***En el siguiente video vamos a consumir los métodos getUsuario() y getHabitaciones() que nos regresarán la clase TFDJSONDataSets.

Ya vimos como enviar las peticiones GET y consumir los métodos de nuestro Servidor DataSnap y la implementación de los métodos en la Aplicación Cliente se harán con aquellos que nos regresan la clase TJSONObject ya que nos permitirá desarrollar clientes desde cualquier herramienta de programación y no solo desde RAD Studio, sin embargo ustedes podrán decidir cual será su favorito.

Dicho lo anterior, todas las peticiones GET, PUT y POST que se agreguen a partir ahora se escribirán con Response TJSONObject y solo haremos un método para las peticiones PUT y POST como ejemplo ilustrativo de la clase TFDJSONDataSets los cuales se consumirá en una pequeña aplicación por separado, los demás métodos se consumirán directamente en nuestra Aplicación Cliente.

***En el siguiente video vamos a implementar los métodos vistos anteriormente en nuestra Aplicación Cliente y se compilará para el Escritorio de Windows (Win10) y para el Escritorio de Linux (Ubuntu).

Con esto terminamos el Episodio 3. En el siguiente Episodio veremos como generar una app Android a partir de nuestra Aplicación Cliente Base.

***Mientras tanto los invito a iniciar sus pruebas con peticiones GET y consumir sus métodos con la opción que mas les interese.

Nos vemos en la próxima

Nos vemos en la próxima entrada.

Proyecto Multiplataforma – Episodio 2.2 (Creación de Métodos)

Hola amigos.

En éste Episodio vamos a escribir un par de métodos para poder pasar a la siguiente etapa que es la construcción de las Aplicaciones Cliente y de esa forma avanzar con el proyecto.

Posteriormente cada método que se agregue en el Servidor, se hará la el proceso para el llamado del mismo desde la Aplicación Cliente para avanzar de forma paralela.

Primero vamos a rediseñar el método ValidaUsuario() ya que requerimos que además de validar que el usuario existe es necesario obtener la información del usuario que inició sesión en el sistema y mostrarla en la ventana principal.

Posteriormente vamos a crear el método Habitaciones() el cual nos regresará la información de las habitaciones para generar lo que en hotelería se le conoce como Rack de Habitaciones.

Un Rack permite visualizar de forma inmediata el estado de las habitaciones (Disponible, Ocupada, Limpia, Sucia, etc.) en una relación Habitación / Día, la siguiente imagen nos muestra un ejemplo de éste visor .

Vamos a mostrar dos formas diferentes de regresar objetos JSON para que ustedes decidan cual se adapta a sus necesidades. Para realizar esto se van a utilizar las siguientes clases:

  • TJSONObject
    • Con esta clase se creará el mapeo JSON del DataSet para que puedan escribir Aplicaciones Cliente con cualquier herramienta y poder serializar el contenido con formato JSON y extraer la información contenida.
  • TFDJSONDataSets
    • Con esta clase se creará el mapeo JSON del DataSet en formato «mime encoded binary content» por lo que solo será útil cuando se use RAD Studio en ambos extremos es decir tanto en el Servidor como en el Cliente.

***En el siguiente video vamos a crear los métodos con el objeto TJSONObject.

***En el siguiente video vamos a crear los métodos con el objeto TFDJSONDataSets

Con esto terminamos el Episodio 2 el cual hice en dos partes para separar el motor y los métodos que serán consumidos.

En el siguiente Episodio comenzaremos a diseñar nuestra aplicación de Escritorio para las plataformas Windows y Linux.

***Mientras tanto los invito a experimentar con la creación de métodos utilizando los dos enfoques TJSONObject y TFDJSONDataSets .

Nos vemos en la próxima

Nos vemos en la próxima entrada.

Proyecto Multiplataforma – Episodio 2.1 (Núcleo del proyecto)

Hola amigos

En este Episodio vamos a crear el núcleo de nuestro proyecto que nos permita la comunicación a través de Internet, de Red local o en el Localhost a las Aplicaciones Cliente desarrolladas en diferentes plataformas.

Construiremos una aplicación que permitirá a las Aplicaciones Cliente invocar los métodos implementados utilizando una tecnología llamada DataSnap la cual genera automáticamente la interfaz de comunicación entre las aplicaciones Cliente y el Servidor.

Antes de iniciar la creación de nuestro Servidor DataSnap vamos a definir algunos métodos que serán invocados desde las aplicaciones Cliente.

Métodos Get

  1. Validación de Usuario para Iniciar Sesión en el Sistema
  2. Obtener Información de las Habitaciones para crear el Rack de Habitaciones
  3. Obtener Detalle de una Habitación en particular
  4. Obtener Información de Huéspedes o un Huésped en particular.
  5. Obtener Listado de Productos o un solo Producto
  6. Obtener Estado de Cuenta

Métodos Post

  1. Check In
  2. Consumos
  3. Pagos
  4. Check Out
  5. Clientes

Creando el Servidor DataSnap

***En el siguiente video veremos como crear un Servidor DataSnap de forma simple y rápida. Una vez creado probaremos su funcionamiento con dos métodos que seguramente ya conocen EchoString() y ReverseString().

Como pudieron ver, crear el motor base de un Servidor DataSnap es muy fácil y muy rápido.

A continuación vamos a construir un método para validar la existencia de un usuario, dicho método requerirá el envío de los elementos USUARIO y CLAVE, se realizará la consulta a la base de datos y el retorno del método será de tipo Boolean, es decir Falso o Verdadero según corresponda.

Método para la Validación de Usuarios

***El siguiente video muestra como crear el Método para validad Usuario y Contraseña.

Ahora sabemos que crear un método con acceso a base de datos es muy fácil, éste método es muy simple porque solo valida si existe o no el registro solicitado y nos regresa un campos Booleano, muy simple pero la idea era mostrar la capacidad de generar métodos en el servidor DataSnap.

En el siguiente Episodio veremos ***Bloopers incluidos 🙂 *** como se regresan DataSets a las aplicaciones cliente y la facilidad con la que lo podemos hacer con nuestra querida herramienta de trabajo.

***Mientras tanto, los invito a experimentar con mas métodos que regresen datos simples y cualquier duda o comentario con gusto la ampliamos 😀

Nos vemos en la próxima

Nos vemos en la próxima entrada.

Proyecto Multiplataforma – Episodio 1 (Diseño de la Base de Datos)

Hola amigos,

Ya estamos listos para iniciar nuestro Proyecto Multiplataforma y lo primero que vamos a hacer es darle un nombre. En realidad no fue demasiado el tiempo que ocupé pero entre varios nombres que se me ocurrieron he elegido el siguiente:

***Aztlán Resort***

Si deseas conocer que es Aztlán da clic aquí.

Ahora, vamos a determinar «el que», «el como» y «el para qué» del proyecto y a partir de ahí crear nuestra base de datos.

Propósito

  • El sistema debe solicitar el registro del usuario que desea acceder al sistema. (Los perfiles de usuario no los veremos por ahora).
  • El sistema debe permitir al usuario ver el rack de habitaciones disponibles y ocupadas.
  • El sistema debe controlar las entradas de huéspedes.
  • El sistema debe permitir realizar cargos de consumos a la cuenta del huésped.
  • El sistema debe permitir a los clientes la búsqueda de habitaciones y ver sus detalles; costo, tipo de habitación, fotos, etc…
  • El sistema debe permitir consultar el estado de cuenta del huésped.
  • El sistema debe controlar la salida y los pagos de los huéspedes.

Definición

Nuestro sistema deberá contar con la información necesaria para poder controlar las habitaciones, su ocupación, todos los consumos de los huéspedes durante su estancia y la salida y pagos del huésped.

De acuerdo a lo anterior vamos a proceder a definir las tablas y su relación entre ellas, No vamos a profundizar en el diseño de una base de datos compleja ya que no es el objetivo que buscamos con el proyecto.

Tablas de la Base de Datos

  1. Habitaciones
    • Tabla Catálogo
    • Esta tabla contendrá las habitaciones del hotel así como la información de precios y disponibilidad.
  2. Tipo Habitación
    • Tabla Catálogo
    • Esta tabla contendrá los tipos de habitación y sus detalles.
  3. Reservas
    • Tabla Operativa
    • En esta tabla se registrarán las entradas y salidas de las habitaciones del Hotel y nos servirá para mostrar el rack de habitaciones.
  4. Clientes
    • Tabla Catálogo
    • Esta tabla contendrá la información de los huéspedes del Hotel
  5. Consumos
    • Tabla Operativa
    • En ésta tabla se registrarán todos los cargos por consumos durante la estancia del huésped en el Hotel.
  6. Pagos
    • Tabla Operativa
    • En esta tabla se registrarán todos los pagos que realice el huésped.
  7. Empleados
    • Tabla Catálogo
    • En esta tabla se registrarán a los usuarios del sistema.
  8. Productos
    • Tabla Catálogo
    • Catálogo de productos que el Hotel comercializa.

Relaciones

La Tabla HABITACIONES se relaciona con la Tabla TIPO_HABITACION a través del campo HABITACIONES.TIPO_HAB_ID con el campo TIPO_HABITACION.TIPO_HAB_ID.

La tabla RESERVAS se relaciona con la Tabla HABITACIONES a través del campo RESERVAS.HABITACION_ID con el campo HABITACIONES.HABITACION_ID y también con la Tabla CLIENTES a través del campo RESERVAS.CLIENTE_ID con el campo CLIENTES.CLIENTE_ID.

La Tabla CONSUMOS se relaciona con la Tabla RESERVAS a través del campo CONSUMOS.RESERVA_ID con el campo RESERVAS.RESERVA_ID y con la Tabla PRODUCTOS a través del campo CONSUMOS.PRODUCTO_ID con el campo PRODUCTOS.PRODUCTO_ID.

Por último la Tabla PAGOS se relaciona con la Tabla RESERVAS a través del campo PAGOS.RESERVA_ID con el campo RESERVAS.RESERVA_ID.

Diagrama Entidad Relación

Como pueden observar todas las tablas tienen una relación excepto la tabla EMPLEADOS la cual solo tendrá la función de permitir la entrada de usuarios al sistema.

*** No estamos considerando ningún acceso restringido (privilegios de usuario) ni contraseñas cifradas ya que no es parte del objetivo del proyecto.

Motor de Base de Datos

En mi caso he decidido utilizar el motor de Firebird para generar la Base de Datos del sistema, ustedes pueden elegir la que consideren mejor.

Campos Auto Incrementables

Para la asignación de nuestras llaves primarias como campos auto-incrementables se creó el generador (GEN_CAT_ID) el cual será ejecutado vía disparadores (Triggers) configurados en los eventos Before_Insert de cada una de las Tablas del sistema como se podrá observar en la definición de la base de datos que se muestra a continuación.


/******************************************************************************/
/*         Generated by IBExpert 2021.8.1.1 26/08/2021 05:48:13 p. m.         */
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE DATABASE 'C:\AZTLAN\BASE\AZTLAN.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET ISO8859_1 COLLATION ISO8859_1;

/******************************************************************************/
/*                                 Generators                                 */
/******************************************************************************/

CREATE GENERATOR GEN_CAT_ID START WITH 0 INCREMENT BY 1;
SET GENERATOR GEN_CAT_ID TO 0;

/******************************************************************************/
/*                                   Tables                                   */
/******************************************************************************/

CREATE TABLE RESERVAS (
    RESERVA_ID       INTEGER NOT NULL,
    HABITACIONES_ID  INTEGER NOT NULL,
    CLIENTES_ID      INTEGER NOT NULL,
    FH_RESERVA       DATE NOT NULL,
    CHECKIN          TIMESTAMP NOT NULL,
    CHECKOUT         TIMESTAMP NOT NULL,
    ESTATUS          VARCHAR(10) NOT NULL
);

CREATE TABLE CLIENTES (
    CLIENTE_ID       INTEGER NOT NULL,
    NOMBRE           VARCHAR(100) NOT NULL,
    DIRECCION        BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    TELEFONO         VARCHAR(15),
    GENERO           VARCHAR(10) NOT NULL,
    DNI              VARCHAR(100),
    ESTATUS          VARCHAR(10) NOT NULL
);

CREATE TABLE EMPLEADOS (
    EMPLEADO_ID      INTEGER NOT NULL,
    NOMBRE           VARCHAR(30) NOT NULL,
    MATERNO          VARCHAR(30) NOT NULL,
    PATERNO          VARCHAR(30),
    USUARIO          VARCHAR(25) NOT NULL,
    CLAVE            VARCHAR(100) NOT NULL,
    ESTATUS          VARCHAR(10) NOT NULL
);

CREATE TABLE PRODUCTOS (
    PRODUCTO_ID      INTEGER NOT NULL,
    TIPO             VARCHAR(25) NOT NULL,
    NOMBRE           VARCHAR(100) NOT NULL,
    COSTO            DOUBLE PRECISION NOT NULL,
    DESCRIPCION      BLOB SUB_TYPE 1 SEGMENT SIZE 80 NOT NULL,
    ESTATUS          VARCHAR(10) NOT NULL
);

CREATE TABLE CONSUMOS (
    CONSUMO_ID       INTEGER NOT NULL,
    PRODUCTOS_ID     INTEGER NOT NULL,
    RESERVAS_ID      INTEGER NOT NULL,
    FH_CONSUMO       DATE NOT NULL,
    CANTIDAD         DOUBLE PRECISION NOT NULL,
    COSTO            DOUBLE PRECISION NOT NULL,
    ESTATUS          VARCHAR(10) NOT NULL
);

CREATE TABLE PAGOS (
    PAGO_ID          INTEGER NOT NULL,
    RESERVAS_ID      INTEGER NOT NULL,
    IMPORTE          DOUBLE PRECISION NOT NULL,
    TIPO             VARCHAR(20) NOT NULL,
    OBSERVACIONES    BLOB SUB_TYPE 1 SEGMENT SIZE 80 NOT NULL,
    FH_PAGO          DATE NOT NULL,
    ESTATUS          VARCHAR(10) NOT NULL
);

CREATE TABLE HABITACIONES (
    HABITACION_ID    INTEGER NOT NULL,
    TIPO_HAB_ID      INTEGER NOT NULL,
    NUMERO           VARCHAR(10) NOT NULL,
    DETALLES         BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    ESTATUS          VARCHAR(10) NOT NULL
);

CREATE TABLE TIPO_HABITACION (
    TIPO_HAB_ID      INTEGER NOT NULL,
    TIPO             VARCHAR(100) NOT NULL,
    DESCRIPCION      BLOB SUB_TYPE 1 SEGMENT SIZE 80 NOT NULL,
    FOTO             VARCHAR(100) NOT NULL,
    COSTO            DOUBLE PRECISION NOT NULL,
    ESTATUS          VARCHAR(10) NOT NULL
);

/******************************************************************************/
/*                                Primary keys                                */
/******************************************************************************/

ALTER TABLE RESERVAS ADD CONSTRAINT PK_RESERVAS PRIMARY KEY (RESERVA_ID);
ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY (CLIENTE_ID);
ALTER TABLE EMPLEADOS ADD CONSTRAINT PK_EMPLEADOS PRIMARY KEY (EMPLEADO_ID);
ALTER TABLE PRODUCTOS ADD CONSTRAINT PK_PRODUCTOS PRIMARY KEY (PRODUCTO_ID);
ALTER TABLE CONSUMOS ADD CONSTRAINT PK_CONSUMOS PRIMARY KEY (CONSUMO_ID);
ALTER TABLE PAGOS ADD CONSTRAINT PK_PAGOS PRIMARY KEY (PAGO_ID);
ALTER TABLE HABITACIONES ADD CONSTRAINT PK_HABITACIONES PRIMARY KEY (HABITACION_ID);
ALTER TABLE TIPO_HABITACION ADD CONSTRAINT PK_TIPO_HABITACION PRIMARY KEY (TIPO_HAB_ID);

/******************************************************************************/
/*                                Foreign keys                                */
/******************************************************************************/

ALTER TABLE RESERVAS ADD CONSTRAINT FK_RESERVAS_1 FOREIGN KEY (HABITACIONES_ID) REFERENCES HABITACIONES (HABITACION_ID);
ALTER TABLE RESERVAS ADD CONSTRAINT FK_RESERVAS_2 FOREIGN KEY (CLIENTES_ID) REFERENCES CLIENTES (CLIENTE_ID);
ALTER TABLE CONSUMOS ADD CONSTRAINT FK_CONSUMOS_1 FOREIGN KEY (PRODUCTOS_ID) REFERENCES PRODUCTOS (PRODUCTO_ID);
ALTER TABLE CONSUMOS ADD CONSTRAINT FK_CONSUMOS_2 FOREIGN KEY (RESERVAS_ID) REFERENCES RESERVAS (RESERVA_ID);
ALTER TABLE PAGOS ADD CONSTRAINT FK_PAGOS_1 FOREIGN KEY (RESERVAS_ID) REFERENCES RESERVAS (RESERVA_ID);
ALTER TABLE HABITACIONES ADD CONSTRAINT FK_HABITACIONES_1 FOREIGN KEY (TIPO_HAB_ID) REFERENCES TIPO_HABITACION (TIPO_HAB_ID);

/******************************************************************************/
/*                                  Triggers                                  */
/******************************************************************************/

SET TERM ^ ;

/******************************************************************************/
/*                            Triggers for tables                             */
/******************************************************************************/

/* Trigger: RESERVAS_BI */
CREATE TRIGGER RESERVAS_BI FOR RESERVAS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.reserva_id is null) then
    new.reserva_id = gen_id(gen_cat_id,1);
end
^

/* Trigger: CLIENTES_BI */
CREATE TRIGGER CLIENTES_BI FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.cliente_id is null) then
    new.cliente_id = gen_id(gen_cat_id,1);
end
^

/* Trigger: EMPLEADOS_BI */
CREATE TRIGGER EMPLEADOS_BI FOR EMPLEADOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.empleado_id is null) then
    new.empleado_id = gen_id(gen_cat_id,1);
end
^

/* Trigger: PRODUCTOS_BI */
CREATE TRIGGER PRODUCTOS_BI FOR PRODUCTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.producto_id is null) then
    new.producto_id = gen_id(gen_cat_id,1);
end
^

/* Trigger: CONSUMOS_BI */
CREATE TRIGGER CONSUMOS_BI FOR CONSUMOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.consumo_id is null) then
    new.consumo_id = gen_id(gen_cat_id,1);
end
^

/* Trigger: PAGOS_BI */
CREATE TRIGGER PAGOS_BI FOR PAGOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.pago_id is null) then
    new.pago_id = gen_id(gen_cat_id,1);
end
^

/* Trigger: HABITACIONES_BI */
CREATE TRIGGER HABITACIONES_BI FOR HABITACIONES
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.habitacion_id is null) then
    new.habitacion_id = gen_id(gen_cat_id,1);
end
^

/* Trigger: TIPO_HABITACION_BI */
CREATE TRIGGER TIPO_HABITACION_BI FOR TIPO_HABITACION
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.tipo_hab_id is null) then
    new.tipo_hab_id = gen_id(gen_cat_id,1);
end
^
SET TERM ; ^

El siguiente paso es inicializar algunas tablas para poder construir los métodos de nuestro Servidor DataSnap.

Tipo de Habitación

INSERT INTO TIPO_HABITACION (TIPO_HAB_ID, TIPO, DESCRIPCION, FOTO, COSTO, ESTATUS)
VALUES (NULL, 'SENCILLA', 'Habitación Sencilla una cama Matrimonial', 'C:\AZTLAN\FOTOS\SENCILLA.JPG', 1200, 'DISPONIBLE');
INSERT INTO TIPO_HABITACION (TIPO_HAB_ID, TIPO, DESCRIPCION, FOTO, COSTO, ESTATUS)
VALUES (NULL, 'DOBLE', 'Habitación Doble dos camas Matrimoniales', 'C:\AZTLAN\FOTOS\DOBLE.JPG', 1800, 'DISPONIBLE');
INSERT INTO TIPO_HABITACION (TIPO_HAB_ID, TIPO, DESCRIPCION, FOTO, COSTO, ESTATUS)
VALUES (NULL, 'JUNIOR SUITE', 'Habitación Junior Suite una cama Queen Size', 'C:\AZTLAN\FOTOS\JUNIORSUITE.JPG', 2800, 'DISPONIBLE');
INSERT INTO TIPO_HABITACION (TIPO_HAB_ID, TIPO, DESCRIPCION, FOTO, COSTO, ESTATUS)
VALUES (NULL, 'MASTER SUITE', 'Habitación Master Suite una cama King Size', 'C:\AZTLAN\FOTOS\MASTERSUITE.JPG', 4500, 'DISPONIBLE');
INSERT INTO TIPO_HABITACION (TIPO_HAB_ID, TIPO, DESCRIPCION, FOTO, COSTO, ESTATUS)
VALUES (NULL, 'TEMATICA', 'Habitación Temática una cama Queen Size', 'C:\AZTLAN\FOTOS\TEMATICA.JPG', 1500, 'DISPONIBLE');
COMMIT WORK;

Habitaciones

INSERT INTO HABITACIONES (HABITACION_ID, TIPO_HAB_ID, NUMERO, DETALLES, ESTATUS)
VALUES (NULL, 1, '100', 'Pantalla plana, Internet, Cafetera', 'LIMPIA');
INSERT INTO HABITACIONES (HABITACION_ID, TIPO_HAB_ID, NUMERO, DETALLES, ESTATUS)
VALUES (NULL, 2, '101', 'Pantalla plana, Internet, Servibar, Cafetera', 'LIMPIA');
INSERT INTO HABITACIONES (HABITACION_ID, TIPO_HAB_ID, NUMERO, DETALLES, ESTATUS)
VALUES (NULL, 3, '111', 'Pantalla plana, Internet, Servibar, Escritorio, Cafetera', 'LIMPIA');
INSERT INTO HABITACIONES (HABITACION_ID, TIPO_HAB_ID, NUMERO, DETALLES, ESTATUS)
VALUES (NULL, 4, '120', 'Pantalla plana, Internet, Servibar, Escritorio, Balcón, Cafetera', 'LIMPIA');
INSERT INTO HABITACIONES (HABITACION_ID, TIPO_HAB_ID, NUMERO, DETALLES, ESTATUS)
VALUES (NULL, 5, '430', 'Pantalla Plana, Cafetera',  'LIMPIA');
COMMIT WORK;

Empleados

INSERT INTO EMPLEADOS (EMPLEADO_ID, NOMBRE, MATERNO, PATERNO, USUARIO, CLAVE, ESTATUS)
VALUES (NULL, 'ELISEO', 'G.', 'N.', 'INSTALADOR', 'DelphiAccess', 'SUPER')

Con esto hemos terminado de diseñar nuestra Base de Datos que por supuesto nada tiene que ver con un ERP Hotelero, sin embargo, nos servirá perfectamente para los fines de éste proyecto multiplataforma.

En el siguiente episodio comenzaremos a construir los métodos REST de nuestro Back-End.

*** Mientras tanto los invito a publicar sus comentarios y/o sugerencias acerca de esta entrada.

Nos vemos en la próxima

Nos vemos en la próxima entrada.

Proyecto Multiplataforma

Hola amigos,

En el segundo Embarcadero Dev Lounge Latinoamérica al cual fui invitado hablamos acerca de porqué desarrollar para Linux, los pros y los contras de aprovechar dicha plataforma y algunas estadísticas acerca de segmento de mercado ocupado tanto por la versión Servidor como de la versión Escritorio y me recordó que en el CodeRage XII presenté la experiencia que obtuve al desarrollar una aplicación multiplataforma.

En dicha presentación mostré un ejercicio que intentaba transportar una aplicación de escritorio VCL a Linux utilizando el nuevo FMXLinux y por supuesto quise hacerlo también a las diversas plataformas que tenía a la mano, es decir, una Laptop con Windows, una Tableta con Android, una Laptop con OSX (Air Pro) y una Máquina Virtual con Linux (Ubuntu).

El resultado de ese primer intento es la siguiente imagen:

Dicha imagen muestra visualmente que se puede crear la misma aplicación para las diversas plataformas, sin embargo, aún no estaba de todo lista ya que por falta de tiempo en ese momento, agregué accesibilidad de Base de Datos solo a la aplicación Linux y a las demás plataformas solo interfaz gráfica, es decir, sin acceso a Base de Datos.

Y bueno, como ya estarán enterados, próximamente se lanzará al mercado el nuevo Delphi 11, por lo que aprovecharé este lanzamiento para continuar con mi proyecto multiplataforma el cual intenta mostrar que podemos desarrollar un Proyecto Multiplataforma con nuestra querida herramienta de trabajo.

Así que para iniciar esta aventura comenzaré por plasmar la idea de lo que quiero desarrollar.

Espero que el poco tiempo libre que me queda en el día a día me permita avanzar a un buen ritmo y sobre todo aprendiendo algo nuevo cada día.

Idea de concepto

Desarrollar un API que corra en un servidor (Windows/Linux) que permita acceder a él desde cualquier aplicación cliente ya sea desarrollada con Delphi o con cualquier otro lenguaje.

Alcance del proyecto

Gestionar la operación básica de un hotel desde el registro del huésped (CheckIn), el uso de las instalaciones (Consumos) hasta la salida del Hotel (CheckOut).

Etapas

Las etapas iniciales de éste proyecto contemplan las siguientes tareas:

  1. Creación de la Base de Datos (Firebird/PostgreSQL/Interbase/MySQL – La que se quiera utilizar). ***Ver el Episodio 1***
  2. Creación del núcleo del proyecto (API REST) con métodos para gestionar la operación del Hotel. ***Ver Episodio 2.1*** ***Ver Episodio 2.2***
  3. Creación de un cliente de escritorio (Windows / Linux). ***Ver Episodio 3***
  4. Creación de un cliente Móvil (Android).
  5. Creación de un cliente Web (Herramienta por definir).

Nota: Como en la vida real, dichas etapas podrán sufrir cambios de acuerdo a las necesidades y/o nuevas ideas que surjan durante el desarrollo de cada una de ellas ya sea propias o de ustedes que me acompañaran en este viaje.

Nos vemos en la próxima

Nos vemos en la próxima entrada.

RAD Studio 10.4.2

Recién he actualizado mi RAD Studio 10.4.1 y en esta ocasión la instalación fue «disparada» desde el Administrador de Descargas GetIt si cuentas con suscripción de actualización.

Y como es costumbre vamos a mostrar el paso a paso de la instalación de mi flamante RAD Studio 10.4.2

Iniciamos seleccionando las plataformas que se desean incluir en nuestro RAD, solo voy a seleccionar la plataforma Delphi Windows Enterprise y posteriormente vamos a instalar las demás plataformas en una serie de entradas independientes.

A manera de collage muestro imágenes del progreso de la instalación.

Durante la instalación nos pregunta si deseamos instalar el Kit de Desarrollo de Software para Windows (Windows SDK).

Una vez que la instalación a finalizado, se inicia nuestro flamante Delphi 10.4.2

Nota: La licencia que me otorga Embarcadero por ser miembro del programa MVP es renovada cada año y aún me quedan 109 días. Tenemos tiempo para hacer varias entradas 🙂

La primera vez que se inicia la versión instalada nos permite seleccionar el tema que mas nos guste.

He seleccionado el tema Dark y finalmente ya tenemos nuestro RAD en funcionamiento.

Esta versión cuenta con 3 parches los cuales por supuesto he instalado antes de comenzar a escribir código.

Ya tenemos nuestra nueva versión lista y esperando poner manos a la obra. En las próximas entradas instalaremos las demás plataformas,

Nos vemos en la próxima
Nos vemos en la próxima entrada

RAD Studio Live 2021 en Español

Hace unos días fui invitado una vez más a este gran evento de Embarcadero y en esta ocasión hablé acerca del proyecto cURL.

El tema del que hablé fue

Usando comandos cURL con Delphi

¿Qué es cURL?

  • cURL (pronunciado “curl”) es un proyecto de software libre, gratuito y de código abierto que consta de dos componentes; una biblioteca de enlace dinámico (libcurl.dll) y una herramienta de línea de comandos (curl.exe) el cual interactúa con libcurl para transferir datos utilizando diversos protocolos de red.
  • El nombre significa «clientURL“ y se publicó por primera vez en 1997, fue creado por el sueco Daniel Stenberg porque quería automatizar la obtención de tipo de cambio de divisas para usuarios de IRC.
  • Antes de adoptar el nombre de cURL éste proyecto fue llamado httpget y urlget.

Y como no podía faltar la demostración de éste proyecto, desarrollé una pequeña aplicación con algunos métodos ejemplo y la he «bautizado» como:

Los métodos ejemplo son los siguientes:

Envío de Correo Electrónico

Subir archivos a servidor sFTP

Consumo de Servicio Web WSDL/SOAP

El video de mi presentación ya está disponible en el canal de Embarcadero Latinoamérica.

La lista de reproducción del evento la pueden ver en el siguiente enlace.

Nos vemos en la próxima
Nos vemos en la próxima.

Descargas:

Todo el código escrito aquí es de libre descarga y utilización solo te pido, si te parece correcto, que menciones su origen y claro cualquier mejora que le hagas publícala que se agradecerá enormemente.

Webinar de Aniversario DelphiAccess (Replays)

Ya están disponibles los Videos del Webinar del Aniversario número 12 de la Comunidad DelphiAccess en su Canal de Youtube

Un grandioso evento que duró aproximadamente 8 horas continuas que nos ha dejado muchas enseñanzas y por supuesto mucha energía.

Muchas gracias a todos los panelistas que amablemente nos han regalado su valioso tiempo y su enorme conocimiento y por supuesto a quienes tomaron parte de su tiempo familiar para acompañarnos.

Mención especial a mi gran amigo Edgar Ramírez por su gran entusiasmo para organizar y dirigir el evento.

Vanessa Amaya

Richard Gress Méndez

Emilio Pérez

M. Yahaira Rodriguez Matla

Marcelo Cuadrado

Miguel Ángel Suárez

Nos vemos en la Próxima.

Evento de Aniversario DelphiAccess

El día 22 de Noviembre de 2020 se llevó a cabo el primer Seminario Web de DelphiAccess celebrando sus primero 12 años.

Fue una experiencia inolvidable llena de emoción, nervios, felicidad y por supuesto de mucho aprendizaje.

Agradezco a todos los asistentes y a los panelistas que amablemente nos dieron su tiempo y su conocimiento y sobre todo agradezco a mi gran amigo Edgar Ramírez que fue quien estuvo a cargo de la organización de este gran evento.

A continuación algunas fotos del evento:

Nos leemos en la siguiente entrada.

Libro «Code Faster in Delphi» – Alister Christie

Uno de los grandes beneficios de ser MVP es la de obtener acceso temprano a las nuevas versiones de Delphi y a mucha información privilegiada, pero además recibimos obsequios de parte de Embarcadero mismo, empresas afiliadas y de otros compañeros que amablemente nos comparten sus trabajos y en ésta ocasión Alister Christie que también es MVP de Embarcadero nos ha regalado su libro «Code Faster in Delphi» – MVP Edition y que además ya está a la venta en LeanPub.com.

Gracias Alister, seguro aprenderé mucho con tu obra.

Nos leémos en la próxima.