Mostrando las entradas con la etiqueta Software. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Software. Mostrar todas las entradas

jueves, 16 de diciembre de 2010

El viejo FOX

No me mal entiendian, Hoy, Hoy, Hoy no hablo del FOX que los mexicanos ya conocen sino de Foxpro al cual muchos programadores conociamos cariñosamente como FOX, un manejador de base de datos de la familia de los Xbase que ademas integraba un potente entorno de desarrollo el cual desafortunadamente Microsoft descontinuo en 2007, sus razones debieron tener: Tal vez no tenia un nicho de mercado tan grande como Visual Studio .NET que a la fecha no he tenido necesidad de aprenderlo, o a lo mejor si lo quisieron integrar originalmente a la familia .NET pero la migracion resultaba tal vez demasiado compleja, en fin... hay toda clase de historias macabras detras de todo esto (por cierto hace tiempo que no publico nada oscuro ni tetrico por aqui) Lo unico que realmente deseo es que no me suceda como a muchos Ingenieros en sistemas: Siguen corriendo un dominio de Windows NT 4 en las redes que administran e inclusive lo siguen implementando en las nuevas instalaciones que hacen cuando un servidor con Windows 2000 (que tambien ya es una antigüedad, mejor instalate de perdido el 2003 R2) y Active Directory son mucho mas estables.
En fin, el dia de ayer me senti algo nostalgico ya que el buen Foxpro fue uno de los primeros lenguajes de programacion que aprendi y sin mencionar que tengo precisamente el proyecto perfecto para una aplicacion tan util a pesar de su obsolesencia... en realidad PASCAL fue el primero que aprendi pero los principios de bases de datos me los enseñaron con este viejo zorro y descargue de Internet una copia de la version 2.6 para MS-DOS de este viejo amigo, para quienes no lo conocieron aqui les dejo una pantalla de MS-DOS y una de la ultima entrega del zorro, que fue la version 9... si las imagenes no se ven bien pueden hacer click en ellas para un acercamiento







Es bueno recordar estas cosas, inclusive creo que hay por ahi un grupo de entusiastas de este viejo zorro que han hecho extensiones para .NET y otros proyectos interesantes que no he tenido tiempo ni ganas de explorar, algun dia lo hare seguramente.

Tristemente reconozco que un dia, igual que muchos otros programadores yo tambien tuve que "abandonar el barco" de este viejo amigo y migre a SQL Server y recientemente acabo de entrar al mundo de las aplicaciones Web cuando andaba buscando como darle una patada en el c... a MS Access, eso de las aplicaciones Web tambien es todo un relajo, en un desarrollo de esta naturaleza la seguridad es lo que mas tiempo y recursos consume pues no es muy agradable que un quinceañero haga sus experimentos en nuestro servidor, mucho menos que alguien mayorcito se robe la informacion sensible de los clientes. En fin, para quienes vivimos de lo que produce el cerebro creo que de cuando en cuando es bueno volver a los origenes, a esa materia primigenia que dio forma al mundo que hoy conocemos.

miércoles, 6 de octubre de 2010

SQL Server: Diversion con getdate() y otras funciones bizarras

Creo que hoy me siento algo geek, por eso voy a publicar algunas cosas que ayudarian a mas de uno en lo que se refiere a elaboracion de queries con SQL Server... aunque con un poco de esfuerzo estas mismas pueden portarse a DB2, Oracle, MySQL u otros manejadores de bases de datos que cuenten con algun dialecto de SQL, asi que saquen lapiz y papel que la catedra dara comienzo:

1) Obtener datos en un rango de fechas de una semana: La teoria detras de esto es la siguiente: Supongamos que nuestra Base de Datos (BD) tiene una tabla donde almacenamos los pedidos de clientes y queremos agrupar lo que se ordeno esta semana y la semana pasada Sin importar que dia se corra el query. Habitualmente mas de alguno respondera que con datepart(ww,[campo fecha])-1 bastaria para sacar la semana pasada pero... que ocurriria si corres el query la primer semana de Enero en la cual datepart devuelve 1? El resultado obvio es que tendrias la semana 0!!! Ahora, suponiendo que el primer dia de la semana sera el domingo y el ultimo el sabado entonces algo asi nos puede servir:

declare @domingo as datetime, @sabado as datetime

--Usar la funcion CONVERT y le agregamos el codigo de formato 101 para eliminar la hora de la fecha, getdate() trae ambas cosas y no se pueden separar.
set @domingo=convert(varchar(10),getdate()+(1-datepart(dw,getdate())),101)

set @sabado=convert(varchar(10),getdate()+(7-datepart(dw,getdate())),101)

--Supongamos que la tabla se llama "ordenes"
with lasordenes(fecha,cliente,parte,cantidad) as (
select fecha,cliente,parte,cantidad from ordenes where fecha between @domingo and @sabado --Esta semana
union all
select fecha,cliente,parte,cantidad from ordenes where fecha between @domingo-7 and @sabado-7
--La semana Pasada
)select * from lasordenes order by fecha desc

2) Desplegar la informacion del ejemplo anterior en columnas: Ahora, si quieren una columna con las ordenes de esta semana y las de la semana pero sin incluir fechas, solo numeros de parte, asi es como podrias hacerlo:

declare @domingo as datetime, @sabado as datetime


--igual que antes, le quitamos la hora a la fecha set @domingo=convert(varchar(10),getdate()+(1-datepart(dw,getdate())),101)
set @sabado=convert(varchar(10),getdate()+(7-datepart(dw,getdate())),101)



--Se usa sum() porque no sabemos que fechas puedan venir ademas no es requerido saberlo

select cliente,parte,
sum(case when fecha between @domingo and @sabado then cantidad else 0 end) as [esta semana],
sum(case when fecha between @domingo-7 and @sabado-7 then cantidad else 0 end) as [semana pasada]
from ordenes where fecha between @domingo-7 and @sabado
group by cliente,parte



Estos ejemplos pueden ser de mucha utilidad cuando se requiere manejar lapsos de tiempo, la teoria es bastante simple, para calcular el rango de fechas de una semana siempre que comience en domingo y concluya en sabado entonces hacemos lo siguiente:

* Conocer el dia de la semana actual, para eso usamos datepart(dw,fecha). Aqui obtendremos un numero segun el dia de la semana, domingo=1, lunes=2, etc. (aqui hay mas info sobre como funciona datepart)

*Para saber la fecha del domingo de esta semana, efectuamos la siguiente operacion: fecha de hoy + (1-resultado de datepart(dw,fecha de hoy)), para dejar esto mas claro prueba el siguiente estatuto:

--El resultado es 2010-10-03 18:52:19.617 suponiendo que la fecha actual es 2010-10-06 18:52:19.617
select getdate()+(1-datepart(dw,getdate()))

*Para el sabado la operacion es parecida: fecha de hoy + (7-resultado de datepart(dw,fecha de hoy)), el ejemplo siguiente demuestra los resultados:

--El resultado es 2010-10-09 18:54:40.820 suponiendo que la fecha actual es 2010-10-06 18:54:57.820
select getdate()+(7-datepart(dw,getdate()))


*Ahora a estos resultados les agregamos o sumamos dias segun lo que se requiera, generalmente serian 7 dias para movernos de las fechas de una semana a la otra.

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.

sábado, 6 de septiembre de 2008

Ahora soy miembro de la iglesia de emacs

¡¡¡No es cierto!!! ¿a poco pensaban que el Juggernaut se iba a cambiar de religion, ahora si ya no seria cristiano? Bueno, si de por si muchos no pueden aceptar que soy creyente del Evangelio creo que con esto quedaria confirmado (para esas personas que dudan de mi conversion a Cristo) que no soy cristiano. En esas cuestiones digo lo que un vecino que tenia cuando vivia en la ciudad de Monterrey Nuevo Leon cuando alguien tocaba a la puerta de su casa: No compro nada ni cambio de religion yo soy cristiano evangelico Asi no les agrade a ciertas personas o les cueste creerlo. Asi pues, ¿a que viene todo esto? bueno, como administrador de bases de datos soy un profesional de la informatica, eso es requisito, para ese tipo de puestos normalmente no aceptan a un tecnico en computacion (no tengo nada contra ellos, conozco varios muy buenos) pero para un puesto de trabajo como el mio las empresas suelen exigir al menos preparacion universitaria y como se han de imaginar, tambien tengo contacto con software, programas de computo en mi vida diaria y aunque soy usuario y cliente de Microsoft tambien he hallado software libre de excelente calidad y por ello, les presento al santo patrono del software libre y lider de la iglesia de emacs: San Ignucio.





Como podran ver, este icono representa a San Ignucio santo patrono del software libre, ahora quienes apoyamos el software libre tenemos a quien encomendar nuestra causa y elevar nuestras plegarias por la caida del imperio de Gates y aunque yo sea cliente de Microsoft definitivamente no comulgo con la idea del software de "codigo cerrado" que es lo opuesto al software libre. Si alguien noto que este es un post broma debo admitir que si no les resulto divertido, el humor no es el objetivo de este blog porque esta destinado a sacudirles la conciencia a quienes lo leen.
Que la sombra del Altisimo los cubra a todos mis amados y recuerden: Si tienen necesidad en sus corazones oren a YHWH Dios de Israel,Isaac y Jacob pero si quieren que el software libre llegue a las PCs de todo el mundo, entonces encomendense a San Ignucio