jueves, 25 de septiembre de 2008

Solo para Fanaticos de SQL Server

Estos dias me abstuve de hacer nuevos escritos en este blog porque mi trabajo secular como Administrador de bases de datos me ha mantenido muy ocupado con la transferencia de nuevos procesos y tecnologias que vienen de una planta que la compañia donde trabajo tenia en la ciudad de Boston Mass y esta por cerrarse en Noviembre del presente. Ahh!! menciono mi trabajo secular como si fuera pastor, evangelista o algo asi cuando no soy ninguna de las dos... tal vez sea un falso maestro capaz de hacer quedar a Arrio como un novato pero nada mas.
Bueno, parte del trabajo que tengo que hacer es coordinar la importacion de varios servidores, respaldos de baterias y otros aparatejos a Mexico y tambien modificar algunos programas que se usaban por alla para adaptarlos al proceso productivo de la planta donde su servidor, el Juggernaut trabaja y en esta semana me encontre con un escollo que me mantuvo ocupado desde el viernes hasta hoy: Convertir un pequeño programita que calculaba la curricula de produccion hecho en un lenguaje arcaico al mas moderno SQL Server. A primera vista parecia algo muy sencillo pero conforme fui analizando la lógica del algoritmo me di cuenta que pasar el dichoso programa de un lenguaje procedural a SQL Server que es un lenguaje de consultas. ¿Quieren saber en que acabo la historia? bueno, acabo en que halle la solucion y me puso de tan buen humor el haber logrado esto que ahora voy a publicar el codigo fuente que salvo mi vida en mis 2 blogs. Como podran notar, para efectos de poder publicar mi trabajo quite cualquier referencia a bases de datos reales de la compañia donde trabajo y utilice informacion ficticia, bien... aqui lo tienen.




create table #inv (startitem char(10),stock decimal(18,8),location char(23))
create table #order (saleitem char(10), orqt decimal(18,8))

declare @item char(10),@stocks decimal(18,8),@queda decimal(18,8)


insert into #inv (startitem,location,stock) values ('A','Almacen1',50)
insert into #inv (startitem,location,stock) values ('A','Almacen2',50)
insert into #inv (startitem,location,stock) values ('B','Almacen1',150)
insert into #inv (startitem,location,stock) values ('B','Almacen2',150)
insert into #inv (startitem,location,stock) values ('C','Almacen1',200)
insert into #inv (startitem,location,stock) values ('C','Almacen2',200)
insert into #inv (startitem,location,stock) values ('D','Almacen1',250)
insert into #inv (startitem,location,stock) values ('D','Almacen2',250)

-- Deben salir 4 ordenes de prod. en 0 y 1 con 40 piezas
insert into #order (saleitem,orqt) values ('A',10)
insert into #order (saleitem,orqt) values ('A',10)
insert into #order (saleitem,orqt) values ('A',10)
insert into #order (saleitem,orqt) values ('A',10)
insert into #order (saleitem,orqt) values ('A',100)

--Deben salir 4 ordenes en 0 y una de 20 pzs.
insert into #order (saleitem,orqt) values ('B',20)
insert into #order (saleitem,orqt) values ('B',20)
insert into #order (saleitem,orqt) values ('B',20)
insert into #order (saleitem,orqt) values ('B',20)
insert into #order (saleitem,orqt) values ('B',240);


/* Esto de aqui es una marranada, si lo quieren corregir adelante! */
declare c cursor for select startitem,sum(all stock) from #inv group by startitem

open c

fetch from c into @item,@stocks

while @@fetch_status=0
begin

set @queda=@stocks

/* Esta linea fue la que hizo el milagro =) */
update #order set @queda=orqt=@queda-orqt
where saleitem=@item

fetch next from c into @item,@stocks
end

close c

deallocate c


update #order set orqt=case when orqt>0 then 0 else abs(orqt) end

select * from #order

drop table #inv
drop table #order




PD. Si notaron que hice una marranada en mi codigo fuente, lo digo especialmente por los conocedores del lenguaje, no se preocupen, son libres de modificar este pequeño codigo como ustedes gusten y manden.

No hay comentarios.:

Publicar un comentario