programacion iii bases de datos · hablamos de delphi. delphi fue el lenguaje para profesionales de...

35
PROGRAMACION III Bases de datos PROGRAMACION III 2011 UTN PÁGINA 1 DE 35 INTRODUCCION

Upload: dangnguyet

Post on 26-Sep-2018

234 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

PROGRAMACION III

Bases de datos

PROGRAMACION III 2011 UTN

PÁGINA 1 DE 35 INTRODUCCION

Page 2: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Programación III

Objetivo

En esta cátedra se introducen técnicas de programación con bases de datos. El alumno podrá desarrollar software con soporte de datos persistentes y relacionar de manera ordenada y efectiva los procesos de una organización.

Para esto se introduce al alumno a conocer otro producto del mercado con un soporte a bases de datos muy integrado y conseguido. Hablamos de Delphi.Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y una herramienta muy precisa.En la actualidad sigue siendo la opción win32 mas destacada.Su amplia librería de componentes VCL nativos lo posicionan como uno de los códigos generados mas veloces y su estabilidad lo primeriza a la hora de elegir una herramienta de desarrollo confiable, sin sobresaltos.El alumno sabrá elegir los distintos motores de bases de datos del mercado de acuerdo a las necesidades del sistema. Trabajará con conectores nativos, ActiveX, OLE y verán cuales son sus diferencias. Se trabajará de manera visual y con lenguajes de consultas para poder apreciar las diferentes herramientas que dispone el desarrollador.También podrá interpretar en breve introducción el mapeo ORM aprovechando las características OOP del lenguaje. Finalmente se hará funcionar un sistema basado en un pequeño modelo con reportes y consumo de datos de lenguajes diferentes y conexiones en red.

PROGRAMACION III

UNIDAD IBases de Datos con DELPHI. Introducción al lenguaje Object Pascal. Conectores y Drivers. Diferencias. Rendimiento.UNIDAD IISQL en Delphi. Diseño SQL. Controles de conexión: BDE , IBX, ADO. Pruebas Desktop - Client-ServerUNIDAD IIIControles de enlaces- Controles comunes enlazados a DataBase. Clases de entidades. Relaciones. Estructuras de datos. Diseño ORM con objetos.UNIDAD IVReportes. QuickReport. Master-Details. Reportes con gráficos. Diseño y despliegue de reportes en aplicaciones.UNIDAD VProgramación Cliente-Servidor multiusuarios. Entornos WEB. Programación distribuida. Conectores SOAP-WebServices. XML

PROGRAMACION III 2011 UTN

PÁGINA 2 DE 35 INTRODUCCION

Page 3: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

UNIDAD I

INTRODUCCION AL LENGUAJE OBJECT PASCAL

Todos los bloques de programa comienzan por la palabra Begin y terminan con la palabra end. Un ejemplo es:

Begina := b + c;Insertar(a);end; En el ejemplo, después de cada instrucción (excepto begin), se coloca un punto y

coma. En Pascal es obligatorio poner punto y coma, pues identifica el fin de una instrucción.

COMENTARIOS

Es posible incluir en el código texto aclarativo que ayude a entender lo que la

