29 de octubre de 2002

Campos calculados en tablas SQL Server 2000

Para ahorrarse un poquitin de trabajo. Cuando almacenamos unicamente el valor de una llave foranea en una tabla, posteriormente debemos hacer una vista o hacer una relacion en un informe para desplegar regularmente campos de descripcion.

Se preguntaran que tiene que ver esto con los campos calculados, por ejemplo al definir una tabla en SQL Server, podemor crear un campo calculado de esta manera, ejemplo:

CREATE TABLE [tbl_empleados] (
	[id_empleado] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
	[nombres] [char] (60) COLLATE Modern_Spanish_CI_AS NULL ,
	[cuota_facturacion] [numeric](10, 2) NULL 
	CONSTRAINT [PK_tbl_empleados] PRIMARY KEY  NONCLUSTERED 
	(
		[id_empleado]
	)  ON [PRIMARY] 
) ON [PRIMARY]

Almacenamos en ella una lista de empleados con su codigo, nombre y cuota de facturacion, posteriormente necesitariamos una tabla donde almacenar las horas laboradas y hacer un calculo del valor con relacion al tiempo trabajado multiplicado por su cuota de facturacion, hariamos entonces una tabla parecida a esta:

CREATE TABLE [tbl_registro_de_empleados] (
	[id_empleado] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
	[nombres] [char] (60) COLLATE Modern_Spanish_CI_AS NULL ,
	[cuota_facturacion] [numeric](10, 2) ,
	[horas_trabajadas] [numeric](10, 2) ,
	[valor_a_pagar] as  cuota_facturacion*horas_trabajadas ,

Esta tabla esta bien, podriamos almacenar el codigo del empleado, sus horas trabajadas, almacenar el valor por hora y el campo calculado nos daria el resultado de multiplicar las horas por su cuota de facturacion. Sin embargo, cuando hagamos un informe, necesitariamos hacer una relacion con el archivo de empleados, para saber su nombre, y alli es donde entra a funcionar lo que les quiero dar a conocer, en SQL 2K, se implementaron las UDF (funciones definidas por el usuario), podriamos usar un select e incluir una funcion que creemos que nos devuelva el nombre del usuario en base al registro seleccionado y esto tambien funciona, sin embargo, algo que probe y funciono de maravilla, fue el crear un campo calculado en una tabla que haga referencia a una funcion y que almacene automaicamente el valor que nos devuelve la funcion por cada registro introducido, evitando asi, el hacer relaciones de mas y sobre todo, el mantener actualizada la data en la tabla, e aqui el ejemplo de como realizar un campo calculado que llame a una funcion para devolver data de otra tabla.

Primero creamos la funcion:

CREATE FUNCTION fn_nombre_empleado (@id_empleado char(10))
RETURNS char(60) AS  
BEGIN 
declare @nombre char(60)

select @nombre=ltrim(rtrim(nombres)) from tbl_empleados where id_empleado=@id_empleado

return @nombre

END

Luego redefinimos nuestra tabla y le agregamos un campo calculado que se llame nombre del empleado la tabla quedaria de esta manera:

CREATE TABLE [tbl_registro_de_empleados] (
	[id_empleado] [char] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
	[nombres] [char] (60) COLLATE Modern_Spanish_CI_AS NULL ,
	[cuota_facturacion] [numeric](10, 2) ,
	[horas_trabajadas] [numeric](10, 2) ,
	[valor_a_pagar] as  cuota_facturacion*horas_trabajadas ,
	[Nombre] as  .dbo.fn_nombre_empleado(tbl_registro_de_empleados.id_empleado))

Con esto obtendriamos que cada vez que se ingrese un codigo de empleado, la tabla nos despegaria el nombre del mismo y podriamos hacer informes mucho mas rapido y sin tener que almacenar la data o hacer relaciones.

Espero que les sirva.

Fernando España

No hay comentarios. :

Publicar un comentario