Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) select com os campos dinamico


flavioavilela

Pergunta

bom dia a todos...

estou fazendo um select e juntamente com ele, um outro select dentro do primeiro select para que eu possa somar alguns itens..... eu sei como fazer e funciona blzinha... só que agora, por eu dar a opção pro usuário escolher quais parametros ele quer consultar, preciso colocar os campos dinamico na clausula where... se ele escolher, por exemplo, Numero de Documento, ai fica

where N_Documento...
, se ele escolher Cliente, ai fica
where Cliente = ...
........ se não fosse dinamico eu sei fazer, mas agora, dinamico, não sei fazer..... segue abaixo o exemplo de como estou fazendo....

select LF.*, Forn.Nome_Fantasia as Nome, CP.Descricao, TD.Descricao, D.Descricao, PF.Plano,
(select sum(Valor_Documento) from Lancamento_Financeiro LF
where :Campo = :Parametro and LF.Tipo = :Tipo and LF.Status = :Status) as valor_doc,
(select sum(Desconto) from Lancamento_Financeiro LF
where :Campoo = :Parametroo and LF.Tipo = :Tipoo and LF.Status = :Statuss) as desco
(select sum(Multa) from Lancamento_Financeiro LF
where :Campooo = :Parametrooo and LF.Tipo = :Tipooo and LF.Status = :Statusss) as mult,
(select sum(Valor_Cobrado) from Lancamento_Financeiro LF
where :Campoooo = :Parametroooo and LF.Tipo = :Tipoooo and LF.Status = :Statussss) as valor_cob
from Lancamento_Financeiro LF
left join Fornecedor Forn on(LF.Codigo_Cli_For = Forn.Codigo)
left join Condicao_Pagamento CP on(LF.Codigo_Forma_Pagamento = CP.Codigo)
left join Tipo_Documento TD on(LF.Codigo_Tipo_Documento = TD.Codigo)
left join Departamento D on(LF.Codigo_Departamento = D.Codigo)
left join Plano_Financeiro PF on(LF.Codigo_Plano = PF.Codigo)

estou usando o :Campo, o nome do campo passando logo em seguinda como parametro, mas não da certo, a query volta em branco, se eu colocar o nome do campo mesmo da certo, mas eu preciso que seja dinamico.... e ai, alguém sabe...?????

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde Flávio,

Assim não dá, pois a verificação sintática do sql, após a cláusula WHERE espera um tipo específico (no caso uma coluna). Você está passando uma variável. Mesmo se a variável estiver o nome da coluna, o sql não consegue identificar.

O interessante era você tratar estas informações no fonte. Passar para o SQL o script já pronto. Mas caso não tenha jeito, você terá que criar uma variável, atribuir o script à variável e mandar executar a variável.

Ex.:

declare @Sql varchar(50)
declare @Complemento varchar(30)

Set @Complemento = 'where cliente = 5'

Set @Sql = 'select * from Tabela ' + @Complemento 

-- mostra o script montado
select @Sql

-- manda executar o script dentro da variável
Exec (@sql)

Outra coisa: no SUM que está fazendo nos subselects, tente retirá-los e colocá-los no corpo do select principal, utilizando o group by.

Link para o comentário
Compartilhar em outros sites

  • 0

tipo assim, deu certo em partes... fazer junto com o select principal ele soma ou conta somente o primeiro registro.... se eu tenho um campo Valor e tem 10 registros.... o 1 registro o campo valor é 100,00, ele retorna apenas o 100,00 que é do primeiro registro e o numero de registros contatos é 1......... porque isso????

Link para o comentário
Compartilhar em outros sites

  • 0

mais tipo assim, qual a lógica desse group by no sum? pra eu entender e saber o que está "sobrando" no group by

eu experimentei tirar alguns itens do grop by, mas ai ele fala que está faltando tal campo no group by e não posso tirar do select pois precisa de ser visualizado na pesquisa saca...... :wacko:

Link para o comentário
Compartilhar em outros sites

  • 0

Quando você utiliza o SUM associado a outras colunas de retorno, é obrigatório você utilizar o Group By. Por que disto? O sql não consegue identificar para qual campo o SUM será associado.

Ex.:

Select SUM( A ), SUM( B ), SUM ( C ) from Tabela

--> Neste caso as somas funcionarão normalmente.

Select SUM( A ), SUM( B ), SUM ( C ), D from Tabela group by D

--> Neste caso, você terá que especificar o agrupamento (o campo D). Quer dizer que os dados iguais na coluna D serão agrupados e somados.

Select SUM( A ), SUM( B ), SUM ( C ), D, E from Tabela group by D, E

--> Neste caso, os dados iguais nas colunas D e E serão agrupados e somados.

Qualquer dúvida, pode postar.

Link para o comentário
Compartilhar em outros sites

  • 0

Se for muitos campos de retorno, provavelmente não retornará o resultado (as somas) que deseja. Caso não tenha como retornar as consultas e somas, pode-se fazer dois selects. Um pra retornar todas as somas, agrupando pela chave de controle e outra para retornar os demais campos.

A outra forma de fazer é a que postou mesmo. Mas o "ruim" é a repetição dos scripts nos subselects. Caso a consulta fique muito grande, a sua manutenção também ficará penosa.

Link para o comentário
Compartilhar em outros sites

  • 0

Rs... se você utilizar o SUM com outros campos (igual ao exemplo que postei acima), obrigatoriamente você deverá utilizar o group by.

