Etiqueta

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

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.

01 julio 2014

¿Qué podemos esperar de Omnis Studio 6.1?

64 bits


El ejecutable Omnis ha sido rediseñado para funcionar con procesadores de 64 bits, aún así deberemos esperar un poco, pues inicialmente sólo estará disponible en la modalidad servidor. Estaremos atentos desde éste blog al anuncio sobre su disponibilidad en la modalidad SDK. 

 

Componentes JavaScript


Los controles JavaScript tendrán una apariencia "nativa" es decir, mostraran el aspecto que corresponda a la plataforma en que se estén ejecutando. Su estilo vendrá determinado por las reglas CSS correspondientes. Estos componentes estarán localizados como un nuevo grupo dentro del "Component Store". Además de esto, todos los componentes han sido optimizados para mejorar su rendimiento, siendo posible alternar entre diferentes tamaños de pantalla ($screensize) soportados por un "remote-form", mediante simplemente pulsar las teclas Ctrl-N/Cmnd-N o bien seleccionando la opción correspondiente del menu contextual.
 

Nueva herramienta para la sincronización de componentes


Permite la configuración automática de los componentes ya utilizados en los "remote-form" según los diferentes diseños, lo que se traducirá en un considerable ahorro de tiempo a la hora de hacer que nuestras aplicaciones ofrezcan un mejor aspecto.
 

Servicios Web


Se añade soporte para servicios web "RESTful": permite tanto la creación de la interfaz de usuario necesaria para el uso de servicios web RESTful, como el hacer disponible el código  para el acceso a clientes externos. Además, de esto se ha añadido un nuevo componente externo denominado OJSON para permitir el uso de objetos basados en​JSON con RESTful.

Vista previa de impresión


Se ha rediseñado la ventana de vista previa, permitiendo al usuario seleccionar el texto de las páginas en pantalla, además de poder navegar por ellas mediante un índice conteniendo una miniatura de las mismas, situado al margen de la ventana.
 

Tarea inicial de la librería (Library Startup Task)


Una nueva preferencia denominada $clibstartuptask nos permitirá indicar cual será la tarea de inicio para la lbrería en ejecución.
 

Número máxima de líneas de código permitidas en un sólo método


¿Habías pensado alguna vez en escribir una aplicación Omnis en un sólo método? ;-)
El número máximo de líneas en un método ha sido aumentado de 1.024 a 256.000.
 

Comparar variables


Ahora es posible establecer comparaciones entre variables binarias, variables de objeto y  variables de referencia a objetos, con la única precaución de que las usadas en cada lado del operador sean del mismo tipo.
 

Separadores multi-hilo


Cada hilo (en un servidor de aplicaciones Omnis multi-hilo) puede tener sus propios identificadores de separación para el punto decimal, indicador de miles y forma decimal usada en importaciones, almacenados bajo la propiedad $separators.
 

Eliminación automática de "Object references" (referencias a objetos)


Las referencias a objetos se borran automáticamente cuando ya no sean necesarias con el fin de liberar memoria.

28 mayo 2014

Nueva versión Omnis Studio 6.1

TigerLogic anuncia el lanzamiento de Omnis Studio versión 6.1 con interesantes novedades centradas principalmente en el desarrollo web y aplicaciones móviles. Omnis Studio 6.1 incluye mejoras en jsClient. Código ejecutable en modo 64 bits, soporte para RESTful Web Services y otras que resumimos a continuación.


64-bit Omnis


El ejecutable ha sido rediseñado para su uso con procesadores de 64 bits estando inicialmente disponible para Omnis Server y para todas las plataformas soportadas. Las actuales versiones 32 bits, incluyendo el SDK, runtime, y server, seguirán estando disponibles para Windows y OSX, aunque ya se ha anunciado el lanzamiento de la versión  64 bits del SDK.

Servicios Web (Web Services)