instrucción esta realizando. A ese texto se le denomina comentario.En Delphi hay 3 formas distintas de poner comentarios: 1. Encerrando el texto aclarativo entre llaves ({ }).2. Encerrando el texto aclarativo entre paréntesis y asterisco (* *).3. Anteponiendo al texto dos símbolos de diagonal (//). Unicamente una línea de

texto.

Ejemplo: (*Todo este trozo es un comentario*)begin {esto también es un comentario}a := b + c; // aquí se esta haciendo una sumaInsertar(a);end; Los comentarios no son considerados por Delphi como parte del código. Su única

función es la de aclarar el código. CONSTANTES Y VARIABLES Cuando se realiza un programa, constantemente se tiene que almacenar valores

dentro del código, valores que pueden ser resultado de una operación. Una variable puede cambiar su valor en cualquier momento del programa, una constante siempre mantendrá el mismo valor durante el programa. Sin embargo se deben seguir unos consejos:

No tiene que haber sido utilizada para identificar otra variable.

PROGRAMACION III 2011 UTN

PÁGINA 3 DE 35 INTRODUCCION

Page 4: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

No puede tener el nombre de una orden de Pascal.No puede empezar con un número, ni tener espacios en blanco.No puede contener caracteres “raros”, como comillas, acentos, símbolos de

puntuación ni la letra ñ. Sin embargo puede tener letras, números(siempre que no sea al principio) y el símbolo “_”.

Las constantes se declaran del siguiente modo: en primer lugar se pone la palabra

reservada const seguida de la contante, el signo igual y el valor de la constante (Sin olvidar el punto y coma reglamentario).

Ejemplos: Const pi = 3.141592;Const B = 18;Const anio = 2001;Const tamano = 12; Las variables se declaran de modo distinto a como lo hacen las constantes. Antes de

utilizarla hay que declarar qué es lo que contendrá, para que reserve el espacio en memoria para ella. Antes de empezar a definir variables debes de poner la palabra var y deberá ser antes de la palabra de inicio begin, abajo el nombre de la variable, seguido de 2 puntos y el tipo de valor que contendrá. Ejemplo:

Var Nombrevariable1 : tipo; Nombrevariable2 : tipo; ...Nombre

(Tipo)La variable almacenará

Boolean Un valor lógico: Verdadero (TRUE) o Falso (FALSE).

Char Una sola letra.

Byte Un número pequeño de 0 a 255.

Smallinit Un número entero de –32768 a 32767.

Word Un número entero de 0 a 65535.

Integer o Longinit

Un número entero de –2,147’483,648 a 2,147’483,647

Cardinal Un número entero de 0 a 2,147’483,647

Real Un número entero y decimal.

Double Un número entero y decimal mas preciso que Real.

String Cadena de caracteres.Ejemplos:

Var Edad : byte; Nombre : string; DNI : cardinal;

PROGRAMACION III 2011 UTN

PÁGINA 4 DE 35 INTRODUCCION

Page 5: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Curso : byte; Puntuación : real; Varon : boolean; Cada variable va acorde con lo que almacenara, pues edad tiene un tipo byte, pues no

almacenara un valor grande. Varon es de tipo boolean para que TRUE indique “SI” y FALSE indique “NO”.

ASIGNACIÓN Una vez definida la variable, hay que darle un valor. Esto se hace siguiendo la sintaxis

siguiente: Variable := valor; Esto es la Asignación, únicamente se debe anteponer el nombre de la variable,

seguido de 2 puntos y un signo igual y finalmente el valor que almacenará. Ejemplo: Edad := 24;Nombre := ‘David Osornio’; También es posible realizar operaciones aritméticas en una asignación como por

ejemplo: A := 1+2;Res := 7+2; Tan sólo se tiene que saber como indicar las operaciones aritméticas. Las operaciones

aritméticas se describen en la siguiente tabla: Operación Descripción Ejemplo

+ Suma a := 1 + 4;

- Resta a := 8 – 2;

* Multiplicación a := 2 * 17;

/ División de números reales

a := 14 / 3;

Div División de números enteros

a := 14 div 3;

Mod Resto de la división

a := 14 mod 3;

REGISTROS

En algunas ocasiones, necesitamos construir variables que se compongan a su vez de otras variables. Por ejemplo, si se desea construir una variable de los datos de una persona y que esta a su vez este construida de otras variables mas limitadas como nombre, teléfono, edad. Los registros se declaran del siguiente modo:

Variable: record

PROGRAMACION III 2011 UTN

PÁGINA 5 DE 35 INTRODUCCION

Page 6: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Subvariable: tipo; Subvariable: tipo; ... end; Donde variable es el nombre de la variable “contenedora”( llamada registro) y las

subvariables, son los nombres de las variables contenidas, las que se denominan “Campos del registro”.

VarFichapersona : record Nombre: string; Edad: byte; Telefono: longint;End; De este modo se declara una variable de registro llamada Fichapersona que se

compone de 3 variables: Nombre, Edad y Telefono. Para acceder a los datos de este registro, se deberán colocar los valores del siguiente modo.

Fichapersona.Nombre := ‘David Osornio Fernández’;Fichapersona.Edad := 22;Fichapersona.Telefono := 7550164; MATRICES En Pascal, podemos definir matrices del mismo tipo que las variables, las cuales son

variables divididas en secciones independientes que pueden almacenar distintos valores. Las matrices se declararán del siguiente modo.

Nombre_matriz : array[1..elementos1,1..elementos2,1..elementos3, ...] of tipo; Donde el Nombre_matriz, es el nombre que recibirá la matriz de datos, array es para

definir que se tratará de una matriz de datos. Y los elementos serán el numero de celdas que tendrá dicha dimensión. Ejemplos:

a : array[1..10] of byte;b : array[1..100, 1..20] of word;c : array[1..10, 1..10, 1..10] of float; OPERACIONES CON CADENAS Las cadenas de tipo string, utilizan operadores especiales para trabajar con ellas: Unión.- Podemos unir dos cadenas en una sola utilizando el signo +. Por ejemplo: Nombre := ‘David’;Apellido := ‘Osornio’;NombreCompleto := nombre + ‘ ‘ + apellido;

PROGRAMACION III 2011 UTN

PÁGINA 6 DE 35 INTRODUCCION

Page 7: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Recorte.- Podemos eliminar letras de una cadena utilizando la función delete, que se

utiliza del siguiente modo: Delete (cadena, inicio, cantidad); Donde cadena es la variable con la que estamos trabajando, inicio es la posición en la

que vamos a iniciar el recorte y cantidad es el número de caracteres que quitaremos. a := ‘Hola a todo el mundo!’; delete (a, 6, 10); En este código estamos eliminando de la variable a los 10 caracteres que están a

partir de la posición 6, por lo que después de esta instrucción la variable a tendrá el valor ‘Hola mundo!’.

CONVERSIÓN DE TIPOS Object Pascal es lo que se denomina un lenguaje fuertemente tipado. Esto quiere decir

que no permite asignar valores entre variables de distinto tipo. Esto es que si tenemos una variable a de tipo byte y una variable c de tipo string, y ésta ultima contiene el valor ‘3’, no podremos hacer algo como:

a := c; Ya que con esto no le damos a la variable a el valor 3, sino que se le da el valor ‘3’, se

le esta dando una cadena de texto, no un número.Para permitir asignaciones entre variables de distinto tipo, e utilizan las siguientes

funciones: Trunc.- esta función permite asignar un número real a una variable de tipo byte, word o

integer. Recibe como parámetro un número real y retorna dicho número sin parte decimal. No hace redondeo, solo elimina la parte que está después del punto decimal. Ejemplo:

a : byte;f : real;f : 1.8934;a := trunc (f); // a = 1 StrToInt.- Permite asignar un texto que contiene en su interior un número a una

variable de tipo entero. Si la cadena no contiene un número, sino letras, se produce un error. Ejemplo:

a : string;b : integer;a := ‘123’;b .= StrToInt (a); // b=123

PROGRAMACION III 2011 UTN

PÁGINA 7 DE 35 INTRODUCCION

Page 8: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

IntToStr.- Es la contraria de la función anterior. Permite convertir un número entero a cadena. Ejemplo:

a : integer;b : string;a := 12;b := ‘el valor de a es ‘ + IntToStr (a); // b= ‘el valor de a es 12’ ESTRUCTURAS DE DECISIÓN Son aquellas instrucciones que permiten al usuario obtener distintas respuestas en

base al valor introducido o al resultado de alguna operación. Se seguirá la siguiente sintaxis:

if condición then instrucción1else instrucción2; Después del if(“si”) debe ir la condición que ha de evaluarse. A continuación de ésta ,

se coloca la palabra then(“entonces”) seguida de la instrucción1, que se ejecutará si la condición es cierta o se cumple. En caso contrario, se ejecutara la instrucción2, que esta precedida por la palabra else(“si no”). Ejemplo:

If a = b Then c := 1Else c := 2; En caso de que se deseen poner mas instrucciones en un solo bloque, se deberá

realizar del siguiente modo: If a = b thenBegin c := 1; d := 2; e := 3;endElseBegin c := 5; d := 3; e := 0;end; La parte del Else no es obligatoria, y puede ser omitida, con lo cual la instrucción

quedara reducida, sin embargo, si la parte else se omite, se deberá poner punto y coma al final de la instrucción. Ejemplo:

If a = b ThenBegin c := 1; d := 2; e := 3;end;

PROGRAMACION III 2011 UTN

PÁGINA 8 DE 35 INTRODUCCION

Page 9: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

En este ejemplo, si las variables a y b son iguales se darán valores a las variables c, d

y e, en caso contrario seguirán con sus valores iniciales. EXPRESIONES BOOLEANAS En Pascal se llaman expresiones booleanas a las expresiones que indican una

condición y que producen un resultado de verdadero o falso.Una expresión booleana se puede colocar de dos modos distintos: 1. Una variable o constante seguida de un operador de comparación y seguida de otra

variable.

2. Una expresión booleana seguida de un operador booleano y de otra operación booleana.

Los operadores que se utilizan en Delphi son: Operador Descripción Ejemplo

> mayor que > b

< menor que < 4

>= mayor o igual a >= 3

<= menor o igual c <= 7

<> distinto a <> 0

= igual a = 4

Las operaciones booleanas sirven para unir expresiones y son las que a continuación se presentan.

Operación Descripción Ejemplo

and y (a > b) and (c < 3)

or o (a > b) or (c < 3)

not no not (a = b)

Un ejemplo de una estructura de decisión con una expresión booleana es el siguiente: If ((a > b) and (c < 3)) or not (a > 7) Then c:= 0; ANIDAMIENTOS Es sabido que después de la palabra reservada Then se pueden ejecutar secuencias

de instrucciones las cuales pueden ser de cualquier tipo, ahora bien, ¿Es posible colocar

PROGRAMACION III 2011 UTN

PÁGINA 9 DE 35 INTRODUCCION

Page 10: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

un if dentro del bloque then de otro?. La respuesta es si, a estas sentencias de “If´s” encadenados se le denomina anidamiento.

El punto clave es tomar en cuenta que cuando se coloquen anidamientos es recomendable colocar las instrucciones Begin y End entre Then y Else de este modo sabremos exactamente a que if pertenece cada Else. Ejemplo:

If a = 7 thenBegin If b = 2 then c := 3 Else c := 2EndElsec := 1;SELECCIÓN MULTIPLE Cuando se realiza un programa, es frecuente encontrarse con alguna variable que

según su valor realizara alguna acción. Esto se podría realizar con muchos If´s anidados, pero resultaria algo enredado, por ejemplo: Si se desea que cuando a tenga el valor 1, c tome el valor 10, cuando a tenga el valor 2, c tome el valor 15, cuando a tenga el valor 3, c tome el valor 20 y cuando no sea alguno de los 3 valores, entonces que c tome el valor 0:

If a = 1 then c := 10 ElseIf a = 2 then c := 15 ElseIf a = 3 then c := 20 Elsec := 0; Esta forma de tomar decisiones resulta muy poco ortodoxa. El lenguaje Pascal nos

ofrece para dicho propósito otra forma mas fácil de hacerlo. Mediante la palabra reservada case of. La sintaxis de dicha instrucción es la siguiente.

case variable ofvalor1: acción1;valor2: acción2;....Else acción N;End; Donde variable es el identificador de la variable que será comprobada y valor1,

valor2... son los diferentes valores que puede tomar dicha variable. Si tomamos el problema anteriormente planteado, tendremos que la solución sería de este modo:

case a of1: c := 10;2: c := 15;3: c := 20;Else c:= 0;End;

PROGRAMACION III 2011 UTN

PÁGINA 10 DE 35 INTRODUCCION

Page 11: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

BUCLES En algunos programas, es necesario repetir la misma acción un número determinado

de veces, hasta que se cumpla una acción determinada. En Delphi existen 3 tipos distintos de Blucles: 1. Bucle “Para”.- Se utiliza para efectuar un número concreto de ocasiones la misma

secuencia de acciones. Su sintaxis es: For variable := inicio to fin doBegin<código a repetir>End; Para repetir una suma 10 veces, se utilizará la siguiente instrucción: a := 1For i := to 10 doBegin a := a + 1;End; 2. Bucle “Mientras”.- Se utiliza para repetir las acciones mientras se cumpla una

condición. Su sintaxis es: While condición doBegin <código a repetir>End; En el momento que la condición deje de cumplirse, el bucle terminará y seguirá con la

siguiente instrucción del código. Ejemplo: a := 1;j := 1;While (j <=10) doBegin a := a +j; j := j +1;End; 3. Bucle “Repetir”.- Se utiliza para repetir las mismas acciones hasta que se cumpla

una condición determinada. Repeat <Código a repetir>Until condición;

PROGRAMACION III 2011 UTN

PÁGINA 11 DE 35 INTRODUCCION

Page 12: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

En el momento en que se cumpla la condición, terminará el bucle. Ejemplo: a := 1;j := 1;Repeat a := a * j; j := j+1;Until j=10; En este ejemplo, se obtendrá el factorial de 10.La diferencia entre el Bloque While y el Bloque Repeat es que en el primero, se evalúa

la condición antes de ejecutar las acciones, por lo que es posible que no se ejecute ni una sola vez. Mientras que Repeat, evalúa la condición después de ejecutarla una vez.

PROCEDIMIENTOS Y FUNCIONES Delphi, es un lenguaje estructurado, lo cual indica que los programas escritos en este

lenguaje, pueden descomponerse en pequeños módulos que pueden ser llamados cuando los necesitemos. Estos módulos en Pascal se llaman funciones y se identifican mediante un nombre. Se declaran del siguiente modo:

function nombre (argumento1: tipo; argumento2: tipo;...) : tipo;Begin <Acciones a realizar>End; Donde nombre es el nombre que se asignará a la función, argumento1 y argumento2

son valores que pasan a la función y tipo es el tipo de valor que retornará como resultado. Por ejemplo, si queremos implementar en Pascal la función matemática: f(x, y) = (x * x + y) / x siendo x e y números enteros, se realizaría de este modo:

Function f (x: integer; y: integer) : integer;Begin F = (x * x + y) / x;End; Dicha función, se definirá una sola ocasión durante el programa, y únicamente será

necesario hacer llamada a esta función mediante su nombre y sus valores dados entre paréntesis.

a := f(1, 2); {llamada a f con x=1 e y=2}b := f(a, 3); {llamada a f con x=a e y=3}c := f(a, b) + f(1, 4); Los valores colocados entre paréntesis de la función, reciben el nombre de

argumentos. Estos se comportan dentro de la función, como si se tratase de variables.

PROGRAMACION III 2011 UTN

PÁGINA 12 DE 35 INTRODUCCION

Page 13: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

PROCEDIMIENTOS Toda función que no retorna valores ningún valor, o que no realiza operaciones

matemáticas o genera resultados numéricos, recibe el nombre de procedimiento. La programación estructurada, se basa en dividirse en pequeñas partes autosuficientes que realizan una tarea muy concreta, y que pueden ser invocados cuando se desee. Se puede realizar alguna función o tarea especifica que arroje información de modo no numérico, o sin realizar operaciones, es entonces cuando se utilizan los procedimientos.

Un procedimiento se declara del mismo modo que una función, a diferencia que la palabra reservada Function cambia por Procedure y al final de la lista de argumentos no se pone ningún tipo de valor de respuesta, pues no arroja ningún resultado. Ejemplo:

Program Ejemplo2;Procedure Di (mensaje: String);Begin Showmessage(mensaje);End;Begin Di (‘Mi nombre es: ’); Di (‘David Osornio Fernández’);End; También es posible construir funciones o procedimientos que no tengas argumentos,

pues pueden realizar una tarea concreta, no importando alguna otra cosa. Ejemplo: Program Ejemplo3;Procedure Saluda;Begin Showmessage(‘Hola a todos’);End;Procedure Nombre;Begin Showmessage(‘Mi nombre es David Osornio Fernández’);End;Procedure Despidete;Begin Showmessage(‘Adiós a todos’);End;Saluda;Nombre;Despidete;End;

PARAMETROS POR VALOR Y POR REFERENCIA ¿Que es lo que sucede cuando enviamos una función matemática a un procedimiento

y nos debe enviar un resultado?. Por ejemplo: Program Ejemplo;Procedure cuadrado (a: byte);Begina := a * a;

PROGRAMACION III 2011 UTN

PÁGINA 13 DE 35 INTRODUCCION

Page 14: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

End;Var c, d :byte;Beginc := 3;cuadrado (c);d := c;End; La pregunta del millón de Dólares, es... ¿Cuánto vale d al final del programa?, se

pensara que d vale 9 pero, en realidad vale 3, pues al pasar un valor numérico a un procedimiento y no a una función, no se rescata ningún resultado, pues no tiene declaración del tipo de variable que arrojará. Si se desea realizar esto se deberá declarar en la sección correspondiente, del siguiente modo:

Program Ejemplo;Procedure cuadrado (Var a: byte);Begina := a * a;End;Var c, d :byte;Beginc := 3;cuadrado (c);d := c;End; Es recomendable que cuando utilices funciones y procedimientos, estos sean lo mas

cortos posibles y si algún procedimiento o función es demasiado extenso, puede ser dividido en procedimientos mas pequeños, de no mas de 30 líneas de código.

PROGRAMACION III 2011 UTN

PÁGINA 14 DE 35 INTRODUCCION

Page 15: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

CONECTORES Y DRIVERS

En Delphi 6 existen varias clases de componentes para acceder a bases de datos por tanto en ocasiones puede resultar difícil la elección de una de ellas para nuestro problema en particular. Los componentes para acceder a bases de datos son agrupados en paletas de acuerdo al mecanismo de acceso a datos que ellos emplean. Estos mecanismos son:

Borland Database Engine (BDE). ActiveX Data Object (ADO). dbExpress. InterBase Express (IBX).

A pesar de que todos estos mecanismos tienen un mismo propósito: el comunicarse con una base de datos y representar la información que esta contiene, ellos se diferencian unos de otros por aspectos como: desempeño, uso de recursos, robustez, portabilidad de un sistema operativo a otro, facilidad en su desarrollo, así como la disponibilidad de controladores (drivers) asociados a ellos para acceder a diferentes tipos de bases de datos.La decisión de cual mecanismo elegir está determinado, para el desarrollador, por la importancia dada a cada uno de los aspectos anteriores. Además está determinado por el tipo de base de datos que se va a emplear ya sea Paradox, Access, MS SQL Server, Interbase, entre otras.A continuación veamos algunas características de cada uno de estos mecanismos de acceso a datos.Borland Database Engine (BDE):Este mecanismo surgió en Delphi desde la misma versión 1 como un motor para acceder a bases de datos Paradox.De todos los mecanismos de acceso a datos BDE es el que brinda un mayor número de funciones para manipular la información contenida en una base de datos, provee también de una interfaz para acceder a una amplia variedad de servidores de bases de datos a través de los controladores correspondientes.Sin embargo una de las desventajas que tiene este mecanismo es que al construir una aplicación basada en BDE, en esta se incluye automáticamente el motor de acceso a datos.Este hecho además de incrementar el tamaño de la aplicación resultante, hace aumentar la complejidad de su desarrollo. El costo, por tanto, de futuros desarrollos y mantenimientos a la aplicación continuaría siendo alto.En muchas fuentes de información se dice que este mecanismo debido a su arquitectura es ideal para trabajar con bases de datos Paradox y dBase -tipos de bases de datos estas basadas en fichero tal como lo es Microsoft Access- por lo que algunos desarrolladores no lo emplean en otros tipos de bases de datos, evitando que se limiten funcionalidades de estas en la aplicación ya que BDE no las soporta. Tal es el caso de los problemas de compatibilidad que se presentan entre los campos de determinados servidores SQL y los tipos de datos de Delphi.BDE presenta también problemas específicos con algunos gestores, como es por ejemplo en MS SQL Server, en el manejo simultáneo de varias consultas. También en el caso de Interbase existen dificultades ya que BDE no puede acceder a los tipos de arreglos Interbase.

PROGRAMACION III 2011 UTN

PÁGINA 15 DE 35 INTRODUCCION

Page 16: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

BDE tiene también otro inconveniente en su uso: es un mecanismo de acceso a datos que desde hace años la misma Borland lo está considerando como en desuso, lo que se conoce en inglés como "deprecated".Esto significa que aunque BDE haya aparecido en las versiones siguientes de Delphi, este no ha sido mejorado ni se le han incorporado nuevas funcionalidades por lo que tiende a desaparecer. En su lugar Borland recomienda que se emigre para el mecanismo dbExpress, en el caso de bases de datos remotas y en el caso de base de datos locales como Paradox y dBase, se aconseja transformarlas a la edición Desktop de InterBase 6 y luego emplear como mecanismo de acceso a datos InterBase Express o dbExpress.ActiveX Data Object (ADO):La tecnología ADO Express apareció en Delphi desde la versión 5.Los componentes ADO Express proveen de acceso a bases de datos por medio de un marco de trabajo simplificado que contiene varios objetos ADO dedicados a efectuar operaciones con la base de datos. Cada uno de estos objetos son encapsulados dentro de los distintos componentes que ofrece Delphi para este mecanismo.Para lograr el acceso a los datos se necesita que tanto en el servidor donde se encuentre la base de datos como en la estación cliente esté instalado el Microsoft ActiveX Data Objects 2.1 o una versión superior. Se requiere además la existencia de un proveedor OLE DB, de los cuales existe un gran número para diferentes bases de datos, o en su lugar un controlador ODBC. OLE DB es una interfaz de bajo nivel diseñado para acceder a cualquier tipo de datos.Las aplicaciones basadas en ADO usan el ADO 2.1 para interactuar con el proveedor OLE DB el cual se conecta con la base de datos y accede a los datos.ADO es un estándar de Microsoft por lo que tanto él como OLE DB son distribuidos por esta compañía y desde hace algunas versiones de Windows forman parte del sistema operativo. Este hecho da mucha eficiencia a este mecanismo pues de esta manera el motor de acceso a datos está integrado en el propio sistema por lo que, a diferencia de BDE, la aplicación no tiene que incluirlo en ella haciéndola más ligera y más fácil de construir.ADO es un mecanismo bastante ligero y altamente poderoso, pues entre otras razones, permite acceder tanto a bases de datos relacionales como no relacionales. A diferencia de BDE provee de gran funcionalidad y rapidez en la actualización del resultado de una consulta a través del método Requery.Sin embargo aunque ADO es empleado para acceder a múltiples bases de datos se dice que este mecanismo tiene un número de características que parecen estar más orientadas hacia Access que a otros gestores, hecho muy similar al que sucede entre BDE y Paradox.Una de las características más interesantes que posee ADO es el uso de cursores o punteros en la estación cliente.Una vez que se ha obtenido del servidor una copia completa de un dataset (una tabla, una consulta o un procedimiento almacenado), en el cliente se pueden efectuar, sobre esta copia caché, operaciones como ordenado, filtrado y edición de datos. Con esto se tiene la posibilidad de crear una copia provisional de los datos en un fichero local y trabajar con esta sin una conexión con el servidor.dbExpress:Este mecanismo de acceso a datos se incorporó en Delphi a partir de la versión 6. Fue diseñado, entre otras razones, con el propósito de facilitar la configuración de los

PROGRAMACION III 2011 UTN

PÁGINA 16 DE 35 INTRODUCCION

Page 17: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

controladores y reemplazar la tecnología de conexión a base de datos remotas existente hasta ese momento, como la usada por BDE, brindando ligereza y facilidad de desarrollo.Por medio de un conjunto de controladores permite, de todos los mecanismos, el acceso más rápido a la información de la base de datos.Para cada base de datos, dbExpress utiliza un controlador que adapta el formato de esta a un conjunto de interfaces dbExpress. De esta manera al construir una aplicación que use este mecanismo se necesita incluir en ella una librería de enlace dinámico (DLL) que es la que constituye el controlador para la base de datos específica.Una característica muy importante de dbExpress es que posibilita su uso y desarrollo en más de un plataforma pues en Linux, con la versión de Delphi para este sistema operativo conocida como Kylix, puede emplearse este mecanismo también.La gran rapidez que tiene dbExpress en el acceso a los datos se debe a que este mecanismo emplea datasets unidireccionales los cuales son diseñados para este propósito con un empleo de recursos mínimo. Los datasets unidireccionales al no almacenar información en memoria están limitados en su funcionalidad con respecto a otros tipos de datasets.De esta manera se ven afectadas, en mayor o menor medida, operaciones como la navegación entre los registros, ediciones para actualizaciones, filtrado de registros, búsqueda de registros por campos e incluso su representación en componentes visuales.Dadas estas limitaciones en dbExpress, a diferencia de BDE y ADO, no se ofrecen un amplio número de funciones para la manipulación de los datos. También hay otros tipos de limitaciones como por ejemplo la dependencia que tiene una aplicación de una DLL, lo que puede resultar en ocasiones un obstáculo. Algunos sistemas gestores de bases de datos no son bien soportados por dbExpress, ese es el caso de los problemas existentes entre los controladores de este para MySQL. Por otra parte ciertas características especiales de un gestor como son los diferentes tipos de datos no son brindadas por dbExpress, así sucede por ejemplo en el caso de Oracle.Interbase Express (IBX):A través de sus componentes este mecanismo permite hacer una conexión directa con una base de datos Interbase sin que para ello intervenga ningún motor o capa intermedia como sucede con BDE y ADO, lo que aumenta la velocidad en el acceso a los datos.Además de los componentes que aparecen por defecto en la paleta Interbase al instalar Delphi, pueden emplearse también unos componentes asociados a estos dedicados a la administración de bases de datos Interbase.Con ellos se pueden efectuar tareas administrativas como la configuración de los parámetros de la base de datos, creación de copias de seguridad (backup), establecimiento de los permisos de acceso, entre muchas otras. Estos, al igual que los primeros, requieren de la instalación de Interbase 6 para su uso.El hecho de que los componentes Interbase son exclusivos para bases de datos de este tipo resulta por una parte una limitante pero también una ventaja pues todas las características y beneficios que brinda Interbase son soportadas por sus componentes. Más que referirnos al mecanismo, todo el comentario se centrará entonces en la base de datos Interbase.Interbase es un sistema de administración de base de datos relacionales creado por Borland y compatible con varias plataformas. Puede ser usado tanto en estaciones de trabajo (edición Escritorio) como en estaciones servidor (edición Servidor) y sus respectivas instalaciones están incorporadas en el programa de instalación de Delphi 6.

PROGRAMACION III 2011 UTN

PÁGINA 17 DE 35 INTRODUCCION

Page 18: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Todo esto convierte a Interbase en una opción importante a tener en cuenta a la hora de elegir un gestor.A diferencia de otros gestores que requieren de ciertos recursos (hardware y software) y de un alto costo para su mantenimiento Interbase fue diseñado para operar en ambientes con pocas prestaciones y casi sin necesitar mantenimiento por parte de un administrador, sin sacrificar su rendimiento el cual es alto. Tiene también la capacidad de soportar transacciones simultáneas de varias aplicaciones y no ocasiona gran sobrecarga a estas por operaciones con la base de datos manteniendo la debida transparencia para los usuarios.Tal es el desarrollo de este gestor que algunos expertos lo consideran en varios puntos superior a SQL Server. Se dice que esa ventaja está determinada por los requerimientos de hardware, el soporte multiplataforma, la flexibilidad de los disparadores (triggers), la velocidad de recuperación ante alguna falla, entre otros aspectos.También se ha determinado su superioridad con respecto a MySQL y está radica en los disparadores, los procedimientos almacenados, la recuperación ante una falla, tipos de datos para cálculos financieros precisos, etcétera.A modo de conclusión puede señalarse que la elección de un mecanismo de acceso a datos debe hacerse conociendo las características de cada uno de ellos y seleccionar entonces el más adecuado a nuestro problema, aunque también como se ha visto la elección depende de la base de datos que se emplee y esta a su vez de la situación real.

AliasUn alias no es más que un pseudonimo par un directorio; el Delphi utiliza para indicar el camino donde está la tabla un Alias ó la cadena con la ruta completa. (C:\Mis bases\la de ahora). Para añadir, modificar, o borrar un alias, en principio, hay que recurrir al administrador de BDE, el cual se encuentra en la carpeta donde esta instalado el Delphi, o en el caso del Delphi 3.0 en el panel de control y que lo veras con la denominación Database Desktop.En la paleta de controles Data Access, se encuentran los controles para manejar bases de datos. Los dos primeros por la izquierda se llaman DataSourcer y Table respectivamente. Estos controles son del tipo no visuales, como los cuadros de dialogo, y se van a encargar de gestionar la base de datos para nosotros.Estos dos componentes trabajan en estrecha relación, así en la propiedad DataSet del componente DataSourcer debe relacionarse con un componente Table, que hay el formulario. El componente Table, tiene un montón de eventos. Si sabes un poco de inglés caeras en la cuenta rapidamente que esos eventos se producen antes (before), después (After) y, algunos, durante (On) las operaciones que se pueden hacer con una base de datos. Por cierto que Delphi las llama Tablas (Table), y de ahora en adelante me voy a referir así a las bases de datos. En el aspecto de las propiedades hay tres que destacan, son: Active, DataBaseName, y TableName. Active, nos permite abrir y cerrar la tabla. Por otra parte las dos restantes están relacionadas entre sí.DataBaseName, almacena el alias que vamos a usar, y TableName, el nombre de la tabla. Una vez que has puesto un alias o una ruta en DatabaseName, en TableName aparecerán todos los nombres de las tablas de ese directorio.Cuando se trabaja con una base de datos, el principal responsable de prácticamente todo es el componente Table. Este componente es el encargado de leer, escribir, actualizar, etc

PROGRAMACION III 2011 UTN

PÁGINA 18 DE 35 INTRODUCCION

Page 19: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

la base de datos a la cual esta conectado, y forma un "tanden" muy útil con el componente Datasourcer, el cual es el encargado de conectar al componente table con los controles usados para visualizar los datos. Así el componente Table tiene una larga lista de eventos, que se pueden dividir en tres grupos, los eventos que se producen antes de un operación (apertura, cierre, lectura, etc) los cuales empiezan por la palabra Before (en inglés significa antes de); luego están los eventos que se producen en el momento cuyo nombre empieza por On (recuerda que el evento que se producía cuando se pulsaba un botón se llama Onclick); y por ultimo los eventos que se producen después, cuyo nombre empieza por After (del inglés: después).Antes de poner una tabla con los principales eventos voy a comentar las principales operaciones de una tabla, estas son:

Open Se abre la tabla

Close Se cierra la tabla

Edit Para editar el campo actual

Insert Añade datos a la tabla

Post Graba los datos

Cancel Cancela la operación actual

Así pues los principales eventos son los siguientes:

AfterDelete Se produce despues de el borrado de un registro

AfterEdit Después de editar un registro

AfterInsert Después de Insertar

After Post Después de grabar los datos

BeforeCancel Antes de cancelar la operación

BeforeClose Antes de que se cierra la tabla

BeforeDelete Antes de borrar

BeforeEdit Antes de editar el registro actual

BeforeInsert Antes de insertar un registro

BeforeOpen Antes de abrir la tabla

BeforePost Antes de guardar los datos

OnCalcFields Se produce cuando se va a calcular el valor de un campo

OnDeleteError Cuando se produce un error al borrar un registro

OnEditError Cuando hay un error al editar un registro

OnFilterRecord Cuando se activa el filtrado

OnNewRecord Cuando se añade un registro

PROGRAMACION III 2011 UTN

PÁGINA 19 DE 35 INTRODUCCION

Page 20: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

OnPostError Cuando hay un error durante el grabado de datos

Otro componente interesante para manejar una tabla es la barra de navegación (dbNavigator), que también tiene caracteristicas interesantes. De sus propiedades especificas se pueden resaltar algunas. Una es la propiedad VisibleButtons la cual contiene la relación de los botones que son visibles.Por defecto los botones visibles son todos, y como quizas hayas descubierto cada uno tiene una función, de derecha a izquierda los botones que se muestran son:

nbFirst Desplaza la tabla al primer registro

nbPrior Se desplaza al registro anterior

nbNext Avanza un registro

nbLast Se coloca en el último registro

nbInsert Inserta un registro en la tabla

ndDelete Borra el registro actual

nbEdit Pone la tabla en modo edición

nbPost Guarda los datos (post)

ndCancel Cancela la operación actual

nbRefresh Refresca los datos

Otra propiedad es ShowHint, la cual si su valor es true muestra una breve descripción de cada botón, pero inglés. Aunque hay otra propiedad llamada Hints, del tipo TString donde podemos escribir las descripciones que queramos para cada botón. Teniendo en cuenta que la primera línea contendrá la descripción del primer botón. Y ojo porque si un botón o más no están visibles debes colocar, igualmente, la descripción del mismo. Así que un pequeño truco que yo uso es, que lo primero que hago es colocar las descripciones de todos los botones, y luego desactivo los botones que me no interesan. Quizás a alguien le interese crearse una barra de herramientas en su aplicación y usar botones convencionales en sustitución de la barra de navegación, o simplemente ha decido poner un menú en su aplicación que haga las misma funciones que la barra de navegación. Pues la solución es colocar en el evento Onclick de los menus la orden correspondiente a la acción que queremos hacer, pero esta vez hay que indicarselo a la tabla, y no a la barra de navegación. Los métodos que hay que llamar son:

First Para llevar la tabla al principio

Prior Para retroceder un registro

Next Para avanzar un registro

Last Para ir al último registro

Edit Para editar el registro actual

Insert Para inserta un registro

Delete Borra el registro actual

PROGRAMACION III 2011 UTN

PÁGINA 20 DE 35 INTRODUCCION

Page 21: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Edit Coloca la tabla en modo edición

Post Guarda los datos

Cancel Cancela la operación (inserción)

En la pestaña DataControls de la barra de herramientas de Delphi, están los controles para manejar los datos de la tabla; son iguales que sus "homólogos" comunes, con la particularidad que contiene las dos propiedades que permiten acceder a una tabla, que son: DataSource donde indicaremos el componente TDataSource el cual está conectado a la tabla que queremos acceder, recordar que el componente TDataSources hace de "interprete" o "puente" en una tabla y los componentes; DataField, es la propiedad en la cual se indica el campo de la tabla que queremos mostrar.

PROGRAMACION III 2011 UTN

PÁGINA 21 DE 35 INTRODUCCION

Page 22: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

UNIDAD II

Qué es SQLQué es y para qué sirve el SQLLas aplicaciones en red son cada día más numerosas y versátiles. En muchos casos, el esquema básico de operación es una serie de scripts que rigen el comportamiento de una base de datos.Debido a la diversidad de lenguajes y de bases de datos existentes, la manera de comunicar entre unos y otras sería realmente complicada a gestionar de no ser por la existencia de estándares que nos permiten el realizar las operaciones básicas de una forma universal.Es de eso de lo que trata el Structured Query Language que no es mas que un lenguaje estándar de comunicación con bases de datos. Hablamos por tanto de un lenguaje normalizado que nos permite trabajar con cualquier tipo de herramientas (ASP o PHP) en combinación con cualquier tipo de base de datos (MS Access, SQL Server, MySQL...).El hecho de que sea estándar no quiere decir que sea idéntico para cada base de datos. En efecto, determinadas bases de datos implementan funciones específicas que no tienen necesariamente que funcionar en otras.Aparte de esta universalidad, el SQL posee otras dos características muy apreciadas. Por una parte, presenta una potencia y versatilidad notables que contrasta, por otra, con su accesibilidad de aprendizaje.

Creación de tablas

Explicamos la manera de crear tablas a partir de sentencias SQL. Definimos los tipo de campos principales y la forma de especificar los índices.

En general, la mayoría de las bases de datos poseen potentes editores de bases que permiten la creación rápida y sencilla de cualquier tipo de tabla con cualquier tipo de formato.Sin embargo, una vez la base de datos está alojada en el servidor, puede darse el caso de que queramos introducir una nueva tabla ya sea con carácter temporal (para gestionar un carrito de compra por ejemplo) o bien permanente por necesidades concretas de nuestra aplicación.En estos casos, podemos, a partir de una sentencia SQL, crear la tabla con el formato que deseemos lo cual nos puede ahorrar más de un quebradero de cabeza.Este tipo de sentencias son especialmente útiles para bases de datos como Mysql, las cuales trabajan directamente con comandos SQL y no por medio de editores.Para crear una tabla debemos especificar diversos datos: El nombre que le queremos asignar, los nombres de los campos y sus características. Además, puede ser necesario especificar cuáles de estos campos van a ser índices y de qué tipo van a serlo.La sintaxis de creación puede variar ligeramente de una base de datos a otra ya que los tipos de campo aceptados no están completamente estandarizados.

PROGRAMACION III 2011 UTN

PÁGINA 22 DE 35 INTRODUCCION

Page 23: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

A continuación os explicamos someramente la sintaxis de esta sentencia y os proponemos una serie de ejemplos prácticos:

2.1.1.- SintaxisCreate Table nombre_tabla ( nombre_campo_1 tipo_1 nombre_campo_2 tipo_2 nombre_campo_n tipo_n Key(campo_x,...))

Pongamos ahora como ejemplo la creación de la tabla pedidos:

Create Table pedidos ( id_pedido INT(4) NOT NULL AUTO_INCREMENT, id_cliente INT(4) NOT NULL, id_articulo INT(4)NOT NULL,fecha DATE, cantidad INT(4), total INT(4), KEY(id_pedido,id_cliente,id_articulo) )

En este caso creamos los campos id los cuales son considerados de tipo entero de una longitud especificada por el número entre paréntesis. Para id_pedido requerimos que dicho campo se incremente automáticamente (AUTO_INCREMENT) de una unidad a cada introducción de un nuevo registro para, de esta forma, automatizar su creación. Por otra parte, para evitar un mensaje de error, es necesario requerir que los campos que van a ser definidos como índices no puedan ser nulos (NOT NULL).El campo fecha es almacenado con formato de fecha (DATE) para permitir su correcta explotación a partir de las funciones previstas a tal efecto.Finalmente, definimos los índices enumerándolos entre paréntesis precedidos de la palabra KEY o INDEX. Del mismo modo podríamos crear la tabla de artículos con una sentencia como ésta:

Create Table articulos ( id_articulo INT(4) NOT NULL AUTO_INCREMENT, titulo VARCHAR(50), autor VARCHAR(25), editorial VARCHAR(25), precio REAL, KEY(id_articulo) )

Añadir un nuevo registroSintaxis y ejemplos para introducir registros en una tablaLos registros pueden ser introducidos a partir de sentencias que emplean la instrucción Insert.La sintaxis utilizada es la siguiente:

PROGRAMACION III 2011 UTN

PÁGINA 23 DE 35 INTRODUCCION

Page 24: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Insert Into nombre_tabla (nombre_campo1, nombre_campo2,...) Values (valor_campo1, valor_campo2...)Un ejemplo sencillo a partir de nuestra tabla modelo es la introducción de un nuevo cliente lo cual se haría con una instrucción de este tipo:

Insert Into clientes (nombre, apellidos, direccion, poblacion, codigopostal, email, pedidos) Values ('Perico', 'Palotes', 'Percebe n°13', 'Lepe', '123456','email', 33)

Como puede verse, los campos no numéricos o booleanos van delimitados por apostrofes: '. También resulta interesante ver que el código postal lo hemos guardado como un campo no numérico. Esto es debido a que en determinados paises (Inglaterra,como no) los codigos postales contienen también letras.

Borrar un registroSintaxis y ejemplos para borrar registros en una tablaPara borrar un registro nos servimos de la instrucción Delete. En este caso debemos especificar cual o cuales son los registros que queremos borrar. Es por ello necesario establecer una selección que se llevara a cabo mediante la cláusula Where.Nota:Si deseamos practicar con una base de datos que está vacía primero debemos crear las tablas que vamos a llenar. Las tablas también secrean con sentencias SQL.

Nota:Si no insertamos uno de los campos en la base de datos se inicializará con el valor por defecto que hayamos definido a la hora de crear la tabla. Si no hay valor por defecto, probablemente se inicialice como NULL (vacío), en caso de que este campo permita valores nulos. Si ese campo no permite valores nulos (eso se define también al crear la tabla) es probable que la ejecución de la sentencia SQL nos de un error.

La forma de seleccionar se verá detalladamente en capítulos posteriores. Por ahora nos contentaremos de mostrar cuál es el tipo de sintaxis utilizado para efectuar estas supresiones:

Delete From nombre_tabla Where condiciones_de_selección

Actualizar un registroSintaxis y ejemplos para editar registros en una tabla

Update es la instrucción que nos sirve para modificar nuestros registros. Como para el caso de Delete, necesitamos especificar por medio de Where cuáles son los registros en los que queremos hacer efectivas nuestras modificaciones. Además, obviamente, tendremos que especificar cuáles son los nuevos valores de los campos que deseamos actualizar. La sintaxis es de este tipo:

PROGRAMACION III 2011 UTN

PÁGINA 24 DE 35 INTRODUCCION

Page 25: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Update nombre_tabla Set nombre_campo1 = valor_campo1, nombre_campo2 = valor_campo2,... Where condiciones_de_selecciónUn ejemplo aplicado:Update clientes Set nombre='José' Where nombre='Pepe'

Consultas

Cómo realizar selecciones eficientemente. Ejemplos prácticos.

La selección total o parcial de una tabla se lleva a cabo mediante la instrucción Select. En dicha selección hay que especificar:

-Los campos que queremos seleccionar -La tabla en la que hacemos la selecciónEn nuestra tabla modelo de clientes podríamos hacer por ejemplo una selección del nombre y dirección de los clientes con una instrucción de este tipo:

Select nombre, dirección From clientes

Si quisiésemos seleccionar todos los campos, es decir, toda la tabla, podríamos utilizar el comodín * del siguiente modo:

Select * From clientes

Resulta también muy útil el filtrar los registros mediante condiciones que vienen expresadas después de la cláusula Where. Si quisiésemos mostrar los clientes de una determinada ciudad usaríamos una expresión como esta:

Select * From clientes Where poblacion Like 'Madrid'

Además, podríamos ordenar los resultados en función de uno o varios de sus campos. Para este ultimo ejemplo los podríamos ordenar por nombre así:

Select * From clientes Where poblacion Like 'Madrid' Order By nombre

Teniendo en cuenta que puede haber más de un cliente con el mismo nombre, podríamos dar un segundo criterio que podría ser el apellido:

Select * From clientes Where poblacion Like 'Madrid' Order By nombre, apellido

Si invirtiésemos el orden « nombre,apellido » por « apellido, nombre », el resultado seria distinto. Tendríamos los clientes ordenados por apellido y aquellos que tuviesen apellidos idénticos se clasificarían por el nombre.Es posible también clasificar por orden inverso. Si por ejemplo quisiésemos ver nuestros clientes por orden de pedidos realizados teniendo a los mayores en primer lugar escribiríamos algo así:

Select * From clientes Order By pedidos Desc

PROGRAMACION III 2011 UTN

PÁGINA 25 DE 35 INTRODUCCION

Page 26: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Una opción interesante es la de efectuar selecciones sin coincidencia. Si por ejemplo buscamos saber en qué ciudades se encuentran nuestros clientes sin necesidad de que para ello aparezca varias veces la misma ciudad usaríamos una sentencia de esta clase:

Select Distinct poblacion From clientes Order By poblacion

Así evitaríamos ver repetido Madrid tantas veces como clientes tengamos en esa población.

En esta sentencia seleccionamos todos los clientes de Madrid cuyo nombre no es Pepe. Como puede verse, empleamos “Like” en lugar de “=” simplemente para evitar inconvenientes debido al empleo o no de mayúsculas.

Select * From clientes Where poblacion Like 'madrid' And Not nombre Like 'Pepe'

Si quisiéramos recoger en una selección a los clientes de nuestra tabla cuyo apellido comienza por A y cuyo número de pedidos esta comprendido entre 20 y 40:

Select * From clientes Where apellidos like 'A%' And pedidos Between 20 And 40

El operador In, lo veremos más adelante, es muy práctico para consultas en varias tablas. Para casos en una sola tabla esempleado del siguiente modo:

Select * From clientes Where poblacion In ('Madrid','Barcelona','Valencia')

De esta forma seleccionamos aquellos clientes que vivan en esas tres ciudades.

Definición de consultas

Las consultas de selección se utilizan para indicar al motor de datos que devuelva información de las bases de datos, esta información es devuelta en forma de conjunto de registros que se pueden almacenar en un objeto recordset.

Este conjunto de registros puede ser modificable.3.5.1.- Consultas básicasLa sintaxis básica de una consulta de selección es la siguiente:

SELECT CamposFROM Tabla

En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por ejemplo:

SELECT Nombre, TeléfonoFROM Clientes

PROGRAMACION III 2011 UTN

PÁGINA 26 DE 35 INTRODUCCION

Page 27: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Esta sentencia devuelve un conjunto de resultados con el campo nombre y teléfono de la tabla clientes.

Devolver Literales

En determinadas ocasiones nos puede interesar incluir una columna con un texto fijo en una consulta de selección, por ejemplo, supongamos que tenemos una tabla de empleados y deseamos recuperar las tarifas semanales de los electricistas, podríamos realizar la siguiente consulta:

SELECT Empleados.Nombre, 'Tarifa semanal: ', Empleados.TarifaHora * 40FROM EmpleadosWHERE Empleados.Cargo = 'Electricista'

Ordenar los registrosAdicionalmente se puede especificar el orden en que se desean recuperar los registros de las tablas mediante la cláusula ORDER BY Lista de Campos. En donde Lista de campos representa los campos a ordenar. Ejemplo:

SELECT CodigoPostal, Nombre, TelefonoFROM ClientesORDER BY Nombre

Esta consulta devuelve los campos CodigoPostal, Nombre, Telefono de la tabla Clientes ordenados por el campo Nombre. Se pueden ordenar los registros por mas de un campo, como por ejemplo:

SELECT CodigoPostal, Nombre, TelefonoFROM ClientesORDER BY CodigoPostal, Nombre

Incluso se puede especificar el orden de los registros: ascendente mediante la cláusula (ASC - se toma este valor por defecto) ó descendente (DESC)

SELECT CodigoPostal, Nombre, TelefonoFROM ClientesORDER BY CodigoPostal DESC , Nombre ASC

Uso de Indices de las tablas

Si deseamos que la sentencia SQL utilice un índice para mostrar los resultados se puede utilizar la palabra reservada INDEX de la siguiente forma:SELECT ... FROM Tabla (INDEX=Indice) ...

Normalmente los motores de las bases de datos deciden que índice se debe utilizar para la consulta, para ello utilizan criterios de rendimiento y sobre todo los

PROGRAMACION III 2011 UTN

PÁGINA 27 DE 35 INTRODUCCION

Page 28: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

campos de búsqueda especificados en la cláusula WHERE. Si se desea forzar a no utilizar ningún índice utilizaremos la siguiente sintaxis:SELECT ... FROM Tabla (INDEX=0) ...

Consultas con PredicadoEl predicado se incluye entre la cláusula y el primer nombre del campo a recuperar, los posibles predicados son:

ALLOmite los registros duplicados basándose en la totalidad del registro y no sólo en los campos seleccionados.Si no se incluye ninguno de los predicados se asume ALL. El Motor de base de datos selecciona todos los registros que cumplen las condiciones de la instrucción SQL y devuelve todos y cada uno de sus campos. No es conveniente abusar de este predicado ya que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que contiene, es mucho más rápido indicar el listado de campos deseados.

SELECT ALL FROMEmpleadosSELECT * FROMEmpleados

TOPDevuelve un cierto número de registros que entran entre al principio o al final de un rango especificado por una cláusula ORDER BY. Supongamos que queremos recuperar los nombres de los 25 primeros estudiantes del curso 1994:

SELECT TOP 25 Nombre, ApellidoFROM EstudiantesORDER BY Nota DESC

Si no se incluye la cláusula ORDER BY, la consulta devolverá un conjunto arbitrario de 25 registros de la tabla de Estudiantes. El predicado TOP no elige entre valores iguales. En el ejemplo anterior, si la nota media número 25 y la 26 son iguales, la consulta devolverá 26 registros. Se puede utilizar la palabra reservada PERCENT para devolver un cierto porcentaje de registros que caen al principio o al final de un rango especificado por la cláusula ORDER BY. Supongamos que en lugar de los 25 primeros estudiantes deseamos el 10 por ciento del curso:

SELECT TOP 10 PERCENT Nombre, ApellidoFROM EstudiantesORDER BY Nota DESC

El valor que va a continuación de TOP debe ser un entero sin signo. TOP no afecta a la posible actualización de la consulta.

DISTINCT

PROGRAMACION III 2011 UTN

PÁGINA 28 DE 35 INTRODUCCION

Page 29: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instrucción SELECT se incluyan en la consulta deben ser únicos. Por ejemplo, varios empleados listados en la tabla Empleados pueden tener el mismo apellido. Si dos registros contienen López en el campo Apellido, la siguiente instrucción SQL devuelve un único registro:

SELECT DISTINCT ApellidoFROM Empleados

Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos indicados en la cláusula SELECT posean un contenido diferente. El resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja los cambios subsiguientes realizados por otros usuarios.

DISTINCTROW

Este predicado no es compatible con ANSI. Que yo sepa a día de hoy sólo funciona con ACCESS.Devuelve los registros diferentes de una tabla; a diferencia del predicado anterior que sólo se fijaba en el contenido de los campos seleccionados, éste lo hace en el contenido del registro completo independientemente de los campos indicados en la cláusula SELECT.

SELECT DISTINCTROW ApellidoFROM Empleados

Si la tabla empleados contiene dos registros: Antonio López y Marta López el ejemplo del predicado DISTINCT devuelve un único registro con el valor López en el campo Apellido ya que busca no duplicados en dicho campo. Este último ejemplo devuelve dos registros con el valor López en el apellido ya que se buscan no duplicados en el registro completo.

ALIAS

En determinadas circunstancias es necesario asignar un nombre a alguna columna determinada de un conjunto devuelto, otras veces por simple capricho o porque estamos recuperando datos de diferentes tablas y resultan tener un campo con igual nombre. Para resolver todas ellas tenemos la palabra reservada AS que se encarga de asignar el nombre que deseamos a la columna deseada. Tomado como referencia el ejemplo anterior podemos hacer que la columna devuelta por la consulta, en lugar de llamarse apellido (igual que el campo devuelto) se llame Empleado. En este caso procederíamos de la siguiente forma:

SELECT DISTINCTROW Apellido AS EmpleadoFROM Empleados

PROGRAMACION III 2011 UTN

PÁGINA 29 DE 35 INTRODUCCION

Page 30: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

AS no es una palabra reservada de ANSI, existen diferentes sistemas de asignar los alias en función del motor de bases de datos. En ORACLE para asignar un alias a un campo hay que hacerlo de la siguiente forma:

SELECT Apellido AS "Empleado"FROM Empleados

También podemos asignar alias a las tablas dentro de la consulta de selección, en esta caso hay que tener en cuenta que en todas las referencias que deseemos hacer a dicha tabla se ha de utilizar el alias en lugar del nombre. Esta técnica será de gran utilidad más adelante cuando se estudien las vinculaciones entre tablas. Por ejemplo:

SELECT Apellido AS EmpleadoFROM Empleados AS TrabajadoresPara asignar alias a las tablas en ORACLE y SQL-SERVER los alias se asignan escribiendo el nombre de la tabla, dejando un espacio en blanco y escribiendo el Alias (se asignan dentro de la cláusula FROM).

SELECT Trabajadores.Apellido (1) AS EmpleadoFROM Empleados Trabajadores

(1)Esta nomenclatura [Tabla].[Campo] se debe utilizar cuando se está recuperando un campo cuyo nombre se repite en varias de las tablas que se utilizan en la sentencia. No obstante cuando en la sentencia se emplean varias tablas es aconsejable utilizar esta nomenclatura para evitar el trabajo que supone al motor de datos averiguar en que tabla está cada uno de los campos indicados en la cláusula SELECT.

El Operador Like

Se utiliza para comparar una expresión de cadena con un modelo en una expresión SQL. Su sintaxis es:

expresión Like modelo

En donde expresión es una cadena modelo o campo contra el que se compara expresión. Se puede utilizar el operador Like para encontrar valores en los campos que coincidan con el modelo especificado. Por modelo puede especificar un valor completo (Ana María), o se puede utilizar una cadena de caracteres comodín como los reconocidos por el sistema operativo para encontrar un rango de valores (Like An*).El operador Like se puede utilizar en una expresión para comparar un valor de un campo con una expresión de cadena. Por ejemplo, si introduce Like C* en una consulta SQL, la consulta devuelve todos los valores de campo que comiencen por la letra C. En una consulta con parámetros, puede hacer que el usuario escriba el modelo que se va a utilizar.

PROGRAMACION III 2011 UTN

PÁGINA 30 DE 35 INTRODUCCION

Page 31: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

El ejemplo siguiente devuelve los datos que comienzan con la letra P seguido de cualquier letra entre A y F y de tres dígitos:

Like 'P[A-F]###'

Este ejemplo devuelve los campos cuyo contenido empiece con una letra de la A a la D seguidas de cualquier cadena.

Like '[A-D]*'

El Operador InEste operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista. Su sintaxis es:

expresión [Not] In(valor1, valor2, . . .)SELECT * FROMPedidos WHEREProvincia In ('Madrid', 'Barcelona', 'Sevilla')

PROGRAMACION III 2011 UTN

PÁGINA 31 DE 35 INTRODUCCION

Page 32: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

UNIDAD III

Diseño de entidades con Delphi.

Utilizando toda la teoría unificando herramientas.

Conociendo el lenguaje, sus herramientas para manipular datos y finalmente un leguaje de consultas que nos exima de trabajar forzosamente con cursores podemos comenzar a desarrollar nuestra primera aplicación de bases de datos.

Pasos necesarios para realizar las actividades de la unidad 3:

a) Realizar modelo de datosb) Conectar a través de ODBC y MySQLc) Crear entidades por tablasd) Crear interfaces gráficas

