08 julio 2009

Favoritos para "consultas sql dinamicas"

Hace algún tiempo que publiqué en este "blog" un ejemplo para crear consultas sql, ahora veremos como añadir a la ventana de resultados una nueva funcionalidad que nos permita guardar a modo de "favoritos" las búsquedas realizadas, para usarlas en otras ocasiones sin tener que reescribirlas.

El primer paso será crear un nuevo objeto sobre la ventana de resultados, un menú desplegable cuyo aspecto sería el siguiente:


En el procedimiento $construct de la ventana resultados añadiremos la siguiente secuencia:

; Carga menú de favoritos
Do cFavoritos.$define(cFavNombre,cFavConsulta)
Test if file exists {[con(mid(sys(115),1,pos(':',sys(115))),iBusqueda,'.txt')]}
If flag true
Set import file name {[con(mid(sys(115),1,pos(':',sys(115))),iBusqueda,'.txt')]}
Prepare for import from file {Delimited (tabs)}
Import data cFavoritos
Close import file
End If

Do cFavoritos.$addbefore(1,'Favoritos')
Do cFavoritos.$add('Añadir...')
Do cFavoritos.$add('Examinar...')
Do cFavoritos.$line.$assign(1)


Cuando el usuario seleccione una opción de éste menú podrá suceder lo siguiente:

On evClick
Switch cFavoritos.cFavNombre

Case 'Añadir...'
Prompt for input De nombre a la selección actual/Favoritos/3005/50 Returns cFavNombre (Cancel button,Prompt above entry)
If flag true
Do cFavoritos.$addafter(1,cFavNombre,$clib.$queries.[iBusqueda].$extraquerytext)
; Guarda favoritos en el disco
Set current list cFavoritos
If #LN>3
Set print or export file name {[con(mid(sys(115),1,pos(':',sys(115)))
,iBusqueda,'.txt')]}
For each line in list from 2 to #LN-2 step 1
Transmit text to print file {[cFavoritos.cFavNombre][chr(9)][cFavoritos.cFavConsulta][chr(9)][chr(13)]}
End For
Close print or export file
End If
End If
Case 'Examinar...'
Open window instance Favoritos (iBusqueda)

; Recarga favoritos
Set import file name {[con(mid(sys(115),1,pos(':',sys(115))),iBusqueda,'.txt')]}
Prepare for import from file {Delimited (tabs)}
Import data cFavoritos
Close import file
Do cFavoritos.$addbefore(1,'Favoritos')
Do cFavoritos.$add('Añadir...')
Do cFavoritos.$add('Examinar...')
Do cFavoritos.$line.$assign(1)
Do $root.$redraw()

Default
Do $clib.$queries.[iBusqueda].$extraquerytext.$assign(cFavoritos.cFavConsulta)
Do iVerList.$definefromsqlclass(iBusqueda)
Do iVerList.$sessionobject.$assign(iSessionObj) Returns #F
Do iVerList.$select() Returns lStatus
Do iVerList.$fetch(kFetchAll) Returns lStatus
Do iVerList.$line.$assign(1)
Calculate cRecordList as con(iVerList.$linecount,' registros en seleción')
Do $root.$redraw()
End Switch

Do cFavoritos.$line.$assign(1)
Do $cwind.$objs.Favoritos.$redraw()


La ventana para la gestión de favoritos (opción examinar) mostraría el siguiente aspecto:


La programación para esta ventana sería como sigue:

En el $construct de la ventana:

Do iListFavor.$define(iFavNombre,iFavConsulta)
Set current list iListFavor
Set import file name {[con(mid(sys(115),1,pos(':',sys(115))),pBusqueda,'.txt')]}
Prepare for import from file {Delimited (tabs)}
Import data iListFavor
Close import file
Enter data
If flag true
; Guarda favoritos en el disco
Set print or export file name {[con(mid(sys(115),1,pos(':',sys(115))),pBusqueda,'.txt')]}
For each line in list from 1 to #LN step 1
Transmit text to print file {[iListFavor.iFavNombre][chr(9)][iListFavor.iFavConsulta][chr(9)][chr(13)]}
End For
Close print or export file
End If
Close top window


Para la opción "mover arriba":

On evClick ;; Event Parameters - pRow( Itemreference )
Calculate iListFavor.$line as $cwind.$objs.favoritos_datagrid_1016.$gridvcell-1
If iListFavor.$line>1&iListFavor.$linecount>1
Load from list
Do iListFavor.$addbefore(iListFavor.$line-1,iFavNombre,iFavConsulta)
Do iListFavor.$remove(iListFavor.$line+1)
Do $cwind.$objs.favoritos_datagrid_1016.$redraw()
End If


Para la opción "mover abajo":

On evClick
Calculate iListFavor.$line as $cwind.$objs.favoritos_datagrid_1016.$gridvcell-1
If iListFavor.$line
Load from list
Do iListFavor.$addafter(iListFavor.$line+1,iFavNombre,iFavConsulta)
Do iListFavor.$remove(iListFavor.$line)
Do $cwind.$objs.favoritos_datagrid_1016.$redraw()
End If


Y por último para la opción "eliminar":

