Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Contents
Tabla de Contenido
0
1 Nociones Basicas
................................................................................................................................... 8
2 Microsoft SQL
...................................................................................................................................
Server
10
Service Manager
..........................................................................................................................................................
Administrador..........................................................................................................................................................
Coorporativo
DTS - Importacin
..........................................................................................................................................................
y exportacin de datos
Gestin de Tablas
..........................................................................................................................................................
10
12
13
14
3 Introduccion...................................................................................................................................
al lenguaje SQL - MSQL-Server
16
Normalizacin..........................................................................................................................................................
de la base de Datos
Primera Forma
.........................................................................................................................................................
Normal
Segunda .........................................................................................................................................................
Forma Normal
Tercera Forma
.........................................................................................................................................................
Normal
Ejemplo de
.........................................................................................................................................................
Normalizacion
Integridad de ..........................................................................................................................................................
los datos
Tipos datos MSSQL
..........................................................................................................................................................
Campos Identity
.........................................................................................................................................................
Lenguaje de Definicin
..........................................................................................................................................................
de datos (LDD)
CREATE .........................................................................................................................................................
ALTER .........................................................................................................................................................
DROP .........................................................................................................................................................
TRUNCATE
.........................................................................................................................................................
Lenguaje de Manipulacin
..........................................................................................................................................................
de Datos Nivel Bsico
Recuperar.........................................................................................................................................................
Datos con SELECT
FROM
.........................................................................................................................................
WHERE y HAVING:
.........................................................................................................................................
Filtrar filas
ORDER BY
.........................................................................................................................................
JOIN: Combinaciones
.........................................................................................................................................
Utilizar alias de tablas
.........................................................................................................................................
DISTINCT
.........................................................................................................................................
TOP n
.........................................................................................................................................
Agregar filas
.........................................................................................................................................................
con INSERT
Cambiar datos
.........................................................................................................................................................
con UPDATE
Eliminar filas
.........................................................................................................................................................
con DELETE
Trabajando con
..........................................................................................................................................................
fechas
Elementos de..........................................................................................................................................................
sintaxis de Transact-SQL
Consultas: Nivel
..........................................................................................................................................................
avanzado
Usar funciones
.........................................................................................................................................................
de agregado en la lista de seleccin
Agrupar filas
.........................................................................................................................................................
con GROUP BY
Combinar.........................................................................................................................................................
resultados con UNION
Subconsultas..........................................................................................................................................................
Subconsultas
.........................................................................................................................................................
con Alias
Subconsultas
.........................................................................................................................................................
con IN
Subconsultas
.........................................................................................................................................................
con NOT IN
Subconsultas
.........................................................................................................................................................
en UPDATE, DELETE e INSERT
Subconsultas
.........................................................................................................................................................
con operadores de comparacin
Subconsultas
.........................................................................................................................................................
con EXISTS
16
19
19
19
20
24
26
28
30
30
30
30
31
31
31
33
34
36
36
44
45
45
45
47
49
51
53
58
58
60
63
64
66
67
69
69
70
72
www.templatesclarion.com.ar
3
74
75
75
76
77
79
80
81
82
83
4 Diccionario ...................................................................................................................................
de Datos (DCT)
84
Propiedades de
..........................................................................................................................................................
Archivos
Tipos de Datos
..........................................................................................................................................................
Clarion / MS-SQL
Usando SQLIdentity
..........................................................................................................................................................
en Clarion 6
Claves/Indices
..........................................................................................................................................................
(Keys)
Integridad referencial
..........................................................................................................................................................
- Relaciones
Creacion Tablas
..........................................................................................................................................................
en Motor
Utility Template
.........................................................................................................................................................
Synchronizer
.........................................................................................................................................................
File Import
.........................................................................................................................................................
Conexion a una
..........................................................................................................................................................
Base de Datos
Driver Nativo
.........................................................................................................................................................
- SQL Accelerator Drivers
ODBC - .........................................................................................................................................................
Open DataBase Conectivity
Convertir TPS
..........................................................................................................................................................
a SQL
"CSTRING"
.........................................................................................................................................................
por "STRING"
Manejo de
.........................................................................................................................................................
Fechas
Migrar Datos
.........................................................................................................................................................
Existentes
85
87
90
91
92
93
93
94
97
100
101
102
102
104
104
105
5 Usando SQL
...................................................................................................................................
en Aplicaciones (APP)
105
Recomendaciones
..........................................................................................................................................................
Ventana de Login
..........................................................................................................................................................
Automtico
Validacion de
..........................................................................................................................................................
Datos
SQL Embebido
..........................................................................................................................................................
en Clarion
Prop:SQL ..........................................................................................................................................................
Comando BUFFER
..........................................................................................................................................................
Prop:SQLFilter
..........................................................................................................................................................
Prop:WHERE
..........................................................................................................................................................
SetFilter con..........................................................................................................................................................
codigo SQL
Filtrando Campos
..........................................................................................................................................................
DATE
StupidTempTable
..........................................................................................................................................................
Codigo Clarion
..........................................................................................................................................................
Vs. SQL
Manejo de Errores
..........................................................................................................................................................
Manejo Set, Next,
..........................................................................................................................................................
Previous
Clarion y NULLs
..........................................................................................................................................................
SQL / VIEWs..........................................................................................................................................................
Browses
..........................................................................................................................................................
SQL Advanced
..........................................................................................................................................................
Tab
Process /Reports
..........................................................................................................................................................
Transacciones
..........................................................................................................................................................
Batch
Manejo de Transacciones
..........................................................................................................................................................
Stored Procedures
..........................................................................................................................................................
Usando TurboSQL
..........................................................................................................................................................
Uso del trace..........................................................................................................................................................
Cargas de Cabecera
..........................................................................................................................................................
- Detalle
www.templatesclarion.com.ar
106
108
108
109
109
111
111
112
113
113
114
116
117
117
118
119
120
122
125
126
126
127
128
128
131
Contents
Creando un ..........................................................................................................................................................
Editor de SQL
132
6 Links - Material
...................................................................................................................................
Recomendado
141
In-Memory Database
..........................................................................................................................................................
Driver
Ejemplos ..........................................................................................................................................................
Indice
143
143
147
www.templatesclarion.com.ar
5
Parte
I
www.templatesclarion.com.ar
Clarion + SQL
1.1
Nociones Basicas
Aplicaciones Cliente/Servidor y Base de datos Relacional
Un trmino utilizado con frecuencia en el uso de la base de datos es cliente/servidor.
Si Ud. esta usando archivos planos (ej. TPS), ya sea en un servidor o una computadora
local, significa que "NO" esta usando cliente/servidor. En el entorno Cliente/servidor,
ambas partes poseen cierta inteligencia. Las bases de datos Relacionadas son un ejemplo
comn del proceso del cliente/del servidor.
El Servidor de Bases de datos proporciona destacables ventajas sobre los archivos
planos; velocidad, integridad de datos, compatibilidad con otros con productos, facilidad
de administracin, etc.
www.templatesclarion.com.ar
completo ya que carece de diseo de interfaces, por ende el SQL es embebido dentro
de un lenguaje con mayor capacidad y generalidad ( como Clarion / C++ ) para crear
aplicaciones completas.
Los sistemas de gestin de base de datos con soporte SQL ms utilizados son, por orden
alfabtico:
DB2
Firebird
Informix
Interbase
MySQL
Oracle
PostgreSQL
SQL Server
Sybase ASE
Clarion y SQL
La tecnologa de los File Drivers de Clarion permite escribir aplicaciones que accedan a
bases de datos SQL sin necesidad de escribir ni sola una lnea de cdigo SQL. El File
Driver de Clarion es el que se comunica con la base de datos generando
automticamente la sentencia SQL que el motor de base de datos requiere a partir de las
instrucciones estndares de I/O del lenguaje Clarion. Como estos Drivers SQL estn
especficamente diseados para conversar con cada base de datos en particular
(excepto el ODBC Driver, que por supuesto, es una versin genrica de SQL), el cdigo
SQL generado est optimizado para utilizar la sintaxis especifica de ese motor. Esto
significa que los usuario Clarion no estn obligados a aprender (utilizar SQL) para escribir
aplicaciones Cliente/Servidor.
El hecho de que un programador Clarion no este obligado a escribir SQL no limita de
ninguna manera la capacidad de Clarion para generar programas Cliente/Servidor. Ud.
puede embeber su propia sentencia SQL para extender lo que el File Driver hace por
usted, o puede tomar el control total sobre la base de datos para realizar cualquier tarea
que necesite realizar.
Existen varias maneras para embeber sentencias propias de SQL en un programa Clarion,
si lo desea. Esto le brinda, al programador Clarion, la flexibilidad de permitir que el File
Driver lo haga, o directamente indicar como lo debe hacer.
www.templatesclarion.com.ar
10
1.2
1.2.1
Service Manager
Enterprise Manager
Query Analizer
Data Transformation Services (DTS)
Service Manager
SQL Server instala varios servicios en nuestra maquina , el nombre del servicio se
puede ver/manejar desde el administrador de servicios de windows: Inicio ->
Programas -> Herramientas Administrativas -> Servicios, desde donde se puede parar,
arracar y cambiar el usuario que los ejecuta.
Tambin podemos utilizar una utilidad que instala SQL Server El Administrador de
Servicios de SQL Server, este programa se encuentra en la barra de tareas de windows
www.templatesclarion.com.ar
11
www.templatesclarion.com.ar
12
1.2.2
Administrador Coorporativo
Esta herramienta es la base de trabajo del SQL Server 2000. A travs de el podemos
realizar cualquier tarea relacionada con SQL Server, adems podemos administrar no
solo nuestro SQL Server sino tambin servidores SQL Server remotos distribuidos en
otras mquinas. El administrador corporativo pertenece a la MMC (Microsoft Management
Console) y como tal se puede aadir a las consolas ya existentes.
Para ejecutar el administrador corporativo debemos ir a inicio -> programas -> Microsoft
SQL Server -> administrador corporativo, una vez ejecutado nos aparece la imagen que
visualizamos abajo, a la izquierda nos muestra los datos estructurados en forma de rbol
y a la derecha diversas opciones dependiendo de donde estemos navegando por el rbol.
www.templatesclarion.com.ar
1.2.3
13
SQL Server
Oracle
Access, excel, Outlook, archivos de texto
Exchange Server
Orgenes de datos proporcionados por terceros
www.templatesclarion.com.ar
14
Una es desde la consola (cmd) del sistema ejecutando el archivo dtswiz. Otra opcin es ir
desde el men Inicio -> programas -> Microsoft SQL Server -> Importacin y exportaci
n de datos y la ultima, por supuesto, desde el administrador corporativo. Se puede
ejecutar posicionndonos en una base de datos y con el botn derechos seleccionamos
Todas las tareas -> importar datos o exportar datos dependiendo de la tarea que vamos
a realizar.
1.2.4
Gestin de Tablas
Para crear tablas SQL Server proporciona varias formas, podemos crear tablas desde el
administrador corporativo, o a travs de transact-sql con el comando Create Table . Del
mismo modo que las creamos las podemos modificar, borrar, renombralas, copiarlas, etc.
Las tablas deben tener un nombre como mximo de 128 caracteres y el nombre debe
empezar por un carcter alfabtico, a excepcin de las tablas temporales que se crean
con el signo # delante del nombre, para la sesin del usuario actual y con dos ## para
las tablas temporales globales, accesibles a todos los usuarios.
Para crear una tabla desde el administrador corporativo seleccionamos una base de datos
y dentro de estas el nodo tablas, pulsamos con el botn derecho del ratn y
seleccionamos Nueva tabla:
www.templatesclarion.com.ar
15
Modificar y/o borrar una tabla: Para realizar estas acciones tenemos que posicionar el rat
n sobre la tabla que queremos borrar o modificar y pulsando con el botn derecho
seleccionamos la opcin deseada.
Las instrucciones de Transact-SQL / Querys para manipular tablas se ejecutan desde el
Analizador de Consultas seleccionando la base de datos que se quiere manipular. Para
ejecutar el Analizador de Consultas debemos ir a inicio -> programas -> Microsoft SQL
Server -> Analizador de Consultas. O tambien desde el Administrador Coorporativo en el
menu Herramientas -> Analizador de Consultas.
www.templatesclarion.com.ar
16
1.3
1.3.1
www.templatesclarion.com.ar
17
como una serie de reglas que sirven para ayudar a los diseadores de bases de datos a
desarrollar un esquema que minimice los problemas al momento de actualizar y
consultar los datos. Cada regla est basada en la que le antecede.
Grados de normalizacin
Existen bsicamente tres niveles de normalizacin
Primera Forma Normal (1NF)
Segunda Forma Normal (2NF)
Tercera Forma Normal (3NF)
Cada una de estas formas tiene sus propias reglas.
Cuando una base de datos se conforma a un nivel, se considera normalizada a esa forma
de normalizacin.
(No siempre es una buena idea tener una base de datos conformada en el nivel ms alto
de normalizacin, puede llevar a un nivel de complejidad que pudiera ser evitado si
estuviera en un nivel ms bajo de normalizacin).
Resumen
En la tabla siguiente se describe brevemente en que consiste cada una de las reglas, y
posteriormente se explican con ms detalle.
Primera Forma Normal(1FN): Incluye la eliminacin de todos los grupos repetidos.
Segunda Forma Normal (2FN): Asegura que todas las columnas que no son llave
sean completamente dependientes de la llave primaria (PK).
Tercera Forma Normal (3FN): Elimina cualquier dependencia transitiva. Una
dependencia transitiva es aquella en la cual las columnas que no son llave son
dependientes de otras columnas que tampoco son llave.
www.templatesclarion.com.ar
18
Ejemplo de Normalizacion
Qu tan lejos debe llevar la normalizacin?
En ultima instancia, depende de nosotros.
La siguiente decisin es qu tan lejos debe llevar la normalizacin?
La normalizacin es una ciencia subjetiva. Determinar las necesidades de simplificacin
depende de nosotros.
Si nuestra base de datos va a proveer informacin a un solo usuario para un propsito
simple y existen pocas posibilidades de expansin, normalizar los datos hasta la 3FN
quiz sea algo exagerado.
Las reglas de normalizacin existen como guas para crear tablas que sean fciles de
manejar, as como flexibles y eficientes. A veces puede ocurrir que normalizar los datos
hasta el nivel ms alto no tenga sentido.
La pregunta fundamental
Se estn dividiendo tablas slo para seguir las reglas o estas divisiones son en verdad
prcticas?.
stas son el tipo de cosas que nosotros como diseadores de la base de datos,
necesitamos decidir, y la experiencia y el sentido comn nos pueden auxiliar para tomar
la decisin correcta. La normalizacin no es una ciencia exacta, ms bien subjetiva.
En resumen
La normalizacin es una tcnica que se utiliza para crear relaciones lgicas apropiadas
entre tablas de una base de datos.
Ayuda a prevenir errores lgicos en la manipulacin de datos. La normalizacin facilita
tambin agregar nuevas columnas sin romper el esquema actual ni las relaciones.
www.templatesclarion.com.ar
19
Existen varios niveles de normalizacin: Primera Forma Normal, Segunda Forma Normal,
Tercera Forma Normal, Forma Normal Boyce-Codd, Cuarta Forma Normal, Quinta Forma
Normal o Forma Normal de Proyeccin-Unin, Forma Normal de Proyeccin-Unin Fuerte,
Forma Normal de Proyeccin-Unin Extra Fuerte y Forma Normal de Clave de Dominio.
Cada nuevo nivel o forma nos acerca ms a hacer una base de datos verdaderamente
relacional.
Se discutieron las primeras tres formas. stas proveen suficiente nivel de normalizacin
para cumplir con las necesidades de la mayora de las bases de datos.
Normalizar demasiado puede conducir a tener una base de datos ineficiente y
hacer a su esquema demasiado complejo para trabajar. Un balance apropiado de
sentido comn y prctico puede ayudarnos a decidir cundo normalizar.
1.3.1.1
Ventajas
Poner la base de datos en la Primera Forma Normal resuelve el problema de los
encabezados de columna mltiples.
Muy a menudo, los diseadores de bases de datos inexpertos harn algo similar a la
tabla no normalizada. Una y otra vez, crearn columnas que representen los mismos
datos. La normalizacin ayuda a clarificar la base de datos y a organizarla en partes ms
pequeas y ms fciles de entender. En lugar de tener que entender una tabla
gigantesca y monoltica que tiene muchos diferentes aspectos, slo tenemos que
entender los objetos pequeos y ms tangibles, as como las relaciones que guardan con
otros objetos tambin pequeos.
1.3.1.2
Ventajas
Una vez alcanzado el nivel de la Segunda Forma Normal, se controlan la mayora de los
problemas de lgica. Podemos insertar un registro sin un exceso de datos en la mayora
de las tablas.
1.3.1.3
www.templatesclarion.com.ar
20
Ventajas
Cuando las tablas estn en la Tercera Forma Normal se previenen errores de lgica
cuando se insertan o borran registros. Cada columna en una tabla est identificada de
manera nica por la llave primaria, y no deben haber datos repetidos. Esto provee un
esquema limpio y elegante, que es fcil de trabajar y expandir.
1.3.1.4
Ejemplo de Normalizacion
Un dato sin normalizar no cumple con ninguna regla de normalizacin. Para explicar con
un ejemplo en que consiste cada una de las reglas, vamos a considerar los datos de la
siguiente tabla.
ID
ORDEN
FECHA
2301
ID
CLI
NOM
CLIENTE
ESTADO
NUM
ITEM
DESC
ITEM
CANT
PRECIO
2/23/03 101
MARTI
CA
3786
RED
35
2301
2/23/03 101
MARTI
CA
4011
RAQUETA 6
65
2301
2/23/03 101
MARTI
CA
9132
PAQ-3
4.75
2302
2/25/03 107
HERMAN
WI
5794
PAQ-6
5.0
2303
2/27/03 110
WESPORTS MI
4011
RAQUETA 2
65
2303
2/27/03 110
WESPORTS MI
3141
FUNDA
10
Al examinar estos registros, podemos darnos cuenta que contienen un grupo repetido
para NUM_ITEM, DESC_ITEM, CANT y PRECIO. La 1FN prohibe los grupos repetidos, por
lo tanto tenemos que convertir a la primera forma normal.
Los pasos a seguir son:
Tenemos que eliminar los grupos repetidos.
Tenemos que crear una nueva tabla con la PK de la tabla base y el grupo repetido.
Los registros quedan ahora conformados en dos tablas que llamaemos ORDENES y
ARTICULOS_ORDENES
- ORDENES
ID_ORDE
N
FECHA
2301
2/23/03
101
MARTI
CA
2302
2/25/03
107
HERMAN
WI
2303
2/27/03
110
WE-SPORTS
MI
- ARTICULOS_ORDENES
ID_ORDEN NUM_ITEM DESC_ITEM CANT
PRECIO
2301
3786
RED
35
2301
4011
RAQUETA
65
2301
9132
PAQ-3
4.75
www.templatesclarion.com.ar
2302
5794
PAQ-6
5.0
2303
4011
RAQUETA
65
2303
3141
FUNDA
10
www.templatesclarion.com.ar
21
22
NUM_ITEM
CANT
2301
3786
2301
4011
2301
9132
2302
5794
2303
4011
2303
3141
NUM_ITEM
DESC_ITEM
PRECIO
3786
RED
35
4011
RAQUETA
65
9132
PAQ-3
4.75
5794
PAQ-6
5.0
4011
RAQUETA
65
3141
FUNDA
10
- ARTICULOS
www.templatesclarion.com.ar
23
La tercera forma normal nos dice que tenemos que eliminar cualquier columna no llave
que sea dependiente de otra columna no llave.
Los pasos a seguir son:
Determinar las columnas que son dependientes de otra columna no llave.
Eliminar esas columnas de la tabla base.
Crear una segunda tabla con esas columnas y con la columna no llave de la cual son
dependientes.
Al observar las tablas que hemos creado, nos damos cuenta que tanto la tabla
ARTICULOS, como la tabla ARTICULOS_ORDENES se encuentran en 3FN. Sin embargo la
tabla ORDENES no lo est, ya que NOM_CLIENTE y ESTADO son dependientes de
ID_CLIENTE, y esta columna no es la llave primaria.
Para normalizar esta tabla, moveremos las columnas no llave y la columna llave de la
cual dependen dentro de una nueva tabla CLIENTES. Las nuevas tablas CLIENTES y
ORDENES se muestran a continuacin.
- ORDENES
ID_ORDEN
FECHA
ID_CLIENTE
2301
2/23/03
101
2302
2/25/03
107
2303
2/27/03
110
- CLIENTES
ID_CLIENTE
NOM_CLIENTE
ESTADO
101
MARTI
CA
107
HERMAN
WI
110
WE-SPORTS
MI
www.templatesclarion.com.ar
24
1.3.2
Tipos de Integridad
Estas son las categoras de integridad de datos:
Integridad
Integridad
Integridad
Integridad
de entidad
de dominio
referencial
definida por el usuario
Integridad de entidad
La integridad de entidad define una fila como entidad nica para una tabla determinada.
La integridad de entidad fuerza la integridad de la columna o columnas de los
identificadores o la clave principal de una tabla (mediante ndices, restricciones UNIQUE,
restricciones PRIMARY KEY o propiedades IDENTITY).
Integridad de dominio
La integridad de dominio viene dada por la validez de las entradas para una columna
determinada. Puede forzar la integridad de dominio si restringe el tipo (mediante tipos de
datos), el formato (mediante las reglas y las restricciones CHECK), o el intervalo de
valores posibles (mediante restricciones FOREIGN KEY, restricciones CHECK, definiciones
DEFAULT, definiciones NOT NULL y reglas).
Integridad referencial
La integridad referencial protege las relaciones definidas entre las tablas cuando se crean
o se eliminan registros. En SQL Server la integridad referencial se basa en las relaciones
entre claves externas y claves principales o entre claves externas y claves exclusivas
(mediante restricciones FOREIGN KEY, restricciones CHECK). La integridad referencial
garantiza que los valores clave sean coherentes en las distintas tablas. Para conseguir
esa coherencia, es preciso que no haya referencias a valores inexistentes y que, si
cambia el valor de una clave, todas las referencias a ella se cambien en consecuencia en
toda la base de datos.
Cuando se fuerza la integridad referencial, SQL Server impide a los usuarios:
www.templatesclarion.com.ar
25
Agregar registros a una tabla relacionada si no hay ningn registro asociado en la tabla
principal.
Cambiar valores en una tabla principal de manera que queden registros hurfanos en
una tabla relacionada.
Eliminar registros de una tabla principal cuando hay registros relacionados
coincidentes.
Por ejemplo, con las tablas sales (compras) y titles (ttulos) de la base de datos pubs, la
integridad referencial se basa en la relacin entre la clave externa (title_id) de la tabla
sales y la clave principal (title_id) de la tabla titles.
www.templatesclarion.com.ar
26
1.3.3
www.templatesclarion.com.ar
27
231
231
Ejemplos:
www.templatesclarion.com.ar
28
-- 3 decimales
Campos Identity
SQL Server nos da la posibilidad de generar valores sobre las columnas de la siguiente
manera:
Propiedad Identity
La propiedad identity puede ser utilizada para crear columnas que contienen
valores secuenciales que identifican a cada columna insertada en la tabla y
frecuentemente estas son utilizadas como llaves primarias.
Las ventajas de la propiedad identity es que se reduce el costo y mejora el
performance. Simplifica la programacin, mantiene las llaves primarias con
valores cortos y reduce cuellos de botella en las transacciones.
Sintaxis
CREATE TABLE table
(column_name data_type
[ IDENTITY [(seed, increment)]] NOT NULL )
Puntos a considerar en los campos identity
www.templatesclarion.com.ar
29
Debe ser usada con el tipo de datos integre(int, bigint, smallint o tinyint),
numeric o decimal. El tipo de datos numerica y decima deben ser especificados
con una escala de 0.
IDENT_CURRENT regresa el ltimo valor del identity generado para una tabla en
especifico en cualquier sesin y cualquier scop.
Se puede permitir insertar valores especficos en los campos identity de una tabla
habilitando la opcin IDENTITY_INSERT. Cuando esta opcin esta en ON, las
sentencias insert deben de contener un valor en la columna con identity.
Para verificar y corregir el valor actual del identity de una columna, se puede
utilizar el DBCC CHECKIDENT. Este te permite comparar los valores actuales del
identity con el valor mximo de la columna con identity.
NOTA: La propiedad identity no garantiza que los registros sea nicos, para esto genere
un ndice nico sobre el campo identity.
Ejemplo
En este ejemplo se crea una tabla con dos campos, userid y nombre. La propiedad
identity es utilizada en el campo userid para incrementar el valor automticamente cada
vez que se inserte un registro. El inicio del identity es 100 y el incremento 5. De esta
manera los valores seran 100, 105, 110, 115, etc. Utilizando un incremento de 5
permite insertar registros entre los valores posteriormente.
CREATE TABLE Class
(userid int IDENTITY(100, 5) NOT NULL, Name varchar(16))
www.templatesclarion.com.ar
30
ndolas en una sola requiriendo que cada uno de los registros sea nico.
La funcin NEWID crea un identificador nico GUID que puede ser almacenado en
un tipo de dato uniqueidentifier.
Ejemplo
CREATE TABLE Customer
(CustID uniqueidentifier NOT NULL DEFAULT NEWID(), CustName char(30) NOT
NULL)
1.3.4
1.3.4.1
, DROP
CREATE
Este comando crea un objeto dentro de la base de datos. Puede ser una tabla, vista,
ndice, trigger, funcin, procedimiento o cualquier otro objeto que el motor de la base de
datos soporte.
Por Ejemplo (creacin de una tabla):
CREATE TABLE TABLA_NOMBRE ( ci integer not null, nombre VARCHAR (50),
fecha_nac DATE NOT NULL, PRIMARY KEY (my_field1, my_field2) )
1.3.4.2
ALTER
Este comando permite modificar la estructura de un objeto. Se pueden agregar/quitar
campos a una tabla, modificar el tipo de un campo, agregar/quitar ndices a una tabla,
modificar un trigger, etc.
Por Ejemplo (agregar columna a una tabla):
ALTER TABLE TABLA_NOMBRE ( ADD NUEVO_CAMPO INT UNSIGNED )
1.3.4.3
DROP
Este comando elimina un objeto de la base de datos.Puede ser una tabla, vista, ndice,
trigger, funcin, procedimiento o cualquier otro objeto que el motor de la base de datos
soporte. Se puede combinar con la sentencia ALTER.
www.templatesclarion.com.ar
31
Por Ejemplo :
DROP TABLE TABLA_NOMBRE
1.3.4.4
TRUNCATE
Este comando trunca todo el contenido de una tabla. La ventaja sobre el comando
DELETE, es que si se quiere borrar todo el contenido de la tabla, es mucho ms rpido,
especialmente si la tabla es muy grande, la desventaja es que TRUNCATE solo sirve
cuando se quiere eliminar absolutamente todos los registros, ya que no se permite la cl
usula WHERE.
Por Ejemplo :
TRUNCATE TABLE TABLA_NOMBRE
1.3.5
1.3.5.1
www.templatesclarion.com.ar
32
conjunto de resultados tiene tres columnas, y cada columna tiene el nombre, tipo de
datos y tamao de la columna asociada de la tabla Products. Puesto que la clusula
FROM especifica slo una tabla base, todos los nombres de columna de la instruccin
SELECT hacen referencia a las columnas de esa tabla.
La clusula FROM enumera la tabla individual, Products, cuyos datos se van a recuperar.
La clusula WHERE especifica que las nicas filas de Products que cumplen los requisitos
de esta instruccin SELECT son aquellas en las que el valor de la columna UnitPrice
supera los 40 dlares.
La clusula ORDER BY especifica que el conjunto de resultados debe ordenarse en
secuencia ascendente segn el valor de la columna UnitPrice.
33
lista de seleccin:
SELECT FirstName + ' ' + LastName AS "Employee Name",
IDENTITYCOL AS "Employee ID",
HomePhone,
Region,
10 AS Constant
FROM Northwind.dbo.Employees
ORDER BY LastName, FirstName ASC
Temas Relacionados:
FROM
WHERE y HAVING: Filtrar filas
ORDER BY
JOIN: Combinaciones
DISTINCT
TOP n
1.3.5.1.1 FROM
La clusula FROM es obligatoria en todas las instrucciones SELECT en las que se estn
recuperando datos de tablas o vistas.
Use la clusula FROM para enumerar las tablas y vistas que contienen columnas a las
que se hace referencia en la lista de seleccin y en la clusula WHERE. Los nombres de
las tablas y vistas se pueden sustituir con alias mediante la clusula AS.
La clusula FROM es una lista separada por comas de nombres de tablas, nombres de
vistas y clusulas JOIN.
www.templatesclarion.com.ar
34
FROM sales
GROUP BY stor_id
) AS SA
WHERE ST.stor_id = SA.stor_id
AND SA.title_count = (SELECT COUNT(*) FROM titles)
Las clusulas WHERE y HAVING de una instruccin SELECT controlan qu filas de las
tablas de origen se usan para generar el conjunto de resultados. WHERE y HAVING son
filtros. Especifican una serie de condiciones de bsqueda y para crear el conjunto de
resultados slo se usan las filas que cumplan los trminos de dichas condiciones. Las
filas que cumplen las condiciones de bsqueda se dice que estn calificadas para
participar en el conjunto de resultados.
Por ejemplo, la clusula WHERE de esta instruccin SELECT slo califica las filas en las
que la regin sea Washington State:
SELECT CustomerID, CompanyName
FROM Northwind.dbo.Customers
WHERE Region = 'WA'
La clusula HAVING se usa normalmente junto con la clusula GROUP BY, aunque se
puede especificar sin GROUP BY. La clusula HAVING especifica otros filtros que se
aplican despus de los de la clusula WHERE. Por ejemplo, esta clusula WHERE slo
califica los pedidos de un producto cuyo precio unitario supere los 100 dlares, y la
clusula HAVING restringe posteriormente el resultado a aquellos pedidos que incluyan
ms de 100 unidades:
SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID
FROM [Order Details] AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100
Operadores de comparacin
www.templatesclarion.com.ar
35
(como =, < >, < y >). Por ejemplo, en la siguiente consulta se recuperan las filas de la tabla Products
SELECT ProductID, ProductName
FROM Northwind.dbo.Products
WHERE CategoryID = 2
ORDER BY ProductID
Intervalos
(BETWEEN y NOT BETWEEN). Por ejemplo, en esta consulta se recuperan las filas de la
tabla Products de las categoras 2 a 4.
SELECT CategoryID, ProductID, ProductName
FROM Northwind.dbo.Products
WHERE CategoryID BETWEEN 2 and 4
ORDER BY CategoryID, ProductID
Listas
(IN, NOT IN). Por ejemplo, en esta consulta se recuperan las filas de la tabla Products
donde Category ID coincida con algn Id. de la lista:
SELECT CategoryID, ProductID, ProductName
FROM Northwind.dbo.Products
WHERE CategoryID IN (1,4,5,7)
ORDER BY CategoryID, ProductID
Coincidencia de patrones
(LIKE y NOT LIKE). Por ejemplo, en esta consulta se recuperan las filas de la tabla
Products donde el nombre del producto empiece con las letras Ch.
SELECT CategoryID, ProductID, ProductName
FROM Northwind.dbo.Products
WHERE ProductName LIKE 'Ch%'
ORDER BY CategoryID, ProductID
www.templatesclarion.com.ar
36
1.3.5.1.3 ORDER BY
La clusula ORDER BY ordena los resultados de una consulta por una o ms columnas.
Una ordenacin puede ser ascendente (ASC) o descendente (DESC). Si no se especifica
ninguna, se supone que es ASC.
Ejemplos
En la consulta siguiente se devuelven los resultados ordenados de forma ascendente por
pub_id.
USE pubs
SELECT pub_id, type, title_id
FROM titles
ORDER BY pub_id
Si se nombra ms de una columna en la clusula ORDER BY, las ordenaciones se anidan.
La instruccin siguiente ordena las filas de la tabla titles, primero por editor, en orden
descendente; despus, por tipo, en orden ascendente, dentro de cada editor y,
finalmente, por precio (tambin en orden ascendente, porque no se especifica DESC).
USE pubs
SELECT pub_id, type, title_id, price
FROM titles
ORDER BY pub_id DESC, type, price
1.3.5.1.4 JOIN: Combinaciones
Tipos de combinaciones
Combinaciones internas (la operacin de combinacin tpica, que usa algunos
operadores de comparacin como = o <>). En este tipo se incluyen las combinaciones
equivalentes y las combinaciones naturales. Las combinaciones internas usan un
operador de comparacin para hacer coincidir las filas de dos tablas segn los valores
de las columnas comunes de cada tabla. Un ejemplo sera recuperar todas las filas en
las que el nmero de identificacin de estudiante es el mismo en las tablas students y
courses.
Combinaciones externas. Puede ser una combinacin externa izquierda, derecha o
completa. Las combinaciones externas se especifican en la clusula FROM con uno de
los siguientes conjuntos de palabras clave:
LEFT JOIN o LEFT OUTER JOIN: El conjunto de resultados de una combinacin externa
izquierda incluye todas las filas de la tabla de la izquierda especificada en la clusula
LEFT OUTER, y no slo aquellas en las que coincidan las columnas combinadas. Cuando
una fila de la tabla de la izquierda no tiene filas coincidentes en la tabla de la derecha,
la fila asociada del conjunto de resultados contiene valores NULL en todas las columnas
de la lista de seleccin que procedan de la tabla de la derecha.
RIGHT JOIN o RIGHT OUTER JOIN: Una combinacin externa derecha es el inverso de
www.templatesclarion.com.ar
37
zip
----94705
94705
au_lname
-------Carson
Bennet
contract
-------1
1
au_fname
-------Cheryl
Abraham
pub_id
-----1389
1389
phone
-----------415 548-7723
415 658-9932
address
city
--------------- -------589 Darwin Ln.
Berkeley
6223 Bateman St. Berkeley
pub_name
--------------------Algodata Infosystems
Algodata Infosystems
city
-------Berkeley
Berkeley
state
----CA
CA
country
------USA
USA
En el conjunto de resultados, la columna city aparece dos veces. Puesto que no tiene
sentido repetir la misma informacin, se puede eliminar una de estas dos columnas
idnticas si se cambia la lista de seleccin. El resultado se llama combinacin natural. La
consulta anterior de Transact-SQL se puede volver a formular para que forme una
combinacin natural. Por ejemplo:
USE pubs
www.templatesclarion.com.ar
38
state
au_id
au_lname au_fname
-------- ----------- -------- -------- 1389
409-56-7008 Bennet
Abraham
CA
238-95-7766 Carson
Cheryl
phone
address
--------------- ------------415 658-9932 6223 Bateman St.
415 548-7723 589 Darwin Ln.
city
-------Berkeley
Berkeley
state
----CA
CA
zip
----94705
94705
contract
--------1
1
(2 row(s) affected)
state
au_lname
------- -------------------MA
Blotchet-Halls
MA
del Castillo
MA
Greene
MA
Panteley
MA
Ringer
MA
Ringer
au_fname
-------------------Reginald
Innes
Morningstar
Sylvia
Albert
Anne
state
----OR
MI
TN
MD
UT
UT
(6 row(s) affected)
www.templatesclarion.com.ar
39
title_id
-------BU1032
BU1111
TC7777
BU1032
PC8888
TC7777
TC7777
MC3021
BU1111
PS1372
PS1372
PC8888
MC3021
PS2091
PS2091
www.templatesclarion.com.ar
40
www.templatesclarion.com.ar
au_lname
-----------------------------Blotchet-Halls
DeFrance
del Castillo
Dull
Green
Greene
Gringlesby
Hunter
Karsen
Locksley
MacFeather
McBadden
O'Leary
Panteley
Ringer
Ringer
Smith
Straight
Stringer
White
Yokomoto
Bennet
Carson
pub_name
----------------NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
Algodata Infosystems
Algodata Infosystems
41
LEFT OUTER JOIN incluye en el resultado todas las filas de la tabla authors, tanto si hay
una coincidencia en la columna city de la tabla publishers como si no la hay. Observe
que, en los resultados, no hay datos coincidentes con la mayor parte de los autores
enumerados, con lo que estas filas contienen valores NULL en la columna pub_name.
au_lname
-----------------------Bennet
Carson
NULL
NULL
NULL
NULL
NULL
NULL
NULL
pub_name
-------------------Algodata Infosystems
Algodata Infosystems
Binnet & Hardley
Five Lakes Publishing
GGG&G
Lucerne Publishing
New Moon Books
Ramona Publishers
Scootney Books
(9 row(s) affected)
www.templatesclarion.com.ar
42
(null)
(null)
(null)
7066
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
(null)
www.templatesclarion.com.ar
au_lname
---------------------------Blotchet-Halls
DeFrance
del Castillo
Dull
Green
Greene
pub_name
-------------------NULL
NULL
NULL
NULL
NULL
NULL
Burt
Sheryl
Livia
Charlene
Stearns
Heather
Michael
Sylvia
Albert
Anne
Meander
Dean
Dirk
Johnson
Akiko
Abraham
Cheryl
NULL
NULL
NULL
NULL
NULL
NULL
NULL
Gringlesby
Hunter
Karsen
Locksley
MacFeather
McBadden
O'Leary
Panteley
Ringer
Ringer
Smith
Straight
Stringer
White
Yokomoto
Bennet
Carson
NULL
NULL
NULL
NULL
NULL
NULL
NULL
43
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
Algodata Infosystems
Algodata Infosystems
Binnet & Hardley
Five Lakes Publishing
GGG&G
Lucerne Publishing
New Moon Books
Ramona Publishers
Scootney Books
Utilizar autocombinaciones
Una tabla se puede combinar consigo misma en una autocombinacin. Por ejemplo,
puede usar una autocombinacin para averiguar qu autores de Oakland, California,
viven en la misma rea de cdigo postal.
Puesto que esta consulta conlleva una combinacin de la tabla authors consigo misma, la
tabla authors aparece en dos funciones. Para distinguir estas funciones, debe dar a la
tabla authors dos alias distintos (au1 y au2) en la clusula FROM. Estos alias se usan
para calificar los nombres de columna del resto de la consulta. ste es un ejemplo de la
instruccin de autocombinacin de Transact-SQL:
USE pubs
SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname
FROM authors au1 INNER JOIN authors au2
ON au1.zip = au2.zip
WHERE au1.city = 'Oakland'
ORDER BY au1.au_fname ASC, au1.au_lname ASC
El siguiente es el conjunto de resultados:
au_fname
www.templatesclarion.com.ar
au_lname
au_fname
au_lname
44
-------------------Dean
Dean
Dean
Dirk
Dirk
Dirk
Livia
Livia
Livia
Marjorie
Stearns
------------------Straight
Straight
Straight
Stringer
Stringer
Stringer
Karsen
Karsen
Karsen
Green
MacFeather
-------------------Dean
Dirk
Livia
Dean
Dirk
Livia
Dean
Dirk
Livia
Marjorie
Stearns
--------Straight
Stringer
Karsen
Straight
Stringer
Karsen
Straight
Stringer
Karsen
Green
MacFeather
Para eliminar las filas del conjunto de resultados en las que los autores coinciden consigo
mismos y eliminar las filas que son idnticas, salvo en que el orden de los autores est
invertido, realice este cambio a la consulta de autocombinacin de Transact-SQL:
USE pubs
SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname
FROM authors au1 INNER JOIN authors au2
ON au1.zip = au2.zip
WHERE au1.city = 'Oakland'
AND au1.state = 'CA'
AND au1.au_id < au2.au_id
ORDER BY au1.au_lname ASC, au1.au_fname ASC
El siguiente es el conjunto de resultados:
au_fname
-----------Dean
Dean
Dirk
au_lname
----------------Straight
Straight
Stringer
au_fname
-------------------Dirk
Livia
Livia
au_lname
-------------------Stringer
Karsen
Karsen
(3 row(s) affected)
Ahora queda claro que Dean Straight, Dirk Stringer y Livia Karsen tienen todos el mismo
cdigo postal y viven en Oakland, California.
1.3.5.1.5 Utilizar alias de tablas
www.templatesclarion.com.ar
45
1.3.5.1.6 DISTINCT
La palabra clave DISTINCT elimina las filas duplicadas de un conjunto de resultados. Por
ejemplo, hay muchas filas en la tabla Northwind Orders con el mismo valor para
ShipCity. Para obtener una lista de los valores de ShipCity que hayan quitado los
duplicados:
SELECT DISTINCT ShipCity, ShipRegion
FROM Orders
ORDER BY ShipCity
.
1.3.5.1.7 TOP n
La palabra clave TOP especifica que se devolvern las primeras n filas del conjunto de
resultados. Si se especifica ORDER BY, las filas se seleccionan despus de que el
conjunto de resultados se haya ordenado. n es el nmero de filas que se va a devolver,
a menos que se especifique la palabra clave PERCENT. PERCENT especifica que n es el
porcentaje de filas del conjunto de resultados que se devuelve. Por ejemplo, esta
instruccin SELECT devuelve las primeras diez ciudades, en secuencia alfabtica, de la
tabla Orders:
SELECT DISTINCT TOP 10 ShipCity, ShipRegion
FROM Orders
ORDER BY ShipCity
1.3.5.2
Columnas que tengan un valor predeterminado que utilice la funcin NEWID para generar
un valor GUID exclusivo.
Columnas calculadas.
www.templatesclarion.com.ar
46
Se trata de columnas virtuales que se definieron como una expresin calculada a partir
de una o varias columnas en la instruccin CREATE TABLE, como:
CREATE TABLE TestTable
(ColA INT PRIMARY KEY,
ColB INT NOT NULL,
ColC AS (ColA + ColB) * 2)
Los valores de datos suministrados deben coincidir con la lista de columnas. El nmero
de valores de datos debe ser el mismo que el nmero de columnas y el tipo de datos,
precisin y escala de cada valor de datos debe coincidir con los de la columna
correspondiente. Hay dos maneras de especificar los valores de datos:
Utilizar una clusula VALUES para especificar los valores de datos para una fila:
INSERT INTO MyTable (PriKey, Description)
VALUES (123, 'A description of part 123.')
Utilizar una subconsulta SELECT para especificar los valores de datos para una o ms filas.
INSERT INTO MyTable (PriKey, Description)
SELECT ForeignKey, Description
FROM SomeView
Ejemplo
Por ejemplo, para insertar un nuevo transportista en la tabla Shippers con la clusula VALUES:
INSERT INTO Northwind.dbo.Shippers (CompanyName, Phone)
VALUES (N'Snowflake Shipping', N'(503)555-7233')
Para esta insercin se necesita una lista de columnas porque la columna ShipperID tiene
la propiedad IDENTITY, con lo que no se pueden insertar valores en la misma.
Ejemplo
Esta instruccin INSERT inserta en una tabla aparte algunos de los datos de todas las
filas de titles cuyo type sea cocina moderna:
USE pubs
INSERT INTO MyBooks
SELECT title_id, title, type
FROM titlesFROM titles
WHERE type = 'mod_cook'
www.templatesclarion.com.ar
47
Ejemplo
SELECT Shippers.*, Link.Address, Link.City,
Link.Region, Link.PostalCode
INTO NewShippers
FROM Shippers
JOIN LinkServer.DB.dbo.Shippers AS Link
ON (Shippers.ShipperID = Link.ShipperID)
SELECT INTO se puede emplear para combinar datos de varias tablas o vistas en una
tabla. Tambin se puede utilizar para crear una nueva tabla que contenga datos
seleccionados de un servidor vinculado.
1.3.5.3
www.templatesclarion.com.ar
48
WHERE CategoryID = 2
www.templatesclarion.com.ar
49
Ejemplo
En el ejemplo siguiente se actualiza la fila de Dirk Stringer de la tabla titleauthor para
agregar el nmero de identificacin de ttulo de su ltimo libro:
UPDATE titleauthor
SET title_id = titles.title_id
FROM titles INNER JOIN titleauthor
ON titles.title_id = titleauthor.title_id
INNER JOIN authors
ON titleauthor.au_id = authors.au_id
WHERE titles.title = 'Net Etiquette'
AND au_lname = 'Locksley'
www.templatesclarion.com.ar
50
base de datos. La instruccin DELETE slo elimina filas de la tabla, y sta se debe quitar
de la base de datos mediante la instruccin DROP TABLE.
www.templatesclarion.com.ar
1.3.6
51
www.templatesclarion.com.ar
52
Abreviaturas
ao
aa, aaaa
trimestre
tt, t
mes
mm, m
dia del ao
da, a
dia
dd, d
semana
sm, ss
hora
Hs
minuto
mi, n
segundo
ss, s
milisegundo
Ms
www.templatesclarion.com.ar
53
Continuando con las operaciones con las fechas, veamos como podemos hacer para sumar, restar, da
select convert(varchar(12), DATEADD(month, -1, getdate()), 106) as 'un mes atrs'
select convert(varchar(12), DATEADD (week, -1, getdate()), 106) as 'una semana atrs'
select convert(varchar(12), DATEADD (day, -1, getdate()), 106) as 'ayer'
1.3.7
Identificadores
Son los nombres de objetos como tablas, vistas, columnas, bases de datos y servidores.
Tipos de datos
Definen el tipo de datos que contienen los objetos de datos como columnas, variables y
parmetros. La mayor parte de las instrucciones de Transact-SQL no hacen referencia
explcitamente a tipos de datos, sino que sus resultados estn influidos por las
interacciones entre los tipos de datos de los objetos a los que se hace referencia en la
instruccin.
Funciones
Son elementos de sintaxis que toman cero, uno o ms valores de entrada y devuelven un
valor escalar o un conjunto de valores en forma de tabla. Ejemplos de funciones son la
funcin SUM para sumar varios valores, la funcin DATEDIFF para determinar el nmero
de unidades de tiempo que separan dos fechas, la funcin @@SERVERNAME para
obtener el nombre de una instancia de Microsoft SQL Server.
Las funciones tambien pueden ser definidas por el usuario.
Expresiones
Son unidades de sintaxis que Microsoft SQL Server puede resolver en valores nicos.
Ejemplos de expresiones son las constantes, las funciones que devuelven un valor nico,
una referencia a una columna o una variable.
Operadores
Funcionan con una o ms expresiones individuales para formar una expresin ms
compleja. Por ejemplo, combinar el signo menos (-) con la constante 12 da como
resultado la constante -12. El signo de multiplicacin (*) de la expresin PriceColumn
*1.1 aumenta el precio en un 10 por ciento.
www.templatesclarion.com.ar
54
Comentarios
Son fragmentos de texto insertado en instrucciones o secuencias de comandos de
Transact-SQL para explicar el objetivo de la instruccin. Los comentarios no son
ejecutados por SQL Server.
Valores NULL.
Los valores NULL son valores desconocidos. Puede usar valores NULL para indicar que la
informacin se proporcionar posteriormente. Por ejemplo, si la persona de contacto de
la empresa Leka Trading cambia y no se conoce la nueva persona de contacto, podra
indicar que su nombre es desconocido con un valor NULL.
Parmetros de Transact-SQL
Un parmetro es un objeto usado para pasar datos entre un procedimiento almacenado y
el lote o secuencia de comandos que lo ejecuta. Los parmetros pueden ser de entrada o
de salida. Por ejemplo:
CREATE PROCEDURE ParmSample
@EmpIDParm INT
AS
www.templatesclarion.com.ar
55
SELECT *
FROM Employees
WHERE EmployeeID = @EmpIDParm
GO
EXEC ParmSample @EmpIDParm = 1234
GO
Control de flujo
Transact-SQL proporciona palabras especiales que forman parte del llamado lenguaje de
control de flujo con el que se controla el flujo de la ejecucin de instrucciones
Transact-SQL, bloques de instrucciones y procedimientos almacenados. Estas palabras se
pueden usar en las instrucciones Transact-SQL ad hoc, en los lotes y en los
procedimientos almacenados.
Sin el lenguaje de control de flujo, las instrucciones Transact-SQL independientes se
ejecutan secuencialmente, tal como se producen. El lenguaje de control de flujo permite
que las instrucciones estn conectadas, se relacionen entre ellas y se hagan
interdependientes con construcciones similares a las de la programacin.
BEGIN...END
Las instrucciones BEGIN y END se usan para agrupar varias instrucciones Transact-SQL
en un bloque lgico. Use las instrucciones BEGIN y END en cualquier parte donde una
instruccin de control de flujo deba ejecutar un bloque con dos o ms instrucciones
Transact-SQL.
Por ejemplo, cuando una instruccin IF controla la ejecucin de una nica instruccin
Transact-SQL, no se necesita ninguna instruccin BEGIN o END:
IF (@@ERROR <> 0)
SET @ErrorSaveVariable = @@ERROR
Si @@ERROR es 0, slo se salta la instruccin individual SET.
Use las instrucciones BEGIN y END para hacer que la instruccin IF salte un bloque de
instrucciones cuando el resultado de la evaluacin sea FALSE (falso):
IF (@@ERROR <> 0)
BEGIN
SET @ErrorSaveVariable = @@ERROR
PRINT 'Error encountered, ' +
CAST(@ErrorSaveVariable AS VARCHAR(10))
END
Las instrucciones BEGIN y END deben usarse como un par: no se puede usar una sin la
otra. La instruccin BEGIN aparece sola en una lnea, seguida de un bloque de
instrucciones Transact-SQL. Finalmente, la instruccin END aparece sola en una lnea
para indicar el fin del bloque.
Las instrucciones BEGIN y END se usan cuando:
Es necesario que un bucle WHILE incluya un bloque de instrucciones.
Es necesario que un elemento de una funcin CASE incluya un bloque de instrucciones.
Es necesario que una clusula IF o ELSE incluya un bloque de instrucciones.
www.templatesclarion.com.ar
56
IF...ELSE
La instruccin IF se usa para probar una condicin. El control de flujo resultante depende
de si se especifica o no la instruccin ELSE opcional:
IF especificado sin ELSE: Cuando la instruccin IF da como resultado TRUE
(verdadero), se ejecuta la instruccin o bloque de instrucciones que sigue a la
instruccin IF. Cuando la instruccin IF da como resultado FALSE (falso), se salta la
instruccin o bloque de instrucciones que sigue a la instruccin IF.
IF especificado con ELSE: Cuando la instruccin IF da como resultado TRUE, se ejecuta
la instruccin o bloque de instrucciones que sigue a la instruccin IF. A continuacin, el
control salta al punto posterior a la instruccin o bloque de instrucciones que sigue a
ELSE. Cuando la instruccin IF da como resultado FALSE, se salta la instruccin o
bloque de instrucciones que sigue a IF y se ejecuta la instruccin o bloque de
instrucciones que sigue a la instruccin ELSE opcional.
Por ejemplo, si un procedimiento almacenado ha estado guardando los cdigos de error devueltos por
IF (@ErrorSaveVariable <> 0)
BEGIN
PRINT 'Errors encountered, rolling back.'
PRINT 'Last error encountered: ' +
CAST(@ErrorSaveVariable AS VARCHAR(10))
ROLLBACK
END
ELSE
BEGIN
PRINT 'No Errors encountered, committing.'
COMMIT
END
RETURN @ErrorSaveVariable
RETURN
La instruccin RETURN termina incondicionalmente una consulta, procedimiento
almacenado o lote. Ninguna de las instrucciones de un procedimiento almacenado o lote
que siga a la instruccin RETURN se ejecutar.
Cuando se usa en un procedimiento almacenado, la instruccin RETURN puede
especificar un valor entero para devolver a la aplicacin, lote o procedimiento que realiza
la llamada. Si no se especifica ningn valor en la instruccin RETURN, un procedimiento
almacenado devuelve el valor 0.
La mayor parte de los procedimientos almacenados siguen la convencin de usar el
cdigo de retorno para indicar si el procedimiento almacenado se ha ejecutado
correctamente o no. Los procedimientos almacenados devuelven el valor 0 cuando no se
encontraron errores. Cualquier valor distinto de cero indica que se produjo un error. Por
ejemplo:
USE Northwind
GO
-- Create a procedure that takes one input parameter
-- and returns one output parameter and a return code.
CREATE PROCEDURE SampleProcedure @EmployeeIDParm INT,
@MaxQuantity INT OUTPUT
AS
-- Declare and initialize a variable to hold @@ERROR.
www.templatesclarion.com.ar
57
WHILE...BREAK o CONTINUE
La instruccin WHILE repite una instruccin o bloque de instrucciones mientras la
condicin especificada siga siendo verdadera.
Con WHILE se usan normalmente dos instrucciones Transact-SQL: BREAK o CONTINUE.
La instruccin BREAK sale del bucle WHILE ms profundo, y la instruccin CONTINUE
reinicia un bucle WHILE. Un programa podra ejecutar una instruccin BREAK si, por
ejemplo, no hubiera ms filas que procesar. Una instruccin CONTINUE podra ejecutarse
si, por ejemplo, la ejecucin del cdigo debiera continuar.
Nota: Si una instruccin SELECT se usa como condicin de la instruccin WHILE, la
instruccin SELECT debe ir entre parntesis.
En este ejemplo se usa una instruccin WHILE para controlar el nmero de
recuperaciones realizadas:
USE Northwind
GO
DECLARE abc CURSOR FOR
www.templatesclarion.com.ar
58
CASE
La funcin CASE es una expresin especial de Transact-SQL que permite que se muestre
un valor alternativo dependiendo del valor de una columna. Este cambio es temporal, con
lo que no hay cambios permanentes en los datos. Por ejemplo, la funcin CASE puede
mostrar California en un conjunto de resultados de una consulta de las filas que tengan
el valor CA en la columna state.
La funcin CASE est compuesta de:
La palabra clave CASE.
El nombre de columna que se va a transformar.
Clusulas WHEN que especifican las expresiones que se van a buscar y clusulas THEN
que especifican las expresiones que las van a reemplazar.
La palabra clave END.
Una clusula AS opcional que define un alias de la funcin CASE.
En este ejemplo se muestra, en el conjunto de resultados de la consulta, el nombre
completo del estado en el que vive cada autor:
SELECT au_fname, au_lname,
CASE state
WHEN 'CA' THEN 'California'
WHEN 'KS' THEN 'Kansas'
WHEN 'TN' THEN 'Tennessee'
WHEN 'OR' THEN 'Oregon'
WHEN 'MI' THEN 'Michigan'
WHEN 'IN' THEN 'Indiana'
WHEN 'MD' THEN 'Maryland'
WHEN 'UT' THEN 'Utah'
END AS StateName
FROM pubs.dbo.authors
ORDER BY au_lname
1.3.8
www.templatesclarion.com.ar
59
columna para generar un nico resultado. Las funciones de agregado se pueden aplicar a
todas las filas de una tabla, a un subconjunto de la tabla especificado por una clusula
WHERE o a uno o varios grupos de filas de la tabla. Cuando se aplica una funcin de
agregado, se genera un valor individual por cada conjunto de filas.
COUNT(*)
COUNT(*) no requiere el parmetro expression porque no utiliza informacin acerca de
ninguna columna concreta. Cuenta el nmero total de filas que cumplen las calificaciones
de la consulta. COUNT(*) devuelve el nmero de filas que coinciden con las condiciones
de bsqueda especificadas en la consulta, sin eliminar los duplicados. Cuenta todas las
filas, incluidas las que contienen valores NULL. En esta consulta se busca el nmero total
de libros de la tabla titles:
USE pubs
SELECT COUNT(*)
FROM titles
El siguiente es el conjunto de resultados:
-----------------18
(1 row(s) affected)
COUNT(*) se puede combinar con otras funciones de agregado. Esta consulta muestra
COUNT(*) combinado con una funcin AVG en la que ambas funciones de agregado slo
agregan los datos de las filas que cumplen la condicin de bsqueda de la clusula
WHERE.
USE pubs
SELECT COUNT(*), AVG(price)
FROM titles
WHERE advance > $1000
El siguiente es el conjunto de resultados:
----------- -----15
14.42
DISTINCT
La palabra clave DISTINCT es opcional con SUM, AVG y COUNT. Cuando se usa
DISTINCT, los valores duplicados se eliminan antes de que se calcule la suma, el
promedio o el recuento.
Si usa DISTINCT, la expresin slo debe constar del nombre de una columna. No puede
incluir una expresin aritmtica.
En la consulta siguiente se devuelven los precios promedio de los libros de empresa (sin
los valores duplicados).
USE pubs
SELECT AVG(DISTINCT price)
FROM titles
WHERE type = 'business'
www.templatesclarion.com.ar
60
Sin DISTINCT, la funcin AVG busca el precio promedio de todos los ttulos de empresa.
USE pubs
SELECT AVG(price)
FROM titles
WHERE type = 'business
El siguiente es el conjunto de resultados:
-----------------13.73
(1 row(s) affected)
1.3.8.2
AmountSold
----------328
453
298
301
372
122
601
603
445
745
239
791
61
conocidas como las columnas de agrupamiento. La clusula GROUP BY restringe las filas
del conjunto de resultados; slo hay una fila por cada valor distinto de la columna o
columnas de agrupamiento. Cada fila del conjunto de resultados contiene los datos de
resumen relacionados con el valor especfico de sus columnas de agrupamiento.
-------------------------2.99
2.99
21.48
14.30
17.97
(5 row(s) affected)
Slo las filas con adelantos superiores a 5.000 dlares se incluyen en los grupos que se
muestran en los resultados de la consulta.
www.templatesclarion.com.ar
62
Para asegurarse de que hay como mnimo seis libros involucrados en los clculos para
cada publicador, este ejemplo utiliza HAVING COUNT(*) > 5 para eliminar los
publicadores que devuelven totales con menos de seis libros.
USE pubs
SELECT pub_id, total = SUM(ytd_sales)
FROM titles
GROUP BY pub_id
HAVING COUNT(*) > 5
El siguiente es el conjunto de resultados:
pub_id
-----0877
1389
total
----------44219
24941
(2 row(s) affected)
La clusula HAVING se usa para filtrar las filas del resultado agrupado.
Es ms eficiente especificar en la clusula WHERE las condiciones de bsqueda que se
pueden establecer antes o despus de la operacin de agrupamiento. Esto reduce el
nmero de filas que tienen que agruparse. Las nicas condiciones de bsqueda que se
deben especificar en la clusula HAVING son aquellas que se deben aplicar una vez que
se hayan realizado las operaciones de agrupamiento.
El optimizador de consultas de Microsoft SQL Server 2000 puede tratar la mayor
parte de estas condiciones. Si el optimizador determina que una condicin de bsqueda
HAVING se puede aplicar antes de la operacin de agrupamiento, lo har. Puede que el
optimizador no reconozca todas las condiciones de bsqueda de HAVING que se pueden
aplicar antes de la operacin de agrupamiento. Se recomienda colocar todas estas
condiciones de bsqueda en la clusula WHERE en lugar de en la clusula HAVING.
En la consulta siguiente se muestra la clusula HAVING con una funcin de agregado.
Agrupa por tipos las filas de la tabla titles y elimina los grupos que incluyen solamente
un libro:
USE pubs
SELECT type
FROM titles
GROUP BY type
HAVING COUNT(*) > 1
El siguiente es el conjunto de resultados:
www.templatesclarion.com.ar
63
type
-----------------business
mod_cook
popular_comp
psychology
trad_cook
(5 row(s) affected)
1.3.8.3
64
1.3.9
Subconsultas
Una subconsulta es una consulta SELECT que devuelve un valor nico y est anidada en
una instruccin SELECT, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Una
subconsulta se puede utilizar en cualquier parte en la que se permita una expresin. En
este ejemplo se utiliza una subconsulta como una expresin de columna llamada
MaxUnitPrice en una instruccin SELECT.
SELECT Ord.OrderID, Ord.OrderDate,
(SELECT MAX(OrdDet.UnitPrice)
FROM Northwind.dbo.[Order Details] AS OrdDet
WHERE Ord.OrderID = OrdDet.OrderID) AS MaxUnitPrice
FROM Northwind.dbo.Orders AS Ord
Se llama tambin subconsulta a una consulta o seleccin interna, mientras que la
instruccin que contiene una subconsulta tambin es conocida como consulta o seleccin
externa.
Muchas de las instrucciones Transact-SQL que incluyen subconsultas se pueden formular
tambin como combinaciones. Otras preguntas se pueden formular slo con
subconsultas. En Transact-SQL, normalmente no hay diferencias de rendimiento entre
una instruccin que incluya una subconsulta y una versin semnticamente equivalente
que no lo haga. Sin embargo, en algunos casos en los que se debe comprobar la
existencia de algo, una combinacin produce mejores resultados. De lo contrario, la
consulta anidada debe ser procesada para cada resultado de la consulta externa con el
fin de asegurar la eliminacin de los duplicados. En tales casos, la utilizacin de
combinaciones producira los mejores resultados. Esto es un ejemplo que muestra una
subconsulta SELECT y una combinacin SELECT que devuelve el mismo conjunto de
resultados:
/* SELECT statement built using a subquery. */
SELECT ProductName
FROM Northwind.dbo.Products
WHERE UnitPrice =
(SELECT UnitPrice
FROM Northwind.dbo.Products
WHERE ProductName = 'Sir Rodney''s Scones')
/* SELECT statement built using a join that returns
the same result set. */
SELECT Prd1.ProductName
FROM Northwind.dbo.Products AS Prd1
JOIN Northwind.dbo.Products AS Prd2
www.templatesclarion.com.ar
65
ON (Prd1.UnitPrice = Prd2.UnitPrice)
WHERE Prd2.ProductName = 'Sir Rodney''s Scones'
La consulta SELECT de una subconsulta se incluye siempre entre parntesis. No puede
incluir una clusula COMPUTE o FOR BROWSE y slo puede incluir una clusula ORDER
BY cuando se especifica tambin una clusula TOP.
Una subconsulta puede anidarse dentro de la clusula WHERE o HAVING de una
instruccin externa SELECT, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Se
puede disponer de hasta 32 niveles de anidamiento, aunque el lmite vara dependiendo
de la memoria disponible y de la complejidad del resto de las expresiones de la consulta.
Las consultas individuales puede que no admitan anidamientos por encima de 32 niveles.
Una subconsulta puede aparecer en cualquier parte en la que se pueda usar una
expresin, si devuelve un valor individual.
Si una tabla aparece slo en una subconsulta y no en la consulta externa, las columnas
de esa tabla no se pueden incluir en el resultado (la lista de seleccin de la consulta
externa).
Tipos de Subconsultas
Las instrucciones que incluyen una subconsulta normalmente tienen uno de estos
formatos:
WHERE expression [NOT] IN (subquery)
WHERE expression comparison_operator [ANY | ALL] (subquery)
WHERE [NOT] EXISTS (subquery)
Hay tres tipos bsicos de subconsultas:
Operan en listas incorporadas con IN, o en aqullas que modific un operador de
comparacin mediante ANY o ALL.
Se introducen con un operador de comparacin sin modificar y deben devolver un valor
individual.
Son pruebas de existencia que se introducen con EXISTS.
www.templatesclarion.com.ar
66
reglas de una subconsulta presentada con EXISTS son idnticas a las de una lista de
seleccin estndar porque una subconsulta presentada con EXISTS constituye una
prueba de existencia y devuelve TRUE o FALSE en lugar de datos.
Temas Relacionados:
Subconsultas con Alias
Subconsultas con IN
Subconsultas con NOT IN
Subconsultas en UPDATE, DELETE e INSERT
Subconsultas con operadores de comparacin
Subconsultas con EXISTS
Subconsultas con NOT EXISTS
Subconsultas usadas en lugar de una expresin
Mltiples niveles de anidamiento
Procesamiento condicional con CASE
1.3.9.1
au_fname
-------------------Marjorie
Dean
Dirk
Stearns
Livia
city
---------Oakland
Oakland
Oakland
Oakland
Oakland
(5 row(s) affected)
www.templatesclarion.com.ar
67
USE pubs
SELECT au1.au_lname, au1.au_fname, au1.city
FROM authors AS au1
WHERE au1.city in
(SELECT au2.city
FROM authors AS au2
WHERE au2.au_fname = 'Livia'
AND au2.au_lname = 'Karsen')
Los alias explcitos indican claramente que las referencias a authors de la subconsulta no
significan lo mismo que las referencias de la consulta externa.
1.3.9.2
Subconsultas con IN
El resultado de una subconsulta presentada con IN (o con NOT IN) es una lista de cero o
ms valores. Una vez que la consulta devuelve los resultados, la consulta externa hace
uso de ellos.
En esta consulta se buscan los nombres de los editores que han publicado libros de
empresa.
USE pubs
SELECT pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
El siguiente es el conjunto de resultados:
pub_name
---------------------------------------Algodata Infosystems
New Moon Books
(2 row(s) affected)
Esta instruccin se evala en dos pasos. Primero, la consulta interna devuelve los
nmeros de identificacin de los editores que han publicado libros de empresa (1389 y
0736). Segundo, estos valores se sustituyen en la consulta externa, que busca los
nombres asociados con los nmeros de identificacin en publishers.
USE pubs
SELECT pub_name
FROM publishers
WHERE pub_id in ('1389', '0736')
Una diferencia de la utilizacin de una combinacin en lugar de una subconsulta, para
este problema y otros similares, es que la combinacin permite mostrar, en el resultado,
columnas de ms de una tabla. Por ejemplo, si desea incluir en el resultado el ttulo de
los libros de empresa, debe usar combinaciones.
USE pubs
SELECT pub_name, title
www.templatesclarion.com.ar
68
title
------------------------------------------------The Busy Executive's Database Guide
Cooking with Computers: Surreptitious Balance Sheets
(4 row(s) affected)
Esta consulta muestra que la combinacin produce cuatro filas, no dos como en la
subconsulta anterior.
Este es otro ejemplo de una consulta que se puede formular con una subconsulta o con
una combinacin. Esta consulta busca los nombres de todos los segundos autores que
viven en California y que reciben menos del 30 por ciento de los derechos de autor de un
libro.
USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE state = 'CA'
AND au_id IN
(SELECT au_id
FROM titleauthor
WHERE royaltyper < 30
AND au_ord = 2)
El siguiente es el conjunto de resultados:
El siguiente es el conjunto de resultados:
au_lname
au_fname
---------------------------------------- -------------------MacFeather
Stearns
(1 row(s) affected)
Se evala la consulta interna y da como resultado los nmeros de Id. de los tres autores
que cumplen las calificaciones de la subconsulta. Despus se evala la consulta externa.
Observe que puede incluir ms de una condicin en la clusula WHERE tanto de las
consultas internas como de las externas.
Mediante una combinacin, la misma consulta se expresa de esta forma:
USE pubs
SELECT au_lname, au_fname
FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id
WHERE state = 'CA'
AND royaltyper < 30
AND au_ord = 2
Una combinacin se puede expresar siempre como una subconsulta. Una subconsulta se
www.templatesclarion.com.ar
69
puede expresar a menudo, aunque no siempre, como una combinacin. Esto se debe a
que las combinaciones son simtricas: puede combinar las tablas A y B en cualquier
orden y obtener la misma respuesta. Lo mismo no es cierto si se implica a una
subconsulta.
1.3.9.3
1.3.9.4
www.templatesclarion.com.ar
70
au_fname
-------Cheryl
Abraham
(2 row(s) affected)
www.templatesclarion.com.ar
71
Puesto que las subconsultas presentadas con operadores de comparacin sin modificar
deben devolver un valor individual, no pueden incluir clusulas GROUP BY o HAVING a
menos que sepa que la propia clusula GROUP BY o HAVING devuelve un valor
individual. Por ejemplo, esta consulta busca los libros con un precio superior al del libro
con el menor precio que sea del tipo 'trad_cook'.
USE pubs
SELECT DISTINCT title
FROM titles
WHERE price >
(SELECT MIN(price)
FROM titles
GROUP BY type
HAVING type = 'trad_cook')
El siguiente es el conjunto de resultados:
title
-----------------------------------------------------------------------But Is It User Friendly?
Computer Phobic AND Non-Phobic Individuals: Behavior Variations
Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean
Prolonged Data Deprivation: Four Case Studies
Secrets of Silicon Valley
Silicon Valley Gastronomic Treats
Straight Talk About Computers
Sushi, Anyone?
The Busy Executive's Database Guide
(9 row(s) affected)
www.templatesclarion.com.ar
72
1.3.9.6
Para determinar los resultados de esta consulta, considere el nombre de cada editor de
uno en uno. Este valor hace que la subconsulta devuelva una fila, como mnimo? En
otras palabras, hace que la prueba de existencia d como resultado TRUE?
En este caso, el primer nombre de editor es Algodata Infosystems, con nmero de
identificacin 1389. Hay filas en la tabla titles cuyo pub_id sea 1389 y cuyo type sea
empresa? Si lo hay, Algodata Infosystems debe ser uno de los valores seleccionados. El
mismo proceso se repite para cada uno de los restantes nombres de editor.
Observe que las subconsultas presentadas con EXISTS son ligeramente distintas de las
restantes subconsultas en los aspectos siguientes:
La palabra clave EXISTS no se precede de un nombre de columna, constante u otra
expresin.
La lista de seleccin de una subconsulta presentada por EXISTS casi siempre consta de
un asterisco (*). No hay razn para enumerar los nombres de las columnas porque
simplemente se est comprobando la existencia de filas que cumplan las condiciones
especificadas en la subconsulta.
La palabra clave EXISTS es importante porque a veces no hay una formulacin
alternativa de la subconsulta. Aunque algunas consultas formuladas con EXISTS no se
pueden expresar de ninguna otra forma, todas las consultas que usan IN o un operador
www.templatesclarion.com.ar
73
au_fname
-------Cheryl
Abraham
(2 row(s) affected)
Estas dos consultas buscan ttulos de libros publicados por algn editor que se encuentre
en una ciudad que comience con la letra B.
USE pubs
SELECT title
FROM titles
WHERE pub_id IN
(SELECT pub_id
FROM publishers
WHERE city LIKE 'B%')
-- Or
USE pubs
SELECT title
FROM titles
WHERE EXISTS
(SELECT *
FROM publishers
WHERE pub_id = titles.pub_id
AND city LIKE 'B%')
ste es el conjunto de resultados de las consultas:
title
---------------------------------------------------The Busy Executive's Database Guide
Cooking with Computers: Surreptitious Balance Sheets
You Can Combat Computer Stress!
Straight Talk About Computers
www.templatesclarion.com.ar
74
1.3.9.7
En esta consulta se buscan los ttulos de los que no ha habido ninguna venta.
USE pubs
SELECT title
FROM titles
WHERE NOT EXISTS
(SELECT title_id
FROM sales
WHERE title_id = titles.title_id)
El siguiente es el conjunto de resultados:
title
---------------------------------The Psychology of Computer Cooking
Net Etiquette
(2 row(s) affected)
www.templatesclarion.com.ar
1.3.9.8
75
price
-------------22.95
20.00
(null)
average
-------------14.77
14.77
14.77
difference
---------------8.18
5.23
(null)
(3 row(s) affected)
1.3.9.9
au_fname
-------------------Cheryl
Ann
Charlene
Sheryl
(4 row(s) affected)
www.templatesclarion.com.ar
76
shortened title
-----------------------------Cooking with Computers: Surrep
Straight Talk About Computers
The Busy Executive's Database
You Can Combat Computer Stress
Silicon Valley Gastronomic Tre
The Gourmet Microwave
But Is It User Friendly?
Secrets of Silicon Valley
Computer Phobic AND Non-Phobic
Emotional Security: A New Algo
Is Anger the Enemy?
Life Without Fear
Prolonged Data Deprivation: Fo
Fifty Years in Buckingham Pala
Onions, Leeks, and Garlic: Coo
Sushi, Anyone?
Price
------11.95
19.99
19.99
2.99
19.99
2.99
22.95
20.00
21.59
7.99
10.95
7.00
19.99
11.95
20.95
14.99
CASE tambin se utiliza para clasificar datos. La siguiente consulta utiliza la funcin
www.templatesclarion.com.ar
77
Shortened Title
-------------------The Psychology of Co
Net Etiquette
You Can Combat Compu
The Gourmet Microwav
Life Without Fear
Emotional Security:
Is Anger the Enemy?
Cooking with Compute
Fifty Years in Bucki
Sushi, Anyone?
The Busy Executive's
Straight Talk About
Silicon Valley Gastr
Prolonged Data Depri
Secrets of Silicon V
Onions, Leeks, and G
Computer Phobic AND
But Is It User Frien
Transaccin
Una transaccin es una unidad de la ejecucin de un programa. Puede consistir en varias
operaciones de acceso a la base de datos. Est delimitada por comandos que indican el
inicio, el fin exitoso o la cancelacion de la misma.
Propiedades A.C.I.D.
Atomicidad
Es la propiedad de las transacciones que permite observarlas como operaciones
atmicas: ocurren totalmente o no ocurren.
www.templatesclarion.com.ar
78
Consistencia
La ejecucin aislada de la transaccin conserva la consistencia de la base de datos.
Aislamiento (Isolation)
Para cada par de transacciones que puedan ejecutarse concurrentemente Ti y Tj, se
cumple que para los efectos de Ti:
- Tj ha terminado antes de que comience Ti
- Tj ha comenzado despus de que termine Ti
Las transacciones son independientes entre s.
Niveles de aislamiento
Se puede ajustar el nivel de aislamiento entre las transacciones y determina para una
transaccin el grado de aceptacin de datos inconsistentes.
A mayor grado de aislamiento, mayor precisin, pero a costa de menor concurrencia.
El nivel de aislamiento para una sesin SQL establece el comportamiento de los bloqueos
para las instrucciones SQL.
Niveles de aislamiento:
Lectura no comprometida. Menor nivel. Asegura que no se lean datos corruptos
fsicamente.
Lectura comprometida. Slo se permiten lecturas de datos comprometidos.
Lectura repetible. Las lecturas repetidas de la misma fila para la misma transaccin
dan los mismos resultados.
Secuenciable. Mayor nivel de aislamiento. Las transacciones se aslan completamente.
Nivel de
aislamiento
Lectura
sucia
Lectura no
repetible
Lectura
fantasma
Lectura no
comprometida
Lectura
comprometida
No
Lectura repetible
No
No
Secuenciable
No
No
No
SQL Server permite todos estos niveles, Oracle slo permite la lectura comprometida y
secuenciable. Los niveles se pueden establecer en ambos para cada transaccin.
Durabilidad
El sistema gestor de bases de datos asegura que los cambios realizados por una
transaccin que termina con xito perduran.
www.templatesclarion.com.ar
79
Transacciones anidadas
Una transaccin anidada o multinivel T consiste en un conjunto T = {t1, t2, . . ., tn} de
subtransacciones y en un orden parcial P sobre T.
Cada ti de T puede abortar sin obligar a que T aborte. Puede que T reinicie ti o
simplemente no ejecute ti. Si se compromete ti, esa accin no hace que ti sea
permanente, sino que ti se compromete con T, y puede que aborte si T aborta.
La ejecucin de T no debe violar el orden parcial P. Es decir, si aparece un arco ti ? tj en
el grafo de precedencia, tj ? ti no debe estar en el cierre transitivo de P.
Temas Relacionados:
Bloqueos
Read Commited
Read Uncommited
Repeatable Read
Serializable
1.3.10.1 Bloqueos
Un bloqueo es una informacin del tipo de acceso que se permite a un elemento. El
motor SQL impone los bloqueos necesarios en cada momento. El gestor de acceso a los
datos implementa las restricciones de acceso. En algunos sistemas se permite que el
usuario pueda indicar el bloqueo ms adecuado (locking hints).
Niveles de bloqueo
Especifica la granularidad del bloqueo
Fila: Fila individual
Clave: Fila de un ndice
Pgina: Pginas (8KB)
Extent: Extensin (grupo de 8 pginas contiguas de datos o ndices)
Table: Tabla completa
Database: Base de datos completa
Modos de bloqueo
Especifica el modo en que se bloquea un elemento
www.templatesclarion.com.ar
80
Livelock
Espera indefinida de una transaccin por un bloqueo que no se llega a conceder porque
se cede a otras transacciones.
Una solucin (sistemas operativos): estrategia first-come-first-served (se atiende al
primero que llega).
Deadlock
T1: LOCK A; LOCK B; UNLOCK A; UNLOCK B;
T2: LOCK B; LOCK A; UNLOCK B; UNLOCK A;
T1 y T2 bloquean A y B => Espera indefinida de T1 y T2.
Soluciones (sistemas operativos):
1- Concesin simultnea de todos los bloqueos de una transaccin.
2- Asignar un orden lineal arbitrario a los elementos y requerir que las transacciones
pidan los bloqueos en este orden.
3- Permitir los deadlocks y analizar cada cierto tiempo si existen. Este es el caso del
SQL Server, por lo tanto es nuestra responsabilidad evitar los DeadLocks.
1.3.10.2 Read Uncommited
Lecturas no confirmadas, nivel ms bajo de aislamiento solamente protege de lecturas de
datos fsicamente daados. Es el que produce mayor nivel de concurrencia (nunca hay un
bloqueo), pero tambin el que no garantiza en absoluto la coherencia de los datos.
Vemoslo con un ejemplo; Juan, director comercial de una firma est pensando en
incrementar los precios de ciertos artculos en un 50%, por eso ejecuta una instruccin
en la que incrementa el precio de todos los artculos en ese 50%. El precio de una
camiseta que costaba 30,00 $ pasa a ser en este instante de 45,00 $, aunque como no lo
tiene muy claro todava no lo ha confirmado.
En ese instante Luis, comercial de la misma compaa, crea una factura a su cliente en la
que le vende la camiseta de 30,00 $ a 45,.00 $.
Despus, nuestro indeciso Juan deshace la transaccin esperando a que el gerente
vuelva de vacaciones para cambiar los precios, mientras que Luis confirma el pedido. El
resultado, Luis ha vendido una camiseta a un precio que nunca ha existido en la base de
datos.
www.templatesclarion.com.ar
-- Script 1
-- PASO 1
use Northwind
go
set transaction isolation level
read uncommitted
begin tran
update products
set UnitPrice=UnitPrice*1.5
-- Ejecutar hasta aqu y pasar
-- al segundo script
-- PASO 3
-- Ahora desharemos la transaccin
rollback tran
-- Volvamos a comprobar el precio
-- en nuestro segundo script.
81
--Script 2
use Northwind
go
-- PASO 2
set transaction isolation level
read uncommitted
begin tran
--Ejecutamos antes de confirmar
-- o validar la transacin de la
-- conexin 1
select UnitPrice from Products
where ProductId=7
-- El resultado es 45.00
commit tran
-- ahora volvemos al script uno
-- y deshacemos la transaccin
-- PASO 4
select UnitPrice from Products
where ProductId=7
-- Ahora el resultado es 30.00
www.templatesclarion.com.ar
82
El nivel de aislamiento puede especificarse mediante el comando SET o bien mediante los
HINTS de SQL es decir indicando en la propia instruccin SELECT el nivel de aislamiento
deseado, por ejemplo para establecer el mnimo nivel de aislamiento adems de con SET
TRANSACTION ISOLATION LEVEL READ UNCOMMITTED podramos hacerlo en nuestro
ejemplo mediante el comando select UnitPrice from Products with(NOLOCK) where
ProductId=7 y el resultado sera 45,00 independientemente del nivel de aislamiento
indicado con la instruccin SET.
-- Vayamos al Script 4,
-- Paso 3
-- Dentro de la misma transaccin,
-- ejecutamos la misma instruccin
select ProductName From Products
where ProductId=77
Commit tran
-- Se llama de otra forma!!!
-- Volvamos al Script 6, Paso 4
-- Script 4
-- PASO 2
use northwind
go
Begin Tran
Update Products Set
Productname='Producto 77'
where ProductId=77
commit tran
--Volvamos al scrit 5 paso 3
-- Paso 4
-- Volvemos a actualizar al valor correcto.
Begin Tran
Update Products Set
Productname='Original
Frankfurter grne Soe'
where ProductId=77
commit tran
www.templatesclarion.com.ar
-- Script 5
-- PASO 1
use northwind
go
SET TRANSACTION ISOLATION LEVEL
REPEATABLE READ
Begin tran
select * From Products
where ProductId=1500
-- resultado (0 Filas)
-- Vayamos al Script 6,
-- Paso 3
-- Dentro de la misma transaccin,
-- ejecutamos la misma instruccin
select * From Products
where ProductId=1500
-- Ahora aparece un registro!!!!
-- Volvamos al Script 6, Paso 4
-- Paso 5
-- validamos la transaccin
commit tran
-- en este instante se termina el
-- bloqueo y se borra el registro
-- (en la otra conexin)
83
-- Script 6
-- PASO 2
use northwind
go
Begin Tran
-- Product Id es un campo identity
-- en la B.D. Northwind, por eso
-- debemos usar este comando si
-- queremos insertar un valor explicito.
set identity_insert Products on
insert into Products
(ProductId,ProductName)
values (1500,'Producto de pruebas')
set identity_insert Products off
commit tran
--Volvamos al scrit 5 paso 3
-- Paso 4
-- Borraremos el registro..
begin tran
delete from products where
ProductId=1500
commit tran
-- Obtendremos un bloqueo, ya que
-- este dato ha sido leido, por lo que
-- no puede ser eliminado
1.3.10.5 Serializable
El nivel de aislamiento serializable es el que ms se acomoda a lo que significa la
definicin ACID, pero por el contrario no permite una alta escalabilidad y si se usa mucho
puede provocar numerosos bloqueos e interbloqueos. En este caso lo que queda
garantizado es que dos instrucciones Select en la misma transaccin con nivel
serializable van a devolver el mismo conjunto de datos. Esto implica bloquear registros
que incluso No existen todava!, con esto evita el problema de los registros fantasma. Lo
que complica poderosamente su implementacin.
Un hecho que me gustara resaltar para que si usamos este nivel de aislamiento lo
hagamos con precaucin es lo sencillo que resulta producir un deadlock o abrazo mortal
con este nivel de aislamiento.
Probemos este script
www.templatesclarion.com.ar
84
-- Script 7
-- Paso 1
use northwind
go
SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE
BEGIN TRAN
-- Obtengamos el nombre del producto
77
SELECT ProductName
FROM Products Where ProductId=77
-- En este nivel de aislamiento hemos
-- creado un bloqueo de tipo compartido.
-- (No confundir con la granularidad
-- del bloqueo, es decir con qu
-- es lo que se bloquea)
-- hagamos lo mismo en el script nmero
8
-- Ahora actualizaremos el nombre del
-- producto
update Products
set ProductName ='Producto 77'
where ProductId=77
-- Obtenemos un bloqueo al intentar
-- convertir el bloqueo compartido
en exclusivo, ya que nuestra
-- segunda conexin tambin tiene un
-- bloqueo compartido sobre este
-- registro.
-- Pasemos al segundo script e
intentemos
-- tambinactualizar el nombre, tampoco
-- es tan raro que dos usuarios
-- quisieran cambiar el nombre a un
-- artculo (por una falta de
-- ortografa por ejemplo)
1.4
www.templatesclarion.com.ar
-- Script 8
-- Paso 2
use northwind
go
SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE
BEGIN TRAN
-- Obtengamos el nombre del
-- producto 77
SELECT ProductName
FROM Products Where ProductId=77
-- Hasta aqu ningn problema,..
-- volvamos al script 7..
-- Ahora actualizaremos el nombre
-- del producto
update Products
set ProductName ='Producto 77'
where ProductId=77
rollback tran
-- El resultado: que la primera
-- conexin obtiene un mensaje de
-- error indicandole que ha sido
-- vctima de un abrazo mortal
1.4.1
85
Propiedades de Archivos
Tab General
www.templatesclarion.com.ar
86
Full PathName: El Pathname se utiliza para definir el nombre fsico de la tabla mientras
que se identifica en el servidor.
No RECLAIM : Los drives SQLs no soportan el atributo RECLAIM.
Tab Options
www.templatesclarion.com.ar
87
Esta Seccion nos permite colocar opciones como por ej.. algunas propiedades de la tabla
que nos permita crear determinado cdigo en la generacion de templates.
Por ejemplo hay una opcion importante a partir del Clarion 6.3 a :
IsIdentity :
Esta opcion es a nivel Campo/Columna del DCT y nos permite activar la recuperacion de
un valor auto-incrementing del lado del servidor . De esta forma evitamos insertar a nivel
codigo "SELECT @@IDENTIty....." o "select Scope_Identity() ..." para recuperar el ultimo
numero del lado del motor.
El valor a insertar seria Isidentity =1 en User options.
Es valido aclarar que la columna debera contener el valor "Identity" en la Base de datos..
1.4.2
www.templatesclarion.com.ar
88
External Name
En primer lugar es valido aclarar que el atributo "External Name" se utiliza tambien para
agregar algun nombre externo a la columna (Campo). Este tipo de caso se puede dar
donde el nombre del campo de la tabla del dct es diferente al nombre de la columna de
la tabla de la base de datos. Por ejemplo si ud. esta accediendo a una tabla de una base
de datos que permiten nombres de columnas mas largos en longitud que Clarion, ud.
puede colocar el nombre que quiere manejar en clarion en el Atributo "Column Name" del
campo y en External Name colocar el nombre de la columna de la tabla del motor de
basedatos.
"Switches" aplicados a "SQL accelerators" en el "External Name":
| NOWHERE
Colocando NOWHERE le estamos diciendo al driver que excluya el campo de cualquier
clausula WHERE que se le envie desde clarion hacia el motor.
| READONLY
Adicionando READONLY le estamos diciendo al driver que no escriba en este campo
cuando el registro es actualizado.
| BINARY
Adicionando BINARY le estamos diciendo al driver que almacene los datos de este campo
en formato Binario. Esto es til al almacenar imgenes o caracteres no-imprimibles
| WRITABLE
WRITABLE es lo contrario a READONLY. Algunos "SQL backends" incorrectamente les
www.templatesclarion.com.ar
89
informan al driver que el campo es " read only" y deberia no ser actualizado. Este
switch informa al driver que puede escribir sobre este campo.
| ZERONOTNULL
ZERONOTNULL es usado en combinacion con el atributo "/ZERODATE=NULL " del "driver
string" . Este switch le informa al driver que este campo fecha en particular sea
actualizado en cero (0) si el mismo es 0.
Tabla Comparativa
En caso de que actualicemos las tablas primero en el dct y luego realizar las
modificaciones en el Motor, o bien realicemos una conversion de TPS a Motor, les
proporcionamos una tabla comparativa/equivalencia entre los tipos de datos MS-SQL y
Clarion:
Categoria
Equivalencia Clarion
Numericos Exactos:
Bigint
Decimal
Int
Numeric
Smallint
Money
Tinyint
Smallmoney
Bit
DECIMAL
DECIMAL(19)
LONG
LONG
SHORT
DECIMAL(19,4)
BYTE
DECIMAL(11,4)
BYTE
Datetime
Smalldatetime
Caracteres Strings:
REAL
REAL
STRING(8) with GROUP(DATE
and TIME)
STRING(8) with GROUP(DATE
and TIME)
Char
Text
Varchar
STRING
BLOB
CSTRING(51)
Nchar
CSTRING
Ntext
Nvarchar
BLOB
CSTRING
Binary Strings:
Binary
Image
Varbinary
STRING
BLOB,BINARY
STRING
Cursor
n/a
Unicode Caracteres
Strings:
www.templatesclarion.com.ar
90
Timestamp
sql_variant
Uniqueidentifier
Table
Xml
STRING(8)
STRING(8016)
CSTRING(37)
n/a
STRING(65535)
1.4.3
CODE
OPEN(MyFile)
MyFile{PROP: ServerAutoInc} !activamos el "server side autoinc"
MyFile{PROP:ServerAutoInc, 1} = 1 !le decimos al drive el nro de columna en la que se contie
Para que funcione esto obviamente necesitamos que el SQL-Server contenga la correcta definicion de
www.templatesclarion.com.ar
91
1.4.4
Claves/Indices (Keys)
Al momento de generar una aplicacion "Clarion SQL" es muy importante en el diseo del
diccionario el manejo de los indices/Claves. Para ello le proporcionamos determinadas
consideraciones al momento de crearlas/modificarlas.
www.templatesclarion.com.ar
92
Consideraciones:
1. NO usar tipos de datos "GROUP" en las Claves. Se pueden usar campos que
formen parte de grupos como componentes de una clave, pero no se puede utilizar el
campo "GROUP" como componente. Si en el dct de tps tenemos claves de con este tipo
de dato, deberiamos colocar cada campo que utiliza ese GROUP.
2. Clave Unica (Primaria) Asegurarnos que todas las tablas tengan una clave unica. En
SQL no existe el concepto de puntero de archivo o numero de Registro, entonces para
que el DRIVER pueda actualizar el registro necesitamos tener identificado
univocamente cada registro. Para esto necesitamos tener al menos una clave unica por
cada Archivo. Tengamos en cuenta que el PUT/ACCESS:File.Update() es convertido
por el driver a una sentencia SQL: UPDATE TABLA SET CAMPO = VALOR WHERE
ClaveUnica = Valor
3. CASE SENSITIVE: La mayoria de las base de datos usan el concepto del sensible a
mayusculas a nivel de toda la base de datos. Por tal motivo no se puede especificar
una llave sensible y otra NO. En realidad tambien si usamos claves sin CASE
SENSITIVE puede degradar la performance del motor, ya que las consultas generadas
van a usar la funcion UCASE.
4. IGUALAR CLAVES DE CLARION CON INDICES DEL MOTOR DE BASE DE DATOS:
Con SQL no es necesario que los indices del DCT sean exactamente igual a los del SQL.
Se pueden crear tantos indices en el dct como indices en el SQL independientemente.
Si hay diferencias NO va a a arrojar el error 47 el aplicativo. El driver utiliza los
componentes de las claves para generar el ORDER BY en los Querys. El problema es
que si no existe la clave en el SQL que coincida con ese ORDER BY , la consulta va a
funcionar mucho mas lenta de lo que pensamos.
5. "CSTRING" x "STRING"
1.4.5
www.templatesclarion.com.ar
93
Las reglas de RI son manejadas mas eficientemente si son definidas en el motor de base
de datos, usualmente utilizando Triggers, Stored Procedures, o sentencias de integridad.
Mediante esto, la base de datos puede automticamente administrar la integridad
referencial,, optimizando el trfico de datos, sin necesidad de enviar a los registros hijos
a travs de la red. (que sera el comportamiento por defecto de Clarion). Como el
servidor de base de datos ser el que maneje la funcionalidad de RI, la mejor opcin es
especificar Ninguna Accin
La integridad Referencial de los datos es recomendable que la maneje el servidor y no
Clarion.
Para ello se utiliza las siguientes configuraciones a nivel Dct:
Restrict
(Server)
Cascade
(Server)
Clear
(Server)
Estos seteos de tipo "server" tienen un mismo comportamiento que el "No Action", no
generan codigo desde clarion, sin embargo nos permiten conocer desde el lado de clarion
cuales son las relaciones y pueden ser usados por algun template de generacion de script
para el server.
1.4.6
1.4.6.1
Utility Template
Una de las formas de crear una tabla en una base de datos es mediante la creacion de un
script SQL.
Existen varios UTILITY templates circulando gratis dentro de la comunidad de usuarios
que nos permiten generar ese script. Por ejemplo uno de los mas utilizados es el de
Roberto Artigas DCT2SQL.
Una vez que hayamos generado el archivo *.SQL deberiamos ejecutar ese script. Para
esto utilizaremos el SQL Query Analyzer, o el winSQL o cualquier otra herramienta que
www.templatesclarion.com.ar
94
1.4.6.2
Synchronizer
Tpicamente, la forma de desarrollar aplicaciones SQL es importando una estructura de
tabla ya definida en el motor de base de datos. Aunque es posible editar manualmente
las estructuras de las tablas en el Editor de Diccionario de datos para tablas SQL,
recomendamos firmemente importar la definicin de la estructura de la tabla. Importar
las estructuras de las tablas, minimiza la posibilidad de introducir un error en el
diccionario y garantiza la correcta especificacin de los tipos de datos , estructuras de las
claves, etc. Este mtodo asume que las tablas ya estn predefinidas en el motor de base
de datos.
Mediante el Synchronizer, Clarion nos permite importar y sincronizar tablas desde el
motor hacia el dct.
El sincronizador del diccionario es probablemente la herramienta ms importante a
dominar al momento de manejar las tabla entre el motor y el dct.
Para acceder al mismo dentro del Editor del diccionario se debera ir al menu File -->
Dictionary Synchronizer.
Los pasos principales a realizar son los siguientes:
Conexion: En este paso se debera establecer los parametros de conexion a la base de
datos a sincronizar.
www.templatesclarion.com.ar
95
Seleccion de Tablas: Seleccionamos con que tablas vamos a trabajar en esta sesion
de Synchronizer .
En el ejemplo de abajo vemos como seleccionamos las tablas "clientes" y "clientes_telef"
que estan en la base y no se encuentran en el dct.
www.templatesclarion.com.ar
96
Resolver las diferencias entre la base de datos y el dct: Estas diferencias entre las
caractersticas de la base de datos/DCT necesitan siempre ser resueltas para ser
procesadas:
Una de las principales razones para utilizar el "Synchronizer" es para importar la
definicion de multiples tablas desde la base hacia el dct.
En el ejemplo que vemos abajo, visualizamos que las tablas "clientes" y "clientes_telef"
no se encuentran en el Dct y si en la base de datos (Source). Si presionamos el boton
derecho del mouse en el registro del archivo, veremos un menu popup con acciones a
tomar/decidir. En este caso le decimos que adicione la tabla a "ejemplo.dct" y de esta
manera quedaria resuelto esta diferencia ya que automaticamente al presionar OK nos va
a crear la definicion en el dct importandola desde la Base de datos.
www.templatesclarion.com.ar
1.4.6.3
97
File Import
Otras de las posibilidades que tenemos para la creacion de tablas en el dct es
importandola desde el motor.
Para ellos Clarion nos provee de una herramienta en el editor del Dct, a la que podemos
www.templatesclarion.com.ar
98
www.templatesclarion.com.ar
www.templatesclarion.com.ar
99
100
En este caso le decimos que adicione la tabla "Clientes_Telef" a nuestro dct y de esta
manera automaticamente nos va a crear la definicion en el dct importandola desde la
Base de datos.
1.4.7
www.templatesclarion.com.ar
101
Usuario
pwd
Password
1.4.7.1
Database Driver
Lo mas recomendable para aplicaciones de Clarion con MS-SQL es utilizar el driver
Nativo "Microsoft SQL" en Database Driver de las propiedades de la tabla en el dct.
El "SQL Accelerator Driver" es el que nos proporciona el acceso a los datos de la base de
datos.
.
Si importamos las tablas directamente desde el motor (Synchronizer /File Import )
vamos a ver que ya nos viene configurado el driver.
En el caso que creemos una tabla desde cero en el dct debemos seleccionar esta opcion.
Los SQL Accelerator Drivers comparten una base de cdigo comn y muchas
caractersticas como por ejemplo la tecnologa de Buffering, los Driver Strings , etc. Sin
embargo, su objetivo primario es traducir los comandos Clarion en eficientes sentencias
SQL para sus respectivos motores de bases de datos y manejar el resultado que ellos
devuelvan.
Los Accelerator Drivers convierten las sentencias de acceso a disco de Clarion ( SET, GET,
NEXT, etc.) a sentencias SQL optimizadas. Esto significa que puede usar el mismo cdigo
fuente para acceder a tablas SQL y a otros tipos de bases como por ejemplo Archivos
TopSpeed. Adems, los SQL Accelerator Drivers permiten enviar SQL propios que son
enviados directamente al motor e interpretan el resultado para ser procesado de manera
estndar usando los comandos NEXT y PREVIOUS.
www.templatesclarion.com.ar
102
1.4.7.2
ODBC
El ODBC (Open DataBase Conectivity) es una interfase estratgica de Windows para
acceder a los datos desde diferentes motores
de base de datos (RDBMS) a travs de una variedad de redes y plataformas. Es un
mtodo alternativo a los Drivers nativos. Su funcionamiento es mediante la utilizacin de
DLLs para cada una de las Bases de Datos.
Ventajas: ODBC es una excelente eleccin en un entorno de desarrollo Cliente Servidor,
especialmente si el Servidor es un motor de base de datos relacionales con SQL nativo
(Pervasive, Informix, Oracle, AS400, SyBase, etc..). Permite crear aplicaciones con
soporte Cliente Servidor sin hacer mucho ms que cambiar el Driver. Con ODBC el
Servidor puede manejar la mayor parte del trabajo con las bases de datos, especialmente
si se usan sentencias SQL complejas. Un buen diseo orientado a Cliente Servidor puede
incrementar considerablemente la performance de las aplicaciones.
Los Drivers ODBC existentes actualmente, cubren la mayora de los tipos de bases de
datos. Hay Drivers ODBC disponibles para las cuales Clarion aun no posee Drivers
nativos. (Access, Excel, Notes, etc..)
Cabe mencionar que existe el driver ODBC para tablas tps que nos permite utilizar, entre
otras cosas, algn producto de reportes como Crystal Reports, o algun gestor de
consultas como WinSQL.
ODBC es un estndar muy difundido actualmente, y la tendencia es que todas las bases
de datos ofrezcan acceso ODBC. En muchos casos tenemos disponibles varios tipos de
Drivers para la misma base.
ODBC es independiente de la plataforma. Uno de los principales objetivos de Microsoft al
establecer ODBC fue el de soportar un fcil acceso a los entornos corporativos en los
cuales las bases de datos se encuentran distribuidas en diversas plataformas o mltiples
motores de base de datos.
Desventajas: ODBC agrega una capa el ODBC Driver Manager- entre su aplicacin y la
base de datos. Cuando se accede a datos en su disco local, esto generalmente deteriora
la performance. El Driver Manager debe traducir cada llamada al API ODBC de la
aplicacin a SQL, antes de que ocurra cualquier acceso a los datos.
La informacin requerida por el ODBC para conectarse a una fuente de datos (data
Source) varia de un Driver a otro. Al contrario que la seleccin del Driver nativo de
Clarion en el cual la operacin es virtualmente transparente; Ud. necesitar conseguir
informacin especfica de configuracin de cada Driver.
ODBC no est incluido en Windows. Cuando distribuya su aplicacin, Ud. necesitar
instalar los correspondientes Drivers junto con el Administrador de ODBC en el sistema
del usuario final. Los Drivers ODBC pueden ser configurados desde el Administrador de
ODBC del Panel de Control. Es muy comn que el usuario final utilice incorrectamente
esta herramienta, y casi cualquier cambio en la configuracin de los data sources har
que nuestra aplicacin deje de funcionar por resultarle imposible conectarse a la fuente
de datos, o peor aun hara que se conecte de manera ineficiente degradando la
performance o provocando su mal funcionamiento
1.4.8
www.templatesclarion.com.ar
103
CREACION DE DCT
Primeramente para realizar las modificaciones al DCT de Clarion debemos hacerlo a
partir de un nuevo diccionario y tenemos tres posibilidades de hacerlo:
1. Copiando el archivo "*.dct"
www.templatesclarion.com.ar
104
No RECLAIM : Los drives SQLs no soportan el atributo RECLAIM, por ende debemos
sacar este atributo para las aplicaciones SQL.
(Si se utilizo metodo de "TXD" para la creacion del nuevo diccionario , se podria realizar una busqueda
"RECLAIM,"
y reemplazar con "")
TIPOS DE DATOS
Otro de los grandes cambios a considerar dentro de la migracion de un aplicativo de tps a
Motor son los tipos de Datos.
LONG a DATE (Fecha) / TIME (Hora)
En los sistemas TPS, generalmente los datos de fecha y Hora se almacenan como LONG.
Estos se deben convertir a DATE y TIME ya que desde clarion se van a serguir trabajando
sin problemas, pero para que los datos sean accesibles desde herramientas externas a
Clarion como por ej. Crystal R eports, Reporting Services, etc. es necesario realizar la
conversion. ( ver manejo de Fechas)
MEMO a CSTRING :
Los drivers SQLs no soportan campos con tipos de datos MEMOs, por tal motivo es
necesario cambiar a tipo de dato CSTRING.
Ver Tipos de Datos Clarion / MS-SQL para mas detalle con respecto a los tipos de datos
Clarion / MS-Sql.
CLAVES (keys):
Recomendamos revisar Claves/Indices (Keys) de este manual para realizar las
modificaciones correspondientes al manejo de Claves/indices de una tabla.
1.4.8.1
1.4.8.2
Manejo de Fechas
En sistemas con archivos TPS, generalmente los datos de fecha y de la hora se
almacenan como tipo de datos LONG. Estos se deben convertir a Campos DATE y TIME,
para que los mismos sean facilmente accesibles desde herramientas de terceros. O sea si
www.templatesclarion.com.ar
105
dejamos los campos como LONG (INT en el Motor) lo vamos a seguir trabajando sin
problemas desde Clarion, pero no se van a ver correctamente por ej. desde el SQLEditor
o desde Cristal Report, Reporting Services,etc..
Microsoft utiliza dos tipos de datos para identificar informacion de fecha y hora :
SMALLDATETIME y DATETIME.
En ambos casos se manejan de la misma manera en clarion:
Aud_Fecha STRING(8)
GFecha GROUP,Over(Aud_Fecha)
Aud_Fecha_Date DATE ! Ud. debe modificar este campo (fecha)
Aud_Fecha_Time TIME ! Ud. debe modificar este campo (Hora)
END
Un dato muy importante, es que si Ud. no necesita manejar la Hora dentro de su campo
de Fecha , puede cambiar la definicion de arriba a:
Aud_Fecha
1.4.8.3
DATE
1.5
www.templatesclarion.com.ar
106
StupidTempTable
Codigo Clarion Vs. SQL
Manejo de Errores
Manejo Set, Next, Previous
Clarion y NULLs
SQL / VIEWs
Browses
SQL Advanced Tab
Process /Reports
Transacciones Batch
Manejo de Transacciones
Stored Procedures
Usando TurboSQL
Uso del trace
Cargas de Cabecera - Detalle
Creando un Editor de SQL
1.5.1
Recomendaciones
Este es un resumen de las consideraciones a tener en cuenta al desarrollar una
aplicacion Cliente Servidor.
Estas consideraciones tienen como objetivo evitar problemas tanto de performance
(lentitud) como de errores en el funcionamiento de nuestra aplicacin.
El objetivo de una aplicacin Cliente Servidor es distribuir coherentemente el trabajo
entre la terminal Cliente y el Servidor de Base de Datos.
Mas que nada hay que tratar de evitar la sobrecarga de trabajo en el servidor y
minimizar el volumen de trafico por la red.
www.templatesclarion.com.ar
107
TakeCompleted).
Claves Primarias en las Tablas
En SQL no existe el concepto de puntero del archivo. Para actualizar un registro se
necesita obligatoriamente algun campo o grupo de campos que definan univocamente el
registro. Esto es: Una clave primaria.
Para que el driver convierta los PUT o DELETE en sus correspondientes sentencias SQL,
tiene que especificar la sentencia Where sobre la que se va a realizar la actualizacion.
Por ejemplo
(Primero posicionarse con NEXT, o GET)
ORD:Saldo = 0
PUT(Ordenes) ACCESS:Ordenes.Update()
Se traduce como:
www.templatesclarion.com.ar
108
Campos Cstring
Cambiar todos los campos STRING(n) del DCT por CSTRING (n+1). Los campos STRING
dan muchos problemas, mas que nada en las claves y busquedas
Definir solo los campos que se usan
En algunos casos no es necesario tener en el DCT todos los campos de la tabla.
Por ejemplo podemos tener campos adicionales de auditoria en las tablas con valores por
default que no es necesario esten en el DCT.
Transacciones en procesos
Siempre que necesitemos hacer un proceso y no podamos usar SQL, es conveniente
encerrar todo el procesamiento en un bloque LOGOUT COMMIT.
De esta manera el SQL confirmara todo el lote de comandos cuando llegue al COMMIT.
Siendo el proceso mucho mas rapido.
Evitar los Relation Trees
El Relation Tree es un control Template que consume bastantes recursos.
Hay que evitar usarlo y mas aun si el primer nivel del arbol es muy grande ya que
siempre carga los niveles completos en memoria.
Acerca de los Browses
1.5.2
1.5.3
Validacion de Datos
La validacin de los datos se refiere al cumplimiento de las reglas del negocio
(especificadas por el programador). En particular, los valores que cada campo pueda
tomar en la base de datos. Algunas validaciones tpicas fuerzan cosas como : un campo
no puede ser dejado en blanco (o cero) , el campo debe contener un valor 1 0 , el
campo debe estar en un determinado rango, el campo debe existir en una clave primaria
de otra tabla.
Estas reglas de validacin pueden ser especificadas tanto en el Cliente como en el
Servidor. La mejor manera de implementar este tema es minimizando el trfico de red,
por ende la mejor solucin sera resolverlo en el cliente. Alternativamente, puede
duplicarse esta lgica y estar definida en ambos lados logrando as el siguiente esquema:
Al declarar las reglas de validacin en el Cliente se asegura que los datos enviados
por el Cliente sean vlidos. Ya que el servidor va a recibir siempre datos vlidos (de
esta aplicacin) entonces nunca generar mensajes de error. El efecto es que esta
www.templatesclarion.com.ar
109
1.5.4
1.5.5
Prop:SQL
Prop:SQL es la propiedad de una Tabla o una Vista que permite enviar cualquier SQL
directo al motor de base de datos.
La sintaxis de Prop:SQL es la misma que cualquier otra propiedad del lenguaje Clarion. El target (dest
MiTabla{Prop:SQL} = SELECT * FROM UnaTabla
www.templatesclarion.com.ar
110
Esta sentencia SQL es enviada al motor de base de datos. Notar que el Target
(destinatario) de la propiedad es MiTabla mientras que el query se refiera a UnaTabla.
Debido a que un SELECT retorna un grupo de registros entonces hay que utilizar el
comando NEXT() para retribuir un registro a la vez. La estructura de la tabla MiTabla
deber tener la misma cantidad de campos que UnaTabla. El ejemplo anterior no
demuestra el mtodo optimo ya que los File Drivers generaran un mejor query, y
adems automtico, para resolver esta consulta.
La verdadera potencia de PROP:SQL es realizar tareas y/o funciones que no tengan su
respectiva contrapartida en el Lenguaje Clarion. Un ejemplo sera la creacin de tablas en
el servidor de base de datos. Aunque el comando CREATE crea las tablas este est
limitado por la informacin guardada en la estructura de la tabla. Es mucho mejor utilizar
en este caso PROP:SQL para crear la tabla ya que podemos agregar mas informacin
como por ejemplo validacin de datos , restricciones, etc. Por ejemplo, el siguiente
cdigo permite crear la tabla de Estudiantes:
MiVista{PROP:SQL} = CREATE TABLE
(CodEstudiante
Apellido
Nombre
CodCarrera
PRIMARY KEY
FOREIGN KEY
REFERENCES
ON DELETE
Estudiantes
INTEGER NOT NULL,
VARCHAR(25) NOT NULL,
VARCHAR(25) NOT NULL
INTEGER,
(CodEstudiante),
CURSA (CodCarrera),
Carreras,
RESTRICT)
&|
&|
&|
&|
&|
&|
&|
&|
&|
Este SQL especifica dos cosas que son imposibles de hacer usando el CREATE de Clarion.
Primero, el atributo NOT NULL especifica que deben existir datos en esa columna.
Segundo, la condicin de integridad referencial especifica la relacin entre la tabla de
Estudiantes y Carreras indicando que no se puede borrar una carrera si esta tiene
estudiantes.
Otra utilizacin de PROP:SQL es el llamado a Store Procedures (Procedimientos Creados
en la base de datos utilizando SQL extendido). En la mayora de bases de datos basados
en SQL los Store Procedures contienen una versin pre-compilada de sentencias SQL .
Debido a que los Store Procedures estn guardados en la base de datos nos permite una
mejor integracin y reusabilidad entre distintas aplicaciones.
El uso de SQL embebido es particularmente eficiente en procesos de actualizacin
masivos de la base de datos, y es en este punto donde podemos utilizarlo para marcar
una gran diferencia en los tiempos de respuesta entre el cdigo Clarion nativo y el SQL.
Por ejemplo si queremos aumentar en un 5% los precios de los productos de
determinado rubro se puede utilizar la siguiente sentencia SQL en lugar de un proceso
Clarion.
MiTabla{PROP:SQL} = UPDATE Productos SET &|
precio=precio * 1.05 WHERE rubro=X
Ntese que los nombres usados en las sentencias SQL son los del servidor, no los de
Clarion. O sea ponemos rubro (o tabla.rubro) en lugar de PRO:RUBRO.
www.templatesclarion.com.ar
1.5.6
111
Comando BUFFER
El comando BUFFER de Clarion puede tener un impacto tremendo en la performance de
aplicaciones Cliente/Servidor. BUFFER le indica al Driver que utilice un buffer para
almacenar registros previamente ledos como as tambin un buffer para registros
read-ahead (Lectura Anticipada) . Tambin permite especificar el tiempo de time-out
de una pgina. Es decir, el tiempo de vencimiento de una pgina de datos. Luego de
vencerse este tiempo el Driver vuelve a leer esta pgina al buffer.
Cuando el File Driver sabe que tiene buffers para guardar mltiples registros puede
optimizar los querys para aprovechar esta capacidad. Esto permite que el servidor
devuelva varios registros a la vez (grupo de registros) en lugar de regresar de a uno por
vez. Esta tcnica se la conoce con el nombre de Fat Fetches (Lecturas Gordas). El
efecto neto de este cambio es que ahora en lugar de tener muchos paquetes pequeos
viajando por la red tenemos uno mas grande (haciendo mas eficiente el trfico de la
red). El lugar mas comn para la utilizacin del comando BUFFER sera en
procedimientos que permitan al usuario realizar un Browse de Registros de la base.
Al utilizar buffers para guardar registros ya ledos, el cliente al necesitar nuevamente
estos registros los trae del buffer de memoria en lugar de necesitar realizar otro query y
esperar su resultado, logrando as una gran reduccin de trfico en la red.
Al utilizar buffers de Lectura Anticipada, la aplicacin cliente se anticipa y trae a memoria
la prxima pgina de registros mientras el usuario est leyendo la primer pgina. De esta
manera, cuando el usuario realmente pide la prxima pgina esos registros ya se
encuentran en el buffer dndole al usuario la sensacin de retribucin instantnea.
Cuan se utiliza un prop:sql con el comando BUFFER(TableName, 0) antes del PROP:SQL le estamos i
BUFFER(TableName, 0)
TableName{PROP:SQL} = 'SELECT Field1, Field2, FROM TableName'
NEXT(TableName)
Ahora bien, tambien podemos utilizar BUFFER(TableName, 20) y de esta forma le estamos diciendo a
Por Ejemplo:
BUFFER(TableName, 20)
TableName{PROP:SQL} = 'SELECT Field1, Field2, FROM TableName'
NEXT(TableName).
1.5.7
Prop:SQLFilter
Prop:SQLFilter es la propiedad que permite agregar un filtro propio a la estructura
WHERE de una sentencia SQL enviada al motor de base de datos.
Esta propiedad permite especificar un filtro para una estructura Tabla y/o Vista utilizando
la sintaxis del servidor en lugar de la sintaxis de Clarion.
Por defecto, Prop:SQLFilter reemplaza cualquier expresin en el atributo Filter. Sin
embargo, al comenzar el filtro con el smbolo +, el File Driver adicionar este filtro al
filtro ya existente de acuerdo al atributo FILTER del SQL generado.
www.templatesclarion.com.ar
112
WHERE A.CodCliente =
....
PARENT.Reset()
1.5.8
Prop:WHERE
Prop:Where es la propiedad que permite agregar un filtro propio a la lectura secuencial
de un archivo (conjuncion de LOOP NEXT (FILE), etc ), utilizando la sintaxis del servidor
en lugar de la sintaxis de Clarion.
PROP:WHERE puede setearse tambien en el diccionario como una propiedad del "driver
string", pero esto no va a afectar el comportamiento de los Views.
Ejemplo:
Supongamos que queremos procesar todas las compras de un Cliente del ao actual:
Clear(Ord:Record)
Ord:CustomerId = 100
Set(Ord:K_CustomerId,Ord:K_CustomerId) .
Orders{Prop:Where}='Year(OrderDate)=Year(GetDate())'
Loop Until Access:Orders.Next()
!......... procesamiento de datos
END
Esto genera el siguiente query SQL:
select ...
www.templatesclarion.com.ar
113
from Orders
where CustomerId >= 100
and Year(OrderDate)=Year(GetDate())
Ntese que PROP:Where debe estar ubicado luego del SET y antes del LOOP. Tenga en cuenta que la
1.5.9
Ejemplo:
A continuacion describimos un ejemplo de un query en el que se filtran todas aquellas
ventas que ser realizaron en un dia determinado (Variable Loc:Fecha). En el mismo
notamos que la fecha es tratada como tipo de dato STRING, o sea con comillas dobles al
momento de comparar - Shippeddate = ''' & FORMAT(Loc:Fecha,@d12-)& ''''.
En este caso tambien observamos que al momento de recibir y guardar el dato de Tipo
DATE (OrderDate/R:Campo4) tambien se le realiza un DEFORMAT() con picture "@d10-"
para visualizar la fecha correctamente.
www.templatesclarion.com.ar
'&|
114
!!!Resultado de la consulta
1.5.11 StupidTempTable
Para que necesitamos esta teoria?
Esta teoria se utiliza para los siguientes casos:
Para obtener y manipular facilmente campos calculados por el server. (Esto se puede
www.templatesclarion.com.ar
115
aplicar a funciones como sum, avg, max, etc como tambien a la llamada de stored
procedures)
Para no tener que establecer relaciones en el diccionario por cada JOIN que se nos
ocurra usar.
Para no necesitar definir una clave por cada ordenamiento que necesitemos de las
tablas, independientemente de las relaciones entre las mismas.
END
END
Obteniendo Informacion y asignacion de valores a una variable:
www.templatesclarion.com.ar
116
= Stt:Distancia
END
www.templatesclarion.com.ar
117
DELETE, ...)
Stored Procedure: Muy Rapido. Ejecuta dentro del server muchas sentencias SQL
complejas. Pre compilado y optimizado. Utiliza SQL extendido (LOOP, IF, ....)
Ord:Nombre = PEREZ
SET(Ord:Nombre,Ord:Nombre)
LOOP
NEXT(Ordenes)
!... Proceso
END
www.templatesclarion.com.ar
118
Conocido = Desconocido
Evala a Desconocido
Desconocido = Desconocido
Evala a Desconocido
Desconocido <> 10
Evala a Desconocido
1 + Desconocido
Evala a Desconocido
Las nicas excepciones a esta reglas son las operaciones booleanas que utilicen los
operadores OR y AND donde parte de la expresin es desconocida y la otra porcin
cumple con el criterio:
Desconocido OR True
Evala a Verdadero
True OR Desconocido
Evala a Verdadero
Evala a False
Evala a False
El soporte de valores nulos es dependiente del File Driver. La mayora de los motores de
bases de datos soportan el concepto de valores nulos, mientras que la mayora de las
bases de datos no-sql no lo soportan.
Puede usar el comando NULL() para detectar si un valor es nulo o no. Para cualquier
campo que deba permanecer nulo al escribir en la tabla, el programador deber
explcitamente setear el campo a nulo utilizando SETNULL(). Por ejemplo,
NEXT(MiTabla)
FlagMiCampo = NULL(MiCampo)
(mas cdigo)
www.templatesclarion.com.ar
119
PROJECT
Una operacin Project relacional notifica al servidor de base de datos que solamente
utilice un subgrupo de las columnas (campos) de la tabla (reduciendo el trfico). Por
ejemplo, la vista siguiente devolver solamente algunos de los campos de la tabla de
Estudiantes.
MiVista
VIEW(Estudiantes)
PROJECT(Est:Nombre,Est:Apellido,Est:CodCarrera)
END
JOIN
Un Join relacional automticamente une (Join) renglones (registros) de mltiples tablas y
los convierte en un nico resultado que el servidor retorna al Cliente. La estructura VIEW
asume que se desea realizar un LEFT OUTER JOIN ( unin que devuelve todo el Set de la
izquierda con sus uniones de la derecha . Es decir que la cantidad de registros totales del
resultado es siempre igual a la cantidad de registros de la tabla primaria). A partir del
atributo INNER es posible cambiar el modo en que se deban realizar los JOINS. Por
ejemplo, la siguiente estructura VIEW devolver todos los estudiantes con el Nombre de
la carrera que estn estudiando.
www.templatesclarion.com.ar
120
MiVista
VIEW(Estudiantes)
PROJECT(Est:Nombre,Est:Apellido,Est:CodCarrera)
JOIN(Car:CodCarrera,Est:CodCarrera)
PROJECT(Maj:NombreCarrera)
END
END
FILTER
El atributo Filter (Filtro) en una vista permite especificar una expresin filtro para indicar
que registros quiero ver. Esto generar un WHERE en el SQL generado. Por ejemplo, la
siguiente vista solamente devolver aquellos estudiantes cuyo nombre sea Aldo.
MiVista VIEW(Estudiantes),FILTER(Est:Nombre= ``Aldo )
PROJECT(Est:Nombre,Est:Apellido,Est:CodCarrera)
END
ORDER
El atributo Order (Orden) en una vista permite especificar como debe estar ordenado el
resultado del query. Esto generar un ORDER BY en el SQL generado. Por ejemplo, la
siguiente vista devolver a los estudiantes ordenados en forma descendente por apellido
y en forma ascendente por nombre
MiVista VIEW(Estudiantes),ORDER(-Est:Apellido,+Est:Nombre)
PROJECT(Est:Nombre,Est:Apellido,Est:CodCarrera)
END
Naturalmente todos estos conceptos pueden ser combinados (usados simultneamente)
para lograr Filtrar,Ordenar,Projectar y Unir obteniendo as el resultado deseado.
1.5.17 Browses
A continuacion detallamos algunas reglas basicas que se debe conocer al momento de Configurar los p
Lo mejor seria que los browses siempre se muestren filtrados lo mas posible y por los
componentes de la clave.
Si un browse no se abre instantaneamente, entonces es que tenemos un problema... y
cuanto mas crezca esa tabla el problema va a ir en aumento.
121
puede usar INNER en las propiedades de todas las relaciones, ya que por defecto Clarion
genera un JOIN del tipo OUTER que es mucho mas costoso de resolver.
= Codigo + IdAutonumber
= Descripcion + IdAutonumber
De esta forma nos estamos asegurando que el browse va a ser muy rapido al
momento de ejecutarse el mismo.
Otro efecto anomalo de "NO Utilizar Claves Unicas" que nos puede aparecer en los
browses es la duplicacion de registros al momento de visualizarlos.
www.templatesclarion.com.ar
122
Pero como eso es virtualmente imposible, tratemos de usar siempre locators Entry.
Si es absolutamente necesario usar Locators que se refresquen con cada tecla, entonces
es preferible Filtered que Incremental.
Tengamos en cuenta que con este tipo de Locators se prepara y ejecuta una sentencia
SQL y vuelve un conjunto de datos por cada tecla que presiona el usuario!
Usando locators Filter en sus Browses en lugar de locators Step o Incremental puede
reducir el volumen de datos enviados entre el cliente y el servidor.
Mientras los locators Step o Incremental producen trafico SQL del tipo:
SELECT campos ... WHERE CampoLocator >= "VALOR"
El subconjunto de datos retribuido es mucho mayor que en la sentencia generada por un
locator Filter:
SELECT campos ... WHERE CampoLocator LIKE VALOR*
Tener en cuenta que la sentencia LIKE es muy ineficiente si no existe un ndice por ese
campo, y que adems la mayora de los motores no soportan un LIKE sobre campos
numricos.
www.templatesclarion.com.ar
123
La idea de este template es bastante simple: Configurar una lista de campos a ser
mostrados en el VIEW y especificar como se cargan esos campos. Con los valores
especificados arriba, el template generara el codigo SQL adecuado para cada campo.
Para ello utiliza el comando PROP:Name para sustituir un campo en la declaracion del
Select.
Ejemplo:
En un Browse quiero mostrar el total vendido por producto. En este ejemplo vamos a
utilizar la tabla Order_details de la base de datos northwind. Esta tabla tiene el detalle de
lo vendido por productos, con lo cual necesitamos hacer un SUM(TOTAL) de la misma
por productos.
Si lo hariamos desde el motor la sintaxis correcta seria:
www.templatesclarion.com.ar
124
En el "list Box Format" del browse, mostramos el codigo + Nombre del Producto
(Products) y el campo de UnitPrice (Order_details).
Si observamos el tab "SQL Advanced" vamos a ver que hay 2 campos con asignaciones
de datos. La razon por la cual Ord:ProductId tiene un valor '1' es porque los mismo se
www.templatesclarion.com.ar
125
www.templatesclarion.com.ar
126
www.templatesclarion.com.ar
127
Siempre que agregamos o modificamos datos dentro de un LOGOUT estos datos quedan
Lockeados. Si algun browse o reporte intenta leer estos datos va a quedar colgado.Por
esto las transacciones deben ser siempre lo mas cortas posible. Nunca se debe dejar una
transaccion abierta con algun mensaje o intervencion pendiente del usuario.
Un ejemplo claro de mala practica es iniciar una transaccion (LOGOUT) en el Init de una
carga de cabecera / detalle, un COMMIT en el TakeCompleted y un ROLLBACK en el
Cancel. Todos los registros que se agreguen estan lockeados hasta que el usuario no se
decida, generando lockeos con otras terminales.
Lo que debe hacerse es trabajar todo en memoria o tablas auxiliares y confirmar todo el
procesamiento transaccional en el minimo tiempo posible (generalmente en el
TakeCompleted).
END
END
2) Llamando a un stored que no devuelve datos :
www.templatesclarion.com.ar
128
Ejemplo:
www.templatesclarion.com.ar
129
Estas opciones se almacenan en el archivo WIN.INI, siendo para este ejemplo los
siguientes valores:
[CWODBC]
Trace=1
TraceFile=c:\temp\log_fb_test_01.txt
Profile=1
Details=1
Flush=1
Profile=1 (Show Clarion Statements) indica que se debe incluir informacin respecto
de los comandos de Clarion sobre la lectura/escritura de archivos
Details=1 (Show record buffer contents) indica que se debe incluir informacin
sobre el contenido de los registros (buffers) de los archivos. Slo se habilita si Profile=1
. En caso de que el archivo se encuentre encriptado, para poder ver el contenido del
registro tambin hace falta activar la propiedad PROP:AllowDetails sobre el driver
('/ALLOWDETAILS =TRUE' )
Trace=1 (Trace calls to back end) indica que se debe incluir informacin sobre el
cdigo sql generado hacia el motor, con su correspondiente cdigo de retorno desde el
motor
En File to store tracing in (TraceFile) se indica el nombre del archivo que se va a
generar; si desea redireccionar la informacin generada hacia el debug, debe tipear la
palabra reservada DEBUG
www.templatesclarion.com.ar
130
05BCH(2) 19:57:13.326
05BCH(2) 19:57:13.326
Taken:0.00 secs
05BCH(2) 19:57:13.326
Taken:0.00 secs
05BCH(2) 19:57:13.326
secs
05BCH(2) 19:57:13.326
Taken:0.00 secs
05BCH(2) 19:57:13.326
Taken:0.00 secs
05BCH(2) 19:57:13.346
secs
05BCH(2) 19:57:13.346
05BCH(2) 19:57:13.346
05BCH(2) 19:57:13.346
Taken:0.00 secs
05BCH(2) 19:57:13.346
secs
05BCH(2) 19:57:13.346
05BCH(2) 19:57:13.346
05BCH(2) 19:57:13.346
Taken:0.00 secs
05BCH(2) 19:57:13.346
secs
05BCH(2) 19:57:13.346
05BCH(2) 19:57:13.346
Time Taken:0.00
SET_PROPERTY(VIEW:187AB8:COUNTRY:0187A68H)
SETview(VIEW:187AB8:COUNTRY:0187A68H)
NEXT(VIEW:187AB8:COUNTRY:0187A68H)
Time Taken:0.02
Time
Time Taken:0.00
COU:COUNTRY : 'Austria'
COU:CURRENCY : 'Schilling'
POSITIONfile(VIEW:187AB8:COUNTRY:0187A68H)
NEXT(VIEW:187AB8:COUNTRY:0187A68H)
Time
Time
COU:COUNTRY : 'Australia'
COU:CURRENCY : 'ADollar'
POSITIONfile(VIEW:187AB8:COUNTRY:0187A68H)
NEXT(VIEW:187AB8:COUNTRY:0187A68H)
Time
Time
Time Taken:0.00
COU:COUNTRY : 'Belgium'
COU:CURRENCY : 'BFranc'
Ademas del trace tradicional mediante la pantalla que hemos detallado, tambin se
puede controlar la informacin de manera condicional, mediante el uso de propiedades
enviadas al driver
Por ejemplo:
SYSTEM{PROP:DriverTracing} = ''
SYSTEM{PROP:DriverTracing} = '1'
tabla{PROP:Profile}=Pathname
www.templatesclarion.com.ar
tabla{PROP:Profile}=''
LOC:Nombre = tabla{PROP:Profile}
tabla{PROP:Log}='test'
tabla{PROP:Details}=1
tabla{PROP:Details}=0
131
!setea Profile=0
!consulta el nombre del archivo log
!escribe el 'test' en el archivo log
!setea Details=1
!setea Details=0
www.templatesclarion.com.ar
132
Recordemos que siempre se debe usar un String de conexin variable en el Owner de las
tablas.
www.templatesclarion.com.ar
www.templatesclarion.com.ar
133
134
Para simplificar el ejemplo usaremos codigo basico CLARION, no ABC. Por lo tanto
deshabilitamos el Defer Open Files.
Si no lo hicieramos, la tabla SQL podria no estar abierta cuando quisieramos recorrerla
con NEXT.
(En general yo siempre deshabilito ese check.)
www.templatesclarion.com.ar
www.templatesclarion.com.ar
135
136
En Local Data definiremos una variable TextoSQL donde poder escribir las sentencias SQL
a ejecutar y una cola de memoria donde vamos a guardar los resultados.
A los campos de la cola de memoria le ponemos los mismos nombres que a la tabla SQL
para poder hacer directamente una asignacion profunda :=:
www.templatesclarion.com.ar
www.templatesclarion.com.ar
137
138
www.templatesclarion.com.ar
139
www.templatesclarion.com.ar
140
www.templatesclarion.com.ar
1.6
www.templatesclarion.com.ar
141
142
www.templatesclarion.com.ar
143
Ejemplos
1.6.1
1.6.2
Ejemplos
El curso de SQL, cuenta con dos ejemplo de Clarion (App/Dct) . Los mismos fueron
desarrollados en Clarion6 cuyo dct se realizaron importando la Base Northwind del Motor
MS-SQL a un dct.
Luego de la instalacion del manual, se encuentran ubicados en el sub-directorio
"ejemplos" del directorio de instalacion del mismo (por defecto: "C:\ClarionCursoSQL")
Northwind.app
Este app contiene ejemplos de:
Uso de Prop:Where
www.templatesclarion.com.ar
144
sqlEditor.app
Este app contiene el ejemplo del Editor de sql.
www.templatesclarion.com.ar
www.templatesclarion.com.ar
145
Index
Integridad 92
Integridad de los datos
Index
-K-
-A-
Keys
Advanced Tab
Archivos 85
-LLogin
Batch 126
Browses Lentos?
BUFFER 111
91
122
-B-
108
-M-
120
-C131
-NNext 117
Normalizacin
Nulls 118
ODBC 102
Owner Name
-P-
100
Previous 117
Process 125
Prop:SQL 109
Prop:SQLFilter 111
Prop:Where 112
Propiedades 85
-R-
-F51
-IIndices
16
-O-
-D-
fecha
24
91
www.templatesclarion.com.ar
Recomendaciones
Relaciones 92
Reports 125
106
31
147
148
-SSet 117
SetFilter + SQL 113
sintaxis de Transact-SQL
SQL 122
SQL Embebido 109
SQLIdentity 90
Stored Procedures 127
Stupid table 114
Subconsultas 64
53
-VValidacion 108
VIEW 119
www.templatesclarion.com.ar