SELECT COM ATRIBUTO IN EM CAMPOS INTEIROS E PARAMETROS VARCHAR

17/03/2015

0

Galera estou tentando fazer um select com parametros no firebird 2.5 com o atributo IN. Só tem um problema meu parâmetro tem que ser varchar, mas o campo no qual vou utilizar o IN é inteiro.
O campo ped.tipo_id é inteiro, mas preciso pesquisar mais de um tipo de venda. exemplo: Tipo 1 = 1, tipo 2 = 2, etc... O select ficaria IN(1,2), só que os valores 1,2 vem dentro paramento :tipo, e da erro de tipo de dados, ja tentei o CAST também não tive sucesso.

Alguém já utilizou esse atributo assim? Podem me ajudar?

SELECT COALESCE(Sum(ped.total1),0)
                       FROM   pedidos ped
                       WHERE  ped.tipo_id < 5
                       AND    ped.loj_id = :loja
                       AND    ped.status = :status
                       AND    ped.tipo_id  in( :tipo )
                       AND    Cast(ped.data_emissao AS DATE) BETWEEN :dt_ini AND :dt_fim
Sidney Abreu

Sidney Abreu

Responder

Post mais votado

17/03/2015

A ideia é simples, embora a sintaxe possa não ser...

1. Declare uma variável varchar para receber o comando sql que será executado
2. Carregue a variável com a parte fixa no código
3. Complemente o código com os parâmetros necessários, SEMPRE tratando-os como string
4. Execute o comando, através da variável declarada, via EXECUTE STATEMENT

Vou fazer a sintaxe para o sql server, que me é mais familiar.

Você pode adaptá-la ao Firebird.

Senão rolar, me avise, que eu tento aqui em um server Firebird...

DECLARE @sql varchar(1000)

set @sql = 'SELECT COALESCE(Sum(ped.total1),0)
 FROM   pedidos ped
 WHERE  ped.tipo_id < 5
 AND    ped.loj_id = ' + Cast(:loja as VARCHAR(5)) + 
'AND    ped.status = ' + Cast(:status as VARCHAR(5)) +
'AND    ped.tipo_id  in( ' +.:tipo ')'+
'AND    Cast(ped.data_emissao AS DATE) BETWEEN ' +:dt_ini+ ' AND ' + ':dt_fim'

execute statement (@sql)


Repare que no código acima eu assumi :
> :loja e :status como inteiro... mas convertidos para varchar, pois eles devem ser concatenados à string do comando
> :tipo... já como varchar delimitado, ou seja, vai ser passada uma string tipo '1,2,3'
> :dt_ini e :dt_fim, já como string delimitado

Para os seguintes parâmetros...
> :loja ( int ) : 5
> status ( int ) : 3
> :tipo ( varchar ) : '1,2,3'
> :dt_ini ( varchar ) : '2015-01-01'
> :dt_fim ( varchar ) : '2015-01-31'

Você ficará com @sql igual a :

SELECT COALESCE(Sum(ped.total1),0)
FROM pedidos ped
WHERE ped.tipo_id < 5
AND ped.loj_id = 5
AND ped.status = 3
AND ped.tipo_id in( '1,2,3')
AND Cast(ped.data_emissao AS DATE) BETWEEN '2015-01-01' AND '2015-01-31'

Resolvendo seu problema de transformar a passagem dos parâmetros char como uma sequencia de inteiros.

Atenção aos delimitadores das strings ( ' ' ) !!!

Espero não ter complicado muito...

Marcos P

Marcos P
Responder

Mais Posts

17/03/2015

Marcos P

Sidney,

Você deve trabalhar com query dinâmica, gerando o comando em uma variável varchar ( ou text ), concatenando os parâmetros como string e executando o comando como EXECUTE STATEMENT...

Esse link, pode ajudar : EXECUTE STATEMENT
Responder

17/03/2015

Sidney Abreu

Desculpe, infelizmente não entendi o funcionamento
Responder

17/03/2015

Marcos P

Onde lê-se : 'AND ped.tipo_id in( ' +.:tipo ')'+

Leia : 'AND ped.tipo_id in( ' + :tipo ')'+

( não tem aquele ponto... )
Responder

17/03/2015

Sidney Abreu

Poxa, bacana! Muitíssimo obrigado! Show de bola. Você conhece algum livro onde eu possa aprender esses recursos?

Abraço
Responder

17/03/2015

Marcos P

Funcionou ?

Procura por "query dinâmica" no Google... é um recurso que pode ser bastante útil, tanto do lado do banco de dados como do lado da aplicação !
Responder

17/03/2015

Sidney Abreu

SIM, SIM, MUITO INTERESSANTE, VOU USAR PRA 'N' SITUAÇÕES
Responder

18/03/2015

Marcos P

Ótimo !!!
Responder

18/03/2015

Sidney Abreu

vc da aula particular?
Responder

18/03/2015

Marcos P

Mal tenho tempo de conectar aqui pra tentar, de vez em quando, ajudar a galera !
Responder

18/03/2015

Sidney Abreu

blz, de qualquer forma obrigado
Responder

02/10/2015

Walter Pereira

Obrigado Marcos P essa sua dica me ajudou muito.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar