jueves, 16 de enero de 2014

Abrir cliente de Navision desde Reporting Services

Crear un link en Reporting Services que nos abra nuestro cliente de navision en una pantalla determinada con unos filtros definidos se hace de la siguiente manera:
  1. En reporting, seleccionamos las propiedades del elemento que va a tener incrustado el link. 
  2.  
  3. En la direccion URL ponemos el link de la siguiente manera ="mi_link"
     
El link se escribe de la siguiente manera:
navision://client/run?
servername=MI_NOMBRE_SERVIDOR
&
database=MI_BASE_DE_DATOS
&
company=MI_EMPRESA
&
target=Form NUMERO_DE_FORM
&
view=SORTING(Field1)
WHERE(Field41=CONST(Rojo),
      Field40=CONST(Alto))
&
position=
&
servertype=MSSQL

La definición de los campos se hace poniendo Field+id del campo.
Si el cliente está abierto, abre un formulario nuevo con nuestra petición. Si no esta abierto, abre el cliente clásico y después el formulario deseado.

jueves, 9 de enero de 2014

Incrustar imagenes en un correo HTML

Se pueden mandar correos por smtp en navision utilizando la codeunit SMTP Mail y el objeto Automation 'Microsoft Navision Mail'.SmtpMessage que viene con la instalacion del navision clásico.
El cuerpo de los correos se puede mandar en html indicandolo en una de las propiedades que tiene el objeto. Si queremos enviar imágenes incrustadas dentro del mensaje en esta web tenemos la
explicacion de los requisitos necesarios para que nuestra imagen este bien formada.

Con esta otra web que convierte imagenes a base64, podemos convertir cualquiera de nuestras imágenes a texto html necesario.
Si agregamos el texto resultante al cuerpo de nuestro mensaje tendremos una imagen incrustada. Pero no vamos a dejar el post aqui, lo que yo propongo, consiste en guardar este resultado en un archivo de texto y leerlo cuando vayamos a utilizarlo para incorporarlo a nuesto correo.Es una de las opciones, tambien se puede guardar en un campo MEMO de la base de datos (Lo explicaremos en un próximo post) o simplemente ponerlo a piñon en una variable de texto.

Las variables:
Name DataType Subtype Length
btResultado BigText    
NombreFichero Text   1024
Fichero File    
ISLector InStream    
CuerpoHTML BigText    
Texto Text   1024
i Integer    

//Abrimos el fichero, lo recorremos y lo guardamos en un BigText
IF EXISTS(NombreFichero) THEN BEGIN
    IF Fichero.OPEN(NombreFichero) THEN BEGIN
       CLEAR(CuerpoHTML);
       Fichero.TEXTMODE := TRUE;
       Fichero.CREATEINSTREAM(ISLector);
       CuerpoHTML.READ(ISLector);
       i := 1;
       WHILE i <= CuerpoHTML.LENGTH DO BEGIN
          CuerpoHTML.GETSUBTEXT(Texto,i,MAXSTRLEN(Texto));
          i:=i+MAXSTRLEN(Texto);
          btResultado.ADDTEXT(Texto);
       END;
    END;
END;

jueves, 2 de enero de 2014

Error al ejecutar un Informe por limitacion de filas en el combobox

Con la actualización de seguridad MS11-100 de Microsoft, se limita el numero máximo de filas del parámetro de tipo combobox de Reporting Services a 1000. Si el parámetro contiene más de 1000 filas da un error la ejcución. Esto se soluciona especificando en los archivos de configuración de Reporting Services el número de registros.
Dentro de la carpeta ReportService y dentro de ReportManager en los archivos web.config hay que añadir lo siguiente:
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="30000" />
<add key="aspnet:MaxJsonDeserializerMembers" value="30000" />
</appSettings>
Todo esto se añade justamente detrás del tag <system.web> y si ya existe el tag <appSettings> ponemos nuestras dos líneas dentro.
Es decir, quedaría así;
</system.web>
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="30000" />
<add key="aspnet:MaxJsonDeserializerMembers" value="30000" />
</appSettings>

jueves, 26 de diciembre de 2013

Zona Horaria en Navision WEB Service

Trabajando con los campos de tipo time desde los webservices se da el caso que la hora no se graba correctamente. Esto es por la configuracion del archivo CustomSettings.config del servidor de Web Service.
No voy a hacer una entrada detallada porque esta todo perfectamente explicado en este blog. Solamente saber, que para evitarnos quebraderos de cabeza, poner que la hora de los web services es la misma del servidor con la siguiente entrada:
<add key="WebServicesDefaultTimeZone" value="Server Time Zone"></add>

jueves, 19 de diciembre de 2013

Añadir el modo de autenticacion básico a nuestro Servidor de Informes

Recientemente he estado trabajando en un proyecto que consistia en crear una pagina web en php y javascript que mediante ajax consumia servicios web de Navision. Surgía la necesidad de consumir web service de Reporting Service desde php para integrar los informes dentro de la web. No vamos a explicar como se hace en este post porque esta todo en este link .
Lo que si vamos a explicar es como añadir el modo de autenticacion básico a nuestro servidor de informes para que funcione los objetos de php.
En la carpeta de instalación de Reporting Services que esta en :
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer
Hay un archivo llamado rsreportserver.config. Dentro del tag AuthenticationTypes añadir lo siguiente:

Recordad que primero hay que parar los servicios del servidor de informes porque si no no dehjará modificar el fichero.

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, 4 de diciembre de 2013

Pasar un valor MultiValue por URL a Reporting Services

Para pasar un valor múltiple a Reporting Services por URL se hace de la siguiente manera:
&Parametro_Mio=Valor1&Parametro_Mio=Valor2&Parametro_Mio=Valor3