Quando precisa referenciar muitas tabelas ou fazer muita manipulação de dados, as consultas ficam realmente muito grandes... Como se pode melhorar isso?

- Criar temporárias para auxiliar nas manipulações de dados;

- VIEW´s para facilitar acessos aos dados;

- Funções, Procedures; etc.

Link para o comentário
Compartilhar em outros sites

  • 0

obrigado pela paciencia amigo, mas pela pressa que estou, preferi fazer do jeito que "sei" aqui mesmo... ficou algo mais ou menos assim:

with FrmConsulta_Lancamentos_Financeiros.qryconsulta_lancamento do
              begin
                close;
                sql.clear;
                sql.add('select LF.*, Forn.Nome_Fantasia as Nome, CP.Descricao, TD.Descricao, D.Descricao, PF.Plano,');
                sql.add('(select sum(Valor_Documento) from Lancamento_Financeiro LF');
                if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 0) then
                  sql.add('where LF.N_Documento = :Documento and LF.Tipo = :Tipo and LF.Status = :Status) as valor_doc, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 1) then
                  sql.add('where LF.Codigo_Cli_For = :Codigo and LF.Tipo = :Tipo and LF.Status = :Status) as valor_doc, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 2) then
                  sql.add('where LF.Data_Lancamento between :DI and :DF and LF.Tipo = :Tipo and LF.Status = :Status) as valor_doc, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 3) then
                  sql.add('where LF.Data_Lancamento between :DI and :DF and LF.Codigo_Plano = :Plano and LF.Tipo = :Tipo and LF.Status = :Status) as valor_doc, ');

                sql.add('(select sum(Desconto) from Lancamento_Financeiro LF');
                if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 0) then
                  sql.add('where LF.N_Documento = :Documentoo and LF.Tipo = :Tipoo and LF.Status = :Statuss) as desco, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 1) then
                  sql.add('where LF.Codigo_Cli_For = :Codigoo and LF.Tipo = :Tipoo and LF.Status = :Statuss) as desco, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 2) then
                  sql.add('where LF.Data_Lancamento between :DII and :DFF and LF.Tipo = :Tipoo and LF.Status = :Statuss) as desco, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 3) then
                  sql.add('where LF.Data_Lancamento between :DII and :DFF and LF.Codigo_Plano = :Planoo and LF.Tipo = :Tipoo and LF.Status = :Statuss) as desco, ');

                sql.add('(select sum(Multa) from Lancamento_Financeiro LF');
                if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 0) then
                  sql.add('where LF.N_Documento = :Documentooo and LF.Tipo = :Tipooo and LF.Status = :Statusss) as mult, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 1) then
                  sql.add('where LF.Codigo_Cli_For = :Codigooo and LF.Tipo = :Tipooo and LF.Status = :Statusss) as mult, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 2) then
                  sql.add('where LF.Data_Lancamento between :DIII and :DFFF and LF.Tipo = :Tipooo and LF.Status = :Statusss) as mult, ')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 3) then
                  sql.add('where LF.Data_Lancamento between :DIII and :DFFF and LF.Codigo_Plano = :Planooo and LF.Tipo = :Tipooo and LF.Status = :Statusss) as mult, ');

                sql.add('(select sum(Valor_Cobrado) from Lancamento_Financeiro LF');
                if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 0) then
                  sql.add('where LF.N_Documento = :Documentoooo and LF.Tipo = :Tipoooo and LF.Status = :Statussss) as valor_cob from Lancamento_Financeiro LF')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 1) then
                  sql.add('where LF.Codigo_Cli_For = :Codigoooo and LF.Tipo = :Tipoooo and LF.Status = :Statussss) as valor_cob from Lancamento_Financeiro LF')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 2) then
                  sql.add('where LF.Data_Lancamento between :DIIII and :DFFFF and LF.Tipo = :Tipoooo and LF.Status = :Statussss) as valor_cob from Lancamento_Financeiro LF')
                else if (FrmConsulta_Lancamentos_Financeiros.RGConsulta_Lancamento.ItemIndex = 3) then
                  sql.add('where LF.Data_Lancamento between :DIIII and :DFFFF and LF.Codigo_Plano = :Planoooo and LF.Tipo = :Tipoooo and LF.Status = :Statussss) as valor_cob from Lancamento_Financeiro LF');
                sql.add('left join Fornecedor Forn on(LF.Codigo_Cli_For = Forn.Codigo)');
                sql.add('left join Condicao_Pagamento CP on(LF.Codigo_Forma_Pagamento = CP.Codigo)');
                sql.add('left join Tipo_Documento TD on(LF.Codigo_Tipo_Documento = TD.Codigo)');
                sql.add('left join Departamento D on(LF.Codigo_Departamento = D.Codigo)');
                sql.add('left join Plano_Financeiro PF on(LF.Codigo_Plano = PF.Codigo)');

ficou legal, funcionou blzinha..... obrigado pela ajuda e dedicação em me ajudar...

Link para o comentário
Compartilhar em outros sites

  • 0

O script montado pelo fonte fica mais limpo, quando passado para execução. Ficou legal. Só tomar cuidado para a manutenção não ficar penosa.

Se tiver um tempo e quiser melhorar, pode criar uma função no sql que recupera a soma de uma determinada coluna, passando o nome da coluna (por exemplo). Formas de implementação são várias.... :.)

Qualquer dúvida, pode postar.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...