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

sábado, 24 de diciembre de 2016

Error al exportar Excel desde Navision

Cuando pinchas en el icono de exportar a Excel, si no tienes la librería de Microsoft msxm.dll para parsear XML da el siguiente error
 



 
 
Aunque tengas instalado el office, es posible que no tengas estos componentes que permiten la integración de Excel.
Lo único que hay que hacer es instalar las siguientes librerías: 

miércoles, 25 de noviembre de 2015

Desactivar el Zoom en un formulario

Cuando creamos un formulario elegimos que campos son los que el usuario ve en pantalla. Mediante el Ctrl+F8 puede hacer un zoom y ver la totalidad de los campos del registro.
Si nos encontramos en la situación de que tenemos un campo cuyo valor no queremos que el usuario pueda ver, no disponemos de ningún método a priori sencillo en el formulario para evitarlo.

Se pude desactivar para un usuario concreto el Zoom con el rol object - 5330 Tools, Zoom. Pero esto lo desactiva en todas las pantallas y queremos desactivarla en una pantalla concreta.

Para  estos casos, lo que se puede hacer es que en la tabla que contiene el campo con la información sensible se añade en el CaptionClass lo siguiente: '99999,2000000002'

Luego se va a la CodeUnit1 y en la función CaptionClassTranslate se añade lo siguiente:
Una opción nueva donde el CASE es el número del captionclass (En este caso el 99999):

CommaPosition := STRPOS(CaptionExpr,',');
IF (CommaPosition > 0) THEN BEGIN
  CaptionArea := COPYSTR(CaptionExpr,1,CommaPosition - 1);
  CaptionRef := COPYSTR(CaptionExpr,CommaPosition + 1);
  CASE CaptionArea OF
    '1' : EXIT(DimCaptionClassTranslate(Language,CaptionRef));
    '2' : EXIT(VATCaptionClassTranslate(Language,CaptionRef));
    '99999' : ERROR('');//<---------Desactivo el ZOOM
  END;
END;
EXIT('');

martes, 25 de agosto de 2015

Renderizar Informes desde NAvision mediante XMLHTTP sin cache

Para llamar a un informe de Reporting (O cualquier página web) utilizamos el Automation XMLHTTP.
Capturamos la respuesta y generamos un pdf (En el caso de Reporting). El problema viene que XMLHTTP guarda en cache  la petición por lo que puede darse el caso que no renderice el informe con los últimos datos.
Para forzarlo añadimos en la cabecera la opción Cache-Control:no-cache.
Quedaría así:

NameDataTypeSubtype
XMLHTTPAutomation'Microsoft XML, v3.0'.XMLHTTP
isArchivoRecibidoInStream
osEscribeArchivoRecibidoOutStream
vRespuestaVariant


CREATE(XMLHTTP);
XMLHTTP.open('GET','Mi_Ruta_Informe_Reporting',FALSE);
XMLHTTP.setRequestHeader('Content-Type','application/pdf');
XMLHTTP.setRequestHeader('Cache-Control', 'no-cache');
XMLHTTP.send();
IF (XMLHTTP.status = 200) THEN BEGIN  CLEAR(vRespuesta);
  vRespuesta := XMLHTTP.responseStream;
  isArchivoRecibido := vRespuesta;
 

  F.CREATE('c:\mifichero.pdf');
  F.CREATEOUTSTREAM(osEscribeArchivoRecibido);
  COPYSTREAM(osEscribeArchivoRecibido,isArchivoRecibido);
  F.CLOSE;

END;
CLEAR(XMLHTTP);

martes, 14 de abril de 2015

Quitar tabulaciones, intros y demás de las casillas de texto en Navision

Cuando copiamos una casilla de excell que contiene un valor para pegarla en una casilla de Navision nos añade el retorno de carro que debemos quitar a mano (Si nos damos cuenta).

