Mostrando entradas con la etiqueta #OMNIS. Mostrar todas las entradas
Mostrando entradas con la etiqueta #OMNIS. Mostrar todas las entradas

21 septiembre 2017

Nuevo Servidor de Aplicaciones Omnis para Linux

Puedo decir que Omnis expande sus oportunidades de negocio, así como la robustez de su plataforma para el despliegue de aplicaciones en la Web, con la nueva versión "headless" del "Omnis App Server" para Linux, ya que permite la ejecución de aplicaciones web y móviles basadas en su tecnología jsClient bajo el entorno de comandos linux y sin necesidad de interface gráfica alguna, aunque permitiendo su administración remota desde un navegador Web. El denominado servidor "headless" está disponible sólo para Linux.

Todas las opciones del servidor podrán ser controladas remotamente desde la línea de comandos del terminal de la máquina Linux o (como ya hemos comentado) hacer uso de su herramienta "Admin" para la Web, incluida en el directorio "clientserver\server".

Consideraciones


Comandos de consola


Encontraremos un nuevo parámetro boleano en el fichero "config.json" denominado "headlessAcceptConsoleCommands". Puesto a "true" (su valor predeterminado), el servidor dejará disponible para su uso la interfaz de línea de comandos.

Funciones


Cuando el servidor está funcionando en modo línea de comandos, la nueva función "isheadless()" devolverá "true", "sys(231)" devolverá cero y "sys(233)" devolverá una cadena vacía, de otro modo devolvería el título de la ventana situada en primer plano sobre el Servidor Omnis.

Java


En caso de usarse el modo comandos y para iniciar la (Maquina Virtual Java) JVM deberá fijar a "ture" el elemento "startjvm" del fichero "config.json".


Creación de clases desde código Omnis


Si en su código Omnis crea nuevas clases dinámicamente mediante notación, ahora dispone de un mecanismo para crear objetos nuevos mediante plantillas, las cuales deberán estar ubicadas bajo la carpeta "componenttemplates" de "Studio". Las carpetas son...

"componenttemplates/window"
"componenttemplates/remoteform"
"componenttemplates/report"

...éstas contiene respectivamente los archivos de plantilla para la creación de ventanas, formularios remotos e informes. Cada nombre de plantilla deberá tener la forma "complibrary_compcontrol.json", con _ (subrayado) en lugar de espacios: Son copias de los archivos "object.json" con sus propiedades. "complibrary" y "compcontrol" identifican respectivamente un componente y un nombre de control.

Restricciones


Existen varias diferencias o (mejor dicho) restricciones en comparación con el Servidor de Aplicaciones Omnis convencional o de entorno gráfico y son las siguientes:

  • La inclusión de imágenes en un PDF está sólo permitido con PNG's (o a imágenes compartidas "true-color").
  • No está soportado el uso de "port".
  • Deberá usarse la entrada "start" bajo la sección "server" del "config.json" para iniciar el servidor en modo "multi-threaded"
  • El comando "Test if running in background" siempre devolverá "true".
  • Algunos comandos y métodos de notación producirán error si son ejecutados, tales como:  open window $open sobre una clase-ventana, etc.
  • Las funciones de conversión de imágenes no están soportadas: pictconvto, pictconvfrom, pictconvtypes, pictformat pictsize (producirán un error).
  • Los mensajes estándar generados por el servidor ("OK messages" y mensajes de error) se enviarán al archivo de "log" del servidor o bien al Terminal si fuese necesario.

Instalación


Descargue el instalador desde: www.omnis.net/download/

Esta instalación supone que se está ejecutando como "root" o utilizando "sudo".

Actualice su versión de Linux usando los siguientes comandos, según el entorno linux de que disponga:

  • Centos/redhat: sudo yum update
  • Suse: sudo zypper update
  • Ubuntu/debian: sudo apt-get update


Una vez actualizado, tendrá que instalar las dependencias que Omnis requiere para su ejecución y que son las siguientes:

  • Centos/redhat: cups, pango
  • Suse/Debian: Runs out of box
  • Ubuntu: cups, libpango1.0


Una vez instalados, deberá iniciar el instalador del siguiente modo:

./Omnis-Headless-App-Server-8.1-x64.run

Siga los pasos que le mostrará el instalador, tal y como lo haría en una instalación normal de Omnis Studio, asegurándose de que su número de serie sea el correcto, de otro modo, la instalación fallará.

En caso de Centos 7 o Redhat el servicio omnis no se iniciará automáticamente tras un reinicio, necesitará agregar manualmente Omnis a la lista "autostart" del siguiente modo:

sudo /sbin/chkconfig --add homnis
sudo /sbin/chkconfig --list homnis
                (Esta línea es para verificar que se ha agregado correctamente "homnis")
sudo /sbin/chkconfig homnis on

Ahora deberemos configurar el servidor utilizando la herramienta "Admin", tal y como mostramos a continuación y para según que plataforma:

CENTOS7 y REDHAT


Comandos necesarios para que Omnis funcione en Centos:

sudo yum update
sudo yum install cups
sudo yum install pango
sudo /sbin/chkconfig --add homnis
sudo /sbin/chkconfig --list homnis
sudo /sbin/chkconfig homnis on

SUSE


El servidor debe funcionar fuera del "box" de SUSE, pero recomendamos su actualización por si acaso:

sudo zypper update

Ubuntu 16.04, 17.04 y DEBIAN 9


sudo apt-get update
sudo apt-get install unzip
sudo apt-get install libpango1.0
sudo apt-get install cups

Herramienta Web de Administración


