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:

miércoles, 13 de noviembre de 2013

Habilitar errores remotos en Reporting Services desde Management Studio

Para habilitar los errores remotos desde Management Studio hay que seguir los siguientes pasos:
Desde la consola del Management Studio darle a Conectar- Reporting Services:
 
 
Seleccionar el servidor de informes:

 
 
Boton de la derecha sobre la conexión y seleccionar Propiedades:

 
En Avanzadas seleccionar EnableRemoteErrors y poner el valor a True:

jueves, 7 de noviembre de 2013

Formatear campo entero como HH:MM:SS en Reporting Services

Operar con campos en formato tiempo puede ser un poco engorroso.
Para transformar un campo entero (Que puede ser el resultado de una resta entre fechas por ejemplo) en un formato HH:MM:SS se hace de la siguiente forma:
=Format(DateAdd("s", Fields!TIEMPO_EN_SEGUNDOS.Value, "00:00:00"), "HH:mm:ss")