Se puede poner un pequeño código para que estos caracteres los elimine de manera automática. PAra eso hay que hacer:
CodeUnit 1 dentro de la función MakeText poner nada más comenzar lo siguiente:
myChr = Char;
//Eliminados caracteres raros del Excel en todas las ediciones.
myChr:=13;  //CR
Text := DELCHR(Text,'=',FORMAT(myChr));
myChr:=10;  //LF
Text := DELCHR(Text,'=',FORMAT(myChr));
myChr:=9;   //TAB
Text := CONVERTSTR(Text,FORMAT(myChr),' ');
myChr:=255; //???
Text := CONVERTSTR(Text,FORMAT(myChr),' ');

jueves, 19 de febrero de 2015

Selector de Carpetas en Navision

Este post lo he copiado de mibuso pero tenia que ponerlo aquí para que veáis que sencillo es:

Name                DataType        Subtype Length
ShellControl     Automation      'Microsoft Shell Controls And Automation'.Shell
Folder               Automation      'Microsoft Shell Controls And Automation'.Folder3
FolderItems      Automation      'Microsoft Shell Controls And Automation'.FolderItems3
FolderItem        Automation      'Microsoft Shell Controls And Automation'.FolderItem2


IF ISCLEAR(ShellControl) THEN
CREATE(ShellControl);
Folder := ShellControl.BrowseForFolder(0,'',0);
IF NOT ISCLEAR( Folder ) THEN BEGIN
 FolderItems := Folder.Items();
 FolderItem := FolderItems.Item;
 EXIT(FORMAT(FolderItem.Path));
END;
CLEAR( ShellControl );
CLEAR( Folder );
CLEAR( FolderItems );
CLEAR( FolderItem );
EXIT('');

miércoles, 18 de febrero de 2015

Manipular Ficheros físicos mediante Web Services

No se si alguna vez os ha surgido la necesidad de copiar o mover ficheros desde el cliente por roles o a través de Web Services.
Desde el cliente clásico funciona sin problemas, pero a la hora de hacerlo funcionar por Web Services surge el quebradero de cabeza.
Hay por ahí teorías que dan una posible solución que tiene que ver con que las funciones COPY,EXISTS,ERASE,etc.... no funcionan en la capa de WS.
Pero este no es el problema, el problema es que tenemos tres niveles en tres equipos. Es decir: que en nuestra arquitectura tenemos el cliente del Web Service (Capa 1), El Web Service en el servidor (Capa 2) y el servidor donde están los ficheros (Capa 3).
No se si habréis podido comprobar que si los ficheros a manipular están en el mismo servidor que donde tenemos instalada la capa de Web Service el problema desaparece. es más, es una de las recomendaciones que hace Microsoft para solucionar el problema.


La solución correcta consiste en Delegar servicios. Como ya he comentado, Microsoft recomienda que los archivos estén en el mismo servidor que la capa de Web Service para ahorrarte la enrevesada configuración de la Delegación.

miércoles, 17 de diciembre de 2014

Llamar a Web-Services de Navision desde Navision


PAra consumir los webservices de un servidor de Navision desde otro servidor de Navision tenemos que montar una petición httpRequest pasándole un XML bien formado y recuperar la respuesta para saber que es lo que ha ocurrido en el servidor de destino.

Para ello primero declaramos las variables:
NameDataTypeSubtypeLength
XmlHttpRequest Automation'Microsoft XML, v4.0'.XMLHTTP 
XmlDocAutomation'Microsoft XML, v4.0'.DOMDocument 
XmlStringText 1024
BTSoapBigText  
BTValoresBigText    


Creamos un BigText y le añadimos la cabecera de la petición:

BTPasado.ADDTEXT('<?xml version="1.0" encoding="utf-8"?>');
BTPasado.ADDTEXT('<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">');
BTPasado.ADDTEXT('<soap:Body>');
BTPasado.ADDTEXT(STRSUBSTNO('<%1 xmlns="urn:microsoft-dynamics-schemas/codeunit/%2">','MiFuncion','MiCodeUnit'));

BTValores.ADDTEXT('<nombre_parametro_que_espera_MiCodeunit_MiFuncion>');
BTValores.ADDTEXT('MI-VALOR');
BTValores.ADDTEXT('</nombre_parametro_que_espera_MiCodeunit_MiFuncion>');

BTPasado.ADDTEXT(STRSUBSTNO('</%1>','MiFuncion'));

BTPasado.ADDTEXT('</soap:Body>');
BTPasado.ADDTEXT('</soap:Envelope>');


Como veis es bien sencillo montar la petición de nuestro httprequest.
Ahora hacemos la llamada:

NameDataType         Subtype

XmlDocPasado              Automation'Microsoft XML, v4.0'.DOMDocument

IF (ISCLEAR(XmlHttpRequest)) THEN
  CREATE(XmlHttpRequest);

XmlHttpRequest.open('POST','http://servidor:7047/DynamicsNAV/WS/empresa/Codeunit/MiCodeunit',FALSE,'DOMINIO\usuario','password');
XmlHttpRequest.setRequestHeader('Host', 'localhost');
XmlHttpRequest.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
XmlHttpRequest.setRequestHeader('Content-Length', FORMAT(BTPasado.LENGTH));
XmlHttpRequest.setRequestHeader('SOAPAction','MiFuncion');
XmlHttpRequest.send(BTPasado);
XmlDocPasado := XmlHttpRequest.responseXML;


Con esto obtendríamos en XmlDocPasado un XML con el resultado.

jueves, 27 de febrero de 2014

Pasar BigText a XML en Navision

¡La de problemas que me he encontrado para trabajar con los BigText en Navision!.
Su manejo no es intuitivo y se necesita de un poco de conocimiento previo a la hora de utilizarlo.
En particular, mi necesidad de las variables del tipo BigText surgen en un proyecto en el que desde un servidor de navision consumia los web services de otro servidor de Navision. En futuros posts comentare los pormenores de este proyecto, pero el post actual es para comentar uno de los quebraderos de cabeza que mas amargado me ha tenido.
En un determinado momento y por necesidades varias, me veo en el plan de transformar un BigText a XML. Sencillo, ¿No? aqui por ejemplo hay una solucion para leer bigtext y pasarlo a XML.
Pues bien, así utilice mi variable BigText, poniendo FORMAT() para que me leyese el contenido y en principio me funciono estupendamente.
Pero no podia ser tan bonito, si leemos la definicion de la funcion format vemos que indica que es para variables de tipo simple ysi leemos la definicion del tipo de datos BIGTEXT vemos que es compleja. Por lo que en teoria no deberia de funcionar, pero funciona!!!.
ERROR!!!!!!!!
No funciona!!!!!!!!!!
Bueno, para ser correctos, funciona cuando el BigText no contiene muchos caracteres, el error que da es el de Excedido el tamaño del bufer.

Por lo que la única solución correcta es la de utilizar InStream y OutStream.
Por lo que en realidad se deberia hacer así:
XmlDocPasado.async := FALSE;
TempBlob.HTML.CREATEOUTSTREAM(ostream);
BTPasado.WRITE(ostream);
TempBlob.CALCFIELDS(HTML);
TempBlob.HTML.CREATEINSTREAM(istream);
XmlDocPasado.load(istream);

Ocurre exactamento lo mismo con la variable Automation 'Navision Attain Hash 1.0'.BSTRConverter y su metodo BSTR. PArece que con este metodo nos va a devolver un bonito chorro de carácteres para pasar a nuesto XML y idem de idem, Excedido el tamaño del bufer.

jueves, 6 de febrero de 2014

Cambiar los captions de un formulario de Navision en tiempo de ejecucion

Para poder cambiar los captions de un formulario, utilizaremos la propiedad CaptionClass del campo.
En el formulario seleccionamos el campo que deseamos cambiar el caption.

 
En las propiedades seleccionamos CaptionClass y ponemos '1,1,,' + NuestroCaption.
 
 
NuestroCaption puede ser perfectamente un parámetro que cambiemos en el openform por ejemplo, o una funcion como en el ejemplo anterior.
El CaptionClass utiliza de la Codeunit 1 la funcion DimCaptionClassTranslate

jueves, 30 de enero de 2014

Campos MEMO en Navision

En este post vamos a ver un ejemplo de como crear un campo memo y grabar y leer datos en este campo.
Lo primero que hay que hacer, es definir un campo de tipo BLOB y luego, en propiedades seleccionar el SubTipo MEMO.



 
 
Para grabar hariamos lo siguiente:
 
Var Name  DataType Length
Memo  BigText  
Texto  Text  1024
i  integer  
ISLector  InStream  
OSEscritor  OutStream  
 
//ESCRIBIR
Memo.ADDTEXT('Mi texto');
Memo.ADDTEXT('Mas');
...
MiTabla.CuerpoLargo.CREATEOUTSTREAM(OSEscritor);
Memo.WRITE(OSEscritor);
MiTabla.INSERT

//LEER
CLEAR(Memo);
MiTabla.CALCFIELDS(CuerpoLargo);
MiTabla.CuerpoLargo.CREATEINSTREAM(ISLector);
Memo.READ(ISLector);
i := 1;
WHILE i <= Memo.LENGTH DO BEGIN
      Memo.GETSUBTEXT(Texto,i,MAXSTRLEN(Texto));
      i:=i+MAXSTRLEN(Texto);
      MESSAGE('%1',Texto);
END;

jueves, 23 de enero de 2014

Instalar los WEB SERVICES de Navision en un servidor

En este post explicaremos como instalar el servicio de Navision de la capa de Web Services.
Ejecutamos el instalador de la carpeta del CD ServiceTier/Microsoft Dynamics Nav Service.msi
y seguimos los pasos.

Una vez instalado, en los 2 servicios de windows creados poner un usuario y contraseña que tenga permisos y roles en navision. Por lo que ponemos un usuario que sea super.

Hay que tener en cuenta,para los que vais a acceder desde php, que por defecto viene la autenticación NTLM desactivada. Es necesario que este activada para acceder con php.
Para activarla, buscamos el archivo CustomSeting.config que suele estar en
C:\Program Files (x86)\Microsoft Dynamics NAV\60\Service\CustomSeting.config y en la entrada <add key="WebServicesUseNTLMAuthentication" value="false"></add> le ponemos true.

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, 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>

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.

jueves, 26 de septiembre de 2013

Convertir filtro de navision a SQL

Navegando por en este blog encontre una funcion de SQL para convertir un filtro de navision en una clausula where de SQL. He modificado la funcion para que tenga en cuenta los condicionantes "| ". La cuelgo a continuacion:
ALTER FUNCTION [dbo].[CONVERT_NAV_FILTER]

(

-- Add the parameters for the function here

@parFieldName VARCHAR(MAX),

@parFilter VARCHAR(MAX)

)

RETURNS VARCHAR(MAX)

AS

BEGIN



DECLARE
@CurrentStringPOSPoints INT

DECLARE @CurrentStringPOSPipe INT

DECLARE @CurrentStringPOSAmp INT

DECLARE @CurrentStringPOSAt INT

DECLARE @CurrentStringPOSNot INT

DECLARE @CurrentStringPOSHaakOpen iNT

DECLARE @CurrentStringPOSHaaksluit int

DECLARE @CurrentStringPOSStar int

DECLARE @From VARCHAR(MAX)

DECLARE @To VARCHAR(MAX)

Declare @IndexToRead INT

Declare @ObjectToRead INT

Declare @IndexRead INT

Declare @ObjectRead INT

DECLARE @NextIndexToRead INT

Declare @NextObjectToRead INT

DECLARE @FirstRun INT

DECLARE @ReturnValue VARCHAR(MAX)

SET @ReturnValue = ''

SET @IndexToRead = 0

SET @CurrentStringPOSPoints = 0

SET @CurrentStringPOSPipe = 0

SET @CurrentStringPOSAmp = 0

SET @CurrentStringPOSAt = 0

SET @CurrentStringPOSNot = 0

SET @CurrentStringPOSHaakOpen = 0

SET @CurrentStringPOSHaaksluit = 0

SET @ObjectToRead = 0

SET @IndexRead = 0

SET @FirstRun = 1

WHILE 1 = 1

BEGIN

SET
@NextIndexToRead = LEN(@parFilter)

SET @IndexToRead = LEN(@parFilter)

SET @ObjectToRead = 0

SET @NextObjectToRead = 0

--Find the index to read

IF @IndexToRead >= Charindex('..', @parFilter, @IndexRead + 1) and (Charindex('..', @parFilter, @IndexRead + 1) > 0)

BEGIN

SET @IndexToRead = Charindex('..', @parFilter, @IndexRead+1)

SET @ObjectToRead = 1

END

IF @IndexToRead >= Charindex('', @parFilter, @IndexRead + 1) and (Charindex('', @parFilter, @IndexRead + 1) > 0)

BEGIN

SET @IndexToRead = Charindex('', @parFilter, @IndexRead+1)

SET @ObjectToRead = 2

END

IF @IndexToRead >= Charindex('&', @parFilter, @IndexRead + 1) and (Charindex('&', @parFilter, @IndexRead + 1) > 0)

BEGIN

SET @IndexToRead = Charindex('&', @parFilter, @IndexRead+1)

SET @ObjectToRead = 3

END



IF @IndexToRead >= Charindex('|', @parFilter, @IndexRead + 1) and (Charindex('|', @parFilter, @IndexRead + 1) > 0)

BEGIN

SET @IndexToRead = Charindex('|', @parFilter, @IndexRead+1)

SET @ObjectToRead = 30

END



IF @IndexToRead >= Charindex('<>', @parFilter, @IndexRead + 1) and (Charindex('<>', @parFilter, @IndexRead + 1) > 0)

BEGIN

SET @IndexToRead = Charindex('<>', @parFilter, @IndexRead+1)

SET @ObjectToRead = 5

END

IF @IndexToRead >= Charindex('(', @parFilter, @IndexRead + 1) and (Charindex('(', @parFilter, @IndexRead + 1) > 0)

BEGIN

SET @IndexToRead = Charindex('(', @parFilter, @IndexRead +1)

SET @ObjectToRead = 6

END

IF @IndexToRead >= Charindex(')', @parFilter, @IndexRead + 1) and (Charindex(')', @parFilter, @IndexRead + 1) > 0)

BEGIN

SET @IndexToRead = Charindex(')', @parFilter, @IndexRead +1)

SET @ObjectToRead = 7

END

-- Find the next index to read

IF @NextIndexToRead >= Charindex('..', @parFilter, @IndexToRead + 1) and (Charindex('..', @parFilter, @IndexToRead + 1) > 0)

BEGIN

SET @NextIndexToRead = Charindex('..', @parFilter, @IndexToRead+1)

SET @NextObjectToRead = 1

END

IF @NextIndexToRead >= Charindex('', @parFilter, @IndexToRead + 1) and (Charindex('', @parFilter, @IndexToRead + 1) > 0)

BEGIN

SET @NextIndexToRead = Charindex('', @parFilter, @IndexToRead+1)

SET @NextObjectToRead = 2

END

IF @NextIndexToRead >= Charindex('&', @parFilter, @IndexToRead + 1) and (Charindex('&', @parFilter, @IndexToRead + 1) > 0)

BEGIN

SET @NextIndexToRead = Charindex('&', @parFilter, @IndexToRead+1)

SET @NextObjectToRead = 3

END

IF @NextIndexToRead >= Charindex('|', @parFilter, @IndexToRead + 1) and (Charindex('|', @parFilter, @IndexToRead + 1) > 0)

BEGIN

SET @NextIndexToRead = Charindex('|', @parFilter, @IndexToRead+1)

SET @NextObjectToRead = 30

END



IF @NextIndexToRead >= Charindex('<>', @parFilter, @IndexToRead + 1) and (Charindex('<>', @parFilter, @IndexToRead + 1) > 0)

BEGIN

SET @NextIndexToRead = Charindex('<>', @parFilter, @IndexToRead+1)

SET @NextObjectToRead = 5

END

IF @NextIndexToRead >= Charindex('(', @parFilter, @IndexToRead + 1) and (Charindex('(', @parFilter, @IndexToRead + 1) > 0)

BEGIN

SET @NextIndexToRead = Charindex('(', @parFilter, @IndexToRead+1)

SET @NextObjectToRead = 6

END

IF @NextIndexToRead >= Charindex(')', @parFilter, @IndexToRead + 1) and (Charindex(')', @parFilter, @IndexToRead + 1) > 0)

BEGIN

SET @NextIndexToRead = Charindex(')', @parFilter, @IndexToRead+1)

SET @NextObjectToRead = 7

END

-- *********************************************

-- Checks Complete start converting

-- *********************************************



-- If this is the first time the conversion is done and there is a or & sign,

-- Set a filter on the first part

IF @FirstRun = 1 and @IndexToRead > 1

BEGIN

IF @ObjectToRead = 2 --

BEGIN

SET @From = Substring(@parFilter, 1, @IndexToRead - 1)

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%'), '@', '')) + ''') OR '

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''') OR '

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''') OR '

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''') OR '

END

IF @ObjectToRead = 3 -- &

BEGIN

SET @From = Substring(@parFilter, 1, @IndexToRead - 1)

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%'), '@', '')) + ''') AND '

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''') AND '

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''') AND '

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''') AND '

END

IF @ObjectToRead = 30 -- |

BEGIN

SET @From = Substring(@parFilter, 1, @IndexToRead - 1)

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%'), '@', '')) + ''') OR '

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''') OR '

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''') OR '

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''') OR '

END

END

SET @FirstRun = 0

IF @ObjectToRead = 1 -- 1 = ..

BEGIN

SET @From = Substring(@parFilter, @IndexRead + 1, @IndexToRead - (@IndexRead + 1))

IF @nextobjecttoread = 0

SET @To = substring(@parFilter, @IndexToRead + 2 , @NextIndexToRead -(@IndexToRead + 1))

else

SET @To = substring(@parFilter, @IndexToRead + 2 , @NextIndexToRead -(@IndexToRead + 2))

if charindex('@', @From, 0) > 0 or charindex('@', @To, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') BETWEEN ''' + lower(replace(@From, '@', '')) + ''' AND ''' + lower(replace(@To,'@','')) + ''')'

ELSE

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' BETWEEN ''' + @From + ''' AND ''' + @To + ''')'

IF @NextObjectToRead = 2 --

SET @ReturnValue = @ReturnValue + ' OR '

IF @NextObjectToRead = 3 -- &

SET @ReturnValue = @ReturnValue + ' AND '



IF @NextObjectToRead = 30 -- &

SET @ReturnValue = @ReturnValue + ' OR '

END

IF @ObjectToRead = 2 -- 2 =

BEGIN

IF @NextObjectToRead <> 6 and @NextObjectToRead <> 5 and @NextObjectToRead <> 1

BEGIN

if @NextObjectToRead = 0

SET @From = substring(@parFilter, @IndexToRead + 1, @NextIndexToRead - @IndexToRead)

else

SET @From = substring(@parFilter, @IndexToRead + 1, @NextIndexToRead - (@IndexToRead + 1))

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%'), '@', '')) + ''')'

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''')'

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''')'

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''')'

END

IF @NextObjectToRead = 2 --

SET @ReturnValue = @ReturnValue + ' OR '

IF @NextObjectToRead = 3 -- &

SET @ReturnValue = @ReturnValue + ' AND '



IF @NextObjectToRead = 30 -- &

SET @ReturnValue = @ReturnValue + ' OR '

END

IF @ObjectToRead = 3 -- 3 = &

BEGIN

IF @NextObjectToRead <> 6 and @NextObjectToRead <> 5 and @NextObjectToRead <> 1

BEGIN

if @NextObjectToRead = 0

SET @From = substring(@parFilter, @IndexToRead + 1, @NextIndexToRead - @IndexToRead)

else

SET @From = substring(@parFilter, @IndexToRead + 1, @NextIndexToRead - (@IndexToRead + 1))

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%') , '@', '')) + ''')'

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''')'

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''')'

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''')'

END

IF @NextObjectToRead = 2 --

SET @ReturnValue = @ReturnValue + ' OR '

IF @NextObjectToRead = 3 -- &

SET @ReturnValue = @ReturnValue + ' AND '



IF @NextObjectToRead = 30 -- &

SET @ReturnValue = @ReturnValue + ' OR '

END

IF @ObjectToRead = 30 -- 3 = &

BEGIN

IF @NextObjectToRead <> 6 and @NextObjectToRead <> 5 and @NextObjectToRead <> 1

BEGIN

if @NextObjectToRead = 0

SET @From = substring(@parFilter, @IndexToRead + 1, @NextIndexToRead - @IndexToRead)

else

SET @From = substring(@parFilter, @IndexToRead + 1, @NextIndexToRead - (@IndexToRead + 1))

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%') , '@', '')) + ''')'

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''')'

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''')'

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''')'

END

IF @NextObjectToRead = 2 --

SET @ReturnValue = @ReturnValue + ' OR '

IF @NextObjectToRead = 3 -- &

SET @ReturnValue = @ReturnValue + ' AND '



IF @NextObjectToRead = 30 -- &

SET @ReturnValue = @ReturnValue + ' OR '

END



IF @ObjectToRead = 4 -- 4 = @

BEGIN

SET @ReturnValue = @ReturnValue

END

IF @ObjectToRead = 5 -- 5 = <>

BEGIN

SET @ReturnValue = @ReturnValue + ' NOT '

SET @From = substring(@parFilter, @IndexToRead + 2, @NextIndexToRead - (@IndexToRead + 2))

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%'), '@', '')) + ''')'

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''')'

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''')'

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''')'

IF @NextObjectToRead = 2 --

SET @ReturnValue = @ReturnValue + ' OR '

IF @NextObjectToRead = 3 -- &

SET @ReturnValue = @ReturnValue + ' AND '

END

IF @ObjectToRead = 6 -- 6 = (

BEGIN

SET @ReturnValue = @ReturnValue + '('

SET @From = Substring(@parFilter, @IndexToRead + 1, @NextIndexToRead - (@IndexToRead +1))

IF @NextObjectToRead = 2 --

BEGIN

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%'), '@', '')) + ''') OR '

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''') OR '

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''') OR '

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''') OR '

END

IF @NextObjectToRead = 3 -- &

BEGIN

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%'), '@', '')) + ''') AND '

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''') AND '

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''') AND '

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''') AND '

ENd



IF @NextObjectToRead = 30 -- &

BEGIN

if charindex('@', @From, 0) > 0

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@From, '*', '%'), '@', '')) + ''') OR '

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@From, '@', '')) + ''') OR '

else

if charindex('*', @From, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@From, '*', '%') + ''') OR '

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @From + ''') OR '

ENd

END

IF @ObjectToRead = 7 -- 7 = )

BEGIN

SET @ReturnValue = @ReturnValue + ')'

IF @NextObjectToRead = 2 --

SET @ReturnValue = @ReturnValue + ' OR '

IF @NextObjectToRead = 3 -- &

SET @ReturnValue = @ReturnValue + ' AND '



IF @NextObjectToRead = 30 -- &

SET @ReturnValue = @ReturnValue + ' OR '

END

IF @ObjectToRead = 8 -- 8 = *

BEGIN

SET @ReturnValue = @ReturnValue

END

-- Nothing found? => BREAK loop

IF @IndexToRead = LEN(@parFilter)

BREAK

SET @ObjectRead = @ObjectToRead

SET @IndexRead = @IndexToRead

SET @IndexToRead = @NextIndexToRead

END -- LOOP

IF @ReturnValue = ''

BEGIN

if charindex('@', @parFilter, 0) > 0

if charindex('*', @parFilter, 0) > 0

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') LIKE ''' + lower(replace(replace(@parFilter, '*', '%'), '@', '')) + ''')'

else

SET @ReturnValue = @ReturnValue + '(lower(' + @parFieldName + ') = ''' + lower(replace(@parFilter, '@', '')) + ''')'

else

if charindex('*', @parFilter, 0) > 0

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' LIKE ''' + replace(@parFilter, '*', '%') + ''')'

else

SET @ReturnValue = @ReturnValue + '(' + @parFieldName + ' = ''' + @parFilter + ''')'

END

-- Return the result of the function

RETURN '(' + @ReturnValue + ')'

END