Mostrando entradas con la etiqueta Teoría. Mostrar todas las entradas
Mostrando entradas con la etiqueta Teoría. Mostrar todas las entradas

lunes, 5 de mayo de 2008

EXECUTEREALSQL

La ejecución del Método EXECUTEREALSQL permite interactuar directamente con la Base de Datos física, para, por ejemplo, ejecución de PL/SQL o sentencias directatas contra objetos tales como INSERT, UPDATE y DELETE.

Para ello hay que crear un concepto llamado EXECUTEREALSQL de ámbito Nodo, Tipo Long. En las propiedades avanzadas ponemos “Argumentos variables” a “”. Como regla creamos una de tipo CPP y en su método le indicamos que vamos a usar es: “executerealsql”. Creamos un argumento llamado ID_CONN de tipo número y tamaño 4.

En un método aparte creamos una sentencia a lanzar contra la base de datos y lo ejecutamos de la siguiente forma:

MsSQL = "INSERT INTO NUESTRA_TABLA (PK,CAMPO1,CAMPO2,CAMPO3) VALUES ('" + STD_ID_PERSON+"','" + STD_N_FAMILY_NAME_1 + "," + STD_N_FIRST_NAME + "'," + ToString(EDAD,0) + ",'" + MsDate + "')"

EXECUTEREALSQL = MsSQL
MsRdo = EXECUTEREALSQL(0)


En este ejemplo metemos en una tabla un valor numérico: “EDAD” y una fecha como cadena “MsDate”; para componer la fecha podemos usar:

MdDate = Today()
MsDay = ToString(DxDay(MdDate),0)
MsMonth = ToString(DxMonth(MdDate),0)
MsYear = ToString(DxYear(MdDate),0)
MsDate = MsDay + "/" + MsMonth + "/" + MsYear


Si queremos usar varias sentencias seguidas podemos encapsularlas en un PL y entonces la llamada será:

MsSQL = "BEGIN NUESTRO_PL ('" + ARGUMENTO1+"', '" + ARGUMENTO2+"','");END;"

EXECUTEREALSQL = MsSQL
MsRdo = EXECUTEREALSQL(0)

O podemos hacer varias llamadas enlacadas:

MsSQL = "DELETE NUESTRA_TABLA"

EXECUTEREALSQL = MsSQL
MsRdo = EXECUTEREALSQL(0)

If MsRdo <> M4_ERROR Then
MsSQL = "INSERT INTO NUESTRA_TABLA (PK,CAMPO1,CAMPO2,CAMPO3) VALUES ('" + STD_ID_PERSON+"','" + STD_N_FAMILY_NAME_1 + "," + STD_N_FIRST_NAME + "'," + ToString(EDAD,0) + ",'" + MsDate + "')"

EXECUTEREALSQL = MsSQL
MsRdo = EXECUTEREALSQL(0)
EndIf
Tiene un problema y es que las cosas que controla la Base de Datos Lógica, digase, completitud, datos "no null", fechas,... las debemos controlar nosotros. Además sino lo hacemos nosotros los campos de control de ID_SECUSER, ID_APPROLE o DT_LAST_UPDATE no se actualizan.
Ojo con usarla de "mala manera" con entornos con AUDITORIA ya que tampoco se actualiza.

sábado, 1 de marzo de 2008

WebServices y Meta4 (SOAP)

