Fórum Query com condições no combobox #529661

24/08/2015

0

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?
Hilda Moraes

Hilda Moraes

Responder

Posts

25/08/2015

Mateus Ribeiro

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í?
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';
// 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.
Responder

Gostei + 0

25/08/2015

Hilda Moraes

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

Gostei + 0

25/08/2015

Hilda Moraes

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'
Responder

Gostei + 0

25/08/2015

Mateus Ribeiro

Lá na ultima linha do seu select, adiciona:

AND I.ULT_COMPRA  BETWEEN :DATA_INICIO AND :DATA_FINAL


Aí tenta novamente
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar