martes, 6 de enero de 2009

Debido a razones estríctamente técnicas estoy cambiando este blog a este otro en WordPress.
Espero que les sea de alguna utilidad.

sábado, 20 de diciembre de 2008

Instalación de JDK 6 update 11 + Netbeans 6.5

Instalaremos ahora JDK 6 update 11 y Netbeans 6.5 en Linux Debian.

Descarga:

Lo primero que tenemos que hacer es visitar la página de Sun Microsystem siguiente

http://java.sun.com/javase/downloads/index.jsp



en esta página seleccionamos JDK 6 Update 11 with NetBeans 6.5, y aparece esta otra página




En esta, seleccionamos Java SE Development Kit 6u11 and NetBeans IDE 6.5 Bundle Downloads, y aparecerá



Seleccionamos la plataforma (Linux), Multilenguaje y aceptamos las condiciones de la licencia. Después de indicar continuar, aparece finalmente:



En esta pantalla hacemos click en el enlace jdk-6u11-nb-6_5-linux-ml.sh , y a partir de ese momento comenzará a descargarse dicho archivo.

Una vez descargado, pasamos a la consola de comandos con atributos de administrador y ejecutamos desde la carpeta de descarga donde se encuentra el archivo descargado

chmod +x jdk-6u11-nb-6_5-linux-ml.sh

y finalmente

./jdk-6u11-nb-6_5-linux-ml.sh
con esto comienza la instalación

Hacemos Next,


Aceptamos los términos de la licencia y volvemos a hacer Next, y comenzará la instslación del jdk necesario para poder ejecutar Netbeans

En la pantalla anterior, aparece el directorio por defecto donde se instalará el JDK, es decir, /usr/local/jdk1.6.0_11, hacemos Next para continuar,


Ahora aparece el directorio por defecto donde se instalará Netbeans, hacemos Next para continuar


En la pantalla anterior hacemos next para continuar,


En la pantalla anterior nos indica que la instalación ha concluido y nos solicita la participación en la estadística, pruebas y mejoras del producto. También nos solicita el registro.

Una vez terminada la instalación, es opcional crear un lanzador en el escritorio, para poder crearlo es necesario identificar el ejecutable y el icono que representa a dicho producto.
El ejecutable se encuentra en /usr/local/netbeans-6.5/bin/ y se llama netbeans.
El icono se encuentra en la carpeta /usr/local/netbeans-6.5/nb6.5 y se llama netbeans.png

Si ahora ejecutamos desde el escitorio aparecerá


Si el equipo donde ehemos instslado está conectado a internet, Netbeans intentará averiguar si existe alguna actualización tanto del producto base como de los distintos "plugin" que incorpora, si es así mostrará una pantalla similar a la siguiente:



En esta pantalla hacemos click sobre el botón Update, nos indicará cuál o cuáles son las actualizaciones pendientes en la siguiente pantalla


Pulsamos ahora Next

Aceptamos los términos de la licencia de cada una de las actualizaciones y pulsamos "update"


En esta pantalla, a través del botón radial nos solicita la restauración inmediata o mas tarde del entorno integrado. Lo natural será "Restart IDE Now". Pulsamos Finish para terminar.
Netbeans se cerrará y se abrirá de nuevo, con la incorporación de las actualizaciones y plugins instalados.
Una vez terminada esta tarea sería conveniente, indicarle al IDE Netbeans que revise todos las actualizaciones cada vez que se abra el entorno. Para ello, seleccionamos la opción Tools/Plugins
y aparecerá la siguiente pantalla, en la que hemos seleccionado la pestaña Setting

Vemos que el parámetro "check interval" se encuentra en "Every Week", lo ideal sería cambiarlo a "Every Startup", es decir


Hacemos ahora "close" y si es necesario, reiniciamos el IDE Netbeans. De esta forma garantizamos que cada vez que iniciemos el entorno se actualice el producto y sus correspondientes plugin, si los hubiere.

sábado, 13 de diciembre de 2008

Asociación de una información video (.avi) a los registros de una tabla.

Existen ocasiones en las que todo está en contra: La base de datos no admite en un campo de un registro una información video tipo .avi (imágenes animadas), además no encontramos un control de base de datos que pueda representar a dicho campo y mantenerse sincronizado con el scroll en la tabla...

Por ejemplo,

Supongamos una interfaz (a cuyo formato llamaremos fpeliculas) pretenda presentar la información de una tabla de películas (a la que llamaremos tpeliculas), y entre otras informaciones (Director, actores, argumento, fechas diversas, etc) se necesita editar un video de un trailer de dicha película. La base de datos en MsAccess (con sus limitaciones propias). La clave de dicha tabla (a la que llamaremos codigo_pelicula) es un número entero autoincrementado.

En este caso existe una solución artesanal del problema.

1) Colocamos un control TAnimate (al que llamaremos Animate1) con la propiedad Active a False y otro TMediaPlayer (al que llamaremos (MP) con la propiedad AutoOpen a False. Se necesitan estos valores porque desconocemos a priori el nombre del fichero video (.avi) que deseamos presentar. Como es obvio en la propiedad Display del control TMediaPplayer asignaremos el control TAnimate.

2) Creamos una carpeta debajo del ejecutable de la aplicación denominada videos y allí colocaremos los distintos trailers, llamándolos 1.avi, 2.avi, 3.avi, etc... Y como es obvio cada uno de ellos de corresponderán con los trailers de las películas cuya clave es 1, 2, 3 respectivamente.

3) En el módulo de datos (al que hemos llamado md) definiremos a nivel global una variable a la que llamaremos primero de tipo booleano.

4) En el evento Create del módulo de datos escribiremos

Primera:=True;

5) En el evento AfterScroll de la tabla tpelículas escribiremos el siguiente código:

procedure Tmd.tpeliculasAfterScroll(DataSet: TDataSet);
var
fichero : string;
begin
fichero:=dir0+'videos\'+inttostr(md.tpeliculas.FieldByName('Codigo_pelicula').AsInteger)+'.avi';
if fileexists(fichero) then
begin
if Primera = False then
begin
Upeliculas.fpeliculas.MP.FileName:=fichero;
Upeliculas.fpeliculas.MP.Open;
Upeliculas.fpeliculas.MP.Play;
end
else Primera := False;
end;
end;

Donde:

Upeliculas es la unidad .pas donde se encuentra el formato fpeliculas del proyecto.

  • fichero es una variable de cadena que cada vez que ocurre un scroll en la tabla (avance o retroceso de los registros) apunta a un hipotético fichero avi que contiene, si existe, el trailer de la película cuyos datos se están mostrando en la interfaz.
  • dir0, es una variable local que apunta al ejecutable de la aplicación, y que está definida en la forma dir0:=extractfilepath(Application.exename); dentro del create del módulo de datos.
  • primero, ya explicada, es una variable que la primera vez que se abre la tabla tiene valor True y el resto de las veces mientras nos desplazamos por los registros de la tabla tiene valor False.
6) Para evitar que una vez se esté reproduciendo un trailer para un registro dado siga reproduciéndose con el cambio al registro anterior/posterior, hemos de escribir el siguiente código en el evento beforeScroll de la tabla películas,

procedure Tmd.tpeliculasBeforeScroll(DataSet: TDataSet);
begin
Upeliculas.fpeliculas.MP.Close;
Upeliculas.fpeliculas.Animate1.active:=False;
Upeliculas.fpeliculas.Animate1.Refresh;
end;

De esta manera cada vez que se haga scroll sobre los registros de la tabla lo primero que se hace es cerrar el componente TMediaPlayer, desactivar y refrescar el componente TAnimate.

7) El código anterior, funciona de forma sincronizada desde el segundo registro hasta el final de la tabla y viceversa, pero no funciona para el primer registro, ya que éste no se presenta mediante scroll la primera vez. Para resolver esto, en el evento Activate de la forma fpelículas escribimos:

