martes, 23 de septiembre de 2008

[Meta4] Fernando Ruiz Marquina, asume la Dirección Comercial y Marketing de Meta4

23 de septiembre de 2008 

Con el nombramiento de Ruiz Marquina Meta4 refuerza su equipo directivo en nuestro país.

Meta4, tras anunciar la adquisición de la compañía francesa AXYS, ha nombrado a Fernando Ruiz Marquina, hasta ahora Director de Desarrollo de Negocio, como nuevo Director Comercial y Marketing para España, reforzando así el nuevo equipo directivo que integrará la estructura de la nueva empresa.

Fernando Ruiz Marquina, que hasta el momento ha ocupado la dirección de diferentes áreas de la compañía, tendrá como objetivos dentro de sus nuevas funciones acelerar el crecimiento tanto en la venta de soluciones especializadas de Recursos Humanos, como en la prestación de servicios de Outsourcing; área de negocio recientemente consolidada por Meta4 tras la compra de AXYS, empresa especializada en Outsourcing/ASP y que cuenta con mas de 350 clientes en toda Europa.

Fernando Ruiz nació en Madrid y es licenciado en Física por la Universidad Complutense, contando con una amplia experiencia en el sector especializado de soluciones para la gestión de Recursos Humanos. 

Acceso directo a la noticia: link

miércoles, 17 de septiembre de 2008

Macros Excel en LN4

(Sacado del CSS de Meta4 y ampliado)

El número de métodos del objeto Excel es muy limitado, por lo que en ocasiones, se puede requerir la utilización de nuevos métodos de EXCEL accesibles vía OLE, a través de la OLEEXEC.DLL.

El Meta4Object Excel instancia un objecto aplicación en el nodo raíz y una colección Workbooks en el nodo hijo. En esa colección no se soportan más que unos pocos métodos (Add, close ...), dado que los métodos de operaciones con hojas de cálculo, no están implementados a nivel de colección, sino a nivel de instancia, la cual sin embargo no está accesible.

Así pues lo primero, tras una llamada de la colección a "Add", que es cuando se crea la nueva hoja de cálculo, es cuando se puede obtener el handle de objeto Workbook instanciado dentro de la colección Workbooks. Como no se tiene referencia directa, se puede obtener, por ejemplo, utilizando la jerarquía de clases de Excel, utilizando la propiedad "ActiveWorkbook" de la clase "Application", para obtener el Handle de la hoja de cálculo. Si hacemos llamadas en el nodo raíz, nos devolvería el Handle en la misma propiedad que donde se ha almacenado el handle propio de la clase aplicación, y se perdería. 

  • Créate un Meta4Object nuevo, CSL_EXCEL que herede del Meta4Object EXCEL estándar. (Podrías tocar el propio Meta4Object EXCEL estándar pero mejor hacerlo así)
  • Mapealo y colocalo en el arbol de ejecución, para que las llamadas a EXCEL se hagan siempre contra tu Meta4Object.
  • Crea un nuevo nodo nodo y su estructura de nodo, que se debe crear a la misma altura que EXCEL_WORKBOOKS, por ejemplo ACTIVE_WORKBOOK. Se añaden las propiedades ERRORS, InterfacePointer y ParentInterfacePointer como en el nodo EXCEL_WORKBOOKS. En la tercera, se almacena el puntero del nodo padre a través del conector, conectando con la propiedad InterfacePointer del nodo raíz para leer el handle de la clase Application (nodo EXCEL).


  • Para implantar la llamada a la propiedad "ActiveWorkbook", debe llamarse a la función GetObjectFromProperty. Para ello, se crea un método (por ejemplo GET) de tipo DLL que referencie el recurso "OleExec.dll", método "GetObjectFromProperty", con un parámetro.
  • Para realizar la llamada, crea un método  (por ejemplo INICIALIZAR) de tipo ln4 en el mismo nodo, realizar el siguiente código; 
AddRegister()
MoveTo(Count()-1)
Get("ActiveWorkbook")
  • Sobre éste nodo, con el valor de InterfacePointer conseguido, se pueden realizar llamadas a los métodos de la clase "WorkBook", creando un método que ejecute la llamada "SaveAs". El método debe llamarse EXACTAMENTE IGUAL que la función que se quiera invocar a través de OLE. En este caso SAVEAS, con código DLL, y recurso "OleExec.dll", método "OLE_Execute" (se llama a la ejecución OLE del método cuyo nombre venga determinado por el identificador del item). Se debe indicar que tenga un parámetro que será la ruta de grabación. Posteriormente podrá ser invocado de la siguiente manera:

EXCEL!ACTIVE_WORKBOOK.INICIALIZAR()
EXCEL!ACTIVE_WORKBOOK.SAVEAS(“c:\MiArchivoExcel.xls”)

Adjunto la definición de los métodos creados:
Método GET:

Método INICIALIZAR:
Método SAVEAS:




Espero que os sirva...

viernes, 12 de septiembre de 2008

Función DELAY en LN4

Me temo que hasta la versión 7.1 SP002 no se libera una función LN4 que permita hacer un DELAY, una pausa de x segundos. Parece que entonces se llamara SLEEP

De todas formas se puede crear una fucnión, un método, que simule este comportamiento. Para ello, create un método llamados DELAY, de ámbito nodo y con un argumento ARG_NUM_SEGUNDOS de tipo numérico sin decimales, y le añade este código:

MnNumSegundos = ARG_NUM_SEGUNDOS  
MdSalida = DateAdd(TodayNow(), MnNumSegundos , M4_SECOND ) 
While MdSalida >= TodayNow()     
  'Bucle de tiempo 
WEnd 
Return M4_SUCCESS  

Para ejecutarlo luego,  sólo necesitas indicarle cuantos segundos quieres que esté "esperando":

DELAY(5)

Fácil, ¿no?

lunes, 8 de septiembre de 2008

Planificación de ejecución de Meta4Objects

Sois bastantes los que me habéis preguntado cómo se puede delegar en el Planificador de Tareas (Job Scheduler) la ejecución de métodos de un Meta4Object.

Aquí redacto una forma de hacerlo. Esta forma no permite al usuario "final" la planificación de tareas de forma sencilla... necesita tener un poco de conocimiento. De todas formas para permitir a un usuario planificar ejecuciones contra el Planificador de Tareas desde un método Ln4, puedes consultar este post "Ejecución de Meta4Objects planificados en el Job Scheduler"

Imaginemos que disponemos de un Meta4Object llamado CXX_MI_META4OBJECT que en su nodo principal, CXX_MI_NODO, dispone de un método CXX_GESTION que realiza la carga del nodo y si hay información resultante de la carga envía un mail. Queremos que se ejecute todos los días a las 00:00 para controlar cierta información.

Nota: Haz click en las imagenes para verlas más grandes

a) Accederemos, inicialmente al Planificador de Tareas:



b) Pulsaremos en "Nuevo" para crear una nueva Tarea:


c) Rellenaremos todos los datos de la primera pestaña de la definición:

Son:
  • Planificación: Crearemos un ID Planificación nuevo: (i.e.) CXX_PLANIFICACION
  • Descripción: Crearemos una descripción que nos inforque que es lo que hace
  • Prioridad: En general "Normal" pero en función de tus necesidades puedes cambiarlo ("No urgente","Urgente"  o "Muy urgente")
  • Cola de ejecución: Podemos elegir entre los M4AppServers conectados a nuestra Base de Datos para decidir quien lo debe ejecutar. Podemos elegir, por ejemplo, un M4AppServer que corra sobre una máquina Windows para ejecutar exportaciones a Excel que una máquina UNIX o AIX sería imposible.

d) Rellenaremos todos los datos de la segunda pestaña de la definición:


Modificaremos:
  • Modo: "Inmediato" para una única ejecución, "Cíclico" hasta 500 ejecuciones que sigan algun patrón (todos los días, todos los martes,...), "Plan Anual" para ejecuiones que sigan planes anuales (1er, o último día meses pares, primer lunes de cada mes, cada 25 de cada mes,...) o "Lista de fechas" planficiaciones hechas para fechas concretas sin seguir patrón.
  • En cada uno de los casos existe diferentes opciones de planificación.
e) Rellenaremos todos los datos de la tercera pestaña de la definición, donde elegiremos una tarea llamada "Execute LN4 Code":



f) Rellenaremos todos los datos de la cuarta pestaña de la definición: 


Haz click en el campo de texto "Valor / Fuente" y pegaremos el siguiente código (link):




g) Rellenaremos todos los datos de la quinta pestaña de la definición, donde podremos indicar para que Sociedad se debe ejecutar este método (en mi caso sólo tengo una): 


h) Por último, inidicaremos en la sexta pestaña de la definición si deseamos, o no, estadísticas de la ejecución.  


Pulsaremos en "Finalizar" y PeopleNet nos avisará de la planificación de esta tarea


Ya está... espero que sea interesante.