Query com condições no combobox
Tenho esses 2 Selects e preciso unir eles para que o resultado apareça no DBgrid. Porem existem algumas condições para isso:
1º Passo - Unir esses 2 Selects
select i.ESTOQUE_ID,i.referencia,i.DESCRICAO,i.Marca_id,i.FORNE_ID,i.ULT_COMPRA,i.ativo ,e.estoque_calculado from estoque i INNER JOIN estoque_atual e ON (i.estoque_ID = e.estoque_ID) where i.ativo='sim';
select DATA,produto,QUANTIDADE,*from ITENS_PED1
no select da tabela itens_ped1 , Produto é o campo que recebe o mesmo valor do estoque_id das outras colunas nas tabelas estoque e estoque_atual.
2º Passo - O primeiro passo ja tem um where que é pra ativos, como colocar um where vindo de um combobox com as opções ultimos 30 dias, ultimos 60 dias, ultimos 90, ultimos 120, ultimos 150 e ultimos 180 dias?
somando essas saidas de cada produto e apresentar nas colunas (Saídas em 30 dias, Saídas em 60 dias,...Saídas em 180 dias)
Porem dependendo dos parametros vindo do combobox
3º Passo - São mais 2 condições que podem filtrar e compactar o resultado que são os combobox Fornecedores e o Combobox Marca
é bem extenso dessa vez, tem como ser feito isso tudo numa query?
1º Passo - Unir esses 2 Selects
select i.ESTOQUE_ID,i.referencia,i.DESCRICAO,i.Marca_id,i.FORNE_ID,i.ULT_COMPRA,i.ativo ,e.estoque_calculado from estoque i INNER JOIN estoque_atual e ON (i.estoque_ID = e.estoque_ID) where i.ativo='sim';
select DATA,produto,QUANTIDADE,*from ITENS_PED1
no select da tabela itens_ped1 , Produto é o campo que recebe o mesmo valor do estoque_id das outras colunas nas tabelas estoque e estoque_atual.
2º Passo - O primeiro passo ja tem um where que é pra ativos, como colocar um where vindo de um combobox com as opções ultimos 30 dias, ultimos 60 dias, ultimos 90, ultimos 120, ultimos 150 e ultimos 180 dias?
somando essas saidas de cada produto e apresentar nas colunas (Saídas em 30 dias, Saídas em 60 dias,...Saídas em 180 dias)
Porem dependendo dos parametros vindo do combobox
3º Passo - São mais 2 condições que podem filtrar e compactar o resultado que são os combobox Fornecedores e o Combobox Marca
é bem extenso dessa vez, tem como ser feito isso tudo numa query?
Hilda Moraes
Curtidas 0
Respostas
Mateus Ribeiro
24/08/2015
Bom dia!
1º - Você já fez um INNER JOIN ali das tabelas ESTOQUE e ESTOQUE_ATUAL, qual seria a dificuldade em incluir a tabela ITENS_PED1 aí?
2º - Presumindo que seja o campo ULT_COMPRA q vc quer condicionar:
Supondo que na Query1 que está todo o seu select.
var xSQL: String;
xSQL:= Query1.SQL.Text; // Vc pega todo aquele SELECT pra poder montar outra com as condições.
// Usando esse método, vc vai adicionando quantos AND q vc quiser.
Query1.SQL.Text:= xSQL;
Agora a condição dos combobox.
Query1.Params.ParamsByName['DATA_FINAL'].AsDateTime:= NOW; // Até hoje
Case ComboBox1.ItemIndex Of
0: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 30); // Dos ultimos 30 dias até hoje
1: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 60); // Dos ultimos 60 dias até hoje
2: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 90); // Dos ultimos 90 dias até hoje
3: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 120); // Dos ultimos 120 dias até hoje
4: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 150); // Dos ultimos 150 dias até hoje
5: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 180); // Dos ultimos 180 dias até hoje
end;
3º - Para isso, vc usa a mesma lógica da 2º questão.
1º - Você já fez um INNER JOIN ali das tabelas ESTOQUE e ESTOQUE_ATUAL, qual seria a dificuldade em incluir a tabela ITENS_PED1 aí?
SELECT I.ESTOQUE_ID,
I.REFERENCIA,
I.DESCRICAO,
I.MARCA_ID,
I.FORNE_ID,
I.ULT_COMPRA,
I.ATIVO,
E.ESTOQUE_CALCULADO
FROM ESTOQUE I
INNER JOIN ESTOQUE_ATUAL E
ON (I.ESTOQUE_ID = E.ESTOQUE_ID)
LEFT JOIN ITENS_PED1 T
ON T.PRODUTO = I.ESTOQUE_ID // Seria essa união??????
WHERE I.ATIVO = 'SIM'
2º - Presumindo que seja o campo ULT_COMPRA q vc quer condicionar:
Supondo que na Query1 que está todo o seu select.
var xSQL: String;
xSQL:= Query1.SQL.Text; // Vc pega todo aquele SELECT pra poder montar outra com as condições.
xSQL:= xSQL + ' AND I.ULT_COMPRA BETWEEN :DATA_INICIO AND :DATA_FINAL';
Query1.SQL.Text:= xSQL;
Agora a condição dos combobox.
Query1.Params.ParamsByName['DATA_FINAL'].AsDateTime:= NOW; // Até hoje
Case ComboBox1.ItemIndex Of
0: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 30); // Dos ultimos 30 dias até hoje
1: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 60); // Dos ultimos 60 dias até hoje
2: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 90); // Dos ultimos 90 dias até hoje
3: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 120); // Dos ultimos 120 dias até hoje
4: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 150); // Dos ultimos 150 dias até hoje
5: Query1.Params.ParamsByName['DATA_INICIO'].AsDateTime:= (NOW - 180); // Dos ultimos 180 dias até hoje
end;
3º - Para isso, vc usa a mesma lógica da 2º questão.
GOSTEI 0
Hilda Moraes
24/08/2015
Obrigada Mateus pela ajuda.
Montei o select na query e deu um erro e acrescentei as duas tabelas do segundo select.:
Ficou assim :
with
CTE_Sum as
(
SELECT
PRODUTO,
sum(QUANTIDADE) as Quantidade
from ITENS_PED1
where DATA between 2015-08-20 and 2015-08-25
group by
PRODUTO
),
CTE_RN as
(
SELECT
PRODUTO,
Quantidade,
ROW_NUMBER() OVER(ORDER BY produto DESC) as RN
FROM CTE_Sum
)
select
ROW_NUMBER() OVER (ORDER BY e.RN) AS Sequencia,
I.ESTOQUE_ID,
I.REFERENCIA,
I.DESCRICAO,
I.MARCA_ID,
I.FORNE_ID,
I.ULT_COMPRA,
I.ATIVO,
t.DATA,
t.quantidade,
E.ESTOQUE_CALCULADO
FROM ESTOQUE I
INNER JOIN ESTOQUE_ATUAL E
ON (I.ESTOQUE_ID = E.ESTOQUE_ID)
LEFT JOIN ITENS_PED1 T
ON T.PRODUTO = I.ESTOQUE_ID
WHERE I.ATIVO = 'SIM'
mas tá dando um erro
Msg 207, Level 16, State 1, Line 21
Invalid column name 'RN'.
É preciso somar as quantidades do períodos conforme ai não tinha as tabelas.
Montei o select na query e deu um erro e acrescentei as duas tabelas do segundo select.:
Ficou assim :
with
CTE_Sum as
(
SELECT
PRODUTO,
sum(QUANTIDADE) as Quantidade
from ITENS_PED1
where DATA between 2015-08-20 and 2015-08-25
group by
PRODUTO
),
CTE_RN as
(
SELECT
PRODUTO,
Quantidade,
ROW_NUMBER() OVER(ORDER BY produto DESC) as RN
FROM CTE_Sum
)
select
ROW_NUMBER() OVER (ORDER BY e.RN) AS Sequencia,
I.ESTOQUE_ID,
I.REFERENCIA,
I.DESCRICAO,
I.MARCA_ID,
I.FORNE_ID,
I.ULT_COMPRA,
I.ATIVO,
t.DATA,
t.quantidade,
E.ESTOQUE_CALCULADO
FROM ESTOQUE I
INNER JOIN ESTOQUE_ATUAL E
ON (I.ESTOQUE_ID = E.ESTOQUE_ID)
LEFT JOIN ITENS_PED1 T
ON T.PRODUTO = I.ESTOQUE_ID
WHERE I.ATIVO = 'SIM'
mas tá dando um erro
Msg 207, Level 16, State 1, Line 21
Invalid column name 'RN'.
É preciso somar as quantidades do períodos conforme ai não tinha as tabelas.
GOSTEI 0
Hilda Moraes
24/08/2015
begin
DM.ADOCOMPRAS.Params.ParamsByName['Data2'].AsDateTime:= NOW; // Até hoje
Case ComboBox3.ItemIndex Of
0: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 30); // Dos ultimos 30 dias até hoje
1: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 60); // Dos ultimos 60 dias até hoje
2: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 90); // Dos ultimos 90 dias até hoje
3: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 120); // Dos ultimos 120 dias até hoje
4: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 150); // Dos ultimos 150 dias até hoje
5: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 180); // Dos ultimos 180 dias até hoje
end;
end;
Ficou assim Mateus, mas deu erro nos Params.
[dcc32 Error] URelComprasCARR.pas(39): E2003 Undeclared identifier: 'Params'
DM.ADOCOMPRAS.Params.ParamsByName['Data2'].AsDateTime:= NOW; // Até hoje
Case ComboBox3.ItemIndex Of
0: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 30); // Dos ultimos 30 dias até hoje
1: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 60); // Dos ultimos 60 dias até hoje
2: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 90); // Dos ultimos 90 dias até hoje
3: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 120); // Dos ultimos 120 dias até hoje
4: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 150); // Dos ultimos 150 dias até hoje
5: DM.ADOCOMPRAS.Params.ParamsByName['Data1'].AsDateTime:= (NOW - 180); // Dos ultimos 180 dias até hoje
end;
end;
Ficou assim Mateus, mas deu erro nos Params.
[dcc32 Error] URelComprasCARR.pas(39): E2003 Undeclared identifier: 'Params'
GOSTEI 0
Mateus Ribeiro
24/08/2015
Lá na ultima linha do seu select, adiciona:
Aí tenta novamente
AND I.ULT_COMPRA BETWEEN :DATA_INICIO AND :DATA_FINAL
Aí tenta novamente
GOSTEI 0