Ir para conteúdo

Arquivado

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

Ripper

Campo + 1

Recommended Posts

Pessoal é o seguinte,

 

Estou com um problema aqui no banco e queria saber se vocês poderiam me ajudar. A consulta é essa:

select pl.*, p.NM_PRETENDENTE, epl.DT_INI, tepl.DS_TIPO_ETP_PROC_LOC, f.NM_GUERRA, 

DescImv = (select convert(varchar,i.CD_IMOVEL) + "-" + e.DS_ENDERECO 
           from IMV_PROC_LOC ipl, IMOVEL i, ENDERECO e where ipl.CD_IMOVEL = i.CD_IMOVEL
           and e.ID_ENDERECO = i.ID_ENDERECO and ipl.NR_PROC_LOC = NUMERO_AQUI)
           
from PROC_LOC pl, PRET_PROC_LOC ppl, PRETENDENTES p, ETP_PROC_LOC epl, TIPO_ETP_PROC_LOC tepl, FUNCIONARIO f
where pl.NR_PROC_LOC = ppl.NR_PROC_LOC
and p.IS_PRETENDENTE = ppl.IS_PRETENDENTE
and epl.NR_PROC_LOC = pl.NR_PROC_LOC
and epl.CD_TIPO_ETP_PROC_LOC = tepl.CD_TIPO_ETP_PROC_LOC
and p.CD_PESSOA_RESPONSAVEL = f.CD_PESSOA
and epl.DT_INI = (select max(DT_INI) from ETP_PROC_LOC where NR_PROC_LOC = pl.NR_PROC_LOC)
and pl.ST_PROC_LOC = '1'

Eu tenho essa consulta e queria saber se no lugar de NUMERO_AQUI eu poderia fazer com que ele checasse um numero por vez vindo de um campo de uma tabela. Tem como ? Só com uma procedure mesmo ?

 

Agradeço desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que você precisa detalhar melhor o problema, tabelas, relacionamentos etc.

Eu pelo menos não entendi.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi motta,

 

É assim: Tem-se o campo calculado DescImv e um campo (com números de 1 até 200.000 e alguma coisa) compartilhado por algumas tabelas(Campo NR_PROC_LOC). O que eu queria saber era se tem alguma possibilidade de ele checar na consulta

select convert(varchar,i.CD_IMOVEL) + "-" + e.DS_ENDERECO 
           from IMV_PROC_LOC ipl, IMOVEL i, ENDERECO e where ipl.CD_IMOVEL = i.CD_IMOVEL
           and e.ID_ENDERECO = i.ID_ENDERECO and ipl.NR_PROC_LOC = NUMERO_AQUI

esses números no lugar de NUMERO_AQUI um por vez junto com a consulta principal, de preferência sem Storage Procedure.

 

Deu para entender ?

 

Agradeço desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma function que receba o valor de "NUMERO_AQUI" execute a query em questão :

 

select convert(varchar,i.CD_IMOVEL) + "-" + e.DS_ENDERECO from IMV_PROC_LOC ipl, 
IMOVEL i, ENDERECO e where ipl.CD_IMOVEL = i.CD_IMOVEL and e.ID_ENDERECO = 
i.ID_ENDERECO and ipl.NR_PROC_LOC = NUMERO_AQUI

não resolveria o problema.?

 

Na query do post #1 se usaria a function

Compartilhar este post


Link para o post
Compartilhar em outros sites

A.Jr para ser franco creio nem ter entendido bem o problema, mas como ele disse querer "mudar" o "NUMERO_AQUI" dei a idiea da function.

 

O uso de functions deve ser realmente pensando antes de usar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

uso de functions e subselect....

juro que tb nao entendi nada do problema... esperando ele dar mais detalhes...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu tentar me explicar melhor:

 

uma linha da consulta é gerada pelo seguinte código:

select pl.*, p.NM_PRETENDENTE, epl.DT_INI, tepl.DS_TIPO_ETP_PROC_LOC, f.NM_GUERRA, 

DescImv = (select convert(varchar,i.CD_IMOVEL) + "-" + e.DS_ENDERECO 
           from IMV_PROC_LOC ipl, IMOVEL i, ENDERECO e where ipl.CD_IMOVEL = i.CD_IMOVEL
           and e.ID_ENDERECO = i.ID_ENDERECO and ipl.NR_PROC_LOC = 1)
           
from PROC_LOC pl, PRET_PROC_LOC ppl, PRETENDENTES p, ETP_PROC_LOC epl, TIPO_ETP_PROC_LOC tepl, FUNCIONARIO f
where pl.NR_PROC_LOC = ppl.NR_PROC_LOC
and p.IS_PRETENDENTE = ppl.IS_PRETENDENTE
and epl.NR_PROC_LOC = pl.NR_PROC_LOC
and epl.CD_TIPO_ETP_PROC_LOC = tepl.CD_TIPO_ETP_PROC_LOC
and p.CD_PESSOA_RESPONSAVEL = f.CD_PESSOA
and epl.DT_INI = (select max(DT_INI) from ETP_PROC_LOC where NR_PROC_LOC = pl.NR_PROC_LOC)
and pl.ST_PROC_LOC = '1'