procedure Tfpeliculas.FormActivate(Sender: TObject);
var
fichero:string;
begin
fichero:=dir0+'videos\'+inttostr(md.tpeliculas.FieldByName('Codigo_pelicula').AsInteger)+'.avi';
if fileexists(fichero) then
begin
Upeliculas.fpeliculas.MP.FileName:=fichero;
Upeliculas.fpeliculas.MP.Open;
Upeliculas.fpeliculas.MP.Play;
end;
end;

Con esto conseguimos presentar el video del primer registro de la tabla, si existe...

Y esto es todo!!.

Aunque parece farragoso pero es de una lógica sencilla si se sabe interpretar los eventos afterScroll y beforeScroll que se producen en una tabla conforme nos movemos sobre ella.

Existen otras solucione mas rápidas y cómodas, pero mucho me temo que requieren de controles/componentes u objetos propietarios, y muy probablemente motores de bases de datos distintos.

domingo, 7 de diciembre de 2008

Editor de instalaciones NSIS y HM NIS Edit.

En el desarrollo de aplicaciones, cuando la aplicación está definitivamente terminada, se hace necesario diseñar un programa instalador o setup que permita la distribución de los distintos componentes que integra la aplicación y la instalación rápida y fácil por parte del usuario.

Existen muchas herramientas que permiten hacer esto, unas son de código propietario y otras abierto o libres. Utilizaremos aquí una de código libre y gratuita denominada NSIS, con su editor de script HM NIS Edit.

La descargar de estas herramientas la podemos hacer desde,
http://nsis.sourceforge.net/Main_page y http://hmne.sourceforge.net/ respectivamente.

Una vez descargadas e instaladas en el disco duro, procederemos a elaborar un script de instalación que respete el siguiente diseño:

Suponemos una aplicación que se llama GESAL 1.0, cuyo ejecutable se encuentra en la carpeta GESAL y que tiene varias carpetas:

BD, Base de Datos de MS Access,
RPT, Informes de Crystal Report
HELP, Ficheros de Ayuda

Suponemos igualmente que en la carpeta principal se encuentran dos ficheros de texto, denominados Licencia.txt y leeme.txt, con la correspondiente información.

En la hipótesis anterior, abrimos el editor NIS Edit y aparecerá

Seleccionamos ahora Archivo/Nuevo Script desde el Asistete, y aparecerá


Pulsamos siguiente,


En la pantalla anterior tendremos que cumplimentar los datos que nos solicitan, es necesario introducir estos datos puesto que el programa instalador los utilizará en la presentación de la instalación. La entrada de la página web no es necesaria si no se dispone de ella.

Pulsamos siguiente,

En esta pantalla sólo es necesario indicarle el nombre y dónde se desea que se guarde el ejecutable del instalador setup. Podría además cambiarse el icono del instalador, el lenguaje, la interfaz y el tipo de compresión.

Pulsamos siguiente,

En esta pantalla, elegimos el directorio por defecto donse deseamos instalar la aplicación, permitimos o no al usuario cambiar el directorio de instalación, indicamos dónde se encuentra el fichero de texto que incorpora la Licencia y establecemos la forma en la que el usuario aceptará la licencia.
Téngase presente que la variable interna $PROGRAMFILE apunta a C:\Archivos de Programa

Pulsamos ahora siguiente,


En esta pantalla y siguiendo el supuesto, tendremos que añadir a la carpeta "principal" tres archivos: El ejecutable, el readme y la licencia.

Es decir:




Crearemos ahora la carpetas BD, en la que se ha incluido la base de datos correspondiente,

Comprobamos que la base de datos Ms Access (archivo con extensión mbd) se instsla en $INSTDIR\BD.

Crearemos después la carpeta RPT, en la que hemos incluidos los distintos informes de Crystal Report,Comprobamos que los archivos de extensión rpt serán copiados en la carpeta $INSTDIR\RPT

Pulsamos ahora Siguiente,


En esta pantalla se definen los iconos, el directorio del menu de inicio y los accesos directos.

