miércoles, 30 de septiembre de 2009

Matar una conexion de red activa en windows XP

Holas, muchas veces nos ha pasado que hacemos un netstat para ver las conexiones activas de nuestro windowsXP y queremos cerrar o terminar alguna de ellas, para hacerlo lo que se debe hacer es matar el proceso que origina esta conexion. Entonces pasos para hacerlo, en una ventana de comandos hacemos lo sig:

1. Listar las conexiones activas con su PID
netstat -o

2. Matamos la conexion de la cual hemos identificado su PID.
taskkill /PID XXXX

* Si les dijera que se debe forzar para poder matar la conexion, entonces seria asi:
taskkill /F /PID XXXX

Ok, eso es todo, bye

miércoles, 2 de septiembre de 2009

Instalar Visual Studio 6.0 sin el JVM

Hola, bueno este es un TIP muy rapidito y en si es la traduccion y resumen del post original de http://www.muujware.com/journal.asp?JournalItemID=1302882294.

Cuando instalamos Visual Studio 6 (siiii!!! aun lo uso.. y mucha gente tambien :o) ) nos pide obligatoriamente instalar su viejo y obsoleto JVM (Java Virtual Machine) y no te deja continuar con la instalacion de VS6 hasta que no instales el JVM.
Para evitar esta instalacion solo debes crear el archivo msjava.dll en la carpeta C:\windows y listo, el instalador de VS6 ya no pedira instalar el JVM.

Bye

jueves, 20 de agosto de 2009

Frase 9

"Tratar a tus usuarios como colaboradores es el comienzo menos complicado para mejorar con rapidez y depurar eficientemente un programa"

martes, 30 de junio de 2009

Trabajando con Netbeans 6.5.1 y Visual Web JSF - Parte 2

Holas a todo@s, bueno aqui va la segunda parte del manual /guia.. mejor me apuro con esto porque ya salio la version 6.7 de Netbeans y derepente ya no sirva mucho esta guia,,jajaja,, no lo creo.. pero siempre hay que estar preparado para algun cambio..

PARTE II. CREANDO LA BASE DE DATOS Y CONECTANDOLA A NUESTRO PROYECTO

1. Crear nuestra base de datos en PostgreSQL.
Usando cualquier Administrador (psql, pgadmin3, pgmanager, etc etc) para PostgreSQL creamos una base de datos que se llame "biblioteca".

2. Haciendo la conexion.
Vamos a netbeans y seleccionamos la ficha Services, alli desplegamos el Nodo Databases -> Drivers, luego hacemos click derecho en sobre PostgreSQL* y escogemos "Connect using..."



*Si no tenemos el driver listado debemos agregarlo, bajando el driver jdbc para PostgreSQL de http://pgfoundry.org/projects/jdbc/ y agregandolo con las opciones que netbeans nos da.

Luego nos aparece la ventana para configurar nuestra conexion usando el driver jdbc de PostgreSQL, asi que solo ponemos lo que corresponda en cada campo, mas o menos como la figura siguiente:


Le damos click en "OK", nos pide escoger el esquema, asi que seleccionamos "public" y hacemos click en "Ok",


con lo que tenemos un nuevo nodo en el arbol bajo Databases.. algo como la figura:


desplegamos el nuevo nodo y veremos 3 carpetas "Tables", "Views" y "Procedures". Hacemos click derecho sobre "Tables" y escogemos la opcion "Create Table"..


nos aparece el formulario de creacion de una nueva tabla, asi que crearemos nuestra tabla que se llame "libros" y con los campos como se muestran en la figura (para agregar un nuevo campo solo debemos hacer click en el boton "Add column"):


Asi podemos crear tambien las otras tablas necesarias para nuestra aplicacion: "usuarios" y "prestamo_de_libros", soy consciente de que no uso ningun estandar de nomenclatura ni que el diseño de la base de datos es el adecuado y bla bla bla.. solo es un EJEMPLO con fines netamente didacticos :o), aun asi recomiendo dar integridad referencial (claves foraneas en la tabla "prestamo_de_libros" con algun otro administrador de PostgreSQL de tal forma que cuando despleguemos el nodo "Foreign keys" de la tabla "prestamo_de_libros" tengamos algo como la figura siguiente:


Bueno para los que deseen solamente crear la base de datos desde cualquier otro medio y empezar a hacer la aplicacion aqui les doy el script de creacion de la base de datos "biblioteca":


CREATE TABLE public.libros (
codigo smallint NOT NULL,
titulo character varying(45),
autor character varying(45),
isbn character varying(45)
) WITHOUT OIDS;
--
CREATE TABLE public.usuarios (
codigo smallint NOT NULL,
nombre character varying(50),
direccion character varying(50),
documento character varying(15),
telefono character varying(15),
fecha_nacimiento date,
sexo character(1)
) WITHOUT OIDS;
--
CREATE TABLE public.prestamo_de_libros (
numero integer NOT NULL,
fecha date NOT NULL,
usuario smallint NOT NULL,
libro smallint NOT NULL,
fecha_de_devolucion date NOT NULL
) WITHOUT OIDS;
--
ALTER TABLE ONLY libros
ADD CONSTRAINT libros_pkey PRIMARY KEY (codigo);
--
ALTER TABLE ONLY usuarios
ADD CONSTRAINT usuarios_pkey PRIMARY KEY (codigo);
--
ALTER TABLE ONLY prestamo_de_libros
ADD CONSTRAINT prestamo_de_libros_pkey PRIMARY KEY (numero);
--
ALTER TABLE ONLY prestamo_de_libros
ADD CONSTRAINT prestamo_de_libros_fk FOREIGN KEY (usuario) REFERENCES usuarios(codigo) ON UPDATE RESTRICT ON DELETE RESTRICT;
--
ALTER TABLE ONLY prestamo_de_libros
ADD CONSTRAINT prestamo_de_libros_fk1 FOREIGN KEY (libro) REFERENCES libros(codigo) ON UPDATE RESTRICT ON DELETE RESTRICT;

3. Enlazando el componente "Table".

Abrimos la pagina "FrmLibros" que hicimos anteriormente, luego vamos a nuestra paleta de componentes y jalamos un componente de tipo "Table" a la pagina,


le cambiamos el titulo a "LIBROS", y quedara algo asi:


luego vamos a la ficha "Services", seleccionamos nuestra tabla "Libros" y con el mouse la arrastramos y soltamos sobre el objeto "Table1" que acabamos de colocar en la pagina "FrmLibros" que tenemos abierta, aqui se puede demorar unos segundos en refrescar, y luego tendremos algo como se muestra:


Con esto se ha enlazado el Table con la tabla Libros de la base de datos. Se pueden dar algunas opciones para personalizar el diseño de la tabla usando la ventana de propiedades o haciendo click derecho sobre la tabla y escogiendo la opcion "Table Layout...". Por ejemplo vamos a corregir los titulos para que esten en mayusculas. Hacemos click derecho sobre Table1, escogemos "Table Layout...":


Alli podemos modificar muchos atributos mas, como alineacion de los datos, ancho de columnas, quitar columnas, agregar, etc etc.


Con esto ya podemos ejecutar "F6" y podremos ver los datos de nuestra tabla Libros.
Bueno dejo esta parte ahi, sino me demorarare mas en publicar.. la proxima si sera el insertar borrar y actualizar datos... y prometo que sera en menos tiempo que este post :o) , ademas revisare la nueva version de Netbeans 6.7, haber que cambios hay para VisualWeb. See yaaa

miércoles, 24 de junio de 2009

Migrando de MSSQL2000 a PostgreSQL8.3 - Conclusiones

Ya termine la migración!!!!.. pero... hubieron cosas y cositas que resolver en el camino... asi queee... que mejor que compartirlas con uds...

Estas son las cosas que pasaron o que siempre se deben tener en consideración al momento de hacer una migración de este tipo:

  • No olvidar la diferencia de mayusculas minusculas, si desean usar Mayusculas o caracteres no ingleses como la ñ o tildes ponerlo siempre entre comillas (").
  • El driver ODBC no puede capturar resultados de cursores; es decir funciones que devuelven tipos cursor o refcursor. Segun algunos se puede usando tres instrucciones:

  
begin;
select * from tufuncion();
fetch all from "nombre del cursor devuelto";

<<<<Yo no lo pude hacer funcionar en VB6 ni en Delphi, asi que use records, el tiempo ya presionaba mucho.

  • El driver OleDB cuando retorna mas de 8000 registros aprox. se vuelve lento muy lento. ODBC es siempre rapido pero hay que definir el record para retornar valores.
  • En Delphi fue muy muy ineficiente usar OleDB asi que alli solo se uso ODBC.
  • La instruccion "exists" en Postgres es muy lenta, en lo posible se debe evitar su uso; siempre hay una forma de evitarla con lefts joins, right joins y esas cosas.
  • No existe la sentencia TOP en Select's, en MSSQL se hace algo como: SELECT TOP 10 * FROM tutabla, en PostgreSQL seria: SELECT * FROM tutabla LIMIT 10 , dicen que tambien se puede usar el atributo 'maxrows' de CFQUERY, pero nunca lo use y no tengo idea a que se refieren :o).
  • La sentencia LIKE diferencia mayusculas y minusculas en postgresql, se puede solucionar con algo como esto: SELECT * FROM tutabla WHERE LOWER(columna) LIKE '%#LCase(var)#%' (O tambien se puedes usar el operador ILIKE).
  • El operador mas (+) no se usa para concatenar, en su lugar se debe usar la barra doble (||), por ejemplo la instrucción en MSSQL SELECT nombre + ' ' + apellido AS nombrecompleto seria SELECT nombre || ' ' || apellido AS nomobrecompleto , la ultima forma es aceptada tambien en MSSQL.
  • Hay muchas otras funciones tambien que no existen en PLPgSQL, pero no es dificil encontrar sus equivalencias, por ejemplo:


month -> date_part
year -> date_part
convert -> to_char, cast, ::
print -> raise notice
isnull -> coalesce
str -> to_char

  • El uso del tipo decimal desde VB a veces funciona y aveces no, el porque..., no lo se, asi que migramos todos los "decimal" a double precision, el problema es que despues hay que formatear las salidas y entradas a la cantidad de decimales que se necesiten.
  • Es importante tambien saber que la logica de manejo de transacciones en las funciones almacenadas en PostgreSQL es diferente que la de MSSQL con los Procedimientos Almacenados, en MSSQL si queremos controlar la correcta ejecucion de tooodo un store con muchas instrucciones debemos indicar explicitamente que queremos que este store este en una transaccion e ir capturando los codigos de error para hacer un rollback, mientras que en PostgreSQL toda funcion almacenada se ejecuta automaticamente dentro de una transaccion, por lo que si falla nuestra funcion en algun punto se hara un rollback automatico.
Ahora si creo que es todo.. Bytes y espero que esto le sirva a alguien mas....

viernes, 12 de junio de 2009

Backup Simple en PostgreSQL usando pg_dump

Holas, bueno este post no es totalmente de mi autoria, pero lo he traducido y lo pongo en mi Blog por si alguien mas lo necesita, hago algunos aportes chiquititos al articulo original, para que se entienda bien en un entorno CentOs 5 y PostgreSQL 8.3
La entrada original en ingles esta en http://www.cyberciti.biz/tips/howto-backup-postgresql-databases.html

PostgreSQL es una de las bases de datos open-source mas robustas que existen. Como muchos otros RDBMS este brinda herramientas para realizar tareas de backup de la data.

Paso# 1: Ingresar al sistema como usuario postgres.

Digite el siguiente comando:
$ su postgres
Obtener la lista(s) de la(s) base de datos a sacar backup:
$ psql -l

Paso# 2: Hacer el backup usando pg_dump

Pg_dump es un utilitario para hacer backups de una base de datos PostgreSQL. Solo se puede hacer backup de una sola base de datos a la vez. Sintaxis general:
pg_dump basededatos > archivodestino

Ejemplo: Hacer backup a una base de datos llamada ventas

Escriba los siguientes comandos
$ pg_dump ventas > ventas.dump.out

Para restaurar la base de datos ventas:
$ psql -d ventas -f ventas.dump.out

O

$ createdb ventas
$ psql ventas

Sin embargo, en un ambiente de produccion siempre necesitaremos comprimir el backup de la base de datos:

$ pg_dump ventas | gzip -c > ventas.dump.out.gz

Para restaurar la base de datos usamos el siguiente comando:

$ gunzip ventas.dump.out.gz
$ psql -d ventas -f ventas.dump.out

Paso# 3: Automatizar el proceso
A continuación veremos un script en bash para realizar dicha tarea automaticamente, y luego los comandos necesarios para ponerlo en el gestor de tareas cron del linux.

Creamos el archivo backup.sh
$ nano backup.sh

Y alli escribimos el codigo siguiente:
#!/bin/bash
DIR=/backup/psql
F=$(date +%Y-%m-%0e)
export PGUSER=postgres
export PGPASSWORD=tupassword
[ ! $DIR ] && mkdir -p $DIR || :
LIST=$(psql -l | awk '{ print $1}' | grep -vE '^-|^Listado|^Nombre|template[0|1]')
#LIST="ventas produccion almacen"
for d in $LIST
do
pg_dump $d | gzip -c > $DIR/$d$F.out.gz
done
unset PGUSER
unset PGPASSWORD

Salimos guardando con Ctrl-X.
Yo reemplazo la variable LIST con los nombres de mis bases que quiero sacar backup, el comando que saca los nombres de las bases de datos en el script no me funciona del todo bien, pero la idea es esa :o).

Luego damos permisos de ejecucion al archivo backup.sh
$ chmod 755 backup.sh

