Selecionar Coluna Dinamicamente

22/02/2013

2

Ola Galera, bom dia!!

Eis que "resurse" eu mais uma vez para pedir a ajuda de vcs... rsrsr

Deixa eu explicar o senário para ver se conseguem me ajudar, eu tenho uma tabela de fechamentos onde eh gravado o abc dos meus produtos, nesta tabela tem 12 colunas para os meses, mes1, mes2, mes3, e assim sucessivamente.

Eu preciso montar um script que me traga apenas a coluna referente ao fechamento do mês imediatamente anterior ao mês atual, ou seja, estamos em fevereiro, eu preciso pegar o abc do fechamento do mês1.

Eis que agora surge a pergunta: Como Fazer isto dinamicamente?

Espero que eu tenha sido claro e que possam me ajudar.

Desde já muito obrigado.

Abraco.

Alex - Lekao
Responder

Posts

22/02/2013

Cesar Roniglei

Boa tarde,
Não consegui entender ao certo o que deseja, mas me adiciona ai no seu msn que posso te dar um help.
cesaronig@hotmail.com
Responder

28/02/2013

Joel Rodrigues

Você pode usar o procedure SP_EXECUTESQL para executar um comando SQL "dinâmico", ou seja, montando o texto dinamicamente. Segue um exemplo:
exec sp_executesql N'SELECT * FROM TbCLIENTES'


Boa sorte.
Responder

28/02/2013

Alex Lekao

Ola Joel, bom dia!!!

meu camarada, me desculpe mas não entendi muito bem como poderei utilizar a sp.

eu preciso que as colunas sejam selecionadas dinamicamente de acordo com o mês atual.

Com essa sp eh possível fazer isso?

desculpe as perguntas mas eh que eu não tenho experiência com a manipulação das sps do sql.

obrigado pela ajuda.

Abraco.

Alex - Lekao
Responder

28/02/2013

Joel Rodrigues

Então, você montaria um select trazendo só a coluna que você quer. Por exemplo:
exec sp_executesql N'SELECT MES1 FROM TABELA'


Ao executar esse comando, seria retornado o resultado do select.

Mas pera aí, você quer fazer isso a partir de uma aplicação? Em que linguagem?
Responder

28/02/2013

Alex Lekao

Entao, a aplicação eh desenvolvida em Delphi, mas na aplicação tem uma ferramente que funciona como construtor de scripts sql, que eu salvo e esses scripts são executados quando necessário para os operadores.

Neste caso eu tenho 12 colunas que correspondem a meses, o que gostaria era para quando o usuário chamar os scripts ele ira ver o saldo referente ao mês imediatamente anterio ao atual, gostaria que isso fosse feito de maneira dinâmica.

Fiz para "quebrar um galho" com o Case, coloquei um case pegando a data e subtraindo 31 e tirando o ano que achei o mês anterior.

mas gostaria de fazer algo mais dinâmico que isso ou mais altomatizado.

Obrigado mais uma vez.

Abraco.

Alex - Lekao
Responder

28/02/2013

Joel Rodrigues

A dificuldade é pegar o número do mês atual? Use a função DecodeDate:
[url]http://www.delphibasics.co.uk/RTL.asp?Name=DecodeDate[/url]
Responder

28/02/2013

Alex Lekao

Oi Joe, boa tarde!!

não... eu acho que me expressei mal.

eu não estou desenvolvendo, os dados de dados que preciso são no próprio SQL mesmo.

o que eu gostaria era conseguir no lugar de ter que ficar escolhendo a coluna que sera mostrada, essa escolha ser feita de maneira dinâmica baseado no mês atual.

Abraco.

Alex - Lekao
Responder

28/02/2013

Joel Rodrigues

Ah, certo, entendi.
Então você pode usar a função DATEPART para obter só o mês da data atual. A partir daí, monta a instrução SQL.
Responder

28/02/2013

Alex Lekao

Certo...
vou colar o código que fiz para ficar mais fácil o entendimento, ai acho que vai ficar melhor para exemplificar.

Eu não quero colocar o case para selecionar as colunas, quero fazer isso dinamicamente.

Segue abaixo o código.

Abraco.

Alex - Lekao