Pulsamos siguiente,


En esta pantalla fijamos los parámetros de ejecución , si existen, de la aplicación y el nombre y la localización del fichero leeme.txt

Pulsamos siguiente,



En esta pantalla se fijarán determinadas caracteristicas del programa desinstalador.

Pulsamos siguiente,


Es esta pantalla seleccionamos Guardar script, Convertir rutas de archivos a rutas relativas y compilar script.

Pulsamos siguiente,


En esta pantalla seleccionamos el nombre y directorio donde deseamos guardar el script.

Finalmente, aparece el script Y EL RESULTADO DE LA COMPILACIÓN.


viernes, 5 de diciembre de 2008

Informes parametrizados con Crystal Report + Delphi. (Parametro = TJvDateEdit).

A veces, la gestión de un informe parametrizado desde Delphi, previamente diseñado con Crystal Report, requiere que la entrada del valor del parámetro se realice a través de un componente que acepte fechas, tal como TJvDateEdit

Por ejemplo, supongamos que tenemos un informe parametrizado que acepta un parámetro de fecha. Supongamos que el campo con el que deseamos comparar pertenezca a la tabla Proyecciones y se llame fechadeproyeccion.

Queremos lanzar un listado parametrizado, de modo que se obtengan sólo los registros de las proyecciones para los que la fecha de proyección sea igual o menor que la fecha entregada en el parámetro.

Para resolver esta cuestión:

1) Disponemos de un miembro de especificaciones con extensión .rpt, generado desde el propio Crystal Report, y al que le hemos llamado InfFechaProyecciones.rpt. Definimos un parámetro de cadena (... no Date, es necesario crearlo como string) en el informe denominado ParFecha y establecemos como formula de selección de los registros la siguiente:

{Proyecciones.fechadeproyeccion} <= DateTimeValue ({?ParFecha})

La función DateTimerValue garantiza que la cadena introducida en el parámetro se convierta a tipo Fecha (Date).

2) Añadirmos al formulario un Objeto/Componente TJvDateEdit al que llamaremos ParFecha, de modo que su propiedad Text tomará como "cadena" en formato DD/MM/AAAA el valor introducido como parámetro.

3) Un botón que, desde su evento click, ejecute el siguiente código:

md.InfFechaProyeccion.ReportName:=ExtractFilePath(Application.ExeName)+'RPT\InfFechaProyeccion.rpt';

md.InfFechaProyeccion.ParamFields.Items[0].CurrentValue:=ParFecha.Text;

md.DirxNacionalidad.execute;

EXPLICACIÓN:

Tal como puede verse, la primera instrucción fija en términos relativos al ejecutable del proyecto, la localización del archivo generado por Crystal Report (extensión rpt).

La segunda instrucción asigna al valor actual del parámetro de orden cero (el primero) a la propiedad Text dependiendo de la fecha seleccionada en el componente TJvDateEdit.

Finalmente, el método execute, ejecuta el informe.

miércoles, 3 de diciembre de 2008

Informes parametrizados con Crystal Report + Delphi. (Parametro = TComboBox).

A veces, la gestión de un informe parametrizado desde Delphi, previamente diseñado con Crystal Report, requiere que la entrada del valor del parámetro se realice a través de un componente TComboBox.

Por ejemplo, supongamos que tenemos un informe parametrizado que acepta un parámetro de cadena con una de las siguiente entradas (Spain, Russia, United Kingdom, United States), y que se corresponde con cuatro nacionalidades posibles.

Para resolver esta cuestión:

1) Disponemos de un miembro de especificaciones con extensión .rpt, generado desde el propio Crystal Report, y al que le hemos llamado DirxNacionalidad.rpt

2) Añadirmos un Objeto/Componente TComboBox al que llamaremos ParNacCombo y para el que la propiedad Items tiene los cuatro valores arriba enumerados, y que se tomarán como posibles valores del parámetro. Fijaremos la propiedad ItemIndex en 0 para indicar que la caja tendrá seleccionado el primer elemento (índice cero).

