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

miércoles, 11 de diciembre de 2013

Obtener el texto de un option en Reporting Services y mediante WEB SERVICES

Una vez tenemos nuestro ensamblado con los web services en sql (Ver post
Consumir Web Services de Navision desde Reporting Services), vamos a utilizarlo para transformar los campos options en el valor de texto correspondiente. Para eso utilizamos una funcion en navision que le paso una tabla y un campo y nos devuelve una lista de las opciones separadas por coma.Me he creado una función llamada ObtenerWS que le paso un id y un texto.

El id 1 me devuelve los options de la tabla y el campo deseado (En el ejemplo Tabla 50045 campo 3).

Con la funcion StringSplit lo transformo en una tabla:
 

SELECT *

FROM StringSplit(([NAVSQL].[dbo].[ObtenerWS] (1,'50045|3')), ',', null)

 

El resultado del select anterior es este:


 

 
 
 
Esto lo pongo en un report como Dataset aparte.

Luego hago la consulta normal (A la Tabla 50045) en otro Dataset que me devuelve el campo option como integer. Para transformarlo al valor de texto en la casilla en vez de poner el campo option como integer, hay que poner lo siguiente:

=Lookup(Fields!Concepto.Value,Fields!ID.Value,Fields!NOMBRE.Value,"Concepto")

 

Donde:

Fields!Concepto.Value = El campo option en integer.

Fields!ID.Value = Al campo option en integer en el dataset de la lista de options

Fields!NOMBRE.Value = Al campo String que contiene la descripcion del option en el dataset de la lista de options

"Concepto" = El nombre del Dataset de apoyo.

Y listo. Asi solo llamas a los web services una vez (Para cargar la tabla de options) y no para cada uno de los resultados.

miércoles, 27 de noviembre de 2013

Consumir Web Services de Navision desde Reporting Services Parte 4

Puedes consultar las partes anteriores aquí:
parte 1 y parte 2 y parte 3
Una vez creado el ensamblado pegamos nuestras dlls compiladas (Explicado en post anteriores) en el servidor de SQL.

Entramos en el SQL Server Management Studio y modificamos la propiedad TRUSTWORTHY de la Base de Datos para indicarle que la instancia de SQL confíe en la base de datos y deje ejecutar nuestro ensamblado y no lo interprete como código malicioso:

ALTER DATABASE MI_BASE_DE_DATOS
SET TRUSTWORTHY ON

Ahora creamos nuestro ensamblado en la base de datos con la siguiente instrucción:

CREATE
ASSEMBLY CLRSP
FROM
'C:\CLRSP\CLRSP.dll'
--Dirección de nuestro ensamblado en el servidor
WITH
permission_set = EXTERNAL_ACCESS

Creamos el XML en la base de datos con la siguiente instrucción:
CREATE
ASSEMBLY [XmlSerializers]
FROM
'C:\CLRSP\CLRSP.XmlSerializers.dll'
--Dirección de nuestro ensamblado en el servidor
WITH
permission_set = EXTERNAL_ACCESS

Creamos la funcion que llama a nuestro ensamblado y que servira para utilizar en nuestras consultas SQL:

CREATE
FUNCTION [dbo].[ObtenerWS](@id int, @texto [nvarchar](MAX))
RETURNS
[nvarchar](MAX) WITH EXECUTE AS CALLER
AS
EXTERNAL
NAME [CLRSP].[UserDefinedFunctions].[GetWebServices]

Puede que de un error de id de usuario si el propietario de la base de datos no es el mismo que el propietario de la base de datos master. PAra esto, hay que ponerlo con la siguiente instrucción:
--PONER EL USUARIO PROPIETARIO IGUAL A SA
ALTER AUTHORIZATION ON DATABASE::NAVSQL TO sa;

miércoles, 20 de noviembre de 2013

Consumir Web Services de Navision desde Reporting Services Parte 3

