Domk no pierde interés…

septiembre 23, 2007 en Enlace interesante, Entrada Diario, Velneo

Mis compañeros de Velneo que no pierdan de vista el blog de Domk.
Una de las últimas entradas habla sobre como crearnos una utilidad de búsqueda y aunque Domingo muy acertadamente la ciñe al ámbito de la web, podeis aplicar el sistema a vuestras aplicaciones:

Buscador web

Se trata al final de aprovechar toda la potencia de los índices de Velneo, entre otros, uno de sus verdaderos puntos fuertes. :-)

La entrada os puede ser muy util así que no la dejeis de leer.

Tres en Raya para Velneo

junio 15, 2007 en Artículos, Velneo

Como ya comenté en una de las entradas anteriores, Empezar por un juego…, ha sido un buen ejercicio para conocer hasta que punto voy asimilando los conocimientos adquiridos. Es interesante plantearse pequeñas aplicaciones en las que aplicarlos, sin que acabemos perdiendonos en detalles que te ofuscan mas que te permiten avanzar. Yo me propuse implementar el juego del tres en raya desde la perspectiva de Velneo, de forma que pudiera combinar algunos de los conocimientos que enumeraba en dicha entrada.

El resultado lo podeis descargar de vTresEnRaya.zip por si puede ayudar a alguien. A mi me ha servido para comprender el funcionamiento de los eventos, las actualizaciones, el uso de librerias dll y funciones/procesos. Son algunos de los detalles que permite ver. Si el lector de esta entrada no proviene del ambito de Velneo puede descargar gratuitamente el editor de Velneo de su página oficial e instalarlo. El editor lo podéis descargar del siguiente enlace:

Descarga editor de Velneo (libre)

Una vez instalado, la forma mas sencilla de visualizar la ejecución del mapa es lanzar el editor de texto y pulsar el boton correspondiente a cargar un mapa (Abrir). Eso si, debeis previamente copiar la dll en una carpeta del sistema, como Sistem32 para que funcione. Una vez abierto el mapa, basta pulsar la tecla F5 y ejecutareis la aplicación. Es realmente sencillo. :-)

Esta es una imagen del mapa en ejecución:

Imagen del juego del 3 en Raya

Respecto al mapa, estoy seguro que se puede mejorar u optimizar, sobretodo a nivel de ejecución de los distintos procesos que intervienen. Tiempo habrá de matizar algunos detalles que pueden pasar inadvertidos. De cualquier forma, los objetivos que quería cubrir, creo que mas o menos se cumplen ya que el resultado es “aceptable”.

Se pueden sacar algunas reflexiones que parecen interesantes, siempre desde el respeto y la imparcialidad, y sobretodo desde el deseo de ser constructivos. ¿Todos los sistemas tienen su talón de Aquiles?. Quizás el de Velneo haya sido el dejar los formularios de Menu para un proposito para el que posiblemente no fueron diseñados “enteramente”. Esto es tan solo una quimera mía. Veo un formulario de edición de Fichas, que comparte la “problematica” de toda transacción abierta, con una caducidad (timeout) de cuatro minutos, y que permitirá finalmente al servidor deshacer automaticamente la transacción. Esto en mi opinión le deja un poco margen en aquellos desarrollos que el usuario quede a la espera del cliente y su capacidad de decisión. :-) Hay ejemplos en las mismas plantillas que inducen a pensar que esto pesa sobre la conciencia del desarrollador, y el primero que se me ocurre es la misma elección del interfaz del TPV, basado en un menu de Formulario en lugar de un Menu de Edición de Ficha.

Un cliente que tardara mas de cuatro minutos en decidirse en comprar la caja azul o la caja roja hubiera provocado que un formulario normal se hubiera suicidado automaticamente. =:-O Ojo… hablamos de aplicaciones ejecutadas en el servidor de Velneo y de procesos que dejen abierta la transacción (podría ser por ejemplo el alta de un cliente). (*)

Es facil de comprobar para los que tengais instalados el servidor de Velazquez. Basta ejecutar un formulario de alta y modificar algunos campos. Luego esperar aproximadamente 4 minutos y al intentar validar el registro recibiremos un mensaje de error ya que el servidor habrá deshecho la transacción.

¿Eso es malo o bueno? Pues… ummm… parece que según se mire. Desde luego es un buen sistema para evitar que el servidor se sature con peticiones que quedan olvidadas y bloquean registros que pueden ser necesitados por otros usuarios. En un sistema clientes/servidor, como lo es Velneo, es un tema a tener en cuenta y entiendo que no se puede dejar al azar.

(*) Vale… vale… Se que se escucharán algunos siseos y comentarios: siempre hay formas de evitar el timeout de la transacción tales como provocar el alta y convertirla de forma inadvertida en una edición, pero bueno… estamos hablando de los comportamientos lógicos, pues una solución como está obligaría a eliminar el registro si el alta es cancelada, lo cual es algo un tanto extraño.

Mi madre tarda mas de diez minutos en decidir cosas menos urgentes… :-) Así que un formulario de menu, que resulta un invento cojonudo para presentar las opciones de la aplicación, se reintroduce con unos controles que permiten (y perdón por la redundancia) un control bastante mediocre del flujo de la aplicación (1). No podemos mover los objetos dinámicamente, como nos permitiría una gran parte de los entornos. No podemos destruirlos, ni crearlos nuevamente… Nos basta jugar con la visibilidad de los mismos, establenciendo las condiciones adecuadas. Esto es posible hacerlo en un tablero pequeño, con nueve casillas y dos posibilidades por casilla. Si esto fuera el tablero de un ajedrez, aun existiendo la forma de registrar los movimientos y el modus operandi de la lógica del juego, resultaría inviable el uso de la ocultación, como medio de percepción del estado por el usuario. Así que si nuestra aplicación tiene que mover controles en el formulario no cuentes con la V6 de Velneo, o buscas nuevas formas de presentar tu aplicación, lo cual tampoco es malo, pues nos enseña que no siempre tenemos que seguir el camino esperado. :-)

Luego existen algunos detalles que quedan bien resueltos en el formulario de edición de Fichas y que no me acaban de gustar en el formulario de Menu. Hablo concretamente del control del orden z de los objetos. En un formulario de edición de Fichas, existe adosado al mismo, una rejilla en la que se visualizan los distintos controles que aparecen y el orden en la lista se corresponde tambien con la condición de visibilidad o solapamiento. Debería haberse planteado un sistema similar en los formularios de Menú. Hubiera sido más práctico que el actual sistema de marcar el orden de forma manual mediante la pulsación del objeto, que en mi opinión no es un sistema comodo de trabajo.
:-(

Por otro lado, y razonando sobre el bloqueo de los registros en el inicio de la transacción, el uso de formularios de Menu parece mas adecuado para seguir el sistema de “coge el dinero y largate antes de que te pillen…” El sistema buscará la mejor forma de iniciar la transacción y que está dure el menor tiempo posible. Cuanto menos dure, menos conflictos existirán y por ende, menos problemática. Parece lógico: Un menu de edición de fichas va ligado a una tabla determinada, por definición. Un formulario de menú NO. Así que será la ejecución de los procesos ligados a el, los que inicien la transaccion y la finalicen, de forma que se cumple en principio esa primera parte del teorema, quedando a juicio del implementador la duración. Yo creo que se entiende, ¿no?

Podeis ver algo mas de información sobre el sistema de bloqueo de registros utilizado por Velneo en su web, a nivel de foro o en alguna entrada de su blog:
http://blog.velneo.com/web/p.pro?vdis=4&p=30700

Aun así, y a pesar de estos comentarios que a primera vista inducirían a tener una visión negativa, nada más lejos de la realidad. El peso de un formulario de Menu sobre la aplicación es bastante pequeño y siempre existen formas de minimizar algunos efectos negativos. Que no se pueda mover un control en tiempo de ejecución no debería ser un problema insalvable, de la misma forma que tampoco lo debería ser que una transacción tuviera un tiempo límite de vida. Basta entrar en el foro y descubrir como día a día se encuentran patrones que permiten plantear los problemas desde otra óptica y eso me parece muy positivo. :-)

No existen sistemas perfectos. Todos son mejorables y cada cual tiene sus pros y sus contras. En próximas entradas intentaremos analizar y reflexionar sobre algunos aspectos muy positivos que también nos descubre.

(1) Si se comparan algunos controles existentes en un menu de edición de ficha frente a los mismos insertados en un menu de formulario, como por ejemplo una casilla de edición, veremos claramente que es algo mas restringida la funcionalidad del mismo en este segundo caso. La gente que provenimos de otros entornos, a menudo enfocamos los controles y disponemos del foco libremente mediante código. Se puede simular pero se echa en falta… :-( Para compensar, en Velneo disponemos de la sincronización de controles que nos permite sin codigo la actualización de algunos objetos como rejillas o variables asociadas a controles del formulario. En fin… reconozco que la palabra “mediocre” es un tanto injusta, ya que el problema no es realmente que existan problemas en el cambio de foco sino que echamos de menos algunos recursos de los que disponemos en otros entornos a nivel de formulario de Menú.

Primeros pasos tras el curso…

mayo 30, 2007 en Artículos, Entrada Diario, Velneo

Comentaba en una de las entradas anteriores, que hace poco había acabado el curso virtual de Velneo que incluye la compra de la versión profesional. En lineas generales me pareció muy correcto y cuando se finaliza, al menos se tiene una idea bastante general de lo que te puede ofrecer este entorno de trabajo. Es similar a cuando compramos un libro de introducción a un tema, con la diferencia que en este tipo de cursos y el hecho precisamente de tener un tutor que nos oriente, puede facilitarnos ese aprendizaje en menor tiempo.

Sin embargo, tanto los libros como los cursos, nos dejan en ese punto inicial crítico que yo quise remarcar en el título del blog: “Desde cero”. Me explico y si me lo permitiis utilizare un simil del mundo animal: es semejante al momento en el que el polluelo debe de saltar del nido y probar las alas. Es su primer salto. Y la madre no escatima “picotazos” hasta que le hace saltar (es broma lo de los picotazos) porque ¡no va a quedarse toda la vida en el nido!. Los ejemplos que se viven en los cursos, los que se escriben en los libros, los que leemos en las webs, se escriben como lo que son, ejemplos. Se preparan y se buscan para que la persona que los lee no se pierda en detalles menos importantes y se centre en algunos temas concretos.

Así que al referir desde el titulo esa idea de partir desde cero, hacía alusión a los momentos en los que nos preparamos para intentar adaptar esos conocimientos aprendidos a la vida real, cosa que sin duda ya no resulta tan sencilla.

Podemos, como yo ya me lo he planteado, pensar en poner en marcha algun tipo de desarrollo con esta nueva herramienta. Es cuestión de pensar un poco y ver como rentabilizar los recursos que estamos adquiriendo. En mi caso concreto, disponía de la plantilla de gestión y la de tpv. Pues bueno… ¡adelante!. Vamos a ver donde la podemos colocar para poder verla trabajar en el mundo real. Eso nos dará una idea bastante buena de qué problemas vamos a encontrarnos, y nos permitirá conocer con mas detalle las distintas tablas y sus relaciones. En mi opinión puede ser interesante decantarnos por un comercio mas o menos pequeño, que no nos obligue en un primer momento a modificar demasiados puntos de la plantilla original.

Por otro lado, y dado que ya partimos de la experiencia previa de haber trabajado con otras herramientas, parece hasta cierto punto lógico ver si de alguna forma nos podemos valer de ellas en algo. En el caso de Velneo hemos aprendido durante el curso que el entorno puede ser mejorado mediante la instalación de pluggins que nos permitirán funcionalidades nuevas. Es el ejemplo del pluggin v2Excel, que nos permite manipular la hoja de cálculo del Office. Otro ejemplo puede ser el vODBC para la gestión de bases de datos externas a través de ODBC.
La utilización de estos pluggins es realmente sencilla ya que están correctamente documentados y el mecanismo de llamada de las funciones a través de la invocación de los procesos es sencillo. En ese sentido no creo que tengáis demasiados problemas. Estos temas los iremos abordando un poco mas adelante.

Sin embargo, mientras escribía estas líneas y escudriñaba en la funciones o rutinas disponibles desde Velneo, es dificil no echar de menos algunas de las funciones mas habituales a las que estabamos acostumbrados desde un entorno como Delphi. Disponíamos de mayor número de funciones de apoyo. Se me ocurre por ejemplo el area de la manipulación de fechas, pero podríamos extenernos a otras areas.

Si os parece vamos a jugar un rato… :-)