3) Un botón que, desde su evento click, ejecute el siguiente código:

md.DirxNacionalidad.ReportName:=ExtractFilePath(Application.ExeName)+'RPT\DirxNacionalidad.rpt';

md.DirxNacionalidad.ParamFields.Items[0].CurrentValue := ParNacCombo.Items[ParNacCombo.ItemIndex];

md.DirxNacionalidad.execute;

EXPLICACIÓN:

En el ejemplo anterior al objeto/Componente TComboBox le he llamado pParNacCombo, el miembro rpt se llama DirxNacionalidad y se encuentra en el directorio RPT desde donde se ejecuta la aplicación.

Tal como puede verse, la primera instrucción fija en términos relativos al ejecutable del proyecto, la localización del archivo generado por Crystal Report (extensión rpt).

La segunda instrucción asigna al valor actual del parámetro de orden cero (el primero) al elemento seleccionado por el usuario de la caja combinada. Téngase presente que los elementos de la caja están indexados y que el valor entero asignado a la propiedad ItemIndex coincide siempre con el elemento seleccionado por el usuario.

Finalmente, el método execute, ejecuta el informe.

Informes parametrizados con Crystal Report + Delphi. (Parametro = JvDBSearchComboBox).

A veces, el valor del parámetro que toma un informe parametrizado desde Delphi, previamente diseñado con Crystal Report, no es libre para el usuario. El usuario se ve obligado a elegir un valor del parámetro que es un campo de una tabla. En este caso, será necesario utilizar el Objeto/Componente "JvDBSearchComboBox" de la paleta de componentes "Jv Data Controls".

Supongamos que

1) Disponemos de un miembro de especificaciones con extensión .rpt, generado desde el propio Crystal Report, que espera un valor de parámetro (la Nacionalidad) y además disponemos de una tabla denominada tpaises con su datasource denominado dspaises. En este caso, no nos interesa que la entrada del valor del parámetro sea simplemente un TEdit, sencillamente porque el usuario podría introducir unas veces España y otras Spain para intentar hacer lo mismo. Necesitamos condicionar la entrada de la nacionalidad a los propios valores de una tabla que las contiene.

2) Añadimos a la interfaz un componente JvDBSearchComboBox, al que hemos llamado (propiedad name) ParJvDBSCB y para el que la propiedad datasource se fijará a dspaises y la propiedad datafield se fijará a pais.

3) Un botón que, desde su evento click, ejecute el siguiente código:

md.DirxNacionalidad.ReportName:=ExtractFilePath(Application.ExeName)+'RPT\DirxNacionalidad.rpt';

md.DirxNacionalidad.ParamFields.Items[0].CurrentValue := ParJvDBSCB.Text;

md.DirxNacionalidad.execute;

EXPLICACIÓN:

Tal como puede verse, la primera instrucción fija en términos relativos al ejecutable del proyecto, la localización del archivo generado por Crystal Report (extensión rpt).

La segunda instrucción asigna al valor actual del parámetro de orden cero (el primero) a la propiedad Text del objeto JvDBSearchComboBox, elegido previamente por el usuario desde una ComBoBox donde se presentar todos los valores posibles tomados de la tabla de paises.

Finalmente, el método execute, ejecuta el informe.

Informes parametrizados con Crystal Report + Delphi. (Parametro = TEdit).

Para gestionar un informe parametrizado desde Delphi, previamente diseñado con Crystal Report, es necesario:

1) Disponer de un miembro de especificaciones con extensión .rpt, generado desde el propio Crystal Report.

2) Un campo TEdit que reciba el valor concreto que tomará el parámetro.

3) Un botón que , desde su evento click, ejecute el siguiente código:

md.DirxNacionalidad.ReportName:=ExtractFilePath(Application.ExeName)+'RPT\DirxNacionalidad.rpt';

md.DirxNacionalidad.ParamFields.Items[0].CurrentValue := pInforme.Text;

