Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Kika_Epilética

Utiliando "OU" em uma substring dentro de uma Trigger

Recommended Posts

Bom dia !!

 

Td beleza galera ? http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Criei uma trigger no sql server 2005 que atualiza o campo data de uma determinada tabela depois que eu extraio valores de documentos XMLs e os insiro no

banco.

 

CREATE TRIGGER TR_DATAPROCESSAMENTO
ON NotaFiscal
AFTER INSERT
AS 

	UPDATE NotaFiscal

SET DataProcessamento = (SELECT CAST( substring(Right(FileSystem,18),7,2) + '/' +
															  substring(Right(FileSystem,18),5,2) + '/' + 
											  substring(Right(FileSystem,18),1,4) AS DATETIME) 
											FROM INSERTED ) 
									  WHERE ID_NotaFiscal = ( SELECT ID_NotaFiscal FROM INSERTED )

Até ai, tudo bem, a trigger funciona perfeitamente, mas em determinado momento ela não consegue extrair o

campo data perfeitamente. MOTIVO : as datas(normalmente) vem com o formato yyyymmdd, mas em alguns casos estão yyyymdd.

Como eu faço pra fazer um "OU" nas substrings na trigger abaixo :

 

 

substring(Right(FileSystem,18),5,2) || substring(Right(FileSystem,18),5,1) + '/' +

Porém não funciona ! http://forum.imasters.com.br/public/style_emoticons/default/yay.gif

Alguém tem uma dica ?

 

Abraços ! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

usa o

CONVERT(VARCHAR(10), campo_data, 103)
na variável que você recebe, aí você vai estar sempre padronizada, independentemente da forma que a data venha

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai, td beleza NaPraia ?

 

usa o

CONVERT(VARCHAR(10), campo_data, 103)
na variável que você recebe, aí você vai estar sempre padronizada, independentemente da forma que a data venha

Nesse caso não da pra fazer isso...

O usuário não digita uma data, o valor é extraido de um campo, que possui a data. Nesse caso, é extraido do campo FileSystem e vem no seguinte formato : CATARINE20070313145020.xml, onde CATARINE é o nome da pessoa que gerou o xml e 20070313 é a data (yyyymmdd). A trigger que eu fiz localiza essa

data e a converte, porém, em alguns momento o campo está inserido da seguinte maneira : EDUARDO2007313145020.xml 2007313 (yyyymdd). Entendeu ?

O que eu quero fazer é criar um ou entre as substrings para poder inserir no banco tanto as datas yyyymmdd como as yyyymdd que o usuário forneceu ao gerar o xml. Entendeu ?

 

Abraços e obrigada http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi, achei que o problema era que as vezes vinha do dia e depois o mês e vice-versa

o que são os números depois da data? São sempre 6 números???

 

 

que se você tem

CATARINE2007101045020.xml

como você faz para saber se essa data é 01-1-2007 ou 10-10-2007??

 

 

SELECT CAST( substring(Right(FileSystem,18),7,2) + '/' +
															  substring(Right(FileSystem,18),5,2) + '/' +
											  substring(Right(FileSystem,18),1,4) AS DATETIME)

outra coisinha, se o mês pode ter 1 dígito ou 2, você também não precisaria mudar o comando do dia??

com dois dígitos no mês

SELECT CAST( substring(Right(FileSystem,18),7,2) + '/' +
						   substring(Right(FileSystem,18),5,2) + '/' +
						   substring(Right(FileSystem,18),1,4) AS DATETIME)
com um dígito no mês

SELECT CAST( substring(Right(FileSystem,18),6,2) + '/' +
						   substring(Right(FileSystem,18),5,1) + '/' +
						   substring(Right(FileSystem,18),1,4) AS DATETIME)

Compartilhar este post


Link para o post
Compartilhar em outros sites

entendi, achei que o problema era que as vezes vinha do dia e depois o mês e vice-versa

o que são os números depois da data? São sempre 6 números???

^^

Bom, não tenho idéia do que seja os números depois da data :rolleyes:

Mas não interfere na data não xD

 

que se você tem

CATARINE2007101045020.xml

como você faz para saber se essa data é 01-1-2007 ou 10-10-2007??

Então, o valor CATARINE2007101045020.xml é extraido, no caso a data aqui é 20071010(tá no formato direitinho yyyymmdd), mas se fornecerem CATARINE200711045020.xml, fica 2007110 (yyyymdd). A minha dúvida é como faço pra que a trigger entenda yyyymmdd ou yyyymdd.

Não sei como posso fazer um "OU" entre as substrings (pelo menos não estou conseguindo.

 

A trigger faz o seguinte pega esse nome : CATARINE2007101045020.xml que se encontra no campo File System (que é varchar) e transforma em data, assim :

 

A primeira substring pega o dia :

(SELECT CAST( substring(Right(FileSystem,18),7,2) + '/' +
Onde FileSystem é o nome do campo, 7 é onde começa o dia (que começa com 1) e pega seus 2 digitos (1 e 0).

essa subtring pega o mês :

substring(Right(FileSystem,18),5,2) + '/' +
Onde FileSystem é o nome do campo, 5 é onde começa o mês (que começa com 1) e pega seus 2 digitos (1 e 0)

 

e a última substring pega o ano :

substring(Right(FileSystem,18),1,4) AS DATETIME)

Onde FileSystem é o nome do campo, 1 é onde começa o ano (que começa com 2) e pega seus 4 digitos (2, 0, 0 e 7)

 

Entendeu ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, não tenho idéia do que seja os números depois da data

é como você vai formatar a data.

 

CATARINE2007101045020

como é que você faz para saber se essa data que está aí é 10-10-2007 ou 01-1-2007??

como você sabe se a data é composta de 8 ou 7 caracteres????

 

Right(FileSystem,18)
nesse comando você só pega da data ou vem os outro números depois???

 

pois você podia fazer o select verificando a quantidade de dígitos

 

select CAST( case when right(fileSystem,18) = 8 then 
						 substring(Right(FileSystem,18),7,2) + '/' +
						 substring(Right(FileSystem,18),5,2) + '/' + 
					 else  
						 substring(Right(FileSystem,18),6,2) + '/' +
						 substring(Right(FileSystem,18),5,1) + '/' +  end 
						 substring(Right(FileSystem,18),1,4) AS DATETIME)

que aí, caso o tamanho seja oito é pq o mês vem com dois dígitos

caso diferente de 8, é pq são sete e o mês tem um dígito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá !!

NaPraia, muito obrigada pela ajuda, mas já consegui resolver ! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

O código ficou assim :

 

UPDATE NotaFiscal
	SET DataProcessamento = (SELECT CASE WHEN ISNUMERIC(SUBSTRING(REVERSE(RIGHT(FileSystem,18)), 5, 14)) = 1
										THEN CAST(substring(Right(FileSystem,18),7,2) + '/' + 
										  substring(Right(FileSystem,18),5,2) + '/' + 
								 substring(Right(FileSystem,18),1,4) AS DATETIME)
						   WHEN ISNUMERIC(SUBSTRING(REVERSE(RIGHT(FileSystem,17)), 5, 13)) = 1
						THEN CAST(substring(Right(FileSystem,17),6,2) + '/' + 
									substring(Right(FileSystem,17),5,1) + '/' + 
								  substring(Right(FileSystem,17),1,4) AS DATETIME)
						WHEN ISNUMERIC(SUBSTRING(REVERSE(RIGHT(FileSystem,16)), 5, 12)) = 1
						THEN CAST(substring(Right(FileSystem,16),6,2) + '/' + 
						   		 substring(Right(FileSystem,16),5,1) + '/' + 
								 substring(Right(FileSystem,16),1,4) AS DATETIME)
						ELSE CAST(substring(Right(FileSystem,15),6,1) + '/' + 
									   substring(Right(FileSystem,15),5,1) + '/' + 
								 substring(Right(FileSystem,15),1,4) AS DATETIME)
						   END AS DATA_FILESYSTEM
			FROM INSERTED)
			WHERE ID_NotaFiscal = ( SELECT ID_NotaFiscal FROM INSERTED )

Mais uma vez obrigada e até a próxima ! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.