La idea es intentar hacernos nuestro primer pluggin y para ello nos basta abrir el entorno de delphi y crear una librería que nos pueda servir de ayuda como funciones auxiliares. Se trata tan solo de un ejemplo ¿vale?
Nos permitirá saber si realmente es dificil ampliar nuestro entorno con nuevas funciones y de paso, aprovechar algunas rutinas que podamos haber implementado tiempo atras (si fuera el caso).

Elegimos nueva libreria y tras un rato tecleando veamos que obtenemos:


library firstlib;

uses
Windows,
Messages,
SysUtils,
Dialogs,
calendario in ‘calendario.pas’ {frmFecha};

function Max3(Num1, Num2, Num3: Integer): Integer; stdcall;
begin
   Result:= Num1;
   if Num2 > Result then Result:= Num2;
   if Num3 > Result then Result:= Num3;
end;

function MensajeAlerta(const ATipo: Smallint): Integer; stdcall;
begin
   Result:= ATipo;
   case ATipo of
      0: ShowMessage(

    ’Mostramos un calendario en una ventana modal.’+#13#10+
    ’Pulsar en una dia del mismo con un doble click.’+#13#10+
    ’La variable FECHA asignada a la casilla de texto’+#13#10+
    ’visualizará el valor’);

      1: ShowMessage(

    ’Vamos a mostrar un cuadro de dialogo.’+#13#10+
    ’El usuario elige el directorio correspondiente +#13#10+
    ’Y la variable ARCHIVO asignada a la casilla de texto’+#13#10+
    ’visualizará el valor’);

        else
             Result:= -1;
   end;
end;

function GetStrDate: PChar; stdcall;
var
   MiFecha: TDateTime;
   s: String;
   res: Array[0..MAX_PATH] of Char;
begin
   frmFecha:= TfrmFecha.Create(nil);
   try
         frmFecha.ShowModal;
         MiFecha:= frmFecha.fFecha;
   finally
         FreeAndNil(frmFecha);
   end;
   s:= FormatDateTime(‘dd/mm/yyyy’, MiFecha);
   StrCopy(res, PChar(s));
   Result:= res;
end;

function GetFileName: PChar; stdcall;
var
   Dialogo: TOpenDialog;
   s: String;
   res: Array[0..MAX_PATH] of Char;
begin
   Dialogo:= TOpenDialog.Create(nil);
   try
   if Dialogo.Execute then
        s:= Dialogo.FileName;
   finally
        FreeAndNil(Dialogo);
   end;
   StrCopy(res, PChar(s));
   Result:= res;
end;

{$R *.res}

exports
  Max3, MensajeAlerta, GetStrDate, GetFileName;

begin
end.

No reflejo aquí el código de la unidad “calendario.pas” para no extenderme demasiado. Esta unidad será requerida por la librería para mostrar un calendario que nos permitirá elegir una fecha del mismo. Básicamente, tenemos un total de 3 funciones “utiles”:

Max3: Devuelve el mayor de los tres números que se han pasado como parámetros.
GetStrDate: Devuelve una cadena con la fecha elegida por el usuario.
GetFileName: Devuelve una ruta hacia un fichero.