md.DirxNacionalidad.execute;

EXPLICACIÓN:

En el ejemplo anterior al objeto/Componente TEdit le he llamado pInforme, el miembro rpt se llama DirxNacionalidad y se encuentra en el directorio RPT, desde donde se ejecuta la aplicación.

Tal como puede verse, la primera instrucción fija en términos relativos al ejecutable del proyecto, la localización del archivo generado por Crystal Report (extensión rpt).

La segunda instrucción asigna al valor actual del parámetro de orden cero (el primero) a la propiedad Text del objeto TEdit, introducido previamente por el usuario.

Finalmente, el método execute, ejecuta el informe.

viernes, 28 de noviembre de 2008

Instalación componentes Crystal Report.

Crystal Report es un generador de Informes diseñado para trabajar con una gran variedad de motores de bases de datos tales como Sybase, IBM DB2, Ingres, Microsoft Access, Microsoft SQL Server, MySQL, Interbase , Oracle, Btrieve, así como otras fuentes de datos tales Microsoft Excel, Text files, XML files, Lotus Notes, Microsoft Exchange , Novell GroupWise o datos accesibles mediante web service, ODBC, JDBC o OLAP.

Cualquiera que sea el origen y naturaleza de los datos, se requiere, mientras se desarrolla la aplicación, tener instalado Crystal Report en el sistema. Con ayuda de dicha herramienta generaremos un informe cuyas especificaciones terminarán en un fichero o archivo de extensión rpt.

Las especificaciones de un informe (.rpt) generado con Crystal Report pueden ser manipuladas desde Delphi a través de una serie de componentes que habrá que incorporar a la "Paleta de Componentes".

Para el caso concreto de Crystal Report 10, se necesita el archivo CrystalVCL10.zip, el cual, contiene los componentes TCrpe y TCrpeDS. Con ayuda de estos objetos/componentes podemos ver por pantalla en nuestros proyectos los informes previamente diseñados con Crystal Report, podemos lanzarlo a la impresora, o exportarlos a formatos tales como pdf , Excel, txt o csv.

Instalación.

Si descomprimimos CrystalVCL10.zip, veremos un archivo readme.txt donde se describen las instrucciones de instalación…

En forma resumida, los pasos a seguir son los siguientes:

a) Comprueba primero que no están instalados previamente los componentes que queremos instalar, para ello, inicia Delphi y comprueba que en la paleta de componentes no aparece en la pestaña “Data Access” los componentes TCrpe y TCrepD5.

b) Cierra todo (Close All) en Delphi, y pulsa "Project" y luego " Options". Localiza "Search path" pulsando previamente sobre "Directories/conditionals". En esa caja de texto hay que introducir el directorio donde se encuentra la carpeta Delphi, resultado de descomprimir CrystalVCL10.zip. Cierra finalmente la caja de diálogo.

c) Ve ahora a la opción File/Open y carga el archivo “dcl7cr10.dpk", (ojo con la extensión, pues los miembros dpk son componentes de terceros ), que se encuentra como cabe esperar en, por ejemplo, C:\componentes2\CrystalVCL10\Delphi.

d) Pulsa View/Project Manager, y comprobarás que el “paquete” anterior está compuesto por un gran número de unidades con extensión pas.

e) Haz click ahora con el botón derecho sobre el miembro “dcl7cr10”, verás que aparece el menú contextual. Para compilar hacer click en la opción “Compile”.

f) Cuando termine, haz click en “Install” en el mismo menú contextual. Si todo va bien aparecerá una informativa indicando que se han instalado los componentes TCrpe y TCrpeDS. Podrás localizar estos componentes en la pestaña "Data Access" de la Paleta de Componentes.

g) Finalmente, hacemos File/Close All y salvamos los cambios. Los componentes a partir de este momento nos permitirán gestionar los informes rpt generados con Crystal Report.

NOTA FINAL: Como es obvio, la distribución de las aplicaciones a nuestros clientes no requerirá de Crystal Report, sólo un runtime de libre distribución.