Puedes consultar las partes anteriores aquí:
parte 1 y parte 2
Ahora hay que crear el ensamblado.
Desde Visual Studio 2010 creamos un nuevo proyecto, seleccionamos el framework que previamente hemos averiguado.
Creamos un proyecto nuevo de Base de Datos (SQL Server) de tipo Visual C# SQL CLR Database Proyect. Nos pedira los datos de la conexion de nuestra base de datos.

Creamos una funcion GetWebServices que devuelve un sql-string y a la que se le pasa us entero y un string. Los tipos de datos que utilizaremos como podeis ver son los compatibles con el CLR de Sql. Por lo que un string pasa a ser un tipo de dato sqlstring. y asi sucesivamente con todos los tipos de datos.


En una clase aparte creamos un metodo que devuelva los valores que obtenemos al llamar a los WS de navision. Creamos la clase a la que pasaremos un integer y un string y que devolvera el valor de nuestra funcion de navision.

Agregamos los Web Services, uno por empresa para mediante un arametro seleccionar la empresa que desamos consultar desde SQL en Navision. La ruta de nuestro wsdl es:
http://SERVIDOR:7047/INSTANCIA/WS/EMPRESA/Codeunit/InterfaceWS
o si no tiene instancia:
http://SERVIDOR:7047/WS/EMPRESA/Codeunit/InterfaceWS

En las propiedades del proyecto ponemos el GUI que previamente hemos generado con la herramienta que incorpora el visual studio y marcamos la aplicacion como ensamblado visible para COM.
Ponemos esto en postbuild "C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\sgen.exe" /force "$(TargetPath)"
No hay que olvidarse de los permisos que hay que darle al ensamblado para que posteriormente funcione. Como va a salir del ambito de SQL accediendo al servidor de navision, le daremos Permision Level=External.

 
Compilamos el proyecto y nos debe de haber generado la .dll y la XmlSerializers.dll dentro de bin:

jueves, 24 de octubre de 2013

Consumir Web Services de Navision desde Reporting Services parte 2

Puedes consultar las partes anteriores aquí:
parte 1
Lo siguiente que hay que hacer, es publicar el WEB service de Navision. Esto es muy sencillo realizarlo desde Navision y con unos sencillos pasos lo podemos completar.
Creamos primero nuestra CodeUnit llamada InterfaceWS:
 Creamos dentro de la CodeUnit una funcion llamada ConsultaExterna donde le pasamos un código y un texto (Por ejemplo):
 En la Tabla 2000000076 Web Service publicamos nuestra CodeUnit:
 Quedando tal que así:

En el próximo post crearemos la dll con Visual Studio 2010 para consumir este web service.

miércoles, 16 de octubre de 2013

Consumir Web Services de Navision desde Reporting Services


Algunas veces para realizar informes que muestren algún dato calculado de Navision, se da la enorme complejidad de cómo sacar el dato. Te planteas la necesidad de facilitar el trabajo a la hora de consultarlo. Mediante los WEB Services que expone Navision y el CLR que se integra en SQL podemos realizar informes en reporting services que consultan datos preparados por Navision.
La documentación es abundante sobre este tema, pero aquí pretendemos aglutinarla toda para tener un decálogo a seguir para crear-configurar y consumir los web services desde SQL.


Lo primero que hay que hacer es averiguar el FRAMEWORK que tenemos en nuestro servidor de SQL.
Para ello, ejecutamos la siguiente consulta:
--AVERIGUAR FRAMEWORK
select * from sys.dm_clr_properties
Una vez tenemos la versión del FRAMEWORK, hay que habilitar el servidor para que use la integración CLR. Por defecto, cuando se instala el SQL server, viene con esta opción deshabilitada, por lo que es casi seguro que tendrás que habilitarla:
--HABILITAR LA INTEGRACION CLR
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
Ahora indicaremos al servidor  que la instancia de SQL Server confía en la base de datos y en su contenido mediante TRUSTWORTHY
--PONER COMO QUE CONFIA
ALTER DATABASE miDataBase
SET TRUSTWORTHY ON


Con esto hemos preparado la Base de Datos para que pueda trabajar con CLR . En próximos posts veremos como crear la dll, anexar el ensamblado a sql y utilizar nuestro ensamblado.