Podéis descargar la librería desde este enlace: firstlib
Y en este otrol vínculo está el codigo fuente de la misma: codigo

Ahora ya es tiempo de abrir el entorno de Velneo e intentar enlazar nuestra librería para que pueda ser usada desde el mismo. Para simplificar, elegimos nuevo proyecto vacío. Una vez que se ha seleccionado la ruta en la que guardamos el proyecto, la ventana principal nos muestra el mínimo contenido que es generado por defecto en la ventana de estructura de datos y que se corresponde con la tabla VMAESTROS. Es decir que ya tenemos un proyecto sobre el que probar nuestra librería.

Veamos…

Tenemos que importar un objeto libreria por lo cual, llamamos a la opción Nuevo Objeto, bien desde los botones de la barra superior o bien desde el menu de la aplicacion (Objetos -> Nuevo -> Objeto) que nos conducirá a la siguiente ventana.


Galeria de Objetos de Velneo

Y desde alli, tras seleccionar con el doble click sobre el objeto librería de funciones (dll), podremos disponer de una ventana donde especificar todos los datos de las funciones de la dll, asi como el nombre de la misma y el estilo.

Rellenamos las casillas adecuadamente, quedando finalmente tal y como nos muestra la ventana:



Ahora no vamos a abordar algunos detalles interesantes sobre las librerias. Si os parece los dejaremos para las siguientes entradas, donde comentaremos que es eso de “stdcall” o los puntos que pueden ser un tanto problematicos en el uso de librerias. Yo por ejemplo he remitido una consulta técnica a Velneo para preguntar sobre cómo gestiona la reserva de memoria el entorno en el caso de cadenas terminadas en nulo o PChar, de cara a evitar cualquier goteo de memoria. Es posible que tenga que rectificar algun detalle de la libreria. Desde Delphi, como ya comentaremos, suele ser habitual reservar memoria desde la función y eliminarla con una llamada desde la misma aplicación que carga la librería. En este caso, he utilizado un array de char para alojar el retorno de la función.

Desgargar el siguiente mapa y lo podéis probar: vlibreria.zip

Bienvenidos a Velneo desde cero

mayo 28, 2007 en Entrada Diario

Hoy empieza una pequeña andadura para esta modesta página. Como veis, va a dar sus primeros pasos y aunque ahora son titubeantes en esta nueva area (Velneo), imagino que llegará el día en el que pueda caminar de forma segura y con pasos firmes. La intención con la que nace es únicamente narrar mi acercamiento a Velneo, desde Delphi, que es mi actual herramienta de trabajo, y compartir con quien quiera adentrarse en su lectura, mis primeros pasos. Estas páginas y yo mismo, partimos desde cero, como reza el título. Es nuestro Velneo desde cero.

Antes de escribir estas líneas reflexioné sobre la posibilidad de abrir un nuevo blog, pero ¿que quereis que os diga? :-) Despues de pensar los pros y los contras, encuentro que muchos de los conceptos que pueda abordar, tanto en uno como en otro, rozan una línea imaginaria, común a las dos herramientas. Os pongo un ejemplo: Si en Velneo abordo un comentario sobre las plantillas de negocio, quizás aporte a persona que me lea desde Delphi una idea que no había valorado desde la lógica de sus desarrollos. Así mismo, y desde la optica contraria, si desde delphi abordo la creación de utilidades mediante la generación de librerias, pueda verse favorecido el programador de Velneo que nunca las ha utilizado y piensa que son algo inalcanzable para el. Se me ocurren muchos detalles más, pero quizás lo mejor es que el tiempo acabe dando forma a todos estos razonamientos.

Falta decir que debido a estos cambios, he tenido que modificar los scripts de php de WordPress para distinguir mejor las distintas categorias, insertando imagenes que permitan visualizar mas facilmente el contenido del post. Eso facilitará la busqueda. Habrán más cambios en la estructura de la página, pero eso lo iremos abordando sobre la marcha, a medida que sean necesarios.

Sin más…, lo que digo siempre: Sed bienvenidos. Estais en vuestra casa.