A linha seguinte é gerada pelo seguinte código:

select pl.*, p.NM_PRETENDENTE, epl.DT_INI, tepl.DS_TIPO_ETP_PROC_LOC, f.NM_GUERRA, 

DescImv = (select convert(varchar,i.CD_IMOVEL) + "-" + e.DS_ENDERECO 
           from IMV_PROC_LOC ipl, IMOVEL i, ENDERECO e where ipl.CD_IMOVEL = i.CD_IMOVEL
           and e.ID_ENDERECO = i.ID_ENDERECO and ipl.NR_PROC_LOC = 2)
           
from PROC_LOC pl, PRET_PROC_LOC ppl, PRETENDENTES p, ETP_PROC_LOC epl, TIPO_ETP_PROC_LOC tepl, FUNCIONARIO f
where pl.NR_PROC_LOC = ppl.NR_PROC_LOC
and p.IS_PRETENDENTE = ppl.IS_PRETENDENTE
and epl.NR_PROC_LOC = pl.NR_PROC_LOC
and epl.CD_TIPO_ETP_PROC_LOC = tepl.CD_TIPO_ETP_PROC_LOC
and p.CD_PESSOA_RESPONSAVEL = f.CD_PESSOA
and epl.DT_INI = (select max(DT_INI) from ETP_PROC_LOC where NR_PROC_LOC = pl.NR_PROC_LOC)
and pl.ST_PROC_LOC = '1'

Veja que mudei de ipl.nr_proc_loc = 1 para ipl.nr_proc_loc = 2. Quero que continue assim por diante até que ipl.nr_proc_loc = 200.000, ou seja, igual ao útlimo registro de nr_proc_loc(que contém números de 1 a 200.000) que vem da tabela proc_loc, tudo isso automaticamente, ou seja, que de um incremento de +1 a cada nova linha da consulta.

 

É isso pessoal, expliquei o melhor que pude. Se ainda não estiver claro por favor me avisem.

 

Agradeço desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tu precisa de um While:

Exemplo prático:

 

declare @id intset @id = 0 while @id < 10beginset @id = @id +1select @idset @id = @id +1select @idend 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi A.Jr,

 

Obrigado pela resposta. O código ficaria assim:

declare @id int 
set @id = 1

while @id < (select count(nr_proc_loc) from proc_loc)
begin 
select pl.*, p.NM_PRETENDENTE, epl.DT_INI, tepl.DS_TIPO_ETP_PROC_LOC, f.NM_GUERRA, 

DescImv = (select convert(varchar,i.CD_IMOVEL) + "-" + e.DS_ENDERECO 
           from IMV_PROC_LOC ipl, IMOVEL i, ENDERECO e where ipl.CD_IMOVEL = i.CD_IMOVEL
           and e.ID_ENDERECO = i.ID_ENDERECO and ipl.NR_PROC_LOC = @id)
           
from PROC_LOC pl, PRET_PROC_LOC ppl, PRETENDENTES p, ETP_PROC_LOC epl, TIPO_ETP_PROC_LOC tepl, FUNCIONARIO f
where pl.NR_PROC_LOC = ppl.NR_PROC_LOC
and p.IS_PRETENDENTE = ppl.IS_PRETENDENTE
and epl.NR_PROC_LOC = pl.NR_PROC_LOC
and epl.CD_TIPO_ETP_PROC_LOC = tepl.CD_TIPO_ETP_PROC_LOC
and p.CD_PESSOA_RESPONSAVEL = f.CD_PESSOA
and epl.DT_INI = (select max(DT_INI) from ETP_PROC_LOC where NR_PROC_LOC = pl.NR_PROC_LOC)
and pl.ST_PROC_LOC = '1'

set @id = @id +1
end 

Certo ?

 

Só vou poder testar amanhã.

 

Agradeço desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ripper, qual a finalidade deste seu codigo? Isso nao tem nada de performance e pode travar seu banco.

Funcionar funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É para gerar um relatório e popular um gridview em .NET(com que eu trabalho). Pode travar mesmo ? O que seria melhor fazer então ?

 

Como é um sistema para poucos usuários, então podemos ignorar um pouco a questão de performace, mas qualquer ajuda é bem-vinda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas se a tabela que gera a sequencia está no select principal não bastaria não tem nenhuma condição no WHERE para a coluna NR_PROC_LOC e tratar a "quebra" no relatório ?!

 

Não entendi bem o motivo do "while" e do "subselect".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ripper, vamos por partes.

Este é somente um relatório, correto?

Para que você precisa deste count? Note que se vc tiver 200 mil registros ele vai rodar 200 mil vezes este select.

Tente explicar melhor esta lógica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi A.Jr,

 

Sim é somente um relatório.

Cara é o seguinte: Eu to migrando um sistema delphi para .NET. No delphi ele tem a opção de usar um campo da consulta e gerar outros campos calculados (dinamicamente, no caso ele vai usar o NR_PROC_LOC e gerar os campos calculados com ele).

O campo númerico pode ser visualizado através desta consulta:

select pl.nr_proc_loc from PROC_LOC pl, PRET_PROC_LOC ppl, PRETENDENTES p, ETP_PROC_LOC epl, TIPO_ETP_PROC_LOC tepl, FUNCIONARIO f 
where pl.NR_PROC_LOC = ppl.NR_PROC_LOC
and p.IS_PRETENDENTE = ppl.IS_PRETENDENTE
and epl.NR_PROC_LOC = pl.NR_PROC_LOC
and epl.CD_TIPO_ETP_PROC_LOC = tepl.CD_TIPO_ETP_PROC_LOC
and p.CD_PESSOA_RESPONSAVEL = f.CD_PESSOA
and epl.DT_INI = (select max(DT_INI) from ETP_PROC_LOC where NR_PROC_LOC = pl.NR_PROC_LOC)
and pl.ST_PROC_LOC = '1'
order by pl.NR_PROC_LOC

Agora eu tenho que usar esses valores no lugar deNUMERO_AQUI_VEM_O_NR_PROC_LOC(isso dinamicamente, ou seja, ele faz a consulta, obtém os numeros do campo NR_PROC_LOC e na mesma consulta(abaixo) usa estes valores para gerar o campo calculado(DescImv) no lugar de NUMERO_AQUI_VEM_O_NR_PROC_LOC)

 

select pl.NR_PROC_LOC, p.NM_PRETENDENTE, epl.DT_INI, tepl.DS_TIPO_ETP_PROC_LOC, f.NM_GUERRA,

DescImv = (select convert(varchar,i.CD_IMOVEL) + '-' + e.DS_ENDERECO from                IMV_PROC_LOC ipl, IMOVEL i, ENDERECO e
           where ipl.CD_IMOVEL = i.CD_IMOVEL 
           and e.ID_ENDERECO = i.ID_ENDERECO 
           and ipl.NR_PROC_LOC = NUMERO_AQUI_VEM_O_NR_PROC_LOC)
           
from PROC_LOC pl, PRET_PROC_LOC ppl, PRETENDENTES p, ETP_PROC_LOC epl, TIPO_ETP_PROC_LOC tepl, FUNCIONARIO f 
where pl.NR_PROC_LOC = ppl.NR_PROC_LOC
and p.IS_PRETENDENTE = ppl.IS_PRETENDENTE
and epl.NR_PROC_LOC = pl.NR_PROC_LOC
and epl.CD_TIPO_ETP_PROC_LOC = tepl.CD_TIPO_ETP_PROC_LOC
and p.CD_PESSOA_RESPONSAVEL = f.CD_PESSOA
and epl.DT_INI = (select max(DT_INI) from ETP_PROC_LOC where NR_PROC_LOC = pl.NR_PROC_LOC)
and pl.ST_PROC_LOC = '1'
order by pl.nr_proc_loc

Assim a consulta retorna um numero(NR_PROC_LOC) e eu tenho que usar esse numero para gerar o campo calculado DescImv mais abaixo na consulta, isso em tempo de execução, ou seja dinamicamente.

 

Acho que agora consegui explicar melhor. Preciso de um força.

 

Agradeço desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.

Não sei a estrutura nem como esta montando este seu relatório, mas eu faria assim:

Montaria um "Combo box" com o resultado do primeiro select.

 

Seu segundo select, transformaria em procedure, recebendo como parametro o campo NR_PROC_LOC

Mais ou menos assim?

CREATE PROCEDURE pr_RELATORIO_01 (@NR_PROC_LOC BIGINT)ASBEGINselect pl.NR_PROC_LOC, p.NM_PRETENDENTE, epl.DT_INI, tepl.DS_TIPO_ETP_PROC_LOC, f.NM_GUERRA, (select convert(varchar,i.CD_IMOVEL) + '-' + e.DS_ENDERECO from IMV_PROC_LOC ipl, IMOVEL i, ENDERECO e with(nolock)  where ipl.CD_IMOVEL = i.CD_IMOVEL and e.ID_ENDERECO = i.ID_ENDERECO and ipl.NR_PROC_LOC = @NR_PROC_LOC) as DescImv from PROC_LOC pl, PRET_PROC_LOC ppl, PRETENDENTES p, ETP_PROC_LOC epl, TIPO_ETP_PROC_LOC tepl, FUNCIONARIO f where pl.NR_PROC_LOC = ppl.NR_PROC_LOCand p.IS_PRETENDENTE = ppl.IS_PRETENDENTEand epl.NR_PROC_LOC = pl.NR_PROC_LOCand epl.CD_TIPO_ETP_PROC_LOC = tepl.CD_TIPO_ETP_PROC_LOCand p.CD_PESSOA_RESPONSAVEL = f.CD_PESSOAand epl.DT_INI = (select max(DT_INI) from ETP_PROC_LOC with(nolock) where NR_PROC_LOC = pl.NR_PROC_LOC)and pl.ST_PROC_LOC = '1'order by pl.nr_proc_locEND

 

Para executar, seria assim:

exec pr_RELATORIO_01 @NR_PROC_LOC = xxxx
-- onde xxxx é o valor de parametrizacao

 

Se não entendeu, pode perguntar.

 

[]´s

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.