< Anterior | Siguiente >

Lección 6: Adición de código para las funciones de servicio

En EGL, las sentencias de E/S como, por ejemplo, add y get acceden a datos que residen en diferentes tipos de almacenamiento de datos persistente, desde sistemas de archivo a colas de bases de datos. La codificación es similar para los diversos casos.

En esta lección, va a añadir funciones que acceden a filas en una base de datos relacional. Añada las funciones por orden, antes del final de la sentencia end en SQLService.egl.

Adición de un registro de pagos

La función addPayment() añade una fila nueva en la base de datos.

Para codificar la función:

  1. En el editor EGL, copie y pegue las líneas siguientes en SQLService.egl antes de la sentencia end:
    	function addPayment(newPayment paymentRec inOut)
    		add newPayment;
    	end
  2. Antes de continuar, deberá resolver la referencia al componente Record (registro) paymentRec. Puede crear automáticamente sentencias import utilizando la característica Organizar importaciones. Pulse con el botón derecho del ratón en cualquier área en blanco del editor y pulse Organizar importaciones.
    El menú contiene una opción para Organizar importaciones.
    EGL añade la sentencia siguiente al principio del archivo:
    import records.paymentRec;
    Ahora la referencia estará resuelta. Utilizará esta característica con frecuencia, tanto si selecciona el elemento de menú como si pulsa Control-Mayús-O.
  3. Guarde el archivo (Control-S) y, a continuación, coloque el cursor en cualquier lugar de la sentencia add. Pulse con el botón derecho del ratón y seleccione Sentencia SQL > Añadir.
    Las opciones de la sentencia SQL.
    Esta característica cambia el SQL implícito que subraya la sentencia add de EGL por código incrustado que el usuario puede modificar.

    El código SQL incrustado

  4. Puesto que el campo paymentID se genera automáticamente, no podrá sobrescribirlo:
    1. Suprima PAYMENT_ID y la coma posterior de la lista INSERT.
    2. Suprima :newPayment.paymentId y la coma posterior de la lista VALUES.
      Nota: De acuerdo con la terminología SQL, cada variable a la que se hace referencia en una sentencia SQL se denomina variable host. La palabra host hace referencia al lenguaje que incluye la sentencia SQL; en este caso EGL. Por ejemplo, el signo de dos puntos inicial en :newPayment.paymentId indica una variable host.
    La sentencia add revisada tiene un aspecto parecido al de la imagen siguiente:
    Código SQL revisado
  5. Guarde el archivo.

Lectura de todos los registros de base de datos

La función getAllPayments lee todos los registros de la tabla y los almacena en una matriz.

Para codificar la función:

  1. En el editor EGL, copie y pegue las líneas siguientes en SQLService.egl antes de la sentencia end:
    function getAllPayments() returns (paymentRec[])
       paymentArray paymentRec[];
       get paymentArray;
       return (paymentArray);
    end
    La sentencia EGL get genera una sentencia SQL SELECT para recuperar un conjunto de resultados. Cuando el destino de la sentencia get es una matriz dinámica de registros, EGL recupera todas las filas coincidentes del conjunto de resultados e inserta cada fila sucesiva en el siguiente elemento de la matriz.
  2. Guarde el archivo.

Sustitución de un registro

La función editPayment sustituye una fila existente de la base de datos con una versión editada. La función supone que el usuario ha leído anteriormente la fila de la base de datos.

Para codificar la función:

  1. En el editor EGL, copie y pegue las líneas siguientes en SQLService.egl antes de la sentencia end:
    function editPayment(chgPayment paymentRec inOut)
       replace chgPayment nocursor;
    end
    La sentencia EGL replace genera una sentencia SQL UPDATE.
  2. Guarde el archivo.

Supresión de un registro

La función deletePayment suprime el registro especificado de la tabla.

Para codificar la función:

  1. En el editor EGL, copie y pegue las líneas siguientes en SQLService.egl antes de la sentencia end:
    function deletePayment(delPayment paymentRec inOut)
    
    try
       delete delPayment nocursor;
    
       onException(exception SQLException)
          if(SQLLib.sqlData.sqlState != "02000") // sqlState es del tipo CHAR(5)
             throw exception;
          end
       end
    end
    La sentencia EGL delete genera una sentencia SQL DELETE. Si no hay ninguna fila, la base de datos Derby devuelve un valor SQLState de "02000", y el código de tiempo de ejecución EGL emite una excepción que captura la función: es decir, procesa en cierta lógica onException.

    Cuando una función capta pero ignora una excepción, el proceso continúa sin interrupción alguna. Esta regla se aplica a la lógica precedente, cuando el valor de SQLState es "02000". Cuando una función utiliza la sentencia throw para generar una excepción, la excepción se convierte en activa. Esta regla solamente se aplica a la lógica precedente, cuando el valor de SQLState es distinto de "02000".

    En el tiempo de ejecución, si un servicio no maneja una excepción, el solicitante de servicio recibe una excepción del tipo ServiceInvocationException. Incidentalmente, si no es posible acceder al servicio, el solicitante recibe una excepción del tipo ServiceInvocationException o ServiceBindingException, en función de los detalles del error.

  2. Guarde el archivo.

Creación de datos de prueba

La función createDefaultTable crea un conjunto de datos para probar la aplicación completada.

Para codificar la función:

  1. En el editor EGL, copie y pegue las líneas siguientes en SQLService.egl antes de la sentencia end:
    function createDefaultTable() returns (paymentRec[])
    
       try
          execute #sql{
             delete from PAYMENT
          };
    
       onException(exception SQLException)
    
          if(SQLLib.sqlData.sqlState != "02000") // sqlState es del tipo CHAR(5)
             throw exception;
          end
       end;
    
       ispDate DATE = dateTimeLib.dateValueFromGregorian(20110405);
       addPayment(new paymentRec{category = 1, description = "Apartment",
          amount = 880, fixedPayment = YES});
    		 addPayment(new paymentRec{category = 2, description = "Groceries",
          amount = 450, fixedPayment = NO});
       addPayment(new paymentRec{category = 5, description = "ISP",
          amount = 19.99, fixedPayment = YES, dueDate = ispDate });
       return (getAllPayments());
    end
    El código actúa de la forma siguiente:
    • La sentencia EGL execute ejecuta una sentencia SQL literal que suprime todas las filas de la tabla PAYMENT.
    • La variable ispDate recibe un valor de fecha de la función de sistema dateTimeLib.dateValueFromGregorian(). El contenido de la variable estará en un formato que resulte adecuado para su inserción en el campo dueDate de la base de datos.
    • La función addPayment se invoca de forma repetida para añadir filas nuevas a la tabla PAYMENT.
    • La llamada a la función getAllPayments devuelve una matriz de filas que se recuperaron de la tabla.
  2. Pulse Control-Mayús-F para dar formato al código. Si observa alguna X de color rojo, compare el código con el código finalizado en Código finalizado para SQLService.egl después de la lección 6
  3. Guarde y cierre el archivo.

Punto de comprobación de lección

Ha aprendido a realizar las tareas siguientes:
  • Añadir código SQL incrustado en un programa y modificar ese código
  • Crear y organizar automáticamente sentencias import

En la lección siguiente, va a crear un widget para albergar la tabla de datos de gastos.

< Anterior | Siguiente >

Comentarios