Mostrando entradas con la etiqueta PeopleNet. Mostrar todas las entradas
Mostrando entradas con la etiqueta PeopleNet. Mostrar todas las entradas

miércoles, 7 de enero de 2015

Trasformar un WebService REST en uno SOAP

Hace poco en un cliente me pidieron leer un WebService de tipo REST desde PeopleNet.

Sin saber demasiado de que iba todo este mundo pregunté en Soporte y me indicaron que PeopleNet trabaja como consumidor de WebServices SOAP pero no REST, aunque si lo puede ser proveedor de ambos tipos.

Primera pregunta ¿Qué diferencias hay entre REST y SOAP?... encontré este artículo que explica de forma sencilla las diferencias más importantes: "REST vs SOAP al servicio de la web". Ahora el problema residía en cómo iba a conseguir leer desde PeopleNet ese tipo de WebService.

Lo primero que quiero que quede claro es que no soy ningún experto en Java y que buscando cosas por internet conseguí que el WebService que me proveían (REST) lo pudiera invocar desde PeopleNet. Seguro que existen mil problemas en hacerlo como muestro y no sé si servirá para todos. (Lo expertos en Java sabrán perdonarme [Espero])

Lo que hice fue crear, con Netbeans, un WebService SOAP al que yo le pasaba una serie de parámetros y éste invocara al WebService REST. Lo que hago, basicamente, es componer una llamada XML y lanzarla a la URL que me indicaban.

La clase completa está aquí; NewRequest.java

Ahora intento explicar el código

1ª Parte: definición del WebService
@WebMethod(operationName = "GetData") 
    public String GetData(@WebParam(name = "param1") String param1, @WebParam(name = "usr") String usr,@WebParam(name = "pwd") String pwd) { 

Esta parte simplemente prepara el encabezado del WebService o cómo invocarlo.

2ª Parte: composición de llamada XML
sParameters = "\r\n"; 
sParameters += "\r\n"; 
sParameters += "\r\n"; 
sParameters += ""+param1+"\r\n";
sParameters += ""+usr+"\r\n"; 
sParameters += ""+pwd+"\r\n"; 
sParameters += "\r\n"; 
sParameters += "\r\n"; 

Esta parte deja en una variable sParameters la solicitud al WebService REST, donde me exigen un código de una persona, un usuario y una contraseña.


3ª Parte: envío de la solicitud

URL uri = new URL("http://www.dominio.com/services/Dataservices.php"); 
HttpURLConnection connection  = (HttpURLConnection) uri.openConnection(); 
connection.setDoInput(true); 
connection.setDoOutput(true); 
connection.setRequestMethod("POST"); 
connection.setRequestProperty("Content-type", "text/xml"); 
            
OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); 
writer.write(sParameters); 
writer.flush(); 

Esta parte enlaza una llamada POST a la URL que me habían proporcionado a través de un objeto OutputStreamWriter (writer) sobre una HttpURLConnection

4ª Parte: recepción de la información del WebService REST y retorno del WebService SOAP
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
            
StringBuilder builder = new StringBuilder(); 
for (String line = null; (line = reader.readLine()) != null;) { 
     builder.append(line).append("\n"); 
}
            
writer.close(); 
reader.close(); 
            
return( builder.toString()); 

Esta parte genera un String que posteriormente retorno para mi código LN4 (Regla de un método meta4)

Una vez compilado y subido como war a un Tomcat por ejemplo, podremos generar el WSDL que PeopleNet necesita.

¿Simple? Sí, puede ser...
¿Efectivo? Para mi problema sí
¿Mejorable? Sí, supongo que mucho


Espero que a alguno os pueda servir
Hasta la próxima y perdón por no escribir tanto como me gustaría.

PD. Feliz 2015 a todos

jueves, 20 de agosto de 2009

Unicode vs. ANSI; ¿qué debo instalar?

Al instalar las versiones de Meta4 (desde la v7.1 Sp1) se te pregunta que tipo de codificación se usará. Siempre he tenido dudas así que he buceado un poco por Internet y he encontrado un montón de referencias que me han ayudado. Os expongo mis conclusiones, si alguien sabe algo más, pues que me lo diga. Aunque siempre se puede consultar el archivo que Meta4 incluye en los CD de Tecnología “Configuración_Unicode.pdf”.

Lamentablemente, hasta la versión 7.1sp1 PeopleNet no ofrece soporte a Unicode.

[Según el archivo “Configuración_Unicode.pdf”]

Por regla general, siempre que se necesite que una instalación de PeopleNet sea capaz de gestionar cadenas de caracteres pertenecientes a más de una página de códigos será necesario el uso del soporte Unicode de PeopleNet.

Así, por ejemplo, si se tiene un escenario donde sólo se gestiona un idioma: inglés, español, francés, alemán, griego, hebreo, chino, etc. No será necesario utilizar el soporte a Unicode de PeopleNet. Bastará con que se seleccione la página de códigos adecuada en cada capa de la aplicación: cliente, servidor, base de datos, etc. Mientras la página de códigos sea la misma en todas ellas los datos serán tratados correctamente y no se perderá información.

Tampoco será necesario hacer uso del soporte Unicode de PeopleNet si se utilizan varios idiomas, pero todos ellos pueden ser representados por una sola página de códigos. Este sería el caso de utilizar inglés y español, alemán y francés, etc. Ya que se puede utilizar la página de códigos ISO-8859-1 para representar todos ellos. Siempre se puede utilizar una página de códigos para representar inglés y cualquier otro idioma.

Existe una excepción a las reglas anteriores, ya que a día de hoy PeopleNet presenta limitaciones en el tratamiento de idiomas que no sean representables con el conjunto de caracteres de Europa occidental (ISO-8859-1). Así, por ejemplo, la ordenación o paso a mayúsculas y minúsculas en la página de códigos hebrea o china no se producirá correctamente si se realizan a través de ln4 (lenguaje de programación de PeopleNet).

Así pues, si se tiene un escenario en el que distintos usuarios de PeopleNet pretenden manipular ciertas cadenas de texto en distintas páginas de códigos, por ejemplo español y chino, será necesario configurar la aplicación para hacer uso del soporte Unicode de PeopleNet.

¿Cuál es la diferencia, a nivel bajo, entre Unicode y ANSI?

En pocas palabras, la versión de un programa de Unicode se ejecuta levemente más rápido que la de un ANSI, pero sólo se ejecuta en Windows NT.

¿Qué es ANSI y Unicode?

ANSI

ANSI vino primero. ANSI (http://www.ansi.org/) es una organización que normaliza diversas áreas y ámbitos, tanto públicos como privados. Es un acrónimo para American National Standards Institute o Instituto Nacional de Estándares Americano. ANSI ha normalizado muchos áreas y ámbitos de la informática. Una de las normas en los equipos fue el conjunto de caracteres (letras, números y símbolos) que utiliza un ordenador. Esta norma fue llamado ASCII (American Standard Code for Information Interchange o Código Estándar Americano para el Intercambio de Información). Esta norma proveía 256 símbolos diferentes que puede utilizar un ordenador. Es rápido, eficiente y fácil de implementar. Todos los sistemas operativos modernos comprenden completamente ASCII.

Unicode

Uno de los principales problemas de usar ASCII es que sólo se pueden tener 256 caracteres diferentes. Sin embargo, hay idiomas, como el japonés o el árabe, que disponen de miles de caracteres, así que ASCII no puede funcionar en estas situaciones. El resultado, para evitar estos problemas, fue Unicode que permite hasta 65.536 caracteres diferentes. Como Unicode es más complejo que ASCII, no se puede aplicar en muchos sistemas operativos. La familia de Microsoft; Windows NT, Windows 2000, Windows XP y Windows 2003, admiten Unicode así como todas las futuras versiones de Windows.

Así que la cuestión pasa a ser ahora, si Windows NT es compatible tanto con ASCII y Unicode, ¿por qué los programas en Unicode se ejecutan con mayor rapidez? Para responder a esta pregunta hay que entender la propia estructura de Windows NT. El kernel de Windows NT está escrito en Unicode, y por lo tanto, sólo entiende de Unicode. Cuando un programa ANSI se ejecuta en Windows NT, el sistema operativo debe convertir las cadenas de ASCII a Unicode. Esto consume un tiempo en la conversión y, además, hace necesario que la memoria almacene los dos ejemplares (ASCII y Unicode). Considerando que un programa Unicode "ataca" directamente al núcleo es más rápido. En los ordenadores modernos que funcionan a velocidades de giga hercios y con cientos de megas de RAM esta diferencia de velocidad es mínima, pero sí existe.

La última área a analizar es, ¿por qué sólo programas Unicode se ejecutan en Windows NT y no en otros sistemas operativos como Windows 95/98/ME? La respuesta se remonta, de nuevo, al Kernel de estos sistemas operativos. Windows 95/98/ME están diseñados para ser un sistema operativo "ligero" y sencillo para el usuario general y su kernel está escrito en ASCII. Microsoft podría haber puesto en práctica un sistema de conversión similar al de Windows NT, pero esto consumiría una gran cantidad de recursos tanto de memoria como de disco duro. Windows 95/98/ME pueden funcionar en un sistema de gama baja, con tan solo 4 megas de RAM, mientras que Windows NT requiere un mínimo de 16 megas de RAM. En la mayoría de los ordenadores que tienen 64 megas de memoria RAM o más, esto no es tan importante. Esta es una de las razones principales por la cual el código de Windows 95/98/ME está cerrado.

Resumen "muy resumido"
  • Si sólo se ejecuta en equipos con Windows NT/2000/XP podrás usar las versiones de Unicode, pero las versiones ANSI tambien funcionan.
  • Si sólo se ejecuta en equipos con Windows 95/98/ME sólo podrás usar la versión ANSI.
  • Si se ejecuta en equipos con Windows 95/98/ME y en equipos con Windows NT/2000/XP, deberás usar la versión ANSI.

sábado, 20 de junio de 2009

Asignación masiva de valores del Periodo de RH

He tenido que realizar este desarrollo que quizás alguien necesite, ya que se necesitaba cargar información en la base de datos, por ejemplo el sueldo de los empleados, en la tabla de Valores del Periodo de RH.




A partir de la versión 7 existe ya una carga másiva de Incidencias del Periodo de RH, pero son eso "incidencias" para una paga en concreto no para dar valores desde una fecha en adelante.




Necesitais descargar un fichero access (ASIGNACION_MASIVA_VALORES.rar) y ejecutar las siguientes sentencias, através de la RAMDL (Ojo el MDB está en versión V7.1Sp2 con HF6, si estais por delante os servirá subiendolo de verisión, si estais por detrás tendreis que subir la versión del entorno)




Es necesario disponer ya de la versión 7 de las tablas de valor ya que se basa en ellas para hacer la carga.




Sentencias:



TRANSFER "NODE STRUCTURE"."SRCSL_PY_VT_DATA_HR_PERIOD_VAL" FROM ORIGIN TO DESTINATION\
TRANSFER "META4OBJECT"."CSL_PY_VT_HR_PERIOD_VAL_MASS" FROM ORIGIN TO DESTINATION\
TRANSFER "PRESENTATION"."CSL_PY_VT_HR_PERIOD_VAL_MASS" FROM ORIGIN TO DESTINATION\
TRANSFER "MENU OPTION"."MN_CSL_PY_VT_HR_PERIOD_VAL_MAS" FROM ORIGIN TO DESTINATION\
TRANSFER "BUSINESS PROCESS"."BP_CSL_PY_VT_HR_PERIOD_VAL_MAS" FROM ORIGIN TO DESTINATION\





Este proceso debería generarte una nueva opción de menú en: Nómina \ Tablas de Valor \ Valores del periodo de RH \ Entrada masiva de valores del Periodo de RH que se puede ver en la siguiente imagen:

¡¡¡¡¡ NOTA IMPORTANTE !!!!!
Para el caso que he tenido que realizar ha funcionando correctamente pero no se ha realizado un plan de pruebas exhaustivo y no puedo asegurar al 100% que funcione en todos los casos... tomadlo como una ayuda

Espero que os sirva!!

domingo, 26 de octubre de 2008

[Colaboración de Jaime González de Zárate - SIC S.A.] Invocación a servicio SOAP externo a Meta4

Mi compañero Jaime González de Zárate de SIC S.A. (http://www.sicsa.es/), me ha enviado la información necesaria para crear un post que creo que os resultará muy interesante. Se trata de poder invocar Web Services a través de SOAP.

El objetivo de este post es mostrar cómo la aplicación Meta4 también puede funcionar como un cliente SOAP que realiza peticiones a un determinado servicio SOAP y traspasa los datos requeridos a los Meta4Objects ya definidos.

Meta4 como cliente SOAP tiene algunas restricciones, ya que no es capaz de consumir todos los servicios SOAP que existen descritos por un WSDL cualquiera. Esto es así, porque Meta4 no puede convertir una estructura de datos arbitraria en un Meta4Object, solamente soporta un subconjunto de tipos.

Meta4 como cliente SOAP es capaz de interpretar los tipos básicos más significativos de SOAP http://www.w3.org/tr/xmlschema-0/ , así como un subconjunto de tipos complejos.

Los tipos complejos que Meta4 puede consumir deben ser estructuras mixtas o vectores de una dimensión de estructuras mixtas. Se define estructura mixta como un objeto compuesto por tipos básicos, estructuras simples (compuestas únicamente por tipos básicos) u otras estructuras mixtas.

Esto significa que Meta4 no es capaz de consumir matrices multidimensionales o vectores de tipos básicos.

Con respecto a los ficheros, Meta4 no los consume. Pero existe una excepción: si los ficheros provienen de una implementación concreta (Axis DataHandler), Meta4 los consume sin ningún problema, tanto de entrada como de salida.

Principalmente hay dos tipos de servicios:
  • rpc/encoded
  • document/literal

Por el momento Meta4 no consume servicios Document/Literal.

Para realizar el ejemplo que se desarrollará en este documento utilizaremos una arquitectura que consta de los siguientes componentes atendiendo a la Guía de Certificaciones:

  • Contenedor Web: Tomcat 5.0.28
  • Motor SOAP: AXIS 1.1
  • Java Virtual Machine: j2sdk1.4.2

Además utilizaremos un “TCPMonitor” (ver punto 4 del documento) que es una utilidad que escucha en un puerto y monitoriza todo lo que se reciba y se mande por él, y lo redirecciona automáticamente al puerto correcto.

Como el documento es largo en vez de añadirlo como Post lo adjunto. Link

Como podreis ver no resulta tan sencillo como aparece en la documentación de Meta4. Si alguien lo ha conseguido de otra forma y quiere compartirla estaré encantado de escribirlo en el blog... así como conseguir que sea Meta4 PeopleNet quien provea de estos Web Services (SOAP).

Espero que sea útil.
SEGURO QUE LO ES... Muchas gracias Jaime!!

martes, 27 de mayo de 2008

Ejecución de un script SQL desde Meta4

Usando el método EXECUTEREALSQL que ya definimos en otro post, es posible usar un método que lance un script de SQL como si de un TOAD se tratara.

Haremos lo siguiente:

  • En un método (ambito cliente), primero abriremos un fichero de texto (scipt.sql) y, segundo, dejaremos el contenido en la variable MsScript:


MsFile = "C:\temp\script.sql"
OpenFile(MsFile,handle)
ReadFile(handle, chr(0), MsScript)

  • Leeremos el fichero que separa las sentencias por ";" y las ejecutaremos usando el método EXECUTEREALSQL:

MsRest = MsScript
While length(MsRest )>0
MnSeparador = indexof(MsRest,";",0)
If MnSeparador <> M4_ERROR Then
MsToExec = Mid(MsRest ,0,MnSeparador )
MsRest = Mid(MsRest,MnSeparador + 1, length(MsRest)-MnSeparador -1)
EXECUTEREALSQL = MsToExec
MnRdo = EXECUTEREAL(0)
If MnRdo = M4_ERROR Then MessageBox("ERROR",MsToExec)
Else
EXECUTEREAL = MsScript + ";"
MnRdo = EXECUTEREALSQL (0)
If MnRdo = M4_ERROR Then MessageBox("ERROR",MsToExec)
EndIf
WEnd

Return M4_SUCCESS

Espero que os sirva

viernes, 28 de marzo de 2008

CXX_AUX_ITEMS para Estructuras de Nodo con Herencia

En el post dedicado a la exportación genérica a Excel (link) o a texto (link), no me fijé en un pequeño detalle, y es que la sentencia de la estructura de nodo,CXX_AUX_ITEMS, que recupera los items a exportar de una estructura de nodo no funciona de forma correcta cuando ésta ha sido heredada.


Aquella era:

mientras que debería ser para cualquier estructura de nodo (heredada o no):

Los cambios residen en:

  • Añadir la tabla lógica "SCH_TIS_INHERIT" (usando una relación personalizada sin unión, de momento entre ningún campo)
  • Cambiar el filtro para que: "A.ID_TI = @ARG_ID_TI" pase a ser: "( A.ID_TI = @ARG_ID_TI Or ( A.ID_TI = B.ID_TI_BASE And B.ID_TI = @ARG_ID_TI ))"

Espero que os sirva. Yo ya la usé el pasado lunes :-)

martes, 25 de marzo de 2008

Filtro dinámico desde una presentación

En el nodo donde necesites tener un filtro dinámico pero no quieres que se "levante" cuando cargas el Meta4Object, crea una propiedad "CXX_DYN_FILTER" de ámbito nodo, tipo "Long" y tipo interno 34 - Sentencia lógica del filtro dinámico.

Luego, en un botón de una presentación pon el siguiente código:


BEGIN Button btnEjecutar
    Idchannel = "CXX_MI_M4OBJ"
    Idnode = "CXX_MI_NODO"
    Left = 468
    Top = 408
    Width = 105
    Height = 38
    Text = "&Ejecutar"
    BEGIN Evclick Ejecucion
        BEGIN Action_dialog EjecucionFiltro
            Idnode = "CXX_MI_NODO_A_FILTRAR"
            Dialog = "Filter"
            Oncancel = "acFinal"
        END

        BEGIN Action_call acFinal
        END
    END
END
Yo lo suelo usar en consultas en pantalla para que el usuario pueda filtrar a su gusto la población que desea.
Espero que os sea de ayuda!!

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!!!

miércoles, 6 de febrero de 2008

PeopleNet V7

He encontrado algo curioso en Internet, se trata de un Informe de PeopleNet V7 MUY COMPLETO. Tiene como un año de antigüedad (al menos su última actualización).

Está en inglés pero se entiende muy bien:

http://softwarefinder.mbtmag.com/software/95-14550/Human-Resources-HR/PeopleNet-7-by-META4.html

jueves, 31 de enero de 2008

[ExpansionYEmpleo.com] CADA TRABAJADOR DEBE CONOCER SU OFERTA FORMATIVA

(Miércoles, 30 de Enero del 2008)


En funcionamiento desde 2004, la universidad corporativa de Asepeyo empieza a dar ahora sus frutos. Más de tres mil empleados se benefician anualmente de los programas de formación que, a través de sus diferentes escuelas y de su campus virtual, imparten los profesores internamente formados.

Director corporativo de recursos humanos de Asepeyo, Ricardo Alfaro dirige también la universidad corporativa de esta empresa, un proyecto del que habla con entusiasmo y que se inició en 2004 con un objetivo muy claro: invertir en el desarrollo de las personas, "que es nuestro principal activo".

¿Por qué surgió la idea de crear una universidad corporativa para Asepeyo?
Es una iniciativa con la que pretendíamos responder a la necesidad que tiene esta compañía de desarrollar el talento de sus empleados. Nuestra plantilla se compone de personal altamente cualificado que nos solicitaba como valor añadido recibir una formación que garantizara el desarrollo de su carrera profesional.

¿Cómo fueron los primeros pasos?
Elaboramos una encuesta para averiguar qué tipo de formación necesitaba la gente. Preguntamos a los directivos sobre las competencias que debían poseer sus empleados para desempeñar correctamente sus funciones.

Una vez pensado el modelo de universidad que queríamos implantar, vimos la necesidad de aplicar una tecnología de gestión de personas en la organización. Para ello, recurrimos a Meta4, una compañía que aporta los sistemas informáticos que utilizan las grandes empresas para gestionar sus recursos humanos.

Además, incorporamos Meta4 Peoplenet, una única plataforma desde la que podíamos administrar no sólo la nómina de nuestros empleados, sino también la selección de personal, su formación y las relaciones laborales.

¿Cuál es su objetivo?
Queríamos migrar el concepto tradicional que representaba el departamento de formación (poco estructurado, basado en cursos que sólo se impartían de vez en cuando y con diferentes proveedores), al de gestión y aprendizaje. Nuestro propósito es que cada trabajador conozca la oferta y el itinerario de formación que la empresa le proporcionará en los próximos años.

El primer paso es definir hacia dónde quiere ir la empresa y, después, determinar cómo formar a la gente para lograr dicho objetivo. De esta forma, tratamos de alinear este aprendizaje con la estrategia y línea de negocio de la organización.

¿Cuáles han sido hasta ahora sus principales logros?
Hemos conseguido cerrar un ciclo entero de programas formativos. Ha sido un proceso largo y ahora es cuando empezamos a ver los resultados. Toda nuestra formación es interna; sólo acudimos a escuelas de negocios como el IESE cuando nos interesa que algunos de nuestros directivos se formen en determinados programas.

Pero nuestro mayor logro es la web de nuestra universidad corporativa, que funciona desde hace unos meses. No es sólo un campus virtual, sino un entorno que permite a cada empleado acceder a varios servicios como hemeroteca, encuestas, etcétera.

Además, una de las principales ventajas de nuestro centro de formación integrado en los sistemas de información de recursos humanos, con lo que desde este departamento podemos ver en una sola pantalla todo tipo de información, como los cursos que ha realizado cada empleado y la calificación obtenida.

La universidad posee dos campus físicos, pero también uno virtual. ¿Por qué inciden en la importancia de este último?
Desde el principio quisimos darle un peso muy importante conscientes del ahorro de costes que suponía para la compañía, expuesta a la dispersión geográfica de sus trabajadores. Lo que antes gastábamos sólo en desplazamientos, dietas y alojamiento, ahora puede destinarse ahora a inversión en formación pura y dura.

¿Cuáles son los retos más inmediatos de esta universidad corporativa?
Para 2008 tenemos varios frentes abiertos:
  • Acabar de estructurar el centro de desarrollo directivo, encargado de la formación específica de estos profesionales.
  • Crear el club de mentores para que a todos los directivos recién nombrados se les asigne un mentor que les ayude en su proceso de adaptación al puesto.
  • Establecer una biblioteca virtual para que los empleados puedan consultar los libros de referencia básicos en su itinerario formativo.
  • Consolidar las bases de datos de conocimientos que permiten el aprendizaje que, por ejemplo, un médico ha adquirido tras asistir a una conferencia.
  • Mantener sesiones clínicas online que hagan la vez de las reuniones diarias donde los médicos intercambian conocimientos y exponen un caso.

Entrevista realizada por Raquel Goig.

Enlace directo a la noticia en ExpansionYEmpleo.com: Link

miércoles, 30 de enero de 2008

Exportación genérica a fichero de texto

Para completar el post que escribí sobre la Exportación genérica a Ms Excel (link) escribo este otro para ver como tener un método que te exporte las cosas a un fichero de texto plano.

Yo lo uso, entre otros casos, cuando en un cliente, con servidor en entorno Unix (Solaris o AIX)quieren consultas en Ms Excel, pero éstas son muy grandes y claro en el servidor no las pueden sacar. Yo monto una exportación en servidor a texto y luego la envío por correo... Bueno es un ejemplo, pero hay más...

A lo que voy que me lío :-)

Debes leer el post al que me refería antes (Exportación genérica a Ms Excel). Haces lo mismo, pero la regla del método CXX_EXPORT_EXCEL la cambias por esta: CXX_EXPORT_TXT. (Yo las suelo poner las dos... y que se el usuario quien elija, ¿no?)

Esto te saca a un txt el contenido de un nodo completo.

Ahora, si en el método cambias el código:


MsCaracterSep = ";"

por

MsCaracterSep = Chr(M4_TAB)

y quitais el "encabezado":


InitFile(MsFile,MsTitle)
ConcatFile(MsFile,"")


y el "pie":


ConcatFile(MsFile,"")
ConcatFile(MsFile,"Fecha impresión: " + MsDay + "/" + MsMonth + "/" + MsYear + " " + MsHour)


...se puede abrir con Ms Excel, sin problemas de importación.

Como siempre, espero que os sirva...

lunes, 17 de diciembre de 2007

Trucos con el Registro de Windows

Podemos "tocar" el registro de Windows, dentro de la rama de Meta4, para poder variar el funcionamiento estándar de la aplicación.

Aquí recojo algún cambio que suelen venir muy bien:

F1 – Ayuda por IdHelpTopic

Siempre es complicado saber que Presentación se levanta desde una tarea de una opción de menú ¿no?. Con el siguiente cambio podemos modificar el comportamiento de la tecla F1 para que en vez de levantarnos la ayuda on-line de Meta4 PeopleNet, nos saque la entrada en la ayuda, es decir el IdHelpTopic. De esta forma si la opción de menú, o la presentación, tienen definido su IdHelpTopic como el ID de la Presentación lo podremos ver:

Me explico, por defecto, en una opción de menu podemos presionar F1 y obtendremos:


pero si modificamos la entrada: HKEY_LOCAL_MACHINE\SOFTWARE\Meta4\Mind\3.X\Build\[Build]\CLIENT\CLIENT\HelpSystem\HelpDocTest y ponemos test (en minúsculas) y sin tener que reiniciar el cliente obtendremos, volviendo a pulsar F1:



Lamentablemente no funciona al reves sin reiniciar el cliente.


INSTALL_MODE

La entrada INSTALL_MODE situada en HKEY_LOCAL_MACHINE\SOFTWARE\Meta4\Mind\3.X\Build\[Build]\CLIENT\TOOLS nos permite acceder a elementos propios de tecnología, tales como a Modelos de datos, Tablas lógicas, Meta4Objects, ... creados con indicador de propietario (ID Owner flag) "1".

Con poner esta entrada a 1 y reiniciar el cliente estarán visibles.

treeshowall

La entrada treeshowall hay que situarla en HKEY_LOCAL_MACHINE\SOFTWARE\Meta4\Mind\3.X\User y nos permitirá acceder a elementos escondidos del Meta4Object de nomina (nodos auxiliares, de lectura, de recalculo,..).

Hay que crear una nueva entrada como Dword y con valor a 1 (hexadecimal o decimal) y al reiniciar el cliente estarán visibles.

El problema es que tras salir del cliente estada entrada deja de existir.

ProductVersion

La entrada ProductVersionsituada en HKEY_LOCAL_MACHINE\SOFTWARE\Meta4\Mind\3.X\Build\[Build]\CLIENT\INSTALL nos permite modificar el texto que aparece en la pantalla de acceso. Por ejemplo si le doy el valor "PeopleNet v7.1 para Oscar" y reiniciar el cliente se podrá ver: "Versión PeopleNet v7.1 para Oscar"



No es que sea un truco, pero a veces tras la instalación de algún Service Pack tecnológico este valor no se refresca produciendo dudas sobre si la instalación ha sido, o no, satisfactoria.

Para acabar: ¡¡¡ OJO CON TOCAR EL REGISTRO !!! no sólo ya en la rama de Meta4 que puede hacer que se nos vaya al "garete" el cliente/servidor sino. lo que es más peligroso, la máquina.

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.


jueves, 29 de noviembre de 2007

Importación desde un Ms Excel

La forma rápida que la gente hace es pasar la hoja de Ms Excel a texto y luego usar las importaciones... pero eso a veces no es posible porque lo debe hacer el usuario y no un desarrollador. (Recordemos que las importaciones son una herramienta del desarrollador (M4DevClient) y no de usuario (M4DistClient o RichWeb))

Yo utilizo una forma que la verdad es rápida y permite hacer comprobaciones según se importa información.

Un ejemplo; los usuario de RRHH reciben todas las semanas una hoja Ms Excel con un listado de los nuevos teléfonos dados por el dpt. de sistemas, es decir, vamos a importar números de teléfono de tipo "Oficina" de un hoja Ms Excel donde el formato es el siguiente: DNI (en la columna A) y Teléfono (en la columna B).


Para ello crearemos un M4Object CXX_IMPORTAR_TELEFONOS con 3 nodos:

CXX_IMP_TEL_ROOT (Nodo principal) -> No tendrá campos, servirá para la ejecución de la importación. Creamos:

  • una propiedad llamada CXX_EXCEL_FILE; de ámbito nodo y tipo long (es donde el usuario podrá dejar la ruta al excel a importar que se pedirá en presentación)
  • un método llamado CXX_IMPORT de ámbito nodo, con el siguiente código: >CXX_IMPORT.TXT

CXX_AUX_PERSONA (Nodo libre) -> Cargaremos los datos de la persona por DNI (STD_SSN).

  • Añadiremos una propiedad: PRP_STD_SSN, de ámbito nodo, tipo cadena variable de 11 posiciones y NO visible.
  • La sentencia será: SELECT @STD_ID_PERSON = A.STD_ID_PERSON, @STD_SSN = A.STD_SSN FROM &STD_PERSON A WHERE (A.STD_SSN = @PRP_STD_SSN).
  • Crearemos un método: CXX_GET_ID_PERSON(ARG_STD_SSN cadena variable de 11 posiciones) ambito nodo, tipo cadena variable de 9 posiciones. El código será el siguiente: CXX_GET_ID_PERSON.TXT

CXX_IMP_AUX_PHONE (Nodo libre) -> Guardaremos el nuevo teléfono.

  • La sentencia será: SELECT @STD_ID_PERSON = A.STD_ID_PERSON, @STD_DT_START = A.STD_DT_START, @STD_DT_END = A.STD_DT_END, @STD_ID_LOCATION_TYPE = A.STD_ID_LOCATION_TYPE, @STD_ID_LINE_TYPE = A.STD_ID_LINE_TYPE, @STD_PHONE = A.STD_PHONE FROM &STD_PHONE_FAX A

La presentación, CXX_IMPORTAR_TELEFONOS quedaría algo así como:



Como temas especiales los dos botones tendrían estos códigos OBL:

a) "Abrir explorador de windows" (Botón de la carpeta) bttBROWSER.txt

b) "Visualizar el documento" (Botón de la lupa) bttVIEW.txt

Espero que os sirva

Exportación genérica a Ms Excel

Las posibilidades que se tiene importando-exportando a Excel en Meta4 PeopleNet son muchísimas...

Me encanta, personalmente, realizar consultas mediante opciones de menú donde obtengas un resultado en pantalla y luego, darle al usuario la posibilidad de exportarlo a Excel o a texto, o incluso yendo más allá permitir planificar una tarea si la exportación va a ser grande [Esto será motivo de otro Post].

Un ejemplo de exportación genérico que me gusta hacer es el siguiente.

En tu Meta4Object créate una Estructura de nodo: llamémosla CXX_AUX_ITEMS con la siguiente sentencia:

Esta estructura te cargará los ítems de tipo campo, concepto y propiedad de una estructura de nodo dada... [Lo veréis más adelante]
Nos falta añadir un par de métodos a la estructura CXX_AUX_ITEMS:
  • DESTROYBLOCK, para destruir el contenido, ámbito bloque.
  • CXX_NORMALIZAR_STRING(argumento ARG_CADENA de tipo long) devuelve LONG, ámbito nodo, que lo que hará es quitar los códigos de retorno que el Ms Excel no controla (sobre todo para el tema de campos comentario o campos de tipo long). El código es: CXX_NORMALIZAR_STRING.txt

y una propiedad para el filtro: ARG_ID_TI de ámbito nodo "No Visible" y de tipo Candena variable de 30 posiciones

En el nodo donde queráis hacer la exportación, crea un alias contra el Meta4Object "EXCEL"

Creáis un método CXX_EXPORT_EXCEL "Exportación a Ms Excel", de ámbito Nodo, que esté en cliente y metéis el siguiente código: CXX_EXPORT_EXCEL.txt

La estructura CXX_AUX_ITEMS la podéis usar donde queráis... por que es genérica siempre que se ejecute el método CXX_EXPORT_EXCEL desde el nodo que queramos exportar... si lo queremos ejecutar desde otro sitio habría que cambiar ligeramente el código.

Esto sería un ejemplo de lo que obtendríamos:


Espero que os sirva...