ITENS VENDIDOS POR FORNECEDOR
bom dia a todos! trabalho com Delphi e banco firebird 2.5. Preciso obter um script que me traga os itens vendidos por fornecedor. Tenho as tabelas
FORNECEDOR - CADASTRO DE FORNECEDOR
MOVITENS - ITENS VENDIDOS
PRODUTOS - CADASTRO DE PRODUTOS
No cadastro de produtos tenho um campo onde consta o ultimo fornecedor (CODFOR).
Nesse caso como ficaria o script? Desde já agradeço a atenção de todos.
FORNECEDOR - CADASTRO DE FORNECEDOR
MOVITENS - ITENS VENDIDOS
PRODUTOS - CADASTRO DE PRODUTOS
No cadastro de produtos tenho um campo onde consta o ultimo fornecedor (CODFOR).
Nesse caso como ficaria o script? Desde já agradeço a atenção de todos.
Gilson Silva
Curtidas 0
Respostas
Emerson Nascimento
27/07/2020
um ponto de partida:
agora uma pergunta:
fornecedores sem movimentação serão listados?
SELECT [F.AAAAAAAA], -- campos da tabela FORNECEDOR [MI.AAAAAAAA], -- campos da tabela MOVITENS [P.AAAAAAAA], -- campos da tabela PRODUTOS FROM FORNECEDOR F INNER JOIN PRODUTOS P ON P.CODFOR = F.CODIGO INNER JOIN MOVITENS MI ON MI.CODPRO = P.CODIGO [WHERE] -- faça o filtro que desejar
fornecedores sem movimentação serão listados?
GOSTEI 0
Gilson Silva
27/07/2020
Emerson, na verdade o cliente me pediu um relatório de vendas (selecionando a data inicial e final) com opção de aparecer TODOS OS PRODUTOS ou POR FORNECEDOR, ou seja, para obter todos os produtos vou precisar apenas das tabelas PRODUTOS E MOVITENS. A outra opção é pra filtrar somente os produtos vendidos no periodo de um determinado fornecedor. Agradeço mais uma vez a atenção.
GOSTEI 0
Emerson Nascimento
27/07/2020
ah, sim. basta colocar a tabela MOVITENS como tabela principal da tua instrução. daí você pode verificar se o parâmetro do fornecedor deve ser utilizado.
SELECT
[F.AAAAAAAA], -- campos da tabela FORNECEDOR
[MI.AAAAAAAA], -- campos da tabela MOVITENS
[P.AAAAAAAA], -- campos da tabela PRODUTOS
FROM
MOVITENS MI
INNER JOIN
PRODUTOS P ON P.CODIGO = MI.CODPRO
LEFT JOIN -- se não precisar apresentar dados do fornecedor, não precisa desta tabela
FORNECEDOR F ON F.CODIGO = P.CODFOR
WHERE
MI.DATA BETWEEN :V_DATAINI AND :V_DATAFIM
AND ( :V_CODFOR = 0 OR P.CODFOR = :V_CODFOR ) -- passe 0 para o parâmetro caso não queira filtrar um fornecedor
ORDER BY
MI.DATA, MI.DOCUMENTO, MI.CODPRO
GOSTEI 0
Gilson Silva
27/07/2020
Bom dia Emerson. Deu certinho esse script. Pra finalizar caso queira agrupar por quantidade vendida sum(MI.QUANT) as total com ficaria? Obrigado mais uma vez.
GOSTEI 0
Emerson Nascimento
27/07/2020
dois exemplos:
se você quiser apresentar o total por produto:
se você quiser apresentar o total por produto e fornecedor:
note que os campos que não estão em funções de agregação precisam estar obrigatoriamente no GROUP BY
se você quiser apresentar o total por produto:
SELECT
MI.CODPROD,
SUM(MI.QUANT) TOTAL
FROM
MOVITENS MI
INNER JOIN
PRODUTOS P ON P.CODIGO = MI.CODPRO
LEFT JOIN -- se não precisar apresentar dados do fornecedor, não precisa desta tabela
FORNECEDOR F ON F.CODIGO = P.CODFOR
WHERE
MI.DATA BETWEEN :V_DATAINI AND :V_DATAFIM
AND ( :V_CODFOR = 0 OR P.CODFOR = :V_CODFOR ) -- passe 0 para o parâmetro caso não queira filtrar um fornecedor
GROUP BY
MI.CODPROD
se você quiser apresentar o total por produto e fornecedor:
SELECT
P.CODFOR,
MI.CODPROD,
SUM(MI.QUANT) TOTAL
FROM
MOVITENS MI
INNER JOIN
PRODUTOS P ON P.CODIGO = MI.CODPRO
LEFT JOIN -- se não precisar apresentar dados do fornecedor, não precisa desta tabela
FORNECEDOR F ON F.CODIGO = P.CODFOR
WHERE
MI.DATA BETWEEN :V_DATAINI AND :V_DATAFIM
AND ( :V_CODFOR = 0 OR P.CODFOR = :V_CODFOR ) -- passe 0 para o parâmetro caso não queira filtrar um fornecedor
GROUP BY
P.CODFOR,
MI.CODPROD
note que os campos que não estão em funções de agregação precisam estar obrigatoriamente no GROUP BY
GOSTEI 0
Gilson Silva
27/07/2020
bom dia Emerson, o script deu certo. Agora como faço pra mostrar os dados dos produtos como NOME, MARCA, etc. que estão na tabela PRODUTOS? pois ele traz somente a totalização.
GOSTEI 0
Emerson Nascimento
27/07/2020
é como eu disse: os campos que você acrescentar precisam ser incluídos também no GROUP BY.
SELECT
P.CODFOR,
MI.CODPROD,
P.NOME,
P.MARCA,
SUM(MI.QUANT) TOTAL
FROM
MOVITENS MI
INNER JOIN
PRODUTOS P ON P.CODIGO = MI.CODPRO
LEFT JOIN -- se não precisar apresentar dados do fornecedor, não precisa desta tabela
FORNECEDOR F ON F.CODIGO = P.CODFOR
WHERE
MI.DATA BETWEEN :V_DATAINI AND :V_DATAFIM
AND ( :V_CODFOR = 0 OR P.CODFOR = :V_CODFOR ) -- passe 0 para o parâmetro caso não queira filtrar um fornecedor
GROUP BY
P.CODFOR,
MI.CODPROD,
P.NOME,
P.MARCAGOSTEI 0
Gilson Silva
27/07/2020
Deu certo Emerson. Muito obrigado. Me ajudou muito. Podemos dá por encerrado o post.
GOSTEI 0