Disponemos de una herramienta "Admin" para configurar y mantener el servidor: la herramienta "Admin" se implementa por medio de un "remote-form" ubicado en la carpeta "clientserver\server" y puede ser cargado desde un navegador web, mediante abrir la página web llamada "osadmin.htm". Deberá tener en cuenta que, (para poder abrir esta página) deberá configurar antes en el servidor, el parámetro "data-webserverurl" de la página html mencionada, (URL, dirección IP o nombre y número de puerto, por ejemplo, http://192.1.1.68.5000), además de colocar el archivo html, bajo una ubicación que le permite abrirlo desde un navegador web.


La herramienta Administrador tiene varias pestañas que le permiten ver o configurar el servidor Activity, Logs, Settings y Users. Cuando abre la herramienta por primera vez en su navegador, se le pedirá que inicie la sesión: use el nombre de usuario predeterminado: omnis, contraseña: 0mn1s (el primer carácter es un cero). Una vez iniciada la sesión, podrá cambiar la contraseña predeterminada y crear otros usuarios.

Activity


La pestaña "Activity" le permite ver todas las librerías abiertas en el servidor. Puede utilizar el botón "Refresh" para actualizar la lista.

El botón "Open" le permite abrir una librería sobre el servidor; tenga en cuenta que eso ocasionará la ejecución de su método "construct". Puede hacer clic sobre cualquier librería para cerrarla con el botón "Close"; tenga en cuenta que al cerrar una librería se perderán todos las conexiones de los posibles clientes conectados a ella.

La pestaña "Active Tasks" mostrará todas las instancias "task" actualmente activas o (lo que es lo mismo) todas las conexiones de clientes actuales; mediante seleccionar una "task" o conexión, podrá ver sus detalles. También podremos matar o cerrar una instancia "task" o conexión mediante el botón "Kill Task"; tenga en cuenta que al eliminar una tarea o conexión se perderán las acciones en curso para ese cliente.

Logs


La pestaña "Logs" nos permite ver la siguiente información:

  • Server. Muestra un registro de la actividad del servidor (su ubicación puede indicarse en la pestaña "Settings")
  • Monitor. Muestra un registro de todas las conexiones de cliente activas (instancias "task")
  • Service. Muestra un registro de todos los errores o mensajes generados por el servidor, incluyendo cualquier mensaje de rastreo o información sobre cualquier solicitud "Web Service".


Bajo la pestaña "Service", el botón "Configure" le permite configurar los mensajes que se guardarán en el registro, incluyendo los atributos "folder" de "logToFile", los cuales indican la ruta hacia el lugar donde se encuentran los ficheros de registros en el servidor. Estos ajustes están localizados en el "config.json" del servidor, bajo el miembro "log", del siguiente modo:

"log": {
        "logcomp": "logToFile",
        "datatolog": [
            "restrequestheaders",
            "restrequestcontent",
            "restresponseheaders",
            "restresponsecontent",
            "tracelog",
            "seqnlog",
            "soapfault",
            "soaprequesturi",
            "soaprequest",
            "soapresponse",
            "cors",
            "headlessdebug",
            "headlesserror",
            "headlessmessage",
            "systemevent"
        ],
        "overrideWebServicesLog": true,
        "logToFile": {
            "stdout": true,
            "folder": "logs",
            "rollingcount": 10
},
        "windowssystemdragdrop": true
    }

Settings


Bajo la pestaña "Settings" podremos especificar la ubicación de los ficheros de registro del servidor y del monitor, además del período (temporizador) y el tamaño de los mismos. También podremos configurar el puerto que deberá usar el servidor ("Server Port"), el número de pilas de ejecución ("Server Stacks") y su "Timeslice" (todo quedará guardado en el archivo "config.json"), también podremos reiniciar el servicio desde aquí.

El nombre de servicio predeterminado es "homnis" y es especificado bajo la entrada "server" del archivo "config.json" del siguiente modo:

{
     "server": {
          …
               "service": "homnis"

Users


Bajo la pestaña "Users" podremos tanto modificar usuarios, como crear nuevos. El usuario predeterminado es "omnis" y podremos cambiarlo desde aquí. La selección, de la opción "Re-start Option" permite que un usuario reinicie el servidor.

Nota del autor


Decíamos al principio de éste artículo que "Omnis expande sus oportunidades de negocio" y la razón es que (en mi opinión) el nuevo servidor "headless", resulta en una opción muy apropiada, para poner en marcha un servicio "hosting" para el despliegue de aplicaciones Omnis en la Web, algo que me consta ha sido demandado por los desarrolladores de aplicaciones Omnis Studio.

Aunque aún no he tenido oportunidad de probarlo, parece sencillo el disponer de una o más máquinas virtuales Linux con servicios OAS (Omnis Application Server) instaladas en nuestro Data Center. ¿Que os parece la idea?


25 abril 2017

Novedades Omnis Studio 8.1

Son muchas e interesantes las novedades que nos acercará la inminente aparición de la versión 8.1 de Omnis Studio

  • Soporte para repositorios de software distintos al VCS-OMNIS (Exportación e importación de librerías en formato JSON)
  • jsForms con soporte de diseño "responsive"
  • Nuevos controles jsClient
  • Correcciones y añadidos menores, en Web Services, el  Editor de métodos y el asistente de codificación

Pero de todas ellas quizás la más destacable sea el jsForm "responsive". El diseño "responsive" es una técnica utilizada para componer formularios que se ajustan de modo automático a los  diferentes tamaños de pantalla del dispositivo en uso, ya sea que se trate de teléfonos móviles, tablets u otras pantallas. La razón para su uso es la de poder disponer de un único formulario desde el cual y mediante unos pocos métodos de código, adaptar automáticamente los objetos al dispositivo en uso o bien tras un cambio en el tamaño de la ventana del navegador por acción del usuario. Cuando hablamos de páginas web estándar, el diseño "responsive" se implementa mediante el uso de técnicas CSS y puntos de interrupción, Omnis Studio 8.1 adopta un enfoque similar, permitiendo especificar los puntos de interrupción que se desee durante el diseño del jsForm. (formulario remoto JavaScript) Cada punto de interrupción se corresponderá con su correspondiente re-diseño o ajuste de objetos en el formulario. 


Los jsForm's confeccionados antes de la versión 8.1, podrán seguir haciendo uso de la ya conocida propiedad "$screensize" que (como ustedes saben) nos permite ajustar el diseño a los diferentes dispositivos, mientras que los jsForm's creados a partir de ésta versión podrán hacer uso del modo "responsive". Una nueva herramienta de migración, (disponible desde el menú "Tools>>Add-Ons") nos permitirá migrar los jsForm's creados con versiones anteriores de Omnis Studio, a los nuevos tipos "responsive".

Una nueva propiedad denominada "$layouttype", (sólo disponible para los nuevos jsForm's) permite especificar el modo de diseño soportado, podrá ser: kLayoutTypeResponsive, kLayoutTypeScreen (para versiones anteriores de Omnis Studio) o kLayoutTypeSingle (diseño no-resposive)

Los nuevos jsForm's son creados con una serie de puntos de interrupción preestablecidos: 320, 768 y 1024 que corresponderían de modo generalizado a teléfonos, tabletas y computadoras de escritorio. Pero podremos cambiar estos puntos de interrupción para adaptarlos a nuestras propias necesidades o tamaños que deseemos soportar en nuestras aplicaciones.

Aquí es donde yo quería llegar con éste artículo, pues llegados a éste punto, seguramente surja la pregunta: ¿Qué puntos de interrupción debo soportar en mi aplicación?

Naturalmente todo dependerá del uso o ámbito de actuación que queramos dar a nuestra aplicación, pero contestando de modo generalista, deberíamos crear al menos un punto de interrupción para el dispositivo más pequeño, de entre el conjunto de dispositivos que deseemos soportar, ya sea que se trate de teléfonos, tablets o escritorios. Por lo tanto, el valor del primer punto de interrupción sería el ancho físico del teléfono más pequeño, no deberemos confundir sus dimensiones físicas con la resolución de pantalla soportada.

Por ejemplo, las dimensiones físicas de la pantalla del iPhone 6 y 7 son 375x667, y el Samsung Galaxy S5 y S6 son 360x640, por lo que podría establecer el primer punto de ruptura de diseño a 360, o tal vez 350 para añadir un margen de seguridad y así dar soporte a ambos teléfonos.

Del mismo modo, para fijar el punto de interrupción para tabletas, deberíamos tener en cuenta el ancho mínimo de entre la gama de tabletas que deseemos  soportar. Como ya hemos mencionado, los puntos de interrupción predeterminados son (320, 768 y 1024) están pensados para dar soporte a la mayoría de dispositivos, tanto en su orientación vertical como horizontal, pero podemos cambiar éstos ajustes según nuestras propias necesidades.

20 abril 2017

Creación y uso de iconos con Omnis Studio (Icon Editor)

Creación de nuevos iconos

  1. Abra “Omnis Studio Developer”.
  2. Abra una librería.
  3. Haga doble clic sobre la librería desde el “Studio Browser” (F2).
  4. Haga doble clic sobre la carpeta “System CLasses”.
  5. Haga doble clic (o “checkout” si trabaja con VCS) sobre la clase #ICONS. Esto causará la apertura de la ventana “Icon Editor”. Si se trata de una nueva librería, la clase #ICONS estará vacía.
  6. Haga clic sobre “New Icon Page..” para crear una nueva página de iconos.
  7. Asigne un nombre para la nueva página y seleccione el tamaño de los iconos que desea crear en ella.
  8. Si desea crear iconos transparentes, seleccione “Solid & Alpha radio button”. Nota: Si selecciona “Solid and Alpha” se creará un icono para cada versión. El primer icono será la versión “Solid”, el segundo icono será la versión “Alpha”. Se puede pasar de una versión a otra haciendo clic sobre el icono “A” (mayúscula/minúscula) situado la derecha del “Icons Editor”. No obstante, siempre podrá añadir la versión “Alpha” de sus iconos mediante hacer clic sobre el botón “Page Options” y después sobre “Alpha copy of 24 bit”.
  9. Haga clic en el botón “Create”.
  10. Copie una imagen al portapapeles (Ctrl + c). La imagen podrá proceder de herramientas como Photoshop, Illustrator, etc.
  11. Haga clic sobre cualquiera de los 20 espacios vacíos de la parte superior derecha.
  12. Haga clic sobre la imagen 48x48 situada en la parte inferior izquierda.
  13. Pegue la imagen desde el portapapeles (Ctrl + v). Esto asignará un tamaño de 48x48 píxeles.
  14. Repita este paso para los tamaños 32x32 y 16x16 (si es necesario).
  15. Si ha creado una versión “Alpha” de los iconos, haga clic sobre la opción situada a la izquierda para cambiar a versión “Alpha” y repita la acción de copiar y pegar para los diferentes tamaños de iconos.
  16. Haga clic sobre el botón “Set Icon ID” y a continuación introduzca un identificador único.
  17. Para editar un icono ya existente, selecciónelo, seleccione después el tamaño y haga clic sobre el botón “Edit Icon”.
Consejo: Si necesita crear iconos grandes y pequeños, comience por el más grande. Una vez satisfecho con su aspecto, cree las versiones más pequeñas mediante la acción de copiar y pegar dese éste mismo icono.

 

Creación de iconos transparentes


Para crear un icono transparente a partir de su versión “Solid”:
  1. Seleccione el icono desde el “Icon Editor”.
  2. Compruebe que el botón A (Solid/Alpha) esté en modo “Solid”.
  3. Haga clic sobre el botón “Page Options”.
  4. Compruebe que esté seleccionada la opción “Substitute Transparent Color”.
  5. Haga clic sobre el botón “Update Page Settings”, para que los cambios surtan efecto.
  6. Haga clic sobre el botón “Edit Icon”.
  7. Ahora podremos ver sobre la paleta de colores, un cuadro de color verde que contiene la letra "T". Esto corresponde al color transparente. Haga clic sobre el para seleccionarlo.
  8. Seleccione la función “paint” (por ejemplo).
  9. Haga clic sobre las áreas que desee hacer transparentes.
  10. Haga clic sobre el botón “Update” cuando haya terminado.
Para crear un icono opaco o totalmente transparente, desde su versión “Alpha”:
  1. Seleccione el icono desde el “Icon Editor”.
  2. Compruebe que el botón A (Solid/Alpha) esté en modo “Alpha”.
  3. Use la herramienta “eyedropper” para seleccionar el color que desea hacer transparente u opaco.
  4. Use la barra “Alpha slider” situada al lado derecho, para modificar el grado de transparencia. Cuanto más hacia la izquierda más transparente.
  5. Seleccione la función “paint” (por ejemplo).
  6. Haga clic sobre las áreas que desee hacer transparentes u opacas.
  7. Haga clic sobre el botón “Update” cuando haya terminado. Nota: Los cambios serán visibles sólo después de cerrar la ventana del “Icon Editor”.

Uso de iconos con Omnis Studio


Existen diversos componentes capaces de mostrar iconos. En el ejemplo siguiente usaremos el denominado “OmnisIcn Control” (en nuestro ejemplo denominado “icon1”). Para asignar un icono simplemente indicamos su identificados único $::iconid (en nuestro ejemplo 1021) y el tamaño deseado (en nuestro ejemplo 32x32 píxeles).
Do $cinst.$objs.icon1.$::iconid.$assign(k32x32+1021)

 

Preguntas frecuentes


¿Donde se almacenan los iconos?

Omnis Studio, guarda los iconos en dos archivos “.df1”. El “usperic.df1” y el “omnispic.df1” situados en la carpeta “icons” situada a su vez en el directorio raíz de la instalación Omnis.

Precaución: Nunca edite los iconos de archivo “omnispic.df1”, ya que los cambios se sobrescribirán con cada actualización de Omnis Studio.

¿Dónde está la clase Omnis creada para contener iconos?

La clase #ICONS se guarda sobre carpeta “System Classes” de cada librería.  Cada una de ellas tiene una propiedad denominada “$iconlib”, que le permite hacer uso de clase #ICONS que usted prefiera. De este modo podrá disponer de un repositorio único para todas sus librerías, evitando la necesidad de copiar (o actualizar) la clase #ICONS una y otra vez. También podrá hacer uso de VCS para crear clases comunes.

¿Cuáles son las propiedades de un icono?

Los iconos poseen un identificador único “icon number”. Además, pueden tener hasta tres diferentes tamaños: 16x16, 32x32 y 48x48.

Ejemplo: Do myIconRef.$iconid.$assign(k32x32+102)

Una práctica habitual es usar una única librería a modo de repositorio que contenga todos los iconos a usar en los diferentes proyectos.

19 diciembre 2016

Gráficas combinadas con Graph2

Una particularidad del componente Graph2, es la de poder trabajar con capas, lo cual nos permite (por ejemplo) combinar dos o más tipos de gráficas en una misma muestra de datos, tal y como se puede ver a continuación:

 

Sin embargo, la incorporación de sucesivas capas en una misma gráfica, (según se puede desprender tras una rápida lectura del manual para el componente Graph2) parece supeditado al uso del evento evPreLayout, por lo que (al menos en mi caso) se me escapaba el modo de componer éste tipo de gráficas cuando queremos usarlas en informes impresos y no para su representación en pantalla.

Hasta que una lectura más detenida del manual antes citado y en su página 39, me hizo tropezar con el párrafo que cito textualmente a continuación: "When using an object variable based on the Graph2 component you can use the $prelayout() method in the object to add layers"

De esto se desprende que cuando hacemos uso del componente Graph2 en su modo "no-visual", es decir asignado a una variable de tipo objeto, se lleva a cabo la invocación de un posible método $prelayout, desde donde poder añadir capas y cualesquiera otras alteraciones que deseemos sobre la gráfica en composición, como por ejemplo, cambiar el grosor predefinido para la líneas que componen la segunda y tercera capa.

Adjunto una librería que ilustra con detalle lo explicado en éste artículo. No he encontrado mucha información sobre esto en los foros de programación con Omnis Studio, por lo que creo que compartir ésta experiencia con vosotros puede resultar útil. Espero vuestros comentarios al respecto, saludos cordiales.



30 marzo 2016

05 agosto 2015

Gestión de sub-formularios dentro de un mismo panel o “Paged Pane”.

En éste artículo queremos destacar una, de las muchas cosas que nos ha traído la versión 6 de Omnis, se trata de la posibilidad de gestionar un grupo de subformularios dentro de un mismo contenedor, creando un efecto de paneles plegables al estilo de lo que sucede con el menú de un “Paged Pane”. Los diferentes subformularios quedan dispuestos verticalmente pudiendo ser expandidos o contraídos, haciendo clic/tocando sobre su barra de título o bien sobre el icono dispuesto al efecto


Configuración de los paneles


Para crear el grupo de paneles tendremos que hacer uso del método “clientcommand”  denominado “subformset_add”, junto con algunos nuevos parámetros, cuyas constantes podremos encontrar bajo el grupo ”Subform sets” y con el epígrafe “kSFSflag...”. El comando “subformset_add” creará el conjunto de subformularios dentro de la instancia “remote form” actual, tal y como si se tratase de un “Paged Pane”.

Do $cinst.$clientcommand("subformset_add",row-variable)

La variable de tipo “row” es definida como: row(grupo,padre,flags,orden,lista). A continuación describimos las principales banderas o “flags” que pueden ser usadas con el comando “subformset_add”.

kSFSflagOpenMin

Éste “flag” o bandera causa que el grupo de paneles se abra en estado minimizado. Normalmente, todos los subformularios se abren en estado de no-minimizado, de modo que deberemos hacer uso de ésta bandera para evitar su comportamiento predeterminado.

kSFSflagMinAsTitle

Cuando se minimiza un panel (subformulario) del grupo, se mostrará sólo la barra de título. Esta bandera anula su comportamiento predeterminado y que es ocultar completamente (cerrar) el subformulario. Para añadir el botón de minimizar a cada subformulario, deberá usarse la bandera “kSFSflagMinButton”, lo cual permite al usuario expandir o contraer el panel mediante su pulsación y no sólo mediante hacer clic en su título.

kSFSflagAutoLayout

Dispone automáticamente los paneles (subformularios del grupo) verticalmente dentro de su matriz, ignorando su posiciones originales “left” y “top”. Se activa la bandera  “kSFSflagMinAsTitle” y se desactivan “kSFSflagResize” y “kSFSflagMaxButton”. Si además activamos “kSFSflagAutoLayout”, el usuario podrá arrastrar y soltar la barra de título de los diferentes paneles del grupo, para reordenarlos, colocándolos en el orden que prefiera.

kSFSflagParentWidth

Sólo es aplicable si antes se ha activado “kSFSflagAutoLayout”. Su posición original “width” (ancho) será ignorada, tomándose en su lugar el ancho del subformulario “padre” para todo el grupo. También fija el “edgefloat” de cada subformulario a “kEFright”. De modo que, el uso de “kSFSflagParentWidth” nos permite, la creación de un “Paged Pane” compuesto a modo de varios paneles creados a partir de un grupo de subformularios, que se redimensionan o ajustan automáticamente dentro del panel que los contiene.

kSFSflagSingleOpen

Sólo es aplicable si antes se ha activado “kSFSflagAutoLayout” y “kSFSflagMinButton”. Permite asegura que al menos una ventana o panel esté siempre abierto.

 

Un ejemplo vale más que mil palabras


La imagen que mostramos al inicio de éste artículo, muestra un conjunto de paneles o grupo de subformularios contenidos en un “Paged Pane”, con las opciones “Auto Layout” y “Parent Width” activadas.

El método que mostramos a continuación, construye el grupo de subformularios asignándolo a un “Paged Pane” colcado a su vez dentro de un “remote form”. En el ejemplo, el subformulario tan solo contiene un campo de edición, con un pequeño texto ("This is panel #"). La lista o grupo de subformularios es construida incluyendo dicho texto, además del color de fondo, todo dentro de la variable “row” indicada para en el método “clientcommand” y su opción “subformset_add”.

; defina las variables para “lFormList”, “lSetRow” y para todas sus columnas
; construya el grupo de subformularios sobre “lFormList”
Do lFormList.$define(lFormID,lClassName,lFormParams,lFormTitle,lFormLeft,lFormTop,lFormWidth,lFormHeight)
Do lFormList.$add(1,'jsSubformSetPanelsSubForm',con(1,chr(44),rgb(221,221,255),chr(44),chr(34),"This is panel 1",chr(34)),'Panel 1',,,,160)
Do lFormList.$add(2,'jsSubformSetPanelsSubForm',con(2,chr(44),rgb(204,204,255),chr(44),chr(34),"This is panel 2",chr(34)),'Panel 2',,,,160)
Do lFormList.$add(3,'jsSubformSetPanelsSubForm',con(3,chr(44),rgb(187,187,255),chr(44),chr(34),"This is panel 3",chr(34)),'Panel 3',,,,160)
Do lFormList.$add(4,'jsSubformSetPanelsSubForm',con(4,chr(44),rgb(170,170,255),chr(44),chr(34),"This is panel 4",chr(34)),'Panel 4',,,,160)
; defina la variable “row” para el comando “subformset_add” como “lSetRow”
Do lSetRow.$define(lSetName,lParent,lFlags,lOrderVar,lFormList)
Do lSetRow.$assigncols("SubformPanelsSet",'PagedPane:1',kSFSflagSingleOpen+kSFSflagMinButton+kSFSflagAutoLayout+kSFSflagParentWidth,'iOpenForms',lFormList)
Do $cinst.$clientcommand("subformset_add",lSetRow)

En este caso las banderas “kSFSflagSingleOpen”, “kSFSflagMinButton”, “kSFSflagAutoLayout” y “kSFSflagParentWidth” son sumadas para dotar al grupo en construcción de todas las propiedades simultáneamente.

29 julio 2015

Controlando la entrada de datos en formularios (Form Errors)

Ahora es posible mostrar etiquetas de error, que guíen al usuario durante la introducción de valores en los campos de un formulario web, podremos hacer que (dichas etiquetas) se muestren a la derecha o debajo de los campos de entrada de un "remote form". Esta nueva característica hará más fácil a los usuarios rellenar formularios en la web y en nuestras aplicaciones móviles, de éste modo podremos realizar una validación dinámica e interactiva del formulario. Los errores aparecen en el formulario como etiquetas de texto "text field", y situados bajo un control o a su derecha, por lo que será necesario diseñar los "remote form" de modo que dejen el espacio necesario para que sea posible mostrar el texto de error. El estilo del texto, puede indicarse mediante HTML o CSS.


Descripción y uso de sus propiedades


$errortext


Todos los controles "jsClient" soportan la propiedad "$errortext", ésta propiedad es la que deberá contener el texto a mostrar cuando se produzca un error sobre el campo o control en uso. Inicialmente no contendrá valor alguno.

$errortextpos

La propiedad "$errortextpos" permite especificar la posición del texto de error. Sus posibles valores son:
  • kJSErrorTextPosUnder (El texto de error será mostrado bajo el control. Es también, su valor predeterminado.)
  • kJSErrorTextPosRight (El texto de error será mostrado a la derecha del control.)

Tenga en cuenta que Omnis deberá guardar valores para cada "$errortextpos", según los diferentes y posibles tamaños de pantalla. Durante el diseño del formulario, deberá mantener pulsada la tecla "control", para asignar un valor diferente según los tamaños de pantalla a soportar.

$errorline

La propiedad "$errorline" sólo puede ser usada en modo "tiempo de ejecución" o "runtime" y permite la asignación de "$errortext" a un objeto localizado dentro de una fila en un control "Complex Grid". Contendrá el número de la fila sobre la que aplicar el texto.

 

Eliminación de los textos mostrados


Un nuevo comando de tipo "client command", denominado "clearerrors" nos permite eliminar todos los mensajes de error mostrados sobre un formulario.

Do $cinst.$clientcommand(“clearerrors")


Ésta acción es equivalente a la asignación de un "$errortext" vacío para todos los controles del formulario con texto de error asignado.

 

Modificación del estilo del texto


A continuación indicamos las clases CSS que controlan la apariencia y bordes del texto. Podrá encontrarlos sobre el fichero "omnis.css".
  • div.om-error-text (Clase con lo estilos aplicables el texto de error.)
  • div.om-error-border (Configura los márgenes del "div" con el texto de error.)

22 julio 2015

Autenticación “Web Service”

A continuación describimos cómo configurar nuestro servidor web para que soporte autenticación “Web Service” basados en “REST”. (Disponible desde Omnis Studio 6.1.)

Por supuesto deberemos configurar nuestra librería Omnis, pero al margen de esto y cuando estamos utilizando un “simple” servidor Web (es decir no un servicio incorporado mediante Tomcat), podemos configurar la dirección URL del servicio web para que soporte autenticación básica (basic) o implícita (digest). También dispondremos de la opción de usar https y certificación para dar soporte a conexiones seguras.

A continuación incluimos algunas notas sobre cómo configurar Tomcat, Apache Web Server y IIS para que soporten autenticación básica (basic) o implícita (digest). Si así lo hacemos, el servidor Web será el encargado de autenticar a los clientes, a Omnis sólo pasará la solicitud una vez que cliente se ha autenticado correctamente; las cabeceras HTTP incluirán los datos con los detalles correspondientes, el llamado “Authorization header”.

Omnis Studio 6.1 posee una nueva función denominada parsehttpauth(auth) que permite examinar el contenido HTTP del “Authorization header”, ésta nos devolverá una variable de tipo “row” con la información extraída. La primera columna de la “row” con el nombre “scheme”, es el tipo de esquema (por ejemplo “basic”). El contenido del resto de las columnas, dependerá del tipo de esquema de que se trate. Por ejemplo, para las cabeceras siguientes:

Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

La “row” devuelta contendrá las siguientes 3 columnas:
  • scheme: basic
  • username: Aladdin
  • password: open sesame

Digest username="Mufasa",realm="testrealm@host.com",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",uri="/dir/index.html",qop=auth,nc=00000001,cnonce="0a4f113b",response="6629fae49393a05397450978507c4ef1",opaque="5ccc069c403ebaf9f0171e9517f40e41"


La “row” devuelta contendrá las siguientes 10 columnas:
  • scheme: digest
  • username: Mufasa
  • realm: testrealm@host.com
  • nonce: dcd98b7102dd2f0e8b11d0f600bfb0c093
  • uri: /dir/index.html
  • qop: auth
  • nc: 00000001
  • cnonce: 0a4f113b
  • response: 6629fae49393a05397450978507c4ef1
  • opaque: 5ccc069c403ebaf9f0171e9517f40e41

OAuth realm="Example",oauth_consumer_key="0685bd9184jfhq22",oauth_token="ad180jjd733klru7", oauth_signature_method="HMAC-SHA1",oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D", oauth_timestamp="137131200",oauth_nonce="4572616e48616d6d65724c61686176",oauth_version="1.0"

La “row” devuelta contendrá las siguientes 9 columnas:
  • scheme: oauth 
  • realm: Example
  • oauth_consumer_key: 0685bd9184jfhq22
  • oauth_token: ad180jjd733klru7
  • oauth_signature_method: HMAC-SHA1
  • oauth_signature: wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D
  • oauth_timestamp: 137131200
  • oauth_nonce: 4572616e48616d6d65724c61686176
  • oauth_version: 1.0

Bearer 0b79bab50daca910b000d4f1a2b675d604257e42


La “row” devuelta contendrá las siguientes 2 columnas:
  • scheme: bearer
  • token: 0b79bab50daca910b000d4f1a2b675d604257e42

Para cualquier otro tipo de “scheme”, la “row” devuelta contendrá las siguientes 2 columnas:

  • scheme: nombre del esquema en minúsculas
  • data: resto de datos de la cabecera

Tomcat


Lo descrito a continuación ha sido testado con Tomcat 7.0.42 y Windows 8.1. Será necesario reiniciar Tomcat para que los cambios tengan efecto.

 

Autenticación “basic”


Configure el/los usuarios: Editando el fichero “conf/tomcat-users.xml”:

Añada el/los perfil(es) y usuario(s) bajo el item ≤tomcat-users≥, por ejemplo:

≤role rolename="omnisrest"/≥
≤user username="bobm" password="bobm" roles="omnisrest"/≥


Edite el fichero “web.xml” del “webapp” “omnisrestservlet” (carpeta WEB-INF);

Agregue lo siguiente después del item “servlet-mapping”:

≤security-constraint≥
≤web-resource-collection≥
≤web-resource-name≥All resources≤/web-resource-name≥
≤url-pattern≥/*≤/url-pattern≥
≤/web-resource-collection≥
≤auth-constraint≥
≤role-name≥omnisrest≤/role-name≥
≤/auth-constraint≥
≤user-data-constraint≥

≤!—el “transport-guarantee” podrá ser CONFIDENTIAL, INTEGRAL, o NONE --≥
≤transport-guarantee≥NONE≤/transport-guarantee≥
≤/user-data-constraint≥
≤/security-constraint≥
≤login-config≥
≤auth-method≥BASIC≤/auth-method≥
≤realm-name≥omnisrest≤/realm-name≥
≤/login-config≥

 

Autenticación “digest”


Igual que el anterior, excepto que el “auth-method” deberá ser “DIGEST”.

Probando el servicio SSL

Sobre el fichero “conf/server.xml”:

Elimine el comentario del conector SSL y modifíquelo, para dejarlo en algo como:

≤Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="C:\apache-tomcat-7.0.42\mykeystore" keystorePass="xxxxxx"/≥

Cree el certificado auto firmado para añadirlo al “keystore” de “tomcat”:

Nota: Será necesario indicar un nombre y apellido para el “localhost” (eso nos permitirá probar el servidor localmente, con “OWEN” como cliente)

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -genkeypair -alias mycert -keyalg RSA - validity 10000 -keystore c:\apache-tomcat-7.0.42\mykeystore

Uso del cliente Omnis “OWEB” para pruebas:

Extracción del certificado:

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -exportcert -alias mycert -keystore c:\apache-tomcat-7.0.42\mykeystore -file my_root_cert

Importación del certificado al “omnisTrustStore”:

cd \secure\cacerts

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -importcert -alias my_tomcat - keystore omnisTrustStore -file c:\apache-tomcat-7.0.42\my_root_cert

Ahora podrá utilizar URLs como:

https://localhost:8443/omnisrestservlet/ws/5988/api/phase2/myapi/conTomcat

Nota: para eliminar la copia de un certificado use:

"C:\Program Files (x86)\Java\jdk1.6.0_37\bin\keytool" -delete -alias my_tomcat -keystore omnisTrustStore

 

Apache Web Server


Autenticación “basic”


Cree un usuario y su contraseña:

c:\apache24\bin\htpasswd -c c:\apache24\test_passwords test

Note: -c is optional - required the first time to create the passwords file

Edite el fichero “httpd.conf”, la entrada “omnisrest” deberá ser algo como esto:

≤Location /omnisrest≥
     SetHandler omnisrest
     AuthType Basic
     AuthName "omnisrest"
     AuthBasicProvider file
     AuthUserFile c:\apache24\test_passwords
     Require user test
≤/Location≥


El “Require” podrá ser “Require user...”, “Require valid-user” o “Require group...”. Consulte la documentación de Apache para más información.

 

Autenticación “digest”


Cree un usuario y su contraseña:

c:\apache24\bin\htdigest -c c:\apache24\test_digest_passwords omnisrest test
Nota: El uso de “-c” es opcional, pero necesario para la primera vez que se crear el archivo de contraseñas.

Edite el fichero “httpd.conf”, la entrada “omnisrest” deberá ser algo como esto:

≤Location /omnisrest≥
     SetHandler omnisrest
     AuthType Digest
     AuthName "omnisrest"
     AuthDigestDomain /omnisrest/
     AuthDigestProvider file
     AuthUserFile c:\apache24\test_digest_passwords
     Require valid-user
≤/Location≥


Des comente la entrada “LoadModule auth_digest_module modules/mod_auth_digest.so” del fichero “httpd.conf”.

El “Require” podrá ser “Require user...”, “Require valid-user” o “Require group...”. Consulte la documentación de Apache para más información.

IIS


Autenticación “basic”


IIS es bastante difícil de configurar (o al menos el “IIS Express” donde ha sido probado). Para habilitar el modo de autenticación “basic”, es necesario deshabilitar la autenticación “anonymous” del archivo “AppServer\applicationhost.config” ubicado bajo el directorio de instalación de IIS Express. Búsqueda la entrada “authentication” correspondiente.

Añada el código siguiente al final del archivo “applicationhost.config”:

≤location path="Default Web Site/cgi-bin/omnisrestisapi.dll"≥
≤system.webServer≥
≤security≥
≤authentication≥
≤basicAuthentication enabled="true" /≥
≤/authentication≥
≤/security≥
≤/system.webServer≥
≤/location≥


Después, podrá utilizar cualquier usuario existente y su contraseña con las URLs protegidas – se necesita disponer de una cuenta de usuario “standard” para que funcione.

16 julio 2015

Formato del método $showurl

Sintaxis: $showurl(cURL[,cFrame,cWindowProperties])

cURL: Es la dirección de la página a presentar en una nueva ventana o el marco específico de la venta cliente en la página HTML.

cFrame: Es el nombre de un marco HTML. Si cFrame está vacío, la página se mostrará  en una nueva ventana, de lo contrario se mostrará en el marco especificado y sobre la ventana actual.

cWindowProperties: Parámetro opcional, si no existe cFrame será ignorado. De lo contrario, tiene el mismo formato que en los argumento del comando javascript equivalente el "window.open", por ejemplo, especificar "toolbar = 0, menubar = 1" indicaría que la ventana del navegador tendrá una barra de menú, pero no una barra de herramientas.

Sus posibles opciones son:

toolbar - si la ventana del navegador tendrá una barra de herramientas
status - si la ventana del navegador tendrá una barra de estado
menubar - si la ventana del navegador tendrá una barra de menú
scrollbars - si la ventana del navegador tendrá barras de desplazamiento
resizable - si la ventana del navegador es de tamaño variable
location - si la ventana del navegador tendrá una barra para direcciones
directories - si la ventana del navegador mostrará el directorio Web
width - anchura de la ventana del navegador
height - altura de la ventana del navegador
top  - coordenada superioresde la ventana del navegador
left - coordenada izquierda de la ventana del navegador

Todas las opciones son booleanas (sólo valores 0 o 1) a excepción de la width, height, top y left, que deberán contener valores expresados en píxel's.

15 julio 2015

Uso de la utilidad del sistema "ditto" de Mac OS, desde Omnis

Crear un Zip, basePath y destName son las respectivas rutas de origen y destino del archivo.


Begin text block
    Text: set dir to "[basePath]" as string (Carriage return)
    Text: set dest to "[destName]" as string (Carriage return)
    Text: set scriptText to "ditto -rsrc -c -k --sequesterRsrc --keepParent " & quoted form of the POSIX path of dir & " " & quoted form of the POSIX path of dest (Carriage return)
    Text: do shell script scriptText
End text block
Get text block script
Do $runapplescript(script,result) Returns error


Descomprimir un Zip, basePath y destName son las respectivas rutas de origen y destino del archivo.


Begin text block
    Text: set dir to "[basePath]" as string (Carriage return)
    Text: set dest to "[destName]" as string (Carriage return)
    Text: set scriptText to "ditto -rsrc -x -k " & quoted form of the POSIX path of dir & " " & quoted form of the POSIX path of dest (Carriage return)
    Text: do shell script scriptText
End text block
Get text block script
Do $runapplescript(script,result) Returns error


Esto eliminaría el archivo temporal después de la copia/descompresión.


Begin text block
    Text: set source to "[pFrom]" as string (Carriage return)
    Text: set targetdir to "[pTo]" as string (Carriage return)
    Text: tell application "Finder" (Carriage return)
    Text: duplicate source to targetdir (Carriage return)
    Text: end tell
End text block
Get text block lScript
Do $runapplescript(lScript,lResult) Returns lnError

01 julio 2015

Función para la generación de contraseñas

La función permite ser invocada con o sin parámetro del modo siguiente:

    Do method $PassGen() Returns Password

Por ejemplo devolvería: Password = x32Vn1

o mediante la especificación un parámetro con la longitud deseada:

    Do method $PassGen(4) Returns Password

Por ejemplo devolvería: Password = 4cB3

Definición de la función:

;  autor        ;; Florent Pousserot
;  método       ;; $PassGen
;  descripción  ;; Generación aleatoria de contraseñas
;  parametros   ;; Parametro 1: Longitud de la contraseña deseada.

                   Por defecto 6 caracteres
;  devuelve     ;; La contraseña generada

Do zlCharAuthorize.$define('char')

For x from 48 to 57 step 1     ;; códigos ascii [0-9]
    Do zlCharAuthorize.$add(chr(x))
End For

For x from 97 to 122 step 1     ;; códigos ascii [a-z]
    Do zlCharAuthorize.$add(chr(x))
End For

For x from 1 to pcPassLength step 1
    Calculate zlCursor as randrealrng(1,36)     ;; devuelve un valor aleatorio entre 1 y 36 ; representa [0-9,a-z] <=> [10+26]
    If mod(x,3)     ;; modulo 3
        Calculate zcPassword as con(zcPassword,zlCharAuthorize.[zlCursor].C1)     ;; minúscula
    Else
        Calculate zcPassword as con(zcPassword,upp(zlCharAuthorize.[zlCursor].C1))     ;; mayúscula
    End If
End For

Quit method zcPassword

24 junio 2015

Las variables de entorno en Omnis Studio

¿Qué son las variables de entorno?


Cuando arranca un proceso en un equipo, éste inicia algunas variables con información sobre su entorno de trabajo. Generalmente se trata de rutas de acceso (como por ejemplo la ruta del programa en ejecución) o de la iniciación de algunas constantes, como el nombre del usuario actual, el nombre del equipo, etc. Dichas variables están (normalmente) accesibles para todos los programas ejecutados en ese mismo entrono de trabajo.

Por supuesto los programas también pueden hacer uso de variables de entorno con información sólo relevante a si mismos. En éstos casos, dichas variables son algo así como los ajustes de preferencias, excepto que no son exclusivos del programa, ya que también son variables globales, (como las preferencias del sistema) aunque su uso está pensado para usuarios individuales y no para todo el equipo.

 

Variables de entorno: Del Sistema y de los Usuarios.


En Windows, disponemos de dos niveles de variables de entorno: Las variables del sistema y las del usuario. Las variables del sistema sólo pueden ser modificadas por un usuario con categoría de administrador. Normalmente no modificaremos éstas variables, ya que, si lo hacemos, será necesario reiniciar el equipo para que el sistema reconozca y use los cambios.

Las variables de usuario, engloban tanto variables definidas por el propio usuario, como las creadas mediante los diferentes programas. Podemos editarlas y utilizar sus nuevos valores sin tener que reiniciar el equipo. El programa desde el cual modificamos una variable de entorno, podrá hacer un uso inmediato del nuevo valor, pero si existen otros programas que quieren hacer uso de esos mismos cambios, deberán ser reiniciados.

 

Diferencias entre plataformas


Dado que, con Omnis Studio podemos escribir aplicaciones multiplataforma, deberemos ser conscientes de las diferencias que se producen entre éstas y sus variables de entorno. Sera absolutamente necesario, que el código escrito para manejar variables de entorno, lo esté del modo esperado para la plataforma en uso, es decir, sobre la que nuestra aplicación esté siendo ejecutada.

Atendiendo a la plataforma Windows, podemos ver (view) (pero no editar) las variables de entorno, mediante la aplicación “System Information”. Accedemos a esta aplicación siguiendo la siguiente ruta desde el menú “inicio” o “Start”: “menu≥Accessories≥System Tools≥System Information”. Podrá ver algo como lo siguiente:


En Windows, las variables de entorno pueden ser gestionadas manualmente, mediante el panel de control del sistema (“System Control Panel”) y su pestaña “Avanzadas” (“Advanced”). Podremos acceder a el, abriendo el directorio de paneles de control, para desde allí ir al panel de control del sistema y seleccionar su pestaña “Avanzadas”, finalmente, tendremos que hacer clic sobre los botones, para ver algo parecido a lo siguiente:


Los usuarios con privilegio de administradores, podrán ver y manipular tanto variables de usuario, como del sistema, mientras que el resto sólo podrán acceder a las de usuario.

Para Mac OS X, las variables de entorno de usuario están registradas en un fichero de tipo “property list” denominado “environment.plist”, localizado en un directorio no-visible denominado “.MacOSX”, ubicado dentro del directorio principal o raíz del usuario. Por defecto, este archivo y su directorio no existen, por lo que deberán ser creados para su uso, pero ha de tener en cuenta, que algunos programas los crean durante su instalación.

Una vez creado, el usuario podrá hacer uso de la aplicación “Property List Editor” (forma parte del conjunto de herramientas para desarrollo Xcode) para editarlo. Debería ver algo similar a los siguiente:


También podremos ver el contenido XML del archivo desde el terminal, escribiendo:

more ~/.MacOSX/environment.plist

En cuanto a las “rutas” o “paths” guardados en las variables de entorno, también (lógicamente) existen diferencias entre plataformas. La mayoría usan rutas de tipo POSIX, que hace uso del carácter barra diagonal (/) para separar los diferentes niveles de directorio. Sin embargo en DOS se hace uso de la barra invertida (\).

 

Valores alternativos


Una variable de entorno puede contener más de un valor. Por ejemplo, una variable que contiene una ruta hacia un archivo, podría contener rutas alternativas para indicar otras posibles ubicaciones. Al ser requerida por un programa, intentará localizar el archivo en la primera ruta indicada, pero si no lo encuentra, hará uso de la ruta alternativa.

Los valores alternativos deberán estar separados entre si, mediante el uso de un carácter delimitador. Aquí nos enfrentamos a otra diferencia entre plataformas. Para las que usan el formato POSIX, el carácter delimitador son los dos puntos (:). En DOS es el punto y coma (;). Por ejemplo y suponiendo una variable de entorno denominada PROGRAMPATH y que va a ser usada para localizar el mismo programa, pero con dos posibles nombres (“miPrograma” y “miOtroPrograma”), su valor podría ser el siguiente:

En Mac OS X: /Applications/miPrograma:/Applications/miOtroPrograma

En Windows: C:\Program Files\miPrograma;C:\Program Files\miOtroPrograma
 

 

¿Cómo usa las variables de entrono Omnis Studio?


El ejemplo más común, es el que tiene que ver con el uso de los componentes Java con Omnis Studio. Omnis Studio necesita saber dónde encontrar las clases Java en cada una de las plataformas, excepto en el caso de Mac OS X. Para ello, consulta las variables de entorno CLASSPATH y OMNIJVM. Podrá obtener más información sobre como configurar y asignar valores a estas variables consulte el Manual de “Programación Omnis” en castellano, a partir de su página 584.

Por defecto, el valor de CLASSPATH apunta al directorio que debería contener las clases de Java no usadas por Omnis Studio, pero, para indicar los directorios que contienen las clases Java que usaremos con nuestras aplicaciones Omnis, disponemos de la variable OMNISCLASSPATH.

Por supuesto, también podemos optar por configurar y utilizar nuestras propias variables de entorno con otros fines. Tal vez para indicar un directorio externo donde alojar archivos de imagen o informes “adhoc”. Por ejemplo, podríamos crear una variable de entorno (llamada CUSTOMPATH o algo similar) su uso se hará de modo similar al de la función sys(). Si no disponemos de herramientas para crear y manipular variables de entorno, podemos crear fácilmente nuestra propia utilidad con Omnis Studio...

 

Funciones para el uso de variables de entorno


Una alternativa a la configuración o ajuste manual de las variables de entorno mediante el Panel de Control (en Windows) o el editor “Property List” (en Mac OS X), podemos optar por hacerlo desde dentro de nuestros programas Omnis. Bajo la pestaña “General” de la ventana “Catalog” de Omnis Studio, encontramos las funciones: listenv(), setenv(), getenv() y putenv().

La función listenv() devuelve una lista con las variables de entorno de usuario, junto con sus correspondientes valores. Tenga en cuenta que no se requieren parámetros para esta función. La lista devuelta, contiene dos columnas denominadas “name” y “value”. Ambas columnas son de tipo carácter. La columna “name” está limitada a 255 caracteres, pero la columna “value” no está limitada. A continuación mostramos lo que típicamente se obtendría bajo la plataforma Mac OS X:



Tenga en cuenta que no todas las variables que se muestran son realmente de utilidad para Omnis Studio. Por ejemplo, con Omnis Studio 4.2, sólo las indicadas en el fichero “odbc.ini” son usadas.

En un entorno Windows, se obtendría algo similar a los siguiente:


Si bien se muestran muchas y diferentes variables, son muy pocas las que podemos utilizar con Omnis Studio, pero eso puede ir cambiando según la versión.

Todo lo que necesitamos saber es el nombre de la variable de entorno que deseamos consultar. Después, podemos usar la función getenv() de modo similar a como usamos la función sys() para recuperar su valor. El nombre de la variable debe ser indicado como parámetro de la función. Por ejemplo, para saber el nombre del usuario actual, usaríamos:

getenv('USERNAME')

Observe que el nombre de la variable de entorno debe ser indicada como una cadena entre comillas, aunque también podría estar contenida en una variable Omnis Studio. Si la variable que solicitamos no existe, la función devolverá un valor vacío.

Pero también puede ser que en algún momento desee modificar el valor de una variable de entorno. La función putenv() permite que lo hagamos. Esta función requiere dos parámetros: el nombre de la variable de entorno cuyo valor queremos modificar y el valor que queremos asignarle. Una ventaja adicional de esta función es que (si no existe) la variable es añadida al conjunto, así que ¡tenga cuidado con la ortografía y el uso de mayúsculas! Por ejemplo, si queremos crear o modificar una nueva variable de entorno denominada “OMNISREPORTPATH” y asignarle el valor “/Users/david/OmnisReports” usaríamos lo siguiente:

putenv('OMNISREPORTPATH','/Users/david/OmnisReports')

Si lo que quisiéramos fuera añadirle una ruta alternativa (cuando sabemos que ya contiene una), podríamos utilizar:

putenv('OMNISREPORTPATH',con(getenv('OMNISREPORTPATH'),':/Users/david/OmnisReports'))

Estos ejemplos son de Mac OS X, pero podrá encontrar con facilidad su equivalente Windows.

 

¿Ha encontrado útil éste artículo?


Recuerde que es necesario configurar manualmente las variables de entorno para utilizar clases Java dentro de nuestras aplicaciones, por lo que podemos utilizar estas nuevas funciones para simplificar el proceso de configuración para nuestros usuarios finales.

Espero con interés sus comentarios al respecto, reciban un saludo.