Los modelos de datos serán provistos por el docente.La conexión ODBC se realizará desde MyODBC.Las entidades se explican a continuación.

Entidades:

Una base de datos posee tablas, cada una de ellas representan por lo general a entidades en el mundo real. Por ejemplo, habitualmente contamos con la tabla “Clientes” haciendo referencia de almacenamientos a clientes de un sistema en particular. Otras veces estas almacenan claves y relaciones que simplemente hacen referencias a otras tablas.Sin embargo, en los lenguajes orientados a objetos, como Delphi, es conveniente manipular cada entidad como un objeto encapsulado.El objeto se encapsula (se hace genérico ) y provee toda la capacidad de manipular datos de manera autónoma. Los atributos de este son los campos de nuestra tabla de la base de datos de turno.La idea básica de éste ejercicio único de la materia no es inculcar las bases de la OOP (Programación orientada a objetos) simplemente por no estar dentro de los tiempos disponibles. No obstante el alumno debe conocer una alternativa objeto-relacional desde el mismo momento que aprende a manipular datos entre un lenguaje de programación OOP y una base de datos.

Objeto tADOTable

Como vimos en el primer capítulo, un objeto de tipo tADOTable nos permite conectar con bases de datos cliente-servidor no pertenecientes al mundo nativo de Delphi, como Interbase. En esta cátedra veremos el mismo con MySQL conectados por un puente ODBC generado por un driver.El objeto tADOtable crea conexiones y navega a través de los registros de la tabla que seleccionamos. Para abstraer un poco nuestro código fuente un nivel mas arriba debemos eliminar toda referncia visual en las entidades que manipularemos.