SELECT
E.CODSTK+' - Núm. Fábrica: '+E.CODFAB AS ITEM,
E.CODSTK,
E.CODFAB,
SUBSTRING(E.NOME,1,30) AS NOME,
SUBSTRING(E.MARCA,1,20) AS MARCA,
SUBSTRING(E.FICTEC,1,30) AS APLIC,
(CASE
WHEN DATEPART(M,GETDATE()-31) = '1' THEN F.CLABCQ1
WHEN DATEPART(M,GETDATE()-31) = '2' THEN F.CLABCQ2
WHEN DATEPART(M,GETDATE()-31) = '3' THEN F.CLABCQ3
WHEN DATEPART(M,GETDATE()-31) = '4' THEN F.CLABCQ4
WHEN DATEPART(M,GETDATE()-31) = '5' THEN F.CLABCQ5
WHEN DATEPART(M,GETDATE()-31) = '6' THEN F.CLABCQ6
WHEN DATEPART(M,GETDATE()-31) = '7' THEN F.CLABCQ7
WHEN DATEPART(M,GETDATE()-31) = '8' THEN F.CLABCQ8
WHEN DATEPART(M,GETDATE()-31) = '9' THEN F.CLABCQ9
WHEN DATEPART(M,GETDATE()-31) = '10' THEN F.CLABCQ10
WHEN DATEPART(M,GETDATE()-31) = '11' THEN F.CLABCQ11
WHEN DATEPART(M,GETDATE()-31) = '12' THEN F.CLABCQ12
END) AS ABCQ,
E.CONSUMO,
E.ESTOQUE AS EST,
E.ESTMIN AS MIN,
E.ESTMAX AS MAX,
E.PRCCUE AS CUSTO,
E.ESTOQUE*E.PRCCUE AS TOTCUS,
E.ESTOQUE-E.ESTMAX AS EXCES,
(E.ESTOQUE-E.ESTMAX)*E.PRCCUE AS TOTCUSEXCES
FROM ESTOQUE AS E
LEFT JOIN CLASSABC AS F ON F.CODSTK = E.CODSTK AND F.MESANO = CONVERT(VARCHAR(02),GETDATE()-31,101)+'/'+SUBSTRING(CONVERT(VARCHAR,GETDATE()-31,103),9,2)
WHERE 1 = 1
AND E.ESTOQUE > E.ESTMAX
AND CASE WHEN DATEPART(M,GETDATE()-31) = '1' THEN F.CLABCQ1 WHEN DATEPART(M,GETDATE()-31) = '2' THEN F.CLABCQ2 WHEN DATEPART(M,GETDATE()-31) = '3' THEN F.CLABCQ3 WHEN DATEPART(M,GETDATE()-31) = '4' THEN F.CLABCQ4 WHEN DATEPART(M,GETDATE()-31) = '5' THEN F.CLABCQ5 WHEN DATEPART(M,GETDATE()-31) = '6' THEN F.CLABCQ6 WHEN DATEPART(M,GETDATE()-31) = '7' THEN F.CLABCQ7 WHEN DATEPART(M,GETDATE()-31) = '8' THEN F.CLABCQ8 WHEN DATEPART(M,GETDATE()-31) = '9' THEN F.CLABCQ9 WHEN DATEPART(M,GETDATE()-31) = '10' THEN F.CLABCQ10 WHEN DATEPART(M,GETDATE()-31) = '11' THEN F.CLABCQ11 WHEN DATEPART(M,GETDATE()-31) = '12' THEN F.CLABCQ12 END >= 'A'
AND CASE WHEN DATEPART(M,GETDATE()-31) = '1' THEN F.CLABCQ1 WHEN DATEPART(M,GETDATE()-31) = '2' THEN F.CLABCQ2 WHEN DATEPART(M,GETDATE()-31) = '3' THEN F.CLABCQ3 WHEN DATEPART(M,GETDATE()-31) = '4' THEN F.CLABCQ4 WHEN DATEPART(M,GETDATE()-31) = '5' THEN F.CLABCQ5 WHEN DATEPART(M,GETDATE()-31) = '6' THEN F.CLABCQ6 WHEN DATEPART(M,GETDATE()-31) = '7' THEN F.CLABCQ7 WHEN DATEPART(M,GETDATE()-31) = '8' THEN F.CLABCQ8 WHEN DATEPART(M,GETDATE()-31) = '9' THEN F.CLABCQ9 WHEN DATEPART(M,GETDATE()-31) = '10' THEN F.CLABCQ10 WHEN DATEPART(M,GETDATE()-31) = '11' THEN F.CLABCQ11 WHEN DATEPART(M,GETDATE()-31) = '12' THEN F.CLABCQ12 END <= 'C'
Responder

28/02/2013

Joel Rodrigues

Vamos lá. Com o DATEPART você obtém o mês atual (de 1 a 12), certo? Então você monta sua instrução como um texto (varchar). E no lugar do case para selecionar a coluna, você monta o nome dela usando a variável que obteve com o número do mês (CLABCQ + mes).
Responder

28/02/2013

Alex Lekao

blz...

eu havia tentado algo pare e não consegui...

mas eu vou tentar novamente seguindo com mais atenção e cautela referente a sua dica e vou ver o que consigo.

Obrigado.

Alex - Lekao
Responder

28/02/2013

Joel Rodrigues

Isso! Vou ver se consigo fazer um exemplo básico aqui. Já já eu dou um retorno.
Responder

28/02/2013

Alex Lekao

BLZ..

obrigado!!

Abraco.

Alex - Lekao
Responder

28/02/2013

Joel Rodrigues

Aí, cara, um exemplo básico:
A tabela tbTESTE tem as colunas mes1, mes2, mes3, mes4, etc.
declare
@script nvarchar(max) = '',
@coluna varchar(4) = 'mes',
@mes int

select @mes = datepart(M, getdate()) - 1
set @coluna = @coluna + cast(@mes as varchar)

set @script = N'select ' + @coluna + ' from tbTESTE'
execute sp_executesql @script

Aí eu pego o mÊs atual, subtraio 1 e monto o nome da coluna que eu quero (mes1, nesse caso, pois fevereiro é o mês 2).
Então eu monto o script e executo usando aquele procedure.
Vê aí se dá pra sacar.
Abraço.
Responder

01/03/2013

Alex Lekao

Ola Joel, vou fazer alguns testes.

Obrigado.

Abraco.

Alex - Lekao
Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira