Dec
19

gacutil.exe en 64-bits

En una maquina de 64-bits, el gacutil.exe se encuentra en la ruta:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64

Este ejecutable se puede copiar en otra carpeta y para que funcione correctamente es necesario copiar los archivos resaltados a continuación

clip_image001

El gacutil.exe y gacutil.exe.config, se encuentran en la carpeta C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64 y la dll gacutlrc, se encuentra en la carpeta C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\1033.

Para instalar o desinstalar un assembly del GAC se deben seguir los siguientes pasos:

- Abrir una ventana de comandos como administrador

- Ingresar a la ruta donde se encuentra el gacutil.exe

- Para instalar se debe utilizar el comando gacutil.exe /i ruta/nombre.dll

clip_image002

- Para desinstalar se debe utilizar el comando gacutil.exe /u NombreAssembly

clip_image003

Para validar si un assembly quedo bien instalado, se debe ingresar a la ruta del GAC de 64-bits: C:\Windows\Microsoft.NET\assembly\GAC_MSIL

clip_image005

Nov
08

BizTalk ESB – Error 115004 en el send port ALL.Exceptions de la aplicación BizTalk Microsoft.Practices.ESB

El Send Port ALL.Exceptions utiliza el pipeline ESBFaultProcessor, este pipeline está compuesto por varios componentes pipeline, entre estos el ESB.Exceptions.Encoder, el cual serializa todas las propiedades del mensaje de error en un mensaje XML.

clip_image002

El pipeline ESBFaultProcessor utiliza el método ExceptionMgmt.IsExceptionSerializable(), de tal manera que cuando una excepción contiene excepciones internas no serializables a más de un nivel de profundidad, El método ExceptionMgmt.IsExceptionSerializable() comprueba que sólo la excepción de la raíz sea serializable, y como resultado, el ESBFaultProcessor falla. Cuando se presenta este caso los mensajes del puerto ALL.Exceptions de la aplicación BizTalk Microsoft.Practices.ESB quedan en estado suspended (resumable), esto se puede visualizar en la consola de administración de BizTalk

clip_image004

Al hacer doble clic en la instancia suspendida del puerto ALL.Exceptions, se puede visualizar el error 115004

clip_image005

Para solucionar este inconveniente se debe crear la clase propuesta por Thomas F. Abraham http://www.tfabraham.com/blog/2010/07/fix-for-biztalk-esb-toolkit-2-0-error-115004-in-all-exceptions-send-port/

A continuación un ejemplo del uso de la clase en una orquestación, que genera una excepción no serializable cuando un cliente se encuentra inactivo.

Para reproducir el error se creó una excepción personalizada (BusinessException), la cual no se puede serializar.

clip_image006

Luego se crea en la orquestación una excepción del tipo BusinessException

clip_image008

Posteriormente se realiza una validación en la orquestación con el fin de lanzar la excepción del tipo BusinessException

clip_image009

El contenido de Lanzar Excepción, es el siguiente:

clip_image011

Para realizar las pruebas de esta aplicación se copia un archivo con la información del cliente en un directorio, cuando el estado del cliente es diferente de 1 se genera una excepción de cliente invalido, la cual no se puede registrar en la base de datos de excepciones del esb, debido a que se produce el error 115004.

clip_image013

Finalmente para lograr que la excepción quede registrada en la base de datos de excepciones del ESB, se debe invocar el método FixNonSerializableExceptionInFaultMsg (propuesto por Thomas F. Abraham) en la construcción del mensaje de Falla en el bloque de excepciones de la orquestación

clip_image014

clip_image016

Y ahora si la excepción quedara registrada en la base de datos de excepciones del ESB y se podrá visualizar en el portal del ESB.

clip_image018

Descarga el código del ejemplo y cópialo en la carpeta C:\Projects

El código esta en BizTalk Server 2010

iTSynergy.ESB.SerializableException

1. Hacer doble clic en la solución iTSynergy.ESB.SerializableException.sln

2. Compilar el proyecto iTSynergy.ESB.SerializableException.Helper

3. Hacer deploy del proyecto iTSynergy.ESB.SerializableException

4. Ingresar a la consola de administración de BizTalk e importar el archivo de bindings (iTSynergy.ESB.SerializableExceptionBindings) en la aplicación iTSynergy.ESB.SerializableException

5. Para realizar las pruebas ingresar a la carpeta Process y copia el archivo ClienteInvalido.xml en la carpeta IN.

Oct
20

Tablas Pivote en Tiempo Real (BAM)

Cuando se crean vistas para las actividades de BAM, se debe tomar la decisión para determinar si la actualización de la vista se debe realizar o no en tiempo real.

Cuando la actualización de la vista se realiza en tiempo real, siempre que se inserta un registro en la tabla creada para la actividad en la base de datos BAMPrimaryImport, se dispara un trigger que calcula los nuevos valores de cada agregación. Esto puede afectar el performance cuando el volumen de los datos que se deben capturar es grande.

Cuando la actualización de la vista no es en tiempo real, al hacer Deploy de la actividad y la vista en BAM, se crean en la base de datos BAMAnalysis de Analysis Services, los cubos que contienen las agregaciones. Para reconstruir el cubo se debe programar un job para que cada cierto intervalo de tiempo se actualice. Esta alternativa se recomienda cuando el volumen de los datos que se deben capturar es grande.

Para activar la actualización en tiempo real en Excel 2010, Hacer clic en la tabla pivote y posteriormente en el botón (Mark the selected pivot table as Real Time Aggregation) indicado en la siguiente figura:

clip_image001

 

Para desactivar la actualización en tiempo real, se debe hacer clic nuevamente en el botón (Unmark the selected pivot table as Real Time Aggregation) indicado en la figura:

 

clip_image003

 

Referencias: Pro Business Activity Monitoring in BizTalk 2009 – Jeff Sanders and Geoff Snowman

Oct
20

Habilitar el complemento de BAM en la barra de menús de Excel 2010

1. Ingresar a Microsoft Excel 2010

2. Hacer clic en el menú File y seleccionar Options

3. En el panel de la derecha hacer clic en la opción Add-Ins y luego en el botón Go…

clip_image002

4. Seleccionar la opción Business Activity Monitoring

clip_image004

Si esta opción no se encuentra en la lista, hacer clic en el botón Browse… y buscar el archivo BAM.xla en cualquiera de las siguientes rutas:

C:\Program Files (x86)\Microsoft Office\Office14\Library

C:\Program Files (x86)\Microsoft BizTalk Server 2010\ExcelDir

5. Verificar que en la ventana de Excel se encuentre habilitado el menú Add-Ins

clip_image006

Mar
02

Mapping the response from the Oracle database Adapter (weak REF CURSOR – GenRecordRow – GenRecordColumns)

Al importar los esquemas de un procedimiento almacenado que retorna un weak ref cursor, el adaptador de Oracle genera un esquema “genrecordrow” y “genrecordcolumns, en lugar de un conjunto de resultados con tipo. Este tipo de mensajes son muy complejos de manejar, por lo cual se requiere realizar una transformación que permita identificar la información retornada por el ref-cursor directamente.

Para realizar la transformación del mensaje existen diferentes opciones, a continuación un ejemplo donde se hace uso de los functoids Iteration, Record Count, Scripting y Less Than or Equal To.

En el ejemplo se utilizará el functoid Iteration para recorrer el conjunto de datos GenRecordRow, este conjunto se recorrerá hasta llegar a la posición del último registro, este valor se calculará con el functoid Record Count, posteriormente se utilizará el functoid Less Than or Equal To, para establecer la condición de las iteraciones, la cual debe ser menor o igual al total de filas o conjunto de datos GenRecordRow, finalmente se usará el functoid Scripting, para realizar la transformación de los datos a través de XSLT.

XML de entrada: Corresponde a la información retornada en el ref cursor

image

1. Crear el esquema empleados:

clip_image003

2. Crear el mapa para realizar la transformación de la estructura genérica al esquema de empleados:

clip_image004

3. Adicionar al mapa los functoids Iteration y Record Count, para recorrer y contar las filas genrecordrow.

clip_image005

4. Adicionar al mapa el functoid Less Than or Equal To, para establecer el limite o total de iteraciones. El functoid Iteration retorna el índice de la iteración y el functoid Record Count el total de registros GenRecordRow, donde estas dos salidas deben ser las entradas de la condición: Indice actual <= total de registros.

clip_image006

5. Adicionar al mapa el functoid Scripting, el cual debe recibir como parámetro el índice de la iteración, para consultar solamente las columnas correspondientes a la fila del índice recibido.

clip_image007

6. Configurar el Scripting, utilizando el tipo de Script Inline XSLT Call Template, para realizar la transformación al esquema destino.

clip_image009

7. Finalmente probar el mapa, y verificar que el XML de salida sea el correcto:

clip_image011

Jan
27

Looping, Scripting and global Variables in Maps

El siguiente ejemplo muestra el uso de los controles looping y scripting, para transformar un archivo XML que contiene la información de los empleados de una empresa, ordenados por el departamento al que pertenecen, en un archivo XML que contenga la información de los departamentos de la empresa, con sus empleados.

Archivo XML Origen:

clip_image002_thumb8

Archivo XML Destino:

clip_image004_thumb1

1. Crear los esquemas Empleados y Departamentos:

* Al crear los esquemas tener en cuenta que los nodos Departamento y Empleado deben tener las propiedades minOccurs en 1 y maxOccurs en unbounded o *, para que puedan tener como mínimo una repetición e infinitas repeticiones.

image_thumb3

2. Crear el mapa para realizar la transformación de empleados a departamentos (Empleados_To_Departamentos):

clip_image007_thumb3

3. Agregar al mapa Empleados_To_Departamentos, un control Scripting, para definir la variable global Código de Departamento, la cual se utilizará para identificar los departamentos de la empresa agregados al esquema destino (Departamentos).

clip_image008_thumb2

4. Hacer doble clic en el scripting adicionado en el paso anterior, para configurarlo:

* Definir un parámetro de entrada con un valor nulo por defecto (Solo se debe definir una entrada, porque solo se va a declarar una variable global).

clip_image009_thumb1

* Hacer clic en la ficha Script Functoid Configuration, para definir la variable global y las operaciones para Modificar y Consultar el valor de la variable global.

clip_image010_thumb2

5. Agregar al mapa Empleados_To_Departamentos, un control Looping, para recorrer los registros de los empleados del esquema origen.

clip_image011_thumb2

6. Agregar al mapa Empleados_To_Departamentos, un segundo control Scripting, para obtener el valor de la variable global _CodigoDepto. Este nuevo control se debe configurar de la siguiente manera:

* No debe tener parámetros de entrada

* Hacer clic en la ficha Script Functoid Configuration, para escribir el código que permite obtener el valor asignado a la variable global _CodigoDepto

clip_image012_thumb3

7. Agregar al mapa Empleados_To_Departamentos, el control lógico Not Equal, el cual debe tener como entradas la salida del segundo scripting (Valor de la variable global _CodigoDepto) y el código del departamento, con el fin de validar que estos valores sean diferentes, para poder incluir el departamento en el esquema destino.

clip_image013_thumb3

8. Agregar el control Value Mapping, el cual debe tener como entradas, la salida del control lógico y el código del departamento, para que solo cuando la condición se cumpla se agregue la información del departamento al esquema destino.

clip_image015_thumb2

9. Hacer un enlace entre el Departamento del esquema origen y el Nombre del esquema destino.

clip_image016_thumb2

10. Agregar un tercer control scripting para actualizar el valor de la variable global _CodigoDepto por el valor del código del departamento que se encuentra en el ciclo.

clip_image017_thumb1

11. Configurar el tercer scripting, para que reciba como parámetro de entrada el código del departamento, cuando la condición lógica se haya cumplido.

clip_image018_thumb2

* Hacer clic en la ficha Script Functoid Configuration del tercer scripting, para escribir el código que permita actualizar el valor de la variable global _CodigoDepto.

clip_image019_thumb2

12. Agregar un cuarto control scripting, para escribir el ciclo que permitirá obtener la información de los empleados correspondientes a un departamento y ubicarlos en el esquema destino. Este scripting debe recibir como parámetro el código del departamento que se encuentra en el ciclo y retornar la información de los empleados del departamento.

clip_image021_thumb2

* Hacer clic en la ficha Script Functoid Configuration del cuarto scripting, para escribir el código que permita obtener los empleados de un departamento.

clip_image022_thumb2

Finalmente el mapa esta listo para las pruebas.

Dec
26

Welcome to iT Synergy Blog