Array
(
)

Selecionar Coluna Dinamicamente

Alex Lekao
   - 22 fev 2013

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

Cesar Roniglei
   - 22 fev 2013

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

Joel Rodrigues
   - 28 fev 2013

Você pode usar o procedure SP_EXECUTESQL para executar um comando SQL "dinâmico", ou seja, montando o texto dinamicamente. Segue um exemplo:
#Código

exec sp_executesql N'SELECT * FROM TbCLIENTES'


Boa sorte.

Alex Lekao
   - 28 fev 2013

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

Joel Rodrigues
   - 28 fev 2013

Então, você montaria um select trazendo só a coluna que você quer. Por exemplo:
#Código

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?

Alex Lekao
   - 28 fev 2013

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

Joel Rodrigues
   - 28 fev 2013

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

Alex Lekao
   - 28 fev 2013

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

Joel Rodrigues
   - 28 fev 2013

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.

Alex Lekao
   - 28 fev 2013

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'

Joel Rodrigues
   - 28 fev 2013

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).

Alex Lekao
   - 28 fev 2013

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

Joel Rodrigues
   - 28 fev 2013

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

Alex Lekao
   - 28 fev 2013

BLZ..

obrigado!!

Abraco.

Alex - Lekao

Joel Rodrigues
   - 28 fev 2013

Aí, cara, um exemplo básico:
A tabela tbTESTE tem as colunas mes1, mes2, mes3, mes4, etc.
#Código

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.

Alex Lekao
   - 01 mar 2013

Ola Joel, vou fazer alguns testes.

Obrigado.

Abraco.

Alex - Lekao