<-- Capítulo

Indice del tutor de Delphi
© Copyright 1998
por David Martínez.

Todos los derechos reservados

Capítulo -->

Navegación Rápida
[SELECT] [CREATE PROC] [CREATE VIEW] [UPDATE] [INSERT] [DELETE]

Capítulo 6.1. Cómo funciona Cliente/Servidor en 20 minutos

En este capitulo teórico explicaremos algunos de los comandos básicos necesarios para trabajar en Cliente/Servidor. Donde sea posible, utilizaré únicamente lenguaje SQL acorde con el estándar SQL-92. La base de datos que utilizo para probar es InterBase 4. Mi base de datos alternativa es MS-SQL. Es muy importante que estudie los conceptos básicos el Capítulo 5 antes de comenzar este capítulo.

Comandos SQL más comunes

SQL es una especie de mezcla entre un lenguaje de tercera generacion como dBase y un lenguaje de línea de comando como unix shell o archivos .BAT en DOS. Los comandos en SQL son ejecutados uno por uno por el sistema de base de datos. Cada comando puede devolver un set de resultado (cursor), un mensaje de error que delphi mostrará como una excepción, o ningún resultado. Los sets de resultados, a su vez, pueden ser o no modificables "en vivo". SQL también permite ejecutar comandos de modificación directa sin utilizar un set de resultado de por medio.

Como éste curso es de Delphi y no de SQL, explicaré muy rápido los comandos básicos que se utilizan en este lenguaje de programación, que en realidad merece un curso propio. Para mayor velocidad y entendimiento de conceptos que Delphi utiliza para enmascarar los comandos SQL en sets de datos (dataset), he decidido dividir la sección de comandos entre devuelven un set de resultado, comandos que no devuelven un set de resultado (recuerden que un set de resultado sin registros sigue siendo un set de resultado), y comandos para manipular metadatos. Por cierto, un comando SQL puede estar escrito en varias líneas.

Junto con cada comando incluyo un poquito de su sintaxis básica (varios comandos son muy complejos) y unos ejemplos para que usted vea en qué clase de situaciones se utilizan los comandos.

Comandos que devuelven un set de resultado

Todos los comandos mencionados en esta sección pueden devolver un set de resultado. Estos comandos son:

SELECT

SELECT es el comando que siempre va a devolver un resultado o un mensaje de error. El comando SELECT tiene la siguiente sintaxis:


SELECT {Campo1 AS NombreCampo1, Campo2, ...CampoN }
        FROM {Tabla/Vista}
        [ WHERE {Condición} ]
        [ LEFT JOIN OtraTabla ]

Ejemplos

Por ejemplo, para hacer un Select que nos devuelva toda la información en la tabla de clientes donde el cliente tiene como domicilio la ciudad de México, DF, puede usted escribir:

SELECT * FROM CLIENTES 
WHERE CIUDAD = "MEXICO" AND ESTADO = "DF"

El resultado de este SELECT será:

NUM NOMBRE DIRECCION CIUDAD ESTADO SALDO
1234 DAVID MARTINEZ AVENIDA DEL PROGRAMADOR #45 MEXICO DF $1,332.00
2374 ELVIS PRESLEY COUNTRY MUSIC RD #485 MEXICO DF $503.00
5586 MARIO MORENO LOS HUMORISTAS #24 MEXICO DF $45.05
1048 PEDRO INFANTE CALLE DEL MARIACHI #4853 MEXICO DF $5,340.00
2894 LUIS MIGUEL BOLEROS #5886 MEXICO DF $1,255.00

El comando JOIN sirve para juntar campos de dos entidades. Un uso común en SQL para el comando JOIN es la llamada "denormalización" de los resultados. Esta denormalización es solo de los resultados, para que el SQL devuelva un set consistente de resultados (siempre el mismo número de columnas). por ejemplo, supongamos que usted tiene información de una factura. Tiene usted el encabezado de la factura y además una serie de renglones con los precios y descripciones de los artículos comprados. Para devolver información que usted pueda desplegar, puede usted escribir su SELECT con un JOIN de la siguiente manera:

SELECT
       ENC.FACNO,
       ENC.NOMBRECLIENTE,
       ENC.CIUDAD++ENC.ESTADO AS CIUDADEDO
       REN.ITEMNO,
       REN.DESCRIPTION,
       REN.PRECIO_USD,
FROM FACTURAS ENC
       LEFT JOIN FACTURARENGLON REN ON ENC.FACNO = REN.FACNO
       WHERE ENC.FACNO = 1

Examine el SQL escrito aquí. En este comando de SQL tenemos dos tablas: Una llamada FACTURAS que estoy "abreviando" a ENC (por encabezado), y la otra llamada FACTURARENGLON, que he abreviado a REN (por renglón). De este modo me puedo referir a ellas más fácilmente. También he mezclado la ciudad y estado en un solo campo, al cual he llamado CIUDADEDO (para eso sirve el AS). De este modo puedo desplegarlo en un solo lugar para efectos de la factura. El JOIN junta las tablas a través del campo indice (FacturaNo), que existe en las dos tablas, y en este caso tiene el mismo nombre (ENC.FACNO = REN.FACNO). Finalmente, especificamos la factura #1 únicamente para aventar eso a un reporte.

FACNO NOMBRECLIENTE CIUDADEDO ITEMNO DESCRIPCION PRECIO_USD
1 DAVID MARTINEZ MEXICO, DF 112232 COMPUTADORA COMPAQ PRESARIO $2,340
1 DAVID MARTINEZ MEXICO, DF 112522 MONITOR COMPAQ 21" $1,340
1 DAVID MARTINEZ MEXICO, DF 513213 3COM PALMIII $400.00
1 DAVID MARTINEZ MEXICO, DF 445653 LIBRO "MASTERING DELPHI 3" $39.99
1 DAVID MARTINEZ MEXICO, DF 445657 LIBRO "COLLAB COMP W/DELPHI 3" $69.99

La denormalización de los resultados es algo común en SQL. Recordemos que, para el servidor, no es problema repetir los datos porque el cursor interno no se mueve de lugar. Y para nosotros, nos ahorra tráfico en la red porque, aunque el set de resultados es más grande, no tenemos que pedir más de uno. Los datos siguen normalizados en las tablas correspondientes.

Procedimientos

Un procedimiento (stored procedure) es básicamente el mismo concepto que un procedimiento en Delphi. Un procedimiento tiene un nombre y parámetros, y dentro de este procedimiento usted puede definir variables y opcionalmente devolver uno o más sets de resultado.

CREATE PROCEDURE MiProcedimiento
             VARIABLE1 CHAR(10),
             VARIABLE2 INT
        AS
        { Comandos SQL. Cualquier Select se convierte en parte
        del set de resultados }

        TODO: TERMINAR PROCEDIMIENTOS

Nota: Los componentes de Delphi, por decisión de arquitectura básica, pueden manejar únicamente un set de resultado por cada llamada al SQL. Si usted necesita recuperar la información de un procedimiento que devuelva más de un set de resultado, deberá utilizar acceso directo al BDE, o si tiene acceso al servidor, dividir el procedimiento en partes que devuelvan un set de resultado diferente en cada caso.

Vistas

Una vista (view) es uno o más comandos que devuelven un set de resultado y llevan consigo un nombre. Para los programas que ejecutan comandos, la vista es identica a una tabla. De esta manera el programador SQL puede juntar tablas y condiciones en una vista y cambiar los parámetros de la misma. Por ejemplo, la siguiente vista repite el ejemplo de visualización de facturas que vimos en la sección de SELECT y lo encapsula en una vista mucho más facil de usar.

CREATE
        VIEW DESPLEGARFACTURA
AS SELECT ENC.FACNO, ENC.NOMBRECLIENTE, ENC.CIUDAD+ " , " +ENC.ESTADO AS CIUDADEDO REN.ITEMNO, REN.DESCRIPTION, REN.PRECIO_USD, FROM FACTURAS ENC LEFT JOIN FACTURARENGLON REN ON ENC.FACNO = REN.FACNO

Note que en esta "vista" no tenemos el número de factura. Esto es intencional, para que podamos escribir comandos como:

        SELECT
        * FROM DESPLEGARFACTURA WHERE FACNO = 1

En este comando, el set de resultado es el mismo que en la sección de SELECT/JOIN, que es lo que esperaríamos:

FACNO NOMBRECLIENTE CIUDADEDO ITEMNO DESCRIPCION PRECIO_USD
1 DAVID MARTINEZ MEXICO, DF 112232 COMPUTADORA COMPAQ PRESARIO $2,340
1 DAVID MARTINEZ MEXICO, DF 112522 MONITOR COMPAQ 21" $1,340
1 DAVID MARTINEZ MEXICO, DF 513213 3COM PALMIII $400.00
1 DAVID MARTINEZ MEXICO, DF 445653 LIBRO "MASTERING DELPHI 3" $39.99
1 DAVID MARTINEZ MEXICO, DF 445657 LIBRO "COLLAB COMP W/DELPHI 3" $69.99

 

Comandos que no devuelven un set de resultado

Hay otros comandos de SQL que no devuelven un set de resultado. Estos comandos son generalmente para preparar diferentes partes del servidor, o para modificar y borrar datos.

UPDATE

El comando UPDATE actualiza la tabla especificada con los valores que usted necesite. En el ejemplo que estamos manejando, el siguiente comando modificará todos. El siguiente comando cambia la abreviatura DF a su forma completa Distrito Federal:

    UPDATE FACTURAS
         SET ESTADO = "DISTRITO FEDERAL"
         WHERE ESTADO = "DF"

Es muy importante poner la clásula WHERE, ya que SQL no pregunta, y si usted no la pone, el SQL cambiará TODOS los " ESTADOs" en las facturas a "DISTRITO FEDERAL" sin importar su estado actual (y estaría raro ver Acapulco, Distrito Federal en una factura)... Asegúrese de siempre poner una clausula WHERE en todas sus tablas a menos que esté seguro que quiere cambiar absolutamente todo. El mismo caso aplica al comandoDELETE.

DELETE

El comando DELETE borra los registros de la tabla especificada. Tal como Update, Delete acepta una cláusula WHERE.

DELETE FACTURAS WHERE FACNO = 10

Este comando borrará la factura numero 10. Tal como en UPDATE, si no incluye una cláusula WHERE en su comando, todos los registros de la tabla serán eliminados.

INSERT

El comando INSERT añade un registro a la tabla especificada. INSERT nunca acepta una clausula where, pero INSERT puede añadir más de un registro basado en un SELECT.

INSERT INTO FACTURAS 
        ( FACNO, NOMBRECLIENTE, CIUDAD, ESTADO )
    VALUES ( 99, 'Winston Churchill', 'Londres', 'La Mera Capital' ) 

Este INSERT añade una factura a la tabla de facturas.

INSERT INTO FACTURARENGLON
        ( FACNO, NOMBRECLIENTE, CIUDAD, ESTADO )
       SELECT 99, ITEMNO, DESCRIPTION, PRECIO_USD FROM 
       FACTURARENGLON WHERE FACNO = 2 

Y este INSERT se combina con otro SELECT para copiar los renglones de la factura número dos y ponerlos en la factura número 99.

Sets de resultado "vivos"

Los sets de resultado de SQL pueden ser "vivos", es decir, Delphi (u otras aplicaciones) puede modificar los registros sin necesidad de comandos UPDATE, INSERT o DELETE.

Capitulo -->