ITENS VENDIDOS POR FORNECEDOR

Delphi

27/07/2020

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.
Gilson Silva

Gilson Silva

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

27/07/2020

um ponto de partida:
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
agora uma pergunta:
fornecedores sem movimentação serão listados?
GOSTEI 0
Gilson Silva

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

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

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

Emerson Nascimento

27/07/2020

dois exemplos:

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

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

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

GOSTEI 0
Gilson Silva

Gilson Silva

27/07/2020

Deu certo Emerson. Muito obrigado. Me ajudou muito. Podemos dá por encerrado o post.
GOSTEI 0
POSTAR