On evClick
Calculate iListFavor.$line as $cwind.$objs.favoritos_datagrid_1016.$gridvcell-1
If iListFavor.$line>0
Do iListFavor.$remove(iListFavor.$line)
Do $cwind.$objs.favoritos_datagrid_1016.$redraw()
End If


Y eso será todo, el sistema contendrá en archivos de texto plano, las preferencias o favoritos de las búsquedas seleccionadas permitiendo su posterior uso, con tan sólo seleccionarlas desde el menú, cada búsqueda diferente tendrá su propio archivo de texto plano.

22 junio 2009

Herramienta "ad hoc"

La herramienta de informes "ad hoc "

Se trata de una versión localizada al castellano de esta herramienta proporcionada por Omnis, para la generación rápida de informes y consulta de datos, mediante SQL.

El acceso a la base de datos se realiza mediante la DAM Omnis SQL para tener acceso a un archivo de datos de Omnis. La utilidad comprueba las sesiones abiertas con el servidor de datos y utiliza esta (independientemente de que servicio se trate Oracle, MySQL, etc) para presentar las tablas de datos que contenga.

Los informes que se generan son iguales que los presentados por la aplicación estándar "ad hoc" por lo que su manejo es idéntico al que se describe en el manual de Omnis para esta herramienta. Para usarla deberá colocar la librería adjunta en la carpeta de inicio (Startup).

Descargar librería

03 junio 2009

Aplicaciones modulares

Al diseñar una aplicación, es posible que deseemos modularla mediante la creación de una biblioteca que contenga todos los módulos de ventanas, informes y métodos.
Cada módulo puede tener sus propios menús y barras de herramientas. Un ejemplo podría ser una aplicación de gestión académica, con las preinscripciones, matriculas y expedientes.
En una aplicación totalmente modular, donde el usuario cambia constantemente entre módulos, no es fácil asegurarse de que el usuario vea correctamente los menús y herramientas para el módulo en uso. En un entorno, multi-ventana, el control de esta a veces puede ser difícil. Afortunadamente Omnis Studio permite la creación de múltiples “tasks” o tareas que permiten automatizar el proceso de creación de aplicaciones modulares.
Observe el ejemplo siguiente en el que, en una sola biblioteca se están ejecutando tres tareas: La “Startup_Task” y dos tareas más “Task1” y “Task2”. La tarea de inicio, que se abre automáticamente cuando se abre la biblioteca, contiene una ventana “Acerca de”. Las otras dos tareas contienen cada una, una ventana, un menú y una barra de herramientas. Cuando el usuario selecciona una ventana de “Task1” o de “Task2”, Omnis mostrará automáticamente las herramientas (toolbar) y los menús que correspondan a cada tarea.

Cuando la biblioteca se abre, la tarea inicial se ejecuta (Startup_Task) para mostrar la ventana “Acerca de” entonces se abren las demás tareas, cada una de los cuales abre su ventana, instala su menú y su barra de herramientas. La tarea de inicio concluye una vez que la propia ventana “Acerca de” se cierre.
Para abrir las dos tareas, usted deberá introducir la siguiente secuencia de instrucciones en el método $construct() de la tarea inicial.
Open window instance AboutWindow
Open task instance MyTaskClass1/Task1
Open task instance MyTaskClass2/Task2
Close task instance LibraryName ;; cierra la instancia Startup_Task

Cada tarea tiene una propiedad $autoactivate, que permite a la misma tomar el control, cuando el usuario actúa sobre la ventana que la contiene. Si la propiedad se establece en “false”, la ventana no llegará a mostrarse. Para que se active de manera automática, será necesario fijar la siguiente secuencia en el $construct() de cada tarea.
Do $ctask.$autoactivate.$assign(kTrue)
Para asegurarse de que los menús y barras de herramientas se muestren y oculten al cambiar de tarea, necesitará establecer la propiedad $local en cada clase. Al activar el “modo local” para cada menú y barra de herramientas que posee la tarea, Omnis los esconderá y mostrará automáticamente.
El ejemplo que se muestra a continuación, indica como establecer la propiedad $local desde el procedimiento $construct() de cada tarea:
; Método $construct() para la task1...
Do $menus.MyMenuClass1.$open(‘Menu1’) Returns iMenuRef
Do iMenuRef.$local.$assign(kTrue)
Do $toolbars.MyToolbarClass1.$open(‘Toolbar1’) Returns iToolRef
Do iToolRef.$local.$assign(kTrue)
Do $windows.MyWindowClass1.$open(‘Window1’) Returns iWinRef
Y exactamente lo mismo para la otra tarea.
; Método $construct() para la task2...
Do $menus.MyMenuClass2.$open(‘Menu1’) Returns iMenuRef
Do iMenuRef.$local.$assign(kTrue)
Do $toolbars.MyToolbarClass2.$open(‘Toolbar1’) Returns iToolRef
Do iToolRef.$local.$assign(kTrue)
Do $windows.MyWindowClass2.$open(‘Window1’) Returns iWinRef
Esta funcionalidad hará que los menús y barras de herramientas cambien automáticamente al cambiar de tarea.