PROGRAMACION III 2011 UTN

PÁGINA 32 DE 35 INTRODUCCION

Page 33: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

En otras palabras, evitaremos el uso de controles visuales de Delphi en nuestra entidad.

Capas con entidades acopladas a la interfaz gráfica.

funcionalidad de formulario

Capas con entidades separadas

Funcionalidadde entidades

funcionalidad de formulario

Objetos y memoriaLa administración de memoria en Delphi está sujeta a tres normas, al menos si se permite que el sistema trabaje en armonía sin violaciones de acceso y sin consumir memoria innecesaria:• Todo objeto ha de ser creado antes de que pueda usarse. • Todo objeto ha de ser destruido tras haberlo utilizado. • Todo objeto ha de ser destruido sólo una vez.

Definición de una clase

type nombre_clase= class private { campos necesarios para la representación } public { procedimientos y/o funciones públicos que representan el comportamiento de los objetos pertenecientes a esta clase} end;

PROGRAMACION III 2011 UTN

PÁGINA 33 DE 35 INTRODUCCION

Page 34: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

ABM

Alta, baja y modificación de una entidad o objetos que estamos manipulandodesde el lenguaje de programación.

Ejercicios simulados:

La empresa “Movie’s World S.A.” dispone de una franquicia de videoclub de tressucursales y desea automatizar su sistema de alquileres en uno de ellos.Para esto, hemos obtenido el informe del Analista de nuestra empresa de desarrolloque ha escrito lo siguiente:

Se solicita un sistema de información que realice:

1) ABM de Localidades2) ABM de Clientes3) ABM de Rubros (Género)4) ABM de Vídeos5) Lógica de control de alquileres6) Listado de Clientes7) Listado de Películas8) Listado de Clientes por Localidades9) Listado de películas por genero10) Buscar películas por nombres11) Buscar clientes por apellido12) Listado de películas alquiladas.

Datos técnicos:

La base de datos deberá ser MySQL.El cliente posee terminales Windows.Los scripts de bases de datos son provistos por el analista.

Nuestra empresa de sistemas ha decidido dividir el trabajo en grupos.

Grupo 1Tareas:ABM de Localidades, ABM de Clientes, Listado de Clientes, Listado de Localidades por Clientes, Buscar clientes por apellidos.

Grupo 2Tareas:ABM de Rubros, ABM de películas, Listado de películas, listado de películas por genero, Buscar películas por nombre (titulo).

PROGRAMACION III 2011 UTN

PÁGINA 34 DE 35 INTRODUCCION

Page 35: PROGRAMACION III Bases de datos · Hablamos de Delphi. Delphi fue el lenguaje para profesionales de sistemas mejor integrado de la era WIN32 y ... características OOP del lenguaje

Cuando ambos grupos tengan estos módulos deberán unirse y confeccionar la lógica de alquileres y el listado de películas alquiladas dividiendo entre si las tareas que crean convenientes.

Cada grupo será evaluado y finalmente el cliente aprobará el sistema con o sin cambios a realizar.

Unidad IV

Ver powerPoint al respecto.

Unidad V

Ver archivo unidad5.pdf

PROGRAMACION III 2011 UTN

PÁGINA 35 DE 35 INTRODUCCION