Ingresamos la tarea en el cron.
$crontab -e

Configuro para que todos los dias a la 1am se realice el backup, por lo que escribo (para editar deben usar comandos de vi)
00 01 * * * /var/lib/pgsql/backup.sh

Paso #4:Backup completo de todo el gestor de base de datos.
Otra opcion es usar el comando pg_dumpall. como su nombre lo dice genera un backup de TODA la base de datos, guardando los datos de todo el gestor como usuarios, grupos y privilegios. Se puede usar el comando de la sig. forma:
$ pg_dumpall > all.dbs.out

O

$ pg_dumpall | gzip -c > todo.dbs.out.gz

Para restaurar el backup usamos el siguiente comando:
$ psql -f todo.dbs.out postgres

martes, 19 de mayo de 2009

Trabajando con Netbeans 6.5.1 y Visual Web JSF - Parte 1

Holas a tod@s, esto queria ya publicarlo hace tiempo; logre hacer este ejemplo que es un sistema sencillo con base de datos full Netbeans con VisualWeb JSF revisando muchos ejemplos y en el caso del uso del framework de persistencia tuve algo de suerte tambien :o). Se que muchos desisten de usarlo porque no encuentran un buen manual o guia, espero que este sea un buen comienzo para todos.. Pensaba hacer una sola guía de todo, pero seria muy larga asi que mejor lo hare por partes.
El ejemplo es un pequeño sistema de Bibliotecas en el cual se tiene mantenimiento de Libros, Autores y Usuarios, y se pueden realizar los prestamos de libros y algunas consultas basicas. Espero en el transcurso de cada semana o antes ir subiendo cada parte de esta guía.

PARTE I. CREANDO EL PROYECTO Y LA INTERFAZ

1. Crear el proyecto
Usamos las opciones segun las figuras:
Tipo de Proyecto: Java Web -> Web application

Llamaremos al proyecto "VWBiblio":

Seleccionamos el Servidor de Aplicaciones: yo uso tomcat por lo comercial que es, por ejemplo hay muy pocos host que te den un servidor Glassfish, hay mas documentación y ayuda sobre tomcat; asi que por eso prefiero usarlo.


Seleccionamos el framework: VisualWeb JavaServer Faces

Le damos en "Finish" y ya tenemos creado nuestro proyecto.

2. Creando la Pagina Principal (Menu y fragments)
La pagina por default se llama Page1.jsp, la renombramos(Ctrl+R) a FrmPrincipal (me gusta usar esa nomenclatura :o) ) y presionamos "Refactor"


Agrego una pagina del tipo Fragment para el menu y la llamare "FrmMenu",


Ajusto el ancho y largo del fragment (widht= ,height= )


Luego agrego un control del tipo "Tree", al colocarlo me pide editar el titulo y le pongo "MENU".


Agrego TreeNodes haciendo click derecho sobre el nodo padre y click en "Add Tree Node" hasta tener un menu como el de la figura.


Agrego otra pagina de tipo Fragment para la barra de Titulo y le pongo de nombre "Frmtitulo"

Luego configuro el ancho=800px y alto=75px.
Agrego un control de tipo Label y cambio el texto a "Sistema de Bibliotecas"

Cambio el tamaño de la fuente del Label a 24px, eso lo hago modificando la propiedad "Style" del Label.


Cerramos guardando FrmMenu y FrmTitulo.
Ahora vamos a la pagina FrmPrincipal que sera la que contenga los fragments que hemos creado.
Agregamos un control del tipo "Page Fragment Box", aparece una venta donde se puede seleccionar el fragmento a agregar, automaticamente se seleccionara el fragment "FrmMenu.jspf" que es el Menu que creamos anteriormente, asi que solo hacemos click en el boton "Close"

Agregamos otro "Page Fragment Box" y en la ventana de seleccion escogemos "FrmTitulo.jspf", luego le damos en "Close" con lo cual tenemos los dos fragment en nuestra pagina principal. Los ubicamos usando el mouse de tal forma que nos quede como la figura siguiente.


3. Agregando las demas paginas y la navegacion del Menu.
Como ya tenemos nuestra pagina principal con titulo y Menu, ahora agregaremos las demas paginas de nuestro proyecto y la enlazaremos al Menu de navegacion que hemos creado.
Click derecho en "Web Pages" del proyecto y New -> "VisualWeb JSF Page".


Le cambio del nombre a FrmLibros y le doy click en el boton "Finish".
Del mismo modo agregamos las paginas FrmUsuarios, FrmPrestamo, FrmDeudores y FrmLibrosDisponibles.
Por lo que nuestra carpeta "WebPages" quedara como la figura siguiente:


Ahora abrimos la pagina "FrmLibros" y agregamos los fragments FrmMenu y FrmTitulo al igual que hicimos en la pagina principal "FrmPrincipal".
Tambien agregamos un control de tipo Label y le ponemos como texto "MANTENIMIENTO DE LIBROS". Con ello nos debera quedar una pagina como se muestra en la figura:

Ahora para añadirle la navegacion al menu: regresamos a la pagina de tipo Fragment "FrmMenu", alli seleccionamos el nodo Libros de nuestro Menu,


Luego vamos a la propiedad "url" y la cambiamos usando el boton del lado derecho "...", al aparecer la ventana seleccionamos la pagina "FrmLibros" y hacemoc click en el boton "Ok".


Debemos hacer lo mismo para las otros nodos del Menu y cambiar su propiedad "url" segun la pagina que corresponda.
Con ello si ejecutamos nuestra aplicacion (presionando F6) tendremos ya nuestro aplicativo web con un menu con el que podemos navegar entre las diferentes opciones.

Esto todo por ahora, la siguiente parte sera hacer el primer mantenimiento, para lo que usaremos PostgreSQL enlazado a nuestro proyecto VisualWeb JSF. Bye

lunes, 27 de abril de 2009

Administrando PostgreSQL

Hola con tod@s otra vez; como ya les conté estaba migrando una base de datos MSSQL2000 a PostreSQL 8,3, bueno la tarea aun sigue, pero esta vez les contare sobre algunas herramientas que son fundamentales en el momento de administrar nuestra base de datos PostgreSQL.

1. psql (http://psql.sourceforge.net). Esta herramienta en modo texto o consola se instala predeterminadamente cuando instalamos el servidor PostgreSQL, es básicamente un programa interactivo para ejecutar comandos SQL en nuestro servidor, aunque no tiene un interfaz gráfico amigable es una poderosa herramienta par administrar de forma interactiva nuestro servidor de base de datos.


2. pgAdmin III (http://www.pgadmin.org/ ) El administrador gráfico por defecto para PostgreSQL, es bueno y nos permite hacer muchas de las tareas de administración y consulta a nuestra base de datos de forma gráfica, es totalmente gratuita y se instala siempre que instalamos PostgreSQL en un entorno Windows. Algunas cosas que no tiene y con lo que seria en si una poderosa herramienta son: un diseñador de consultas al estilo E/R, un depurador de funciones , aunque en este punto encontré que si es posible hacerlo pero hay que recompilar el servidor y la herramienta con algunos parches para que se pueda realizar dicha función, mas información al respecto en http://www.pgadmin.org/docs/1.8/debugger.html. También sería fenomenal si se pudiera exportar a otros formatos como html, xml, xls, etc. ya que solo soporta exportación de los datos consultados a CSV (texto separado por comas).

3. pg_dump. La herramienta predeterminada para hacer copias de seguridad de nuestras bases de datos en PostreSQL, lo malo ( si se le puede llamar asi) es que es en modo texto o consola y es totalmente interactiva, no pudiéndose programar tareas, pero usándolo en combinación con algún otro programa adicional como cron en unix/linux/freebsd se puede hacer muchas cosas interesantes. Pero en definitiva es imprescindible para cualquier administrador de base de datos PostgreSQL.


4. pg_top (http://ptop.projects.postgresql.org/). Interesante programa para poder monitorear el estado de las conexiones, que esta haciendo cada una y algunas cosas mas de nuestro servidor PostgreSQL en ambientes linux. Podríamos compararlo en funcionalidad con el SQLProfiler de MSSQL. Esta herramienta esta hecha al estilo de la interfaz del comando top de Linux. PgAdminIII puede también darnos este tipo de información pero solo si tenemos instalado PGAdmin en el mismo equipo que el servidor. Pero en definitiva la considero también como una herramienta imprescindible para un DBA de PostgreSQL que se respete :o) .


5, SQL Manager for PostgreSQL (http://sqlmanager.net/en/products/postgresql/manager). Poderosa herramienta de administración, consulta y manipulación de datos para PostgreSQL. Permite consultar, modificar, eliminar datos, administrar usuarios y permisos, depurar funciones, exportar a muchos formatos, diseñador de consultas, etc, etc, etc. Todo con excelentes interfaces y asistentes gráficos que hacen que la tarea de administración del servidor sea realmente un trabajo mucho mas sencillo. Yo he probado algunos otros mas y siempre llego a la conclusión de que esta herramienta es la mejor. Lo malo, es que es de pago, pero aun así podemos usarla con dos opciones una es un demo por 30 días con todas las opciones y la otra es una versión “Lite” libre de pago pero con limitaciones en algunas funcionalidades. Aun así si se tiene la posibilidad de comprarla sera una excelente compra.

6, Arinet Automatic Postgresql BackupScript (http://autopgsqlbakup.sourceforge.net/) Mas que un programa es un script basado en pg_dump para poder realizar las tareas de backup de nuestra base de datos de una forma mucho mas sencilla y con mejores opciones. Se debe trabajar también con cron en Unix/Linux/FreeBSD ya que el script esta hecho en bash. Pero para mi caso particular me ha servido bastante en el momento de administrar el backup de mi información. En el sig. link hay un pequeño manual de como ponerlo a trabajar en Linux: http://linux2.arinet.org/index.php?option=com_content&task=view&id=125&Itemid=35

Bueno es todo por ahora, si se de alguna otra herramienta por ahí se los haré saber en un próximo post. Bye

jueves, 2 de abril de 2009

Frase 8

“La única diferencia entre un sueño y un objetivo es una fecha.”
Edmundo Hoffens

martes, 17 de marzo de 2009

Migrando de MSSQL2000 a PostgreSQL8.3

Hola, estoy ahora migrando una BD MicroSoft SQL 2000(MSSQL) a PostgreSQL 8.3 (PGSQL)..., la BD MSSQL tiene como principal caracteristica y que ha dado todo el trabajo, muchos Stores Procedures (SPs) asi que la dificl tarea de hacer esa migracion empezo ya.
Los sistemas que actualmente uso y se conectan al MSSQL2000 estan hechos en VisualBasic 6 y en Delphi 5, ya hice pruebas de conectividad y uso de PGSQL con estos lenguajes y todo bien usando el driver OleDB de Postgres (http://pgfoundry.org/projects/oledb/). Generar la cadena de conexion es muy sencillo, en todo caso un ejemplo seria:


CadConn = "Provider=PostgreSQL OLE DB Provider;" & _
"Password=mipassword;User ID=miusuario;" & _
"Data Source=localhost;Location=mibasededatos;Extended Properties='';"

El Unico detalle aqui es un problema del driver cuando uno lanza SQLs que devuelven registros, provoca un error de retorno, pero esto no sucede si se hace a traves de SPs.

Ok ahora si a las bases de datos; primero unos alcances: MSSQL usa como lenguaje de programacion Transact-SQL(T-SQL) y PostgreSQL PlPgSQL, para postgres no es el unico, se pueden instalar otros como java, c, etc ,etc. Pero el mas usado y casi por default es PLPGSQL. Asi que dare alguno tips para hacer esta tarea un poco mas sencilla.

Existe una herramienta que se llama SQLWays(http://www.ispirer.com/products) que ofrece hacer dicha migracion, es realmente util, pero siempre hay que revisar lo que ha migrado, ademas al hacer esta tarea de manera automatizada hay muchos SPs que no son optimos o que no se ejecutan.

Ok entonces vamos a los tips especificos

1. En PGSQL no existen "Procedimientos Almacenados" como tales, sino mas bien "Funciones Almacenadas", eso quiere decir que siempre estaremos obligados a devolver algo desde nuestros "SPs".

2. Declaracion de variables:

MSSQL: se usa la palabra DECLARE y el nombre debe empezar con el simbolo @ , por ejem:

DECLARE @mivar INT

PGSQL: se hace el estilo de C o de java, es decir identificador seguido del tipo de dato, por ejem:

mivar int;

3. Las asignaciones de valores a variables:

MSSQL: se usa SET , ejem:

SET @mivar=1.12

PGSQL: se usa el simbolo := , ejem:

mivar:=1.12;

4. Devolucion de registros o filas, uno de los mas importantes tips creo yo.

MSSQL: se hace el select directamente y punto, por ejem: :o)

create procedure consulta as
select * from mitabla

PGSQL: como dije anteriormente en PGSQL se usan "funciones Almacenadas" por lo que debemos indicar a nuestra funcion el tipo a devolver. Lo mejor es usar el tipo pg_catalog.refcursor, que creo que esta disponible recien desde la version 8.x de PGSQL.

CREATE OR REPLACE FUNCTION consulta() RETURNS "pg_catalog"."refcursor" AS
declare data refcursor;
begin
open data for (
Select * from mitabla
);
return data;
END;

5. Recorrer cursores dentro de los SPs.

MSSQL:

declare @v_1 varchar(10)
declare @v_2 varchar(10)
declare cur1 cursor for
select * from mitabla
OPEN cur1
FETCH NEXT FROM cur1
INTO @v_1, @v_2
WHILE @@FETCH_STATUS = 0 BEGIN
print 'Valor 1 '+v_1
print 'Valor 2 '+v_2
FETCH NEXT FROM cur1
INTO @v_1, @v_2
END
CLOSE cur1

PGSQL:

declare
cur1 refcursor;
v_1 varchar (10) ;
v_2 varchar (10) ;
begin
OPEN cur1 FOR execute('select * from mitabla');
loop
fetch cur1 into v_1, v_2;

if not found then
exit ;
end if;

RAISE NOTICE 'Valor 1(%)', v_1;
RAISE NOTICE 'Valor 2(%)', v_2;

end loop;
close cur1;
end;

* Existe otra forma de recorrer registros en PGSQL, pueden ver mas detalles en http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING.

6. Bueno este tip mas que de SPs, es para la carga de data, mis tablas en MSSQL son de millones de registros asi que la mejor manera de pasar la data del MSSQL a PGSQL es:

1ero. Bajar la data del MSSQL a texto plano, tipo csv, es decir valores separados por comas.
2do. Usar el comando COPY.. FROM de PGSSQL para cargar a data desde los arhivos de texto a las tablas de PGSQL.

Ok, es todo hasta ahora, si veo algo mas lo publicare o si alguien mas puede dar un aporte bienvenido.

lunes, 9 de marzo de 2009

Un programa simple de descarga de archivos usando API’s de Windows en Visual Basic

Hola a todos, bueno en esta oportunidad les contare algo del uso de APIs desde nuestros programas hechos en Visual Basic.
Para los que no saben que es un API… un API(Application Programming Interface) o en castellano “Interfaz de Programación de Aplicaciones” es [gracias Wikipedia :o)] :

Un conjunto de funciones residentes en bibliotecas (generalmente dinámicas, también llamadas DLLs por sus siglas en inglés, término usado para referirse a éstas en Windows) que permiten que una aplicación corra bajo un determinado sistema operativo. En este caso se refiere a las aplicaciones Windows. Debido a su estrecha relación con el desarrollo de software, los programas en sus especificaciones generalmente explicitan la versión de la API del sistema operativo, mediante diversas nomenclaturas tales como la versión específica del sistema operativo (para Windows 98, por ejemplo), o explicitando la versión del conjunto de bibliotecas (Plataforma Win32, etc.). Las funciones API se dividen en varias categorías:
  • Depuración y manejo de errores
  • E/S de dispositivos
  • DLLs, procesos e hilos
  • Comunicación entre procesos
  • Manejo de la memoria
  • Monitoreo del desempeño
  • Manejo de energía
  • Almacenamiento
  • Información del sistema
  • GDI (interfaz para dispositivos gráficos) de Windows (tales como impresoras)
  • Interfaz de usuario de Windows

Bueno a lo nuestro.. “y entonces José para que es todo eso, si VB (Visual Basic) tiene un montón de clases, funciones y procedimientos que nos permiten hacer cosas con el sistema operativo” , es cierto pero no todo se puede hacer con lo nativo de Visual Basic, veamos un ejemplo especifico; se requiere hacer un programa en VB de descarga de archivos de Internet, donde nos muestre una barra con el avance de la descarga y obviamente antes nos habra mostrado el tamaño total de la descarga.

Como lo resolvemos??? Existe en VB6 el control Inet y en Vb.Net la clase Net.WebClient, pero con ninguno de ellos podremos hacer una barra de progreso real.

Asi que para eso usaremos el API “WinInet” que como su nombre lo indica esta en el archivo “WinInet.dll” dentro de la carpeta de Windows\system32.

Ahora si, a resolver el problema..

  1. Hagamos la Interfaz usando el diseñador de formularios en VB2005 de tal forma que nos quede algo asi:

Ok, ahora agregamos un modulo que se llame WinInet.bas y declaramos las funciones de la API que usaremos:

Option Explicit
Public Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Public Const INTERNET_OPEN_TYPE_DIRECT = 1
Public Const INTERNET_OPEN_TYPE_PROXY = 3
Public Const scUserAgent = "VB OpenUrl"
Public Const INTERNET_FLAG_RELOAD = &H80000000

Public Const HTTP_QUERY_CONTENT_LENGTH = 5
Public Const HTTP_QUERY_LAST_MODIFIED = 11

Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _
(ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, _
ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

Public Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" _
(ByVal hOpen As Long, ByVal sUrl As String, ByVal sHeaders As String, _
ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

Public Declare Function InternetReadFile Lib "wininet.dll" _
(ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, _
lNumberOfBytesRead As Long) As Integer

Public Declare Function InternetCloseHandle Lib "wininet.dll" _
(ByVal hInet As Long) As Integer

Public Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" _
(ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, _
ByRef lBufferLength As Long, ByRef lIndex As Long) As Boolean

Una explicacion rápida (el artículo se volvería demasiado extenso si explico a profundidad cada uno de ellos):

InternetOpen: Abre la conexión a Internet.
InternetOpenUrl:
Abre la dirección desde donde descargaremos el archivo.
InternetReadFile:
Lee o descarga el archivo desde la dirección abierta.
HttpQueryInfo: Lee o extrae algun tipo de información de una dirección en Internet.
InternetCloseHandle: Cierra la conexión abierta a Internet

Listo, ahora que tenemos las funciones hay que usarlas. En el formulario que creamos anteriormente lo que nos interesa es que al presionar el boton etiquetado “Iniciar” descargue el archivo ingresado en la caja de texto al lado de la etiqueta “Ruta(URL):”; ademas deberemos cambiar el nombre de algunos objetos como sigue:

La barra de progreso : pgDownload
La Etiqueta de Tamaño del archivo: lblFileSize
La Etiqueta de Bytes descargados: lblBytesDownloaded
La etiqueta de Estado: LblEstado

entonces el código para ello seria el siguiente:

Private Sub Command1_Click()
DownloadFile Text1.text, “c:\Downloads\archivo.txt”
End Sub

Public Function DownloadFile(FileOrigen As String, FileDestino As String) As Boolean
'On Error GoTo errhandle
Dim hOpen As Long
Dim HOpenURL As Long
Dim sUrl As String
Dim bDoLoop As Boolean
Dim bRet As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
Dim sBuffer As String
Dim percent As Integer
Dim file As String
Dim flen As Long

pgDownload.Value = 0
lblFileSize.Caption = 0
lblBytesDownloaded.Caption = 0
'MsgBox "voy a conectar" + vbCrLf + FileOrigen + vbCrLf + FileDestino

sUrl = FileOrigen 'url
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
HOpenURL = InternetOpenUrl(hOpen, sUrl, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)

'MsgBox "conectado!!"

DownloadFile = False
Me.LblEstado.Caption = "Descargando.."
Me.LblEstado.Refresh
bDoLoop = True

Dim cnt As Long
cnt = 0
DownloadFile = True

While bDoLoop
sReadBuffer = vbNullString
bRet = InternetReadFile(HOpenURL, sReadBuffer, Len(sReadBuffer), lNumberOfBytesRead)
sBuffer = sBuffer & Left$(sReadBuffer, lNumberOfBytesRead)
'percent = Int((Len(sBuffer) / flen) * 100)
cnt = cnt + lNumberOfBytesRead
If (cnt > 10000) Then
lblBytesDownloaded.Caption = CStr(Len(sBuffer))
lblBytesDownloaded.Refresh
cnt = 0
End If
pgDownload.Value = lblBytesDownloaded.Caption
If Not CBool(lNumberOfBytesRead) Then
bDoLoop = False
End If
Wend
'Kill FileDestino
Open FileDestino For Binary Access Write As #2
Put #2, , sBuffer
Close #2
pgDownload.Value = 100
lblBytesDownloaded.Caption = file
lblBytesDownloaded.Refresh

If HOpenURL <> 0 Then InternetCloseHandle (HOpenURL)
If hOpen <> 0 Then InternetCloseHandle (hOpen)

End Function

Con eso seria suficiente, espero a alguien le sirva este programita, a mi me sirvio mucho; le hice algunas modificaciones para que me sirva de un actualizador de EXE's en mi red corporativa, si alguien desea que le explique como lo hice e avisan para un siguiente post jeje.

Referencias:
http://www.wikilearning.com/tutorial/los_rincones_del_api_win32_el_cache_de_wininet-enumerar_las_entradas_almacenadas_en_el_cache/3846-6#verOpiniones
http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_20577961.html
http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3BQ175179
http://en.allexperts.com/q/Visual-Basic-1048/using-wininet-dll.htm
http://www.vbforums.com/showthread.php?t=543107

lunes, 2 de febrero de 2009

Frase 7

"El que quiera hacer todo solo, jamás será un gran líder; tampoco el que quiera quedarse con todo el crédito por hacerlo "
- Andrew Carnegie

lunes, 5 de enero de 2009

Frase 6

Vuelve a empezar...

aunque sientas el cansancio,
aunque el triunfo te abandone,
aunque un error te lastime,
aunque un negocio se quiebre,
aunque una traición te hiera,
aunque una ilusión se apague,
aunque el dolor queme tus ojos,
aunque ignoren tus esfuerzos,
aunque la ingratitud sea la paga,
aunque la incomprensión corte tu risa,
aunque todo parezca nada...
vuelve a empezar...
(Cecilia Prezioso)