Esta vez no voy a publicar una "ayuda" sino que la voy a pedir... :-(

Según la documentación de Meta4, PeopleNet es capaz de proveer y consumir WebServices, siento decir que "según la documentación" por que lo estamos intentando hacer y no hay manera.

Si alguien ha trabajado con WebServices y Meta4 (SOAP) por favor, que se ponga en contacto conmigo: oscar.lopezgrandmontagne@gmail.com, para que nos ayude, ya que lamentablemente desde soporte de Meta4 no pueden hacerlo... Es algo URGENTE porque tengo al cliente esperando.

MUCHAS GRACIAS!!!

viernes, 1 de febrero de 2008

Salida de Reports/Informes en cliente

Cuando queramos que un informe llamado desde una presentación salga por defecto en cliente sin que el usuario deba tocar más parámetros, se puede hacer incluyendo:

SetConstBool EXECUTION_SERVER, False; SetConstBool CLIENT_TASK_EXECUTION, False

en la llamada desde la presentación... algo así:

Set = "*C*#SYS_BLOCK_CONTEXT_VAL# :=(ISOSTR)SetConstStr ID_REPORT, "ID_INFORME_A_EJECUTAR"; SetConstStr DATA_CHANNEL_NAME, "ID_M4OBJECT_A_EJECUTAR"; SetConstBool ASKDATAPARAM,True; SetConstBool EXECUTION_SERVER, False;SetConstBool CLIENT_TASK_EXECUTION, False; SetParamConcatString NODO_M4O_DESTINO,ITEM_NODO_M4O_DESTINO,[NODO_M4O_ORIGEN.ITEM_NODO_M4O_ORIGEN];..."

Es muy típico cuando un usuario quiere informes en PDF para ser enviados, por ejemplo, por correo electrónico a personas que no dispongan de Meta4 instalado, o a gestores documentales, ...

lunes, 28 de enero de 2008

Login avanzado para el ESS

La opción de usar el login avanzado del ESS nos permite poder modificar mucho el comportamiento de Meta4. Se usa cuando un usuario puede acceder con diferentes sociedades, roles, monedas o fechas.

Yo lo he usado para que se pueda cambiar de Rol de seguridad, de esa manera mantengo los usuarios/roles de PeopleNet y les añado nuevos roles... que luego eligen a acceder:

A ver si explico bien los pasos (a mi me sirvio estudiar el login avanzado del portal de tecnología):

  • En el login del portal de tecnología... (http://server:port/tctools/espanol/tc_login.jsp) tienes un link llamado "Login avanzado" cuando lo pulsas aparecen varías opciones para el cambio de sociedades, roles, moneda y fechas por defecto...



  • Desmarca la opción de roles por defecto y logate con un usuario que tenga opción de acceder con varios roles...

  • ...y aparecerá una nueva página como "Pop-up" que te permitirá elegir entre ellos...




  • Replica este comportamiento en tu login y ya está... (de forma sencilla básicamente es añadir un checkbox que por defecto esté marcado y que se envía dentro del form del login):

<input type="checkbox" checked="checked" name="CHANGE_ROLE" title="Cambio de perfil" onclick="var scam=login.CHANGE_ROLE.checked;if (scam==false){m4valor('login','M4_CHANGE_ROLE','1','set');}else{m4valor('login','M4_CHANGE_ROLE','','set');};">

Luego hay que tener en cuenta que las páginas a las que se pueda acceder deben tener dos includes más:

Al comienzo dentro del tag <head>: <%@ include file="/shco_g0/shco_gen_portal_code_begin.jspf" %>

Al final despues del tag </body>: <%@ include file="/shco_g0/shco_gen_portal_code_end.jspf" %>

para que te funcione bien.

Si hay alguna duda... ya sabeis por donde ando,

martes, 22 de enero de 2008

Conexión de un OpenLDAP con Meta4 PeopleNet

He estado últimamente un poco liado con la conexión de un LDAP como repositorio externo de autenticación para Meta4, sobre todo con lo que se refiere a la conexión SSL, así que se me ha ocurrido añadir mi experiencia.

Pongamos primero el caso de estudio:

Tenemos un OpenLDAP (no certificado aún por Meta4) al que un cliente desea conectarse para autenticar las contraseñas introducidas en el cliente de desarrollo, el cliente rico y el ESS/MSS.

Datos de este OpenLDAP:

  1. Versión de LDAP: 3

  2. Máquina: openldap.cliente.org

  3. Puertos: 389 y 636 (este para SSL)

  4. Cadena de búsqueda (DN): uid=user,ou=people,dc=cliente,dc=org

  5. Servidor de aplicaciones sobre AIX

  6. El cliente quiere que la conexión se haga usando SSL, y para ello suministra un certificado “ca_raiz.cer”.

Conexión sin usar SSL

Para la hora de hacer pruebas es, creo, el más cómodo y el más rápido.


  • Crearemos en Meta4 el repositorio LDAP: para ello se debe acceder a: "Herramientas de Desarrollo / Configuración de la aplicación / Repositorios de autenticación". Crearemos uno con los siguientes datos:


  • Configuraremos en Meta4 el acceso al LDAP: Crearemos en "Herramientas de Desarrollo / Configuración de la aplicación / Repositorios LDAP" un repositorio con los siguientes datos:

  • Creamos o tomamos un usuario de Meta4, por ejemplo OSCARLG, que sabemos cuyo “uid” dentro del OpenLDAP es olopez y los mapeamos usando la opción de menú: "Herramientas de Desarrollo / Configuración de la aplicación / Mapeo usuarios LDAP". (Nota: también es posible usar como usuario de Meta4 olopez y así nos evitaríamos el mapeo)


  • Lo siguiente será configurar la aplicación para que al logarse este usuario el proceso no busque el usuario en el repositorio interno sino en el nuevo que hemos configurado. Para ello, debemos acceder a: "Herramientas de Desarrollo / Configuración de la aplicación / Parámetros de aplicación". Iremos a la vista “Avanzada” (Menú Herramientas / Avanzado...) y buscaremos, primero, “Parámetros generales”, segundo, “Parámetros de sesión” y tercero “ID Repositorio externo de autenticación”. Añadiremos en la pestaña “Valores por ámbito” un nuevo ámbito por “Usuario de aplicación” y seleccionaremos la “OSCARLG”.

  • Luego en el Valor añadiremos el identificador de nuestro nuevo repositorio “0002”.



  • Ya estamos en disposición de logarnos con el usuario OSCARLG de Meta4 en el LDAP con su contraseña y no con la de Meta4.

Conexión de un usuario con SSL (a entornos Windows)

Para Meta4 es necesario disponer de un almacén de certificados, pero no cualquiera. Es necesario que se genere usando la herramienta “certutil” que incorpora el Sun ONE Directory Server Resource Kit (yo he usado la versión 5.2) que puede ser descargado desde site de SUN en: http://www.sun.com/download/products.xml?id=3f74a0db.

Vamos, inicialmente a conseguir la conexión SSL con el LDAP desde un cliente de desarrollo en Windows luego explicaré como hacerlo en AIX.

  • Descomprime el Zip descargado (dsrk52-WINNT4.0_OPT.zip) en, por ejemplo, C:\temp\dsrk52-WINNT4.0_OPT. Ejecuta: java DSRK en la línea de comandos y obtendrás un asistente de instalación para instalar DSRK en tu máquina… yo lo he dejado en E:/DSRK.

  • A continuación debes crear un directorio para almacenar la base de datos de certificados… yo la crearé en c:\MyCertsDB.

  • Luego ejecuta desde la línea de comandos, o crea un .bat con, el siguiente comando:

    PATH=%PATH%;E:\DSRK\lib;E:\DSRK\lib\nss\lib
    E:\DSRK\lib\nss\bin\certutil -N -d "C:\MyCertsDB"

  • Esto creará en C:\MyCertsDB 3 archivos: cert7.db, key3.db y secmod.db
  • Lo siguiente es conseguir el certificado del LDAP, yo lo he dejado en C:\MyCertsDB por comodidad. Se llama ca_raiz.cer (y con un alias que llamaré ca_raiz_alias)
  • Luego ejecuta desde la línea de comandos, o crea un .bat con, el siguiente comando:

    PATH=%PATH%;E:\DSRK\lib;E:\DSRK\lib\nss\lib
    E:\DSRK\lib\nss\bin\certutil -A -n ca_raiz_alias -t "C,C,C" -d “C:\MyCertsDB” -i “C:\MyCertsDB\ca_raiz.cer”

  • Esto incorpora este certificado a la Base de Datos de certificados que creamos.
  • Ahora, de nuevo en Meta4, en Herramientas de Desarrollo / Configuración de la aplicación / Repositorios LDAP modificamos el repositorio “0002” con los siguientes datos:



Conexión de un usuario con SSL (a entornos AIX)



  • Descomprime el Zip descargado (dsrk52-AIX5.2_OPT.zip) en, por ejemplo, C:\temp\dsrk52-AIX5.2_OPT. Lleva a un AIX usando sftp en binario los archivos: dsrk52.zip y DSRK.class. Ejecuta: #java DSRK.class en la línea de comandos y obtendrás un asistente de instalación para instalar DSRK en tu máquina… yo lo he dejado en /opt/meta4/dsrk.

  • A continuación debes crear un directorio para almacenar la base de datos de certificados… yo la crearé en /opt/meta4/mycertsdb.

  • Luego ejecuta desde la línea de comandos, o crea un .sh con, el siguiente comando:

    #export LIBPATH=/opt2/meta4/dsrk/lib:/opt2/meta4/dsrk/lib/nss/lib
    #/opt2/meta4/dsrk/lib/nss/bin/certutil -N -d /opt2/meta4/mycertsdb


  • Esto creará en /opt/meta4/mycertsdb los 3 archivos: cert7.db, key3.db y secmod.db

  • Lo siguiente es conseguir el certificado del LDAP, yo lo he dejado en /opt/meta4/mycertsdb por comodidad. Se llama ca_raiz.cer (y con un alias que llamaré ca_raiz_alias)

  • Luego ejecuta desde la línea de comandos, o crea un .sh con, el siguiente comando:

    #export LIBPATH=/opt2/meta4/dsrk/lib:/opt2/meta4/dsrk/lib/nss/lib
    #/opt2/meta4/dsrk/lib/nss/bin/certutil -A -n ca_raiz_alias -t "C,C,C" -d /opt2/meta4/mycertsdb -i /opt2/meta4/mycertsdb/ca_raiz.cer
  • Esto incorpora este certificado a la Base de Datos de certificados que creamos.

  • Ahora, de nuevo en Meta4, en Herramientas de Desarrollo / Configuración de la aplicación / Repositorios LDAP modificamos el repositorio “0002” con los siguientes datos:


  • Ya estamos en disposición de logarnos con el usuario OSCARLG de Meta4 en el LDAP con su contraseña y no con la de Meta4 pero bajo conexión SSL y contra el servidor de aplicaciones en AIX

Espero que os ayude, … porque a mi me ha costado :-)

lunes, 21 de enero de 2008

Ejecutable externo desde una regla de un método

Para llamar a un ejecutable externo desde una regla de un método LN4, esto es lo que se hace:
  1. Crear un método de tipo DLL, cuyo recurso empleado sea "m4jsutils" y el método "ExecuteProgram". Hay que definir también un argumento de tipo Long.
  2. Una vez creado este método tan solo hay que llamarlo desde el que se desee ejecutar, pasandole la ruta y el nombre del programa externo, por ejemplo:

EJECUTAR("c:\winnt\system32\notepad.exe")

ó

CXX_RUTA_EJECUTABLE = "c:\winnt\system32\notepad.exe"
EJECUTAR(CXX_RUTA_EJECUTABLE)


Donde EJECUTAR es el método que registra la DLL y donde CXX_RUTA_EJECUTABLE puede ser una propiedad o campo por la que introducir la ruta en Tiempo de ejecución desde la presentación.

Nota (gracias a Franco Tarchini, Colombia): para rutas con directorios cuyo nombre sea mayor de 8 caracteres hay que usar los 6 primeros caracteres de dicho directorio más el caracter "~" (alt + 126) y un número correlativo al número de directorios que contengan esa raiz de 6 caracteres. Por ejemplo:

"c:\Archivos de programa\" equivale a "c:\Archiv~1\"

Espero que os sea de utilidad...

jueves, 20 de diciembre de 2007

Generación de trazas "ldbinsp0_X.txt"

Las trazas de la Base de Datos Lógica son realmente utiles (aparte de que nos las pida siempre soporte) para comprobar que sentencias se lanzan contra la Base de Datos Física.


Existen el registro entradas que controlan a generación de estas trazas. Todos ellos bajo la rama HKEY_LOCAL_MACHINE\SOFTWARE\Meta4\Mind\3.X\Build\[Build]\CLIENT\CVM\LOG:
  1. DebugDir: Dónde se generarán estas trazas (por defecto: C:\Archivos de programa\meta4\M4DevClient\M4Temp)
  2. MaxLDBInspSize: Tamaño máximo que pueden alcanzar el total de archivos de traza.
  3. MaxRollingFileNum: caso de que MaxRollingFileNum sea igual a "1" número de ficheros generados antes de rotar su uso.
  4. MaxRollingFileSize: es el tamaño máximo del fichero antes de que se genere el de backup.
  5. MultipleFilesTrace: Si es "0" es que no se generarán multiples ficheros.
  6. SystemDebugDetailLevel y
  7. SystemDebugEnable.

La combinación de valores posibles para ambas entradas de registro aparece en la siguiente tabla:

SystemDebugEnableSystemDebugDetailLevelSignificado
00Sin traza
10Traza de datos
20Traza datos y metadatos
30Traza de mayor nivel
0<>0Sin traza
1<>0Traza de datos con el filtro especificado
2<>0raza de datos y metadatos con el filtro especificado
3<>0Mayor traza posible con el filtro especificado


Los valores de filtrado posibles determinan el detalle que podemos obtener. Cabe destacar que una traza con el nivel de detalle máximo (sin filtro) es más extensa y puede ser más difícil de interpretar. Los posibles tipos de filtro se listan a continuación.

SystemDebugDetailLevel

0

No se aplica filtro. Se vuelcan todos los datos

1

Se muestran detalles relacionados con la ejecución y tiempos, pero no datos

2

Todos los detalles (ejecución, datos, prepares, bindings…)(1). No filtros de seguridad.

3

Se muestran detalles relacionados con ejecuciones, tiempos y datos. Como el nivel 1 pero con datos. No muestra prepares, bind ni filtros de seguridad.

4

Se muestran detalles relacionados con ejecuciones, tiempos, datos e información de filtros de seguridad, pero no datos.


(1) No significa que sea equivalente a SystemDebugEnable = 1 y SystemDebugDetailLevel = 0. La información que se vuelca con los valores anteriores es mucho más extensa que con SystemDebugEnable = 1 y SystemDebugDetailLevel = 2.


Si el valor es menor que cero y mayor que cuatro se tomará valor cero.

Puedes encontrar información referente a estas entradas en el manual Administrador_Depuracion_Trazas.pdf, páginas 19, 20 y 21.

martes, 18 de diciembre de 2007

Detener la generación de archivos de benchmark del Servidor de aplicaciones

¿Cómo se puede detener, o limitar, la generación de los archivos de benchmark (benchmark_YYYY-MM-DD@XYZABC.txt) que genera el servidor de aplicaciones de Meta4?


Para desactivar la generación de los ficheros benchmark debes modificar el fichero startup.obl concretamente localizar el texto: “OUT_TO_FILE” dentro del bloque "COMMUNICATION_SERVER BLOCK10" y establece el valor "FALSE".


Puedes encontrar información referente a estas entradas en el manual Administración_Servidor_Aplicaciones.pdf , páginas 134 y 135.

miércoles, 12 de diciembre de 2007

Uso del servlet DownloadBlob en el ESS/MSS

Muchas veces nos encontramos con la necesidad de publicar documentos en el ESS o en el MSS que son "estáticos" por ejemplo un listado de personas, o una descripción de una unidad organizativa,...

Ante este caso podemos actuar de dos maneras:

Enlace HTML:
Dejamos el documento en las carpetas del servidor Web y referenciamos a ellas mediante un ancla o "anchor" de la siguiente forma href="/documents/documento.pdf".

  • Pros:
    Esto es lo más sencillo
  • Contras:
    1) no podemos controlar que ese link sea privado, por lo que cualquier persona podrá enlazar a ese documento de la forma http://server:port/documents/documento.pdf.
    2) si el usuario necesita modificar el documento, es muy probable, que tenga que pedirlo a otras personas para que se lo cuelguen. (O con los implantadores) (A no ser que lo montemos como un link en PeopleNet)
    3) el documento SIEMPRE se deberá llamar de la misma forma y tener la misma extensión ya que si no tendremos que modificar también la página.

Uso de Campo BLOB:
Usar el tipo Blob en un campo de una de nuestras tablas y ser capaz de descargarlo.

  • Pros:
    1) podemos controlar que ese link sea privado, ya que como la descarga se hace usando tecnología Meta4 es necesario estar logado al sistema.
    2) si el usuario necesita modificar el documento lo hará desde Meta4 PeopleNet.
    3) Se puede cambiar de nombre y extensión las veces que se quiera... Meta4 se encarga de la descarga y vuestro navegador de decidir que programa usa para abrirlo.
  • Contras:
    1) Es algo "más" complicado ya que hay que ser capaz de insertar ese documento en la Base de Datos
    2) Si el número de documentos es grande o esto son muy grandes podemos llenar la Base de Datos.
Este post trata, además de explicar porqué lo hago, describir la forma de poder llevar a cabo esta descarga.

Vamos a pensar en que debemos sacar la descripción de una Unidad Organizativa que es un documento que el usuario realiza y pasa luego a pdf y que lo quiere colgar del historial de puestos de los empleados, de tal forma que pinchando, o haciendo click, en un link el empleado pueda ver esta descripción, pero sólo de aquellas Unidades Organizativas por las que ha pasado a lo largo de su vida profesional.

Modelo de Datos: Lo primero sería, crear una tabla que, por ejemplo, se herede de STD_WORK_UNIT (También se puede hacer con un tabla con relación 1:1 con esta). A esta tabla le añadiremos un campo CXX_DESCRIPCION_BLOB con un tipo extendido basado en un BLOB.

Meta4Object: Crearemos un Meta4Object, llamémosle CXX_WUNIT_BLOB con un nodo y estructura de nodo que llame igual de tal forma que en la sentencia recojamos el STD_ID_WORK_UNIT y el campo CXX_DESCRIPCION_BLOB de la tabla que hemos creado en el paso anterior.
Añadiremos una propiedad PRP_ID_WORK_UNIT
Añadiremos un método "CXX_CARGA" con un parámetro ARG_ID_WORK_UNIT para poder recibir el ID Unidad Organizativa que más tarde enviaremos desde la página. El código podría ser: CXX_CARGA.txt


JSPs (ESS): Necesitaremos crear una nueva página sse_g3_desc_uo.jsp. Esta página recibirá un parámetro "iduo" que se pasará al Meta4Object: CXX_WUNIT_BLOB de la siguiente forma: sse_g3_desc_uo.jsp


De esta forma al entrar en esta página se lanzará la ejecución del servlet de la descarga del Blob

No he incluido nada que compruebe que esta Unidad organizativa tiene o no un documento que, creo que se debería.

Para la incluir un documento en un campo blob dedicaré otro post...o retocaré este en breve.


viernes, 30 de noviembre de 2007

Teoría: Indirección

La indirección, permite entre otras muchas cosas multiplicar la potencia de muchos procesos...

Los ejemplos más claros son los de guardar en una tabla de parametrización una serie de registros con información de TI (Estructura de nodo) y campos, de tal forma que al recorerlos podamos generar nuevas salidas.

Existe por otro lado una leve desventaja y es que Meta4 PeopleNet, no puede generar dependencias por indirección, por lo que perderemos la funcionalidad de la pestaña de los items "Dependencias" para aquellos items que, como ya he dicho, se vean involucrados en llamadas de indirección.

Las funciones Ln4 más comunes que se suelen usar son:

  1. Call

    • Para llamadas a métodos o conceptos; Call(Argumentos, Nodo, Metodo); por ejemplo: Call(0,"CXX_NODO","MOVETO") o Call("CXX_NODO","BEGIN"). Hasta se pueden anidar: Call(Call("CXX_NODO","GETCURRENT") + 1 ,"CXX_NODO","MOVETO")

  2. GetItem
    • Para poder recuperar valores de campos, conceptos o propiedades GetItem(Nodo,Item,Registro); por ejemplo: GetItem("CXX_NODO","CAMPO1",0). También se puede usar GetItem("CXX_NODO","CAMPO1",-1) para recuperar valores de ámbito nodo o bloque.

  3. SetItem
    • Para poder insertar valores en campos, conceptos o propiedades SetItem(Nodo,Item,Registro,Valor); por ejemplo: SetItem("CXX_NODO","CAMPO1",0,NullValue()).

Otras funciones muy usadas serían las que nos permitirán saber desde código Ln4 el ID del nodo o del Meta4Object en el que nos encontramos: GetThisNodeID() y GetChannelID() respectivamente.

Un ejemplo de tratamiento de datos con indirección lo tenéis en: Post:Exportación genérica a Ms Excel