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, 26 de diciembre de 2013
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.
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).
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
&Parametro_Mio=Valor1&Parametro_Mio=Valor2&Parametro_Mio=Valor3
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;
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.
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:
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")
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")
jueves, 31 de octubre de 2013
Crear un calendario en SQL
Para crear un calendario en sql que muestre todos los dias entre dos fechas he creado la siguiente funcion: CREATE
FUNCTION [dbo].[CALENDARIO]
(
-- Add the parameters for the function here
@fIni smalldatetime
,@fFin smalldatetime
)
RETURNS
@MyCalendario TABLE (FECHA smalldatetime)
BEGIN
DECLARE @d tinyint
SET @d = 0
WHILE @fIni <= @fFin
BEGIN
INSERT INTO @MyCalendario VALUES (@fIni)
SET @fIni = DATEADD(d, 1, @fIni)
END
RETURN
END
GO
Para hacer uso de ella es de la siguiente manera:
SELECT *FROM[dbo].[CALENDARIO] ('01/01/13','31/12/13') CALENDARIO
FUNCTION [dbo].[CALENDARIO]
(
-- Add the parameters for the function here
@fIni smalldatetime
,@fFin smalldatetime
)
RETURNS
@MyCalendario TABLE (FECHA smalldatetime)
BEGIN
DECLARE @d tinyint
SET @d = 0
WHILE @fIni <= @fFin
BEGIN
INSERT INTO @MyCalendario VALUES (@fIni)
SET @fIni = DATEADD(d, 1, @fIni)
END
RETURN
END
GO
Para hacer uso de ella es de la siguiente manera:
SELECT *FROM[dbo].[CALENDARIO] ('01/01/13','31/12/13') CALENDARIO
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.
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.
miércoles, 9 de octubre de 2013
Poner código HTML en una casilla de Reporting Services
Si queremos introducir por alguna necesidad código HTML en una casilla de valor de reporting services es muy sencillo y ampliamente documentado. Pero de manera tonta, no era capaz de seguir las instrucciones de la documentación para acceder al menú desde donde se puede.
Por eso, este post es una ayuda visual de como se hace por si alguien se ha sentido frustado intentando hacerlo cuando es muy sencillo.
Por eso, este post es una ayuda visual de como se hace por si alguien se ha sentido frustado intentando hacerlo cuando es muy sencillo.
Lo primero que hay que hacer es seleccionar la casilla:
Con la casilla seleccionada, seleccionar el texto que contiene (Esta es la parte clave que no conseguia hacer):
Con el texto seleccionado, boton de la derecha y seleccionamos Propiedades del marcador de posición:
En Tipo de Marcado seleccionamos la segunda opcion que es HTML: interpretar etiquetas HTML como estilos.
En Valor escribimos el código HTML. Por ejemplo, con el marcador <br> creamos un código que genera en una casilla una línea que pone PRIMERA LÍNEA y otra línea con SEGUNDA LINEA:
"PRIMERA LÍNEA"&"<br>"&"SEGUNDA LINEA"
miércoles, 2 de octubre de 2013
Mostrar en Reporting Services un parametro MultiValue
Se puede dar el caso que deseamos mostrar los valores seleccionados en un paramero de valor múltiple.Podríamos hacerlo con una tabla pero lo que vamos a ver en este post es como hacerlo en un cuadro de texto.
Pongamos que tenemos un DataSet con una lista de empresas y queremos mostrar la lista de las empresas seleccionadas en un cuadro de texto, una detras de otra separadas por un guión.
El DataSet lo llamamos ListaDeEmpresas.
El DataSet tiene un parámetro llamado NOMBRE con el nombre de la empresa.
El parámetro multi valor se llama EMPRESA.
En el cuadro de texto pondríamos lo siguiente:
=iif(Parameters!EMPRESA.Count = count(Fields!NOMBRE.Value, "LisaDeEmpresas"),"All",Join(Parameters!EMPRESA.Value,","))
Pongamos que tenemos un DataSet con una lista de empresas y queremos mostrar la lista de las empresas seleccionadas en un cuadro de texto, una detras de otra separadas por un guión.
El DataSet lo llamamos ListaDeEmpresas.
El DataSet tiene un parámetro llamado NOMBRE con el nombre de la empresa.
El parámetro multi valor se llama EMPRESA.
En el cuadro de texto pondríamos lo siguiente:
=iif(Parameters!EMPRESA.Count = count(Fields!NOMBRE.Value, "LisaDeEmpresas"),"All",Join(Parameters!EMPRESA.Value,","))
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
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
Suscribirse a:
Entradas (Atom)