Se añade soporte para REST, un modelo de Web Service que está siendo muy popular. El Web Service RESTful es identificado mediante un URI, el cliente interactúa con el recurso a través de peticiones y respuestas HTTP. El nuevo componente Web Services proporcionará tanto el cliente como el servidor con soporte RESTful. Se ha añadido un nuevo plug-in para permitir que el servidor de aplicaciones Omnis publique un servicio web RESTful.

Componentes JavaScript


Se han añadido más controles JavaScript para dotar a las aplicaciones de una apariencia "nativa", es decir adaptada a las distintas plataformas y/o dispositivos en los que se ejecuta su aplicación Omnis. Tanto el estilo como su apariencia son definidos mediante controles CSS adaptables a cada plataforma. Estos nuevos componentes JavaScript podrán localizarse dentro de un grupo específico en el "Component Store". Además de esto descubriremos algunas mejoras generales de rendimiento al trabajar con jsClient.

Utilidad "Screen Size Sync"


Tras la creación de cualquier "remote form", los campos y otros controles en el contenidos podrán re-colocarse para aparecer en el tamaño y posición correctas según las posibles orientaciones de pantalla, incluyendo entornos de escritorio, tablets y smartphone. Omnis Studio 6.1 permite configurar y guardar automáticamente los componentes según los diferentes diseños localizados en el mismo "remote form", lo cual significará un más que considerable ahorro de tiempo a la hora de construir nuestras aplicaciones, logrando a la vez que éstas resulten más consistentes.

Otras mejoras


  • Una nueva ventana de vista previa para las salidas impresas, permite al usuario seleccionar el texto y de recorrer el informe mediante una lista de páginas situada al margen de la ventana. 
  • El número máximo de líneas permitidas en un método Omnis se ha aumentado de 1.024 a 256.000.
  • Se permite la comparación de variables de tipo binario, objeto y referencia a objeto, en el código. (las variables usadas a cada lado del operador debe ser del mismo tipo)
  • Los separadores de idioma ($separators), ahora pueden ser guardados para cada hilo, en caso de usarse un servidor de aplicaciones multi-hilo.
  • Los "object reference" se borran automáticamente liberando espacio en la memoria.

09 mayo 2014

Nuevo Video-Tutorial en Aula Omnis

Nuevo Video-Tutorial producido por "Aula Omnis Studio", en el que se puede ver como crear un sencillo Servicio Web, así como un cliente para éste mismo Servicio Web con la herramienta de programación Omnis Studio 6.0.1


16 abril 2014

Soporte Multilingüe

Soporte Multilingüe con Omnis Sudio (Opción Built-in)


A partir del estudio 5.0.1, es posible editar los textos utilizados por Omnis, lo cual permite personalizarlo para adaptarlo a sus preferencias y diferencias del idioma, corregir problemas deribados del uso de diferentes teclados o cambiar la combinación de teclas a utilizar en la activación de opciones. Todos los textos personalizados serán guardados sobre el archivo “studio.stb”.

Tenga en cuenta que Omnis cargará automáticamente sólo los textos incluidos en “studio.stb”, que se correspondan con la columna cuyo nombre sea coincidente con el consignado en el parámetro “$language” de las preferencias Omnis. (Añada o edite los diferentes idiomas mediante la librería “omnisloc.lbs”, que podrá hallar bajo el directorio 'local' del raíz Omnis Studio).

Los siguientes ejemplos, muestran como cambiar los atajos de teclado asignados a la opción de mostrar la lista de tipos de letra y a la que permite comentar o des-comentar líneas de código:

Lista de tipos de letra

 

  • Presione F9 (Cmd-9 en Mac) para abrir el Catálogo.
     
  • Vaya a la pestaña "StringTable", y busque la entrada "Built-in Strings". Haga clic derecho y seleccione "Find strings", esto le permitirá localizar el STRINGID de cualquier texto utilizado por Omnis.
     
  • Sitúese sobre el cuadro de búsqueda y escriba "[] (list font size)”, haga clic derecho y cópielo sobre el portapapeles.
     
  • Ahora vuelva de nuevo al Catálogo, haga clic derecho sobre "Built-in Strings" y seleccione la opción "Edit built-in strings". Esto abrirá el editor “String Table”, mediante el cual, podremos componer nuestra traducción y/o personalización del texto.
     
  • Si es necesario añada una nueva fila a continuación de la columna STRINGID, pegue el contenido del portapapeles. Cambie el nombre de la primera columna, utilizando el código de país que corresponda a su preferencia "$language", por ejemplo, si es el español, cambie el nombre de la columna por "ES_es".
  • Copie el STRINGID sobre su columna con el texto a personalizar y cambie los símbolos "[]" por los 2 caracteres que desee utilizar.

Guarde los cambios y salga del editor "String Table", si el valor actual de la propiedad "$language" coincide con el nonbre dado a la columna que contiene el texto traducido, las nuevas teclas de acceso directo estarán listas para su uso.

Comentar o des-comentar líneas de código (Comment/Uncomment)


Por defecto, usted puede comentar o des-comentar las líneas de código previamente seleccionadas sobre el editor de métodos, mediante la pulsación de las teclas Cmd/Ctrl y ";" o "’", a continuación indicamos como cambiarlas para usar en su lugar las teclas que desee.

Para conseguirlo simplemente repita los pasos descritos en el aparado anterior, pero buscando ahora el texto "comment". Seleccione después la línea "2846!~Comment Selected Lines\; 2221", añada una fila más a la tabla de textos y situándose sobre la columna que contiene sus textos personalizados, cambie solamente el carácter “;” por la combinación de teclas que desee.

Haga lo mismo para "2847!~Uncomment Selected Lines\' 2222", cambiando el carácter "’".


Yendo más lejos


Los ejemplos anteriores ilustran los procesos que intervienen en la personalización de teclas de acceso directo. El mismo enfoque se puede utilizar para personalizar cualquier texto de los utilizados por Omnis mediante simplemente buscarlo para después editarlo, puede encontrar más información sobre como añadir soporte multi-lenguaje a sus aplicaciones Omnis, en el articulo publicado en Bastiaan's blog: http://bastiaanolij.blogspot.com.es/2013/05/part-5-adding-multi-lingual-support.html

Resumen

  1. Desde el catálogo, haga clic sobre la pestaña “STRINGTABLE”.
  2. Haga clic derecho sobre "Built-in strings" y seleccione la opción "Edit Built-in Strings" 
  3. Esto abrirá el editor “String Table” con esta tabla especial vacía (excepto la primera línea que contiene el ID A)
  4. Luego haga clic derecho en "Built-in strings" y seleccione la opción "Find Strings"

La ventana de búsqueda nos permite realizar búsquedas de textos localizaod en el “Studio Core“, los “dam’s”, y otras librerías del entorno Omnis, en ellas encontraremos los textos que queramos traducir, naturalmente primero tendremos que tener claro que es lo que queremos traducir para poderlos buscar, normalmente desearemos traducir aquello que afecta a la interface del usuario y no lo correspondiente al entorno de programación Omnis Studio.

09 abril 2014

De No-Unicode a Unicode (Parte 10 de 10)

Conclusión


En esta serie de 10 artículos, he querido hacer una breve explicación sobre como Omnis Studio aborda la compleja cuestión de la codificación Unicode. Seguramente a usted ahora le surjan algunas preguntas sobre esto, le animo a que las platee, en el grupo “omnisstudio” (http://groups.google.com/group/omnisstudio?hl=es). Si le ha parecido útil la información le pediría deje algún comentario, comparta la información en las redes sociales o al menos haga “click” en +1.

Estaré agradecido por cualesquiera preguntas y/o comentarios desee plantear sobre el tema a la comunidad omnis. A través de éste blog seguiré atento ante cualquier novedad que se presente en las futuras actualizaciones de Omnis Studio.

Es posible que usted ya haya actualizado sus versiones no-Unicode de Omnis a Unicode, si es así, ¿Porqué no plantearse ahora la internacionalización de su aplicación? Ahora es posible, con algo de esfuerzo podrá extender el abanico de clientes hasta lugares insospechados, quien sabe si Japón o China. ¿Ya ha hecho ésto también? Entonces le animo a que comparta su experiencia con la creciente comunidad Omnis de habla hispana.

Muchas gracias por la atención prestada durante la publicación de esta serie.

Reciba un cordial saludo.

02 abril 2014

De No-Unicode a Unicode (Parte 9 de 10)

Localización


Con el termino “localización” Omnis hace referencia al proceso previo necesario, para la distribución de una aplicación entre clientes finales localizados en diferentes países y que por tanto usan diferentes grafías de caracteres e idioma. En la práctica, esto significa que tendremos que traducir cualquier texto que sea visible al cliente a los idiomas que desea sean soportados por su aplicación, pero también es posible que tenga que modificar el modo en que se manejaran los datos, el tipo de ordenación, etc.

Para localizar su aplicación, en primer lugar deberá cambiar ciertas cosas tanto en el propio Omnis, como  en todas las cadenas de texto y etiquetas que contenga su librería. Si va a distribuir su aplicación a través de la web, sólo tendrá que traducir los textos de su librería o dicho más concretamente, todo lo que vaya a ser visible sobre el navegador del usuario.

Omnis Studio cuenta con diversas herramientas, tanto para traducir el propio Omnis, como para sus archivos de librería, en futuros artículos hablaremos más concretamente sobre el uso de éstas herramientas, en ésta serie de 10 artículos, tan sólo pretendo exponer en términos generales como Omnis trata la codificación Unicode.

Aún no he recibido muchos comentarios sobre si los artículos expuestos en éste blog, están resultado útiles para la comunidad de desarrolladores Omnis de habla hispana, pero espero sinceramente que así estén resultando, no obstante (querido lector) sería muy animador poder contar con su opinión al respecto.

La “localización” del propio Omnis.

La “localización” del run-time Omnis le permitirá cambiar los elementos que indicamos a continuación, algunos de ellos podrán ser observados por el usuario final, mientras que otros sólo afectan a cómo se gestionarán los datos de tipo “Character” y “Number”, hablamos de los siguientes:

  • Denominación de los días de la semana y meses del año.
  • Caracteres separadores.
  • Los textos de “Yes/no”, “OK/Cancel”, “True/False”, “Am/Pm” y “On/Off”.
  • La forma de ordenación a utilizar con el uso de “National”

Todas sus librerías comparten las especificaciones que habrán sido guardadas en un archivo de datos Omnis, denominado omnisloc.df1, se trata de hecho, de la base de datos de localización y que podrá encontrar dentro de la carpeta “local”, situada bajo el directorio raíz de su instalación Omnis. La librería “omnisloc.lbr”, le permitirá añadir y modificar información según los diferentes idiomas a soportar en su aplicación.

Cada registro en la base de datos de localización (omnisloc.df1) contiene un conjunto completo de datos en correspondencia con un idioma. También contiene un identificador de idioma actual, es decir, el registro actual o configuración en uso.

La librería “omnisloc.lbs” ha sido actualizada para soportar Unicode. El campo que antes se llamaba “sort order” ahora se denomina “locale”. Además, y sólo en la versión Unicode, podrá encontrar una nueva casilla de verificación denominada “Use Locale For Defaulted Items”. Esto determinará la configuración regional a utilizar según las diferencias que se pueden encontrar en cada lengua y del modo siguiente:

  • Si la casilla de verificación “Use Locale...” está marcada, los valores por defecto se tomarán de la configuración guardada en el registro del lenguaje (omnisloc.df1).
  • Si no está marcada, los valores por defecto serán tomados de la configuración regional indicada en el sistema operativo.

La “localización” de una librería.

Omnis proporciona dos opciones para traducir textos y etiquetas incluidas en su aplicación:

  • La librería “translation”.
    La librería (trans.lbs), situada en el directorio raíz Omnis, permite la traducción de textos y las etiquetas de su librería, podrá exportar todos los literales contenidos en su librería para así poder traducirlos, para después ser importados de nuevo a su librería.
  • Uso de “String Tablas”.
    Mediante “String Tables”, podrá traducir dinámicamente textos y etiquetas de su aplicación, use la utilidad “String Table Editor” para configurar tablas conteniendo conjuntos de palabras para los diferentes idiomas, también dispone de algunas utilidades que le ayudaran en la traducción, podrá encontrar la utilidad “String Table Editor” bajo el menú “Tools>>Add Ons”.

Una herramienta similar a ésta, incluida desde la versión 5 de Studio, nos permite, incluso la traducción en diferentes idiomas de cada texto usado por la propia aplicación Omnis, pero no hablaremos de ella en ésta ocasión, lo dejaremos para un futuro artículo.

26 marzo 2014

De No-Unicode a Unicode (Parte 8 de 10)

Conversión de archivos de datos Omnis (df1)

  • ¡¡ CUIDADO !!
    Haga una copia de seguridad de sus archivos, antes de convertirlos en una versión Unicode de Omnis Studio.

Desde la versión 4.3 (y 4.3.x) Unicode, Omnis Studio incluye un conversor de los datos e índices contenidos en ficheros df1 de Omnis. En el caso de encontrar datos de tipo “Character” almacenados en campos de tipo “Binay”, (por ejemplo, al guardar un documento creado con un editor de textos externo) no se llevará cabo ningún tipo de conversión.

Al abrir un archivo de datos Omnis con una versión Unicode, se le pedirá que confirme si desea realmente realizar la conversión. Si pulsa sobre el botón “Sí”, Omnis mostrará un cuadro de diálogo con las siguientes opciones:

  • Rápida (Quick)
    Los índices son eliminados y después reconstruidos, los datos no se convierten. Ésta opción puede resultar útil en los casos en que el archivo a convertir únicamente contenga caracteres de 7 bits, tenga en cuenta que Omnis no realizará comprobación alguna en cuanto a esto, será responsabilidad suya.

  • Completa (Full)
    Se lleva a cabo la conversión completa del archivo.

Cuando el fichero es abierto desde comandos


A los comandos “Open data file” y  “Prompt for data file” se les ha añadido la opción “Convert without user prompts”. Si esta opción está activada, no se mostrará el diálogo para conversión mencionado anteriormente, pero si podrá seleccionar, (como parte del comando), si desea usar "Quick Unicode conversion" o "Full Unicode conversion", de éste modo podrá indicar el nivel de conversión que desee.

Compruebe cabalmente si los resultados de la conversión son los deseados, no deseche la copia de seguridad del archivo de datos no-Unicode y que realizo antes de la conversión, al menos hasta que esté completamente seguro de que los datos ha sido convertidos con éxito. Realice algunas pruebas con los datos desde su aplicación. Normalmente usted hará esto con una nueva versión de Omnis Studio, pero cuando la librería es convertida a Unicode al igual que sus archivos de datos, deberá tener especial precaución por los posibles problemas que se puedan presentar.

Datos tipo “Character” y “Binary” bajo Unicode

No es posible concatenar una variable de tipo “Character” con otra de tipo “Binary” cuando se está trabajando con una versión Unicode de Omnis Studio. El opción correcta sería usar $readfile para leer un archivo y guardarlo sobre una variable binaria, para después analizarlo. La asignación de datos de tipo “Characer” a “Binary” y viceversa es probable que cause problemas, sobre todo al usar Unicode, y debe ser por tanto evitado.

19 marzo 2014

De No-Unicode a Unicode (Parte 7 de 10)

Conversión de Librerías


Al abrir una librería Omnis con una versión Unicode, se le pedirá que convierta el archivo. Se trata de una conversión total, incluyendo los caracteres menores del 128. Una vez que la librería ha sido convertida a Unicode, no podrá volver a utilizarse como versión no-Unicode.

Control de versiones (VCS)

La versión Unicode de Omnis VCS construye librerías que funcionan únicamente con versiones Unicode de Omnis Studio. Sólo las versiones no-Unicode de VCS pueden construir bibliotecas ejecutables tanto con versiones Unicode, como no-Unicode.

Edición de textos en campos con barras de desplazamiento

La propiedad $righttoleft fue añadida con la intención de permitir la entrada de texto en los campos de edición con desplazamiento de derecha ha izquierda y con la finalidad de (por ejemplo) permitir la introducción de datos con escritura árabe. Esta propiedad ha sido mejorada para que en un campo con varias líneas de texto, muestre la barra de desplazamiento vertical situada a la izquierda.

Oracle8 DAM (Unicode)

Se ha creado una nueva propiedad de sesión para DAM de Oracle8 (DAMORA8), disponible en sólo con el DAM Unicode.
  • $nationaltonclob
    $nationaltonclob puede ser usado para modificar la asignación predeterminada para los tipos de datos Omnis “Character” y “National”. Por defecto, los tipos “Character” y “National” creados con un tamaño superior a $maxvarchar2 son relacionados con el tipo de datos NCLOB, pero, fijando la propiedad $nationaltonclob a kTrue, sólo los campos de tipo “National” mayores de $maxvarchar2 serán asignados como NCLOB. De éste modo los campos de tipo “Character” mayores de $maxvarchar2 serán asignados como no-Unicode CLOB y podrían sufrir pérdida de datos por truncamiento, si es el caso que contienen caracteres Unicode.

12 marzo 2014

De No-Unicode a Unicode (Parte 6 de 10)

El componente FormFile


Las propiedades $filereadencoding y $filewriteencoding del componente FormFile, introducido en la versión 4.0 de Studio, fueron modificadas en la versión 4.1, de modo que la constante kFFEncoding permitiese el uso del grupo kUniType… y poder así indicar la codificación del archivo. En el caso de la propiedad $filereadencoding podrán usarse todas las constantes del grupo excepto kUniTypeCharacter, y en el caso de la propiedad $filewriteencoding excepto kUniTypeAuto y kUniTypeCharacter .

Además, también se dispone de una constante kUniTypeBinary para identificar los archivos que se tratarán como datos binarios sin procesar, el código antiguo sigue estando soportado.

El componente Fileops


El componente Fileops contiene dos nuevos métodos, $readcharacter() y $writecharacter(), que permiten la lectura y/o escritura de datos en formato Unicode.
  • $readcharacter(encoding,variable) Lee un fichero almacenando sus caracteres en variable; encoding podrá ser una constante del grupo kUniType…, excepto kUniTypeBinary o kUniTypeCharacter.

  • $writecharacter(encoding,variable) Sustituye el contenido del archivo, con los datos  de variable; encoding podrá ser una constante del grupo kUniType…, excepto kUniTypeAuto, kUniTypeBinary o kUniTypeCharacter.

Cuando se usan las opciones Import/Export y Report File


Es posible especificar la codificación de los archivos de texto que se generan al usarse las opciones de importación y exportación, así como al enviar un informe a un archivo de texto, esto podrá hacerse mediante las propiedades $importencoding y $exportencoding:
  • $importencoding Especifica la codificación que se utilizará para los datos importados, tanto al importar desde un puerto, como cuando el archivo de importación no contiene una cabecera Unicode BOM. Podrá usarse cualquiera de las constantes del grupo kUniType..., con excepción de kUniTypeAuto, kUniTypeCharacter, kUniTypeBinary y las kUniTypeUTF32….

  • $exportencoding Especifica la codificación que se utilizará en la exportación de datos, tanto al imprimir sobre un puerto o sobre un archivo de texto. Podrá usarse cualquiera de las constantes del grupo kUniType..., con excepción de kUniTypeAuto, kUniTypeCharacter y kUniTypeBinary.

  • $exportbom Si es “true”, indicará que la propiedad $exportencoding deberá usar una codificación Unicode, se creará la marca Unicode BOM al inicio del archivo de salida.

Todas éstas propiedades pueden ser localizadas entre las preferencias Omnis ($root.$prefs). Cuando se trata de un servidor multi-hilo, existirá un valor separado para cada una de estas propiedades, en correspondencia con cada hilo.

06 marzo 2014

De No-Unicode a Unicode (Parte 5 de 10)

Conversión de datos Unicode

La función uniconv() permite convertir caracteres Unicode de un tipo a otro.

Su sintaxis es: uniconv(srctype,src,dsttype,dst,bom,errtext)

Convierte src y guarda el resultado en dst. Devolverá cero o un valor distinto de cero junto con el texto de error en errtext. src y dst pueden ser variables de tipo binario o carácter, en función de los valores usados en srctype y dsttype.

bom es un valor booleano: si es cierto, dst será “Unicode Byte Order Marker” (BOM).

srctype y dsttype podrán ser cualquiera de las siguientes constates kUniType...

kUniTypeAuto

La codificación de origen es detectada automáticamente y sólo puede ser usado en alusión al origen de datos.

kUniTypeUTF8

Los datos son guardados en una variable binaria y codificados en UTF-8.

kUniTypeUTF16BE

Los datos son guardados en una variable binaria y codificados en UTF-16BE.

kUniTypeUTF16LE

Los datos son guardados en una variable binaria y codificados en UTF-16LE.

kUniTypeUTF16

Los datos son guardados en una variable binaria y codificados en UTF-16LE si la plataforma es “little-endian” o en UTF-16BE si la plataforma en uso es “big-endian”. Esto asegura estar usando la codificación apropiada según el sistema operativo en uso.

kUniTypeUTF32BE

Los datos son guardados en una variable binaria y codificados en UTF-32BE.

kUniTypeUTF32LE

Los datos son guardados en una variable binaria y codificados en UTF-32LE.

kUniTypeUTF32

Los datos son guardados en una variable binaria y codificados en UTF-32LE si la plataforma es “little-endian” o en UTF-32BE si la plataforma en uso es “big-endian”. Ésto asegura estar usando la codificación apropiada según el sistema operativo en uso.

kUniTypeNativeCharacters

Los datos son guardados en una variable binaria, donde cada byte es un carácter del juego de caracteres “Latin 1” según el sistema operativo en uso (Ansi, si se trata de Windows, MacRoman si es un Mac, e ISO-8859-1 si es Unix.

kUniTypeCharacter

Los datos son guardados en una variable de tipo carácter.

En los casos de kUniTypeAnsiThai, kUniTypeAnsiCentralEuropean, kUniTypeAnsiCyrillic, kUniTypeAnsiLatin1, kUniTypeAnsiGreek, kUniTypeAnsiTurkish, kUniTypeAnsiHebrew, kUniTypeAnsiArabic, kUniTypeAnsiBaltic, y kUniTypeAnsiVietnamese, los datos son guardados en una variable binaria, y contiene datos de tipo carácter, donde cada byte es codificado usándose para ello el conjunto de códigos ANSI estándar.

26 febrero 2014

De No-Unicode a Unicode (Parte 4 de 10)

Representación de caracteres

 

Dependiendo del tipo de letra/fuente y del sistema operativo en uso, un mismo carácter puede no ser siempre representado del mismo modo y lo mismo ocurrirá al trabajar con textos que requieren pares suplentes. En términos generales, los mejores resultados se obtendrá mediante la normalización del texto usando para ello la función nfc(), ya que (generalmente) los diferencias se producen con el uso de caracteres compuestos.

Introducción de caracteres


Para la introducción/edición de textos y siempre que sea posible se recomienda utilizar  normalización nfc(). Si tenemos caracteres compuestos entre los datos, se requerirán varias pulsaciones de teclas de desplazamiento izquierda/derecha para saltar uno de éstos caracteres y es posible que cuando copie texto sobre el portapapeles, éste no contenga después exactamente lo que parecía haberse copiado.

Omnis, lleva a cabo automáticamente la normalización NFC de los caracteres pegados desde el portapapeles, pero tenga en cuenta que esto no se producirá cuando el hecho suceda desde el cliente web.

Conversión de caracteres


Las funciones siguientes le permitirán convertir un carácter específico de entre un conjunto de caracteres (cadena) a su valor Unicode y lo mismo en sentido inverso.

  • unicode(cadena,posición[,valor-hex])
    devuelve el valor Unicode del carácter indicado en posición. La primera posición de cadena es 1. Si el valor bolean “valor-hex” es cierto (por defecto es falso) se obtendrá su representación en formato hexadecimal, en el formato:  'U+h'.
  • unichr(num1[,num2]…)
    devuelve una cadena formada por la concatenación de los códigos de caracteres Unicode suministrados. Cada código es un número o una cadena en la forma 'U+h', donde h está formado por los de 1-6 caracteres que representan un valor hexadecimal.

Estas funciones están disponibles tanto desde el lado del cliente remoto, como localmente. (si se intentasen utilizar con una versión no-Unicode de Omnis, se producirá un error, cualquier biblioteca desarrollada con una versión Unicode es incompatible con no-Unicode)

Identificador de configuración regional (LCID)


La función locale() devuelve el identificador de configuración regional (LCID) del sistema/máquina en uso. El LCID especifica el formato de los separadores de decimales, miles, listas, tipos de moneda, unidades de medida, fecha y orden de clasificación. La configuración regional se especifica a nivel de sistema operativo y se encuentra en la forma "idioma_país", donde idioma es el nombre ISO639, y el país el ISO3166. Por ejemplo, la configuración regional para el Reino Unido es: “en_GB”.

Comprobación versión Unicode


La función isunicode() devolverá verdadero, siempre y cuando la función sea ejecutada desde una versión Unicode de Omnis Studio. isunicode() también funciona desde el cliente web, e indica si es o no compatible Unicode.

19 febrero 2014

De No-Unicode a Unicode (Parte 3 de 10)

Comparando textos

Omnis utiliza dos tipos de comparación entre cadenas de caracteres:
  • Comparación entre cadenas con valores UTF-8, conocida como: comparación de caracteres.
  • Comparación de acuerdo a las reglas de entorno locales, indicadas en el fichero de datos de localización (localisation data file), en éste caso y antes de llevarse a cabo la comparación, los datos entrantes son normalizados. Esto se denomina como comparación nacional (National). El uso de “National” por parte del usuario, permitirá garantizar el correcto uso de los caracteres correspondientes a su localidad. Tenga en cuenta que el uso de “National” podrá hacer caso omiso de otras reglas de codificación superiores.
Deberá usarse la función natcmp() para realizar comparaciones de tipo “National”. Tenga en cuenta que dicha función no está disponible del lado del cliente Web.

Omnis también realiza comparación de textos por muchas motivos diferentes y en ocasiones muy diversas, pero a continuación mencionaremos las más importantes.
  • Al ordenar listas
  • Al realizar búsquedas en listas
  • Al manejar índices de archivos de datos (df1)
  • En expresiones, como por ejemplo en una sentencia “if”
En todos los casos Omnis soporta el uso de variables de carácter (UTF-8) y nacional (National).

Al ordenar listas

Cuando se usa el tipo carácter, Omnis utiliza la comparación de caracteres (UTF-8) y cuando se usa el tipo nacional, Omnis utiliza la comparación nacional (National).

Al realizar búsquedas en listas

Cuando se usa el tipo de carácter, Omnis utiliza la comparación de caracteres. En el caso de listas que contienen una columna de caracteres de tipo nacional se usará “National”. Tipos especiales de búsqueda, como por ejemplo, búsquedas mediante un cálculo, se trataran como de tipo carácter, sin embargo, podrá hacer uso de la función natcmp() como parte del cálculo, con el fin de forzar el uso de la comparación “National”.

Al manejar índices de archivos de datos (df1)

Si son declarados como de tipo “National”, se usara éste.

En expresiones

Para garantizar el correcto comportamiento de las expresiones donde se evalúen caracteres, debe previamente normalizar su valor mediante el uso de la función nfc(), nfd() (vistas en la parte II) o bien la función natcmp(), según le interese.