Erro na SP
TENHO ESTA STORED PROCEDURE QUE AINDA NAO ESTA TODA TERMINADA , MAS ESTA DANDO ERRO NO END. COMO SE FALTASSE ALGUM COMANDO , OU ALGUM PONTO E VIRGULA ( ; )
COMO FICARIA A SINTAXE CORRETA DESTA SP?
CREATE PROCEDURE PROC_ESTOQUEDIARIO
RETURNS (
PRODUTO INTEGER,
NOME VARCHAR(35),
NOME2 VARCHAR(35),
NOME3 VARCHAR(35),
SALDO NUMERIC(12,4),
PRODUCAO NUMERIC(12,4),
VENDAS NUMERIC(12,4),
SAIDAS NUMERIC(12,4))
AS
begin
FOR /* VERIFICA OS PRODUTOS COM MOVIMENTACAO DIARIA */
Select PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
From Itens_Ped Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
Inner JOIN Produtos On Produtos.Id_Produto = Itens_Ped.Produto
Where Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP By PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
UNION ALL
Select PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
Inner Join Produtos On Produtos.Id_Produto = Itens_PedFaturar.Produto
Where Ped_Faturar.Emissao = CURRENT_DATE
GROUP By PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
INTO :PRODUTO, :NOME, :NOME2, :NOME3, :SALDO
DO
BEGIN
/* QUANTIDADE DE PRODUTOS DIGITADOS */
FOR
Select sUM(Itens_Ped.QUANTIDADE)
From Itens_Ped
Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
WHERE (PEDIDOS.situacao = 0 and PEDIDOS.controle =1) or (PEDIDOS.situacao < 2 and Pedidos.Controle = 0)
AND Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP BY ITENS_PED.PRODUTO
HAVING ITENS_PED.PRODUTO = :PRODUTO
UNION ALL
Select Sum(Itens_PedFaturar.QUANTIDADE)
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
WHERE (Ped_Faturar.SITUACAO = 0 AND Ped_faturar.controle=1) or (Ped_Faturar.SITUACAO < 2 and Ped_Faturar.Controle = 0)
AND Ped_Faturar.Emissao = CURRENT_DATE
GROUP BY ITENS_PEDFATURAR.PRODUTO
HAVING ITENS_PEDFATURAR.PRODUTO = :PRODUTO
INTO :VENDAS
DO
/* QUANTIDADE DE PRODUTOS COM NOTAS EMITIDAS*/
FOR
Select sUM(Itens_Ped.QUANTIDADE)
From Itens_Ped
Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
WHERE (PEDIDOS.situacao = 1 and PEDIDOS.controle = 1) or (PEDIDOS.situacao > 1 and Pedidos.Controle = 0)
AND Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP BY ITENS_PED.PRODUTO
HAVING ITENS_PED.PRODUTO = :PRODUTO
UNION ALL
Select Sum(Itens_PedFaturar.QUANTIDADE)
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
WHERE (Ped_Faturar.SITUACAO = 1 AND Ped_faturar.controle=1) or (Ped_Faturar.SITUACAO > 1 and Ped_Faturar.Controle = 0)
AND Ped_Faturar.Emissao = CURRENT_DATE
GROUP BY ITENS_PEDFATURAR.PRODUTO
HAVING ITENS_PEDFATURAR.PRODUTO = :PRODUTO
INTO :SAIDAS
DO
END
*/
SUSPEND;
end
COMO FICARIA A SINTAXE CORRETA DESTA SP?
CREATE PROCEDURE PROC_ESTOQUEDIARIO
RETURNS (
PRODUTO INTEGER,
NOME VARCHAR(35),
NOME2 VARCHAR(35),
NOME3 VARCHAR(35),
SALDO NUMERIC(12,4),
PRODUCAO NUMERIC(12,4),
VENDAS NUMERIC(12,4),
SAIDAS NUMERIC(12,4))
AS
begin
FOR /* VERIFICA OS PRODUTOS COM MOVIMENTACAO DIARIA */
Select PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
From Itens_Ped Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
Inner JOIN Produtos On Produtos.Id_Produto = Itens_Ped.Produto
Where Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP By PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
UNION ALL
Select PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
Inner Join Produtos On Produtos.Id_Produto = Itens_PedFaturar.Produto
Where Ped_Faturar.Emissao = CURRENT_DATE
GROUP By PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
INTO :PRODUTO, :NOME, :NOME2, :NOME3, :SALDO
DO
BEGIN
/* QUANTIDADE DE PRODUTOS DIGITADOS */
FOR
Select sUM(Itens_Ped.QUANTIDADE)
From Itens_Ped
Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
WHERE (PEDIDOS.situacao = 0 and PEDIDOS.controle =1) or (PEDIDOS.situacao < 2 and Pedidos.Controle = 0)
AND Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP BY ITENS_PED.PRODUTO
HAVING ITENS_PED.PRODUTO = :PRODUTO
UNION ALL
Select Sum(Itens_PedFaturar.QUANTIDADE)
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
WHERE (Ped_Faturar.SITUACAO = 0 AND Ped_faturar.controle=1) or (Ped_Faturar.SITUACAO < 2 and Ped_Faturar.Controle = 0)
AND Ped_Faturar.Emissao = CURRENT_DATE
GROUP BY ITENS_PEDFATURAR.PRODUTO
HAVING ITENS_PEDFATURAR.PRODUTO = :PRODUTO
INTO :VENDAS
DO
/* QUANTIDADE DE PRODUTOS COM NOTAS EMITIDAS*/
FOR
Select sUM(Itens_Ped.QUANTIDADE)
From Itens_Ped
Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
WHERE (PEDIDOS.situacao = 1 and PEDIDOS.controle = 1) or (PEDIDOS.situacao > 1 and Pedidos.Controle = 0)
AND Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP BY ITENS_PED.PRODUTO
HAVING ITENS_PED.PRODUTO = :PRODUTO
UNION ALL
Select Sum(Itens_PedFaturar.QUANTIDADE)
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
WHERE (Ped_Faturar.SITUACAO = 1 AND Ped_faturar.controle=1) or (Ped_Faturar.SITUACAO > 1 and Ped_Faturar.Controle = 0)
AND Ped_Faturar.Emissao = CURRENT_DATE
GROUP BY ITENS_PEDFATURAR.PRODUTO
HAVING ITENS_PEDFATURAR.PRODUTO = :PRODUTO
INTO :SAIDAS
DO
END
*/
SUSPEND;
end
Bruno_solucao
Curtidas 0
Respostas
Afarias
26/08/2004
qual a mensagem de erro completa?
T+
T+
GOSTEI 0
Bruno_solucao
26/08/2004
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 80, char 5.
END.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 80, char 5.
END.
GOSTEI 0
Bruno_solucao
26/08/2004
sendo que o char 5 é o E do end
GOSTEI 0
Afarias
26/08/2004
{...}
INTO :SAIDAS
DO
END [color=red:6f901e02cf]<---- BEGIN no lugar desse end[/color:6f901e02cf]
*/
SUSPEND;
end
T+
GOSTEI 0
Bruno_solucao
26/08/2004
Tudo bem, coloquei o begin e não deu erro, mas agora só esta pegando dados do ultimo produto . do meu primeiro for (for principal)
GOSTEI 0
Afarias
26/08/2004
ai é questão de lógica. não sei o resultado q deseja. mova o SUSPEND para onde vai trazer o resultado esperado por vc.
T+
T+
GOSTEI 0
Bruno_solucao
26/08/2004
E qual eh a logica de trocar o END pelo Begin. ja que trocando o END pelo Begin , da uma mensagem de Warning. que tem um BEGIN empty
GOSTEI 0
Afarias
26/08/2004
:roll: :lol:
GOSTEI 0
Bruno_solucao
26/08/2004
AQUI AGORA ESTA A STORED PROCEDURE . COM 90¬
A PROCEDURE ESTA ME RETORNANDO REALMENTE TODOS OS PRODUTOS QUE TIVERAM MOVIMENTACAO DIARIA, MAS SO ESTA ME RETORNANDO O VALOR DOS PEDIDOS DIGITADOS.
OU SEJA SE TEVE NOTAS IMPRESSAS OU PRODUCAO, ESTA RETORNANDO 0. PQ COLOQUEI PARA RETORNAR 0 SENAO FICA NULL
JA TESTEI OS SELECT PELO SQL EDITOR E FUNCIONA LEGAL, MAS DEVE ESTA ACONTECENDO ALGUM DESVIO QUE NAO PASSA NESTES OUTROS FOR
COMO QUE EU POSSO VERIFICAR (TEM ALGUMA ESPECIE DE DEBUG PELO IBEXPERT) OU COMO FAZER PARA ARRUMAR ESTA SP..
OBRIGADAO
CREATE PROCEDURE PROC_ESTOQUEDIARIO
RETURNS (
PRODUTO INTEGER,
NOME VARCHAR(35),
NOME2 VARCHAR(35),
NOME3 VARCHAR(35),
SALDO NUMERIC(12,4),
PRODUCAO NUMERIC(12,4),
VENDAS NUMERIC(12,4),
SAIDAS NUMERIC(12,4))
AS
begin
FOR /* VERIFICA OS PRODUTOS COM MOVIMENTACAO DIARIA */
Select PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
From Itens_Ped Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
Inner JOIN Produtos On Produtos.Id_Produto = Itens_Ped.Produto
Where Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP By PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
UNION ALL
Select PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
Inner Join Produtos On Produtos.Id_Produto = Itens_PedFaturar.Produto
Where Ped_Faturar.Emissao = CURRENT_DATE
GROUP By PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
ORDER BY 1
INTO :PRODUTO, :NOME, :NOME2, :NOME3, :SALDO
DO
BEGIN
SAIDAS = 0;
VENDAS = 0;
PRODUCAO = 0;
/* QUANTIDADE DE PRODUTOS DIGITADOS */
FOR
Select sUM(Itens_Ped.QUANTIDADE)
From Itens_Ped
Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
WHERE (PEDIDOS.situacao = 0 and PEDIDOS.controle =1) or (PEDIDOS.situacao < 2 and Pedidos.Controle = 0)
AND Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP BY ITENS_PED.PRODUTO
HAVING ITENS_PED.PRODUTO = :PRODUTO
UNION ALL
Select Sum(Itens_PedFaturar.QUANTIDADE)
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
WHERE (Ped_Faturar.SITUACAO = 0 AND Ped_faturar.controle=1) or (Ped_Faturar.SITUACAO < 2 and Ped_Faturar.Controle = 0)
AND Ped_Faturar.Emissao = CURRENT_DATE
GROUP BY ITENS_PEDFATURAR.PRODUTO
HAVING ITENS_PEDFATURAR.PRODUTO = :PRODUTO
INTO :VENDAS
DO
/* QUANTIDADE DE PRODUTOS COM NOTAS EMITIDAS */
FOR
Select sUM(Itens_Ped.QUANTIDADE)
From Itens_Ped
Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
WHERE (PEDIDOS.situacao = 1 and PEDIDOS.controle = 1) or (PEDIDOS.situacao > 1 and Pedidos.Controle = 0)
AND Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP BY ITENS_PED.PRODUTO
HAVING ITENS_PED.PRODUTO = :PRODUTO
UNION ALL
Select Sum(Itens_PedFaturar.QUANTIDADE)
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
WHERE (Ped_Faturar.SITUACAO = 1 AND Ped_faturar.controle=1) or (Ped_Faturar.SITUACAO > 1 and Ped_Faturar.Controle = 0)
AND Ped_Faturar.Emissao = CURRENT_DATE
GROUP BY ITENS_PEDFATURAR.PRODUTO
HAVING ITENS_PEDFATURAR.PRODUTO = :PRODUTO
INTO :SAIDAS
DO
/*PRODUCAO DIARIA POR PRODUTO */
FOR
Select PRODUCAO.QUANTIDADE FROM PRODUCAO
WHERE PRODUCAO.PRODUTO = :PRODUTO
AND PRODUCAO.DATA = CURRENT_DATE
INTO :PRODUCAO
DO
BEGIN END
SUSPEND;
END
end
A PROCEDURE ESTA ME RETORNANDO REALMENTE TODOS OS PRODUTOS QUE TIVERAM MOVIMENTACAO DIARIA, MAS SO ESTA ME RETORNANDO O VALOR DOS PEDIDOS DIGITADOS.
OU SEJA SE TEVE NOTAS IMPRESSAS OU PRODUCAO, ESTA RETORNANDO 0. PQ COLOQUEI PARA RETORNAR 0 SENAO FICA NULL
JA TESTEI OS SELECT PELO SQL EDITOR E FUNCIONA LEGAL, MAS DEVE ESTA ACONTECENDO ALGUM DESVIO QUE NAO PASSA NESTES OUTROS FOR
COMO QUE EU POSSO VERIFICAR (TEM ALGUMA ESPECIE DE DEBUG PELO IBEXPERT) OU COMO FAZER PARA ARRUMAR ESTA SP..
OBRIGADAO
CREATE PROCEDURE PROC_ESTOQUEDIARIO
RETURNS (
PRODUTO INTEGER,
NOME VARCHAR(35),
NOME2 VARCHAR(35),
NOME3 VARCHAR(35),
SALDO NUMERIC(12,4),
PRODUCAO NUMERIC(12,4),
VENDAS NUMERIC(12,4),
SAIDAS NUMERIC(12,4))
AS
begin
FOR /* VERIFICA OS PRODUTOS COM MOVIMENTACAO DIARIA */
Select PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
From Itens_Ped Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
Inner JOIN Produtos On Produtos.Id_Produto = Itens_Ped.Produto
Where Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP By PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
UNION ALL
Select PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
Inner Join Produtos On Produtos.Id_Produto = Itens_PedFaturar.Produto
Where Ped_Faturar.Emissao = CURRENT_DATE
GROUP By PRODUTOS.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.NOME2, PRODUTOS.NOME3, PRODUTOS.SALDO
ORDER BY 1
INTO :PRODUTO, :NOME, :NOME2, :NOME3, :SALDO
DO
BEGIN
SAIDAS = 0;
VENDAS = 0;
PRODUCAO = 0;
/* QUANTIDADE DE PRODUTOS DIGITADOS */
FOR
Select sUM(Itens_Ped.QUANTIDADE)
From Itens_Ped
Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
WHERE (PEDIDOS.situacao = 0 and PEDIDOS.controle =1) or (PEDIDOS.situacao < 2 and Pedidos.Controle = 0)
AND Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP BY ITENS_PED.PRODUTO
HAVING ITENS_PED.PRODUTO = :PRODUTO
UNION ALL
Select Sum(Itens_PedFaturar.QUANTIDADE)
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
WHERE (Ped_Faturar.SITUACAO = 0 AND Ped_faturar.controle=1) or (Ped_Faturar.SITUACAO < 2 and Ped_Faturar.Controle = 0)
AND Ped_Faturar.Emissao = CURRENT_DATE
GROUP BY ITENS_PEDFATURAR.PRODUTO
HAVING ITENS_PEDFATURAR.PRODUTO = :PRODUTO
INTO :VENDAS
DO
/* QUANTIDADE DE PRODUTOS COM NOTAS EMITIDAS */
FOR
Select sUM(Itens_Ped.QUANTIDADE)
From Itens_Ped
Inner Join Pedidos On Itens_Ped.pedido = Pedidos.id_pedido
WHERE (PEDIDOS.situacao = 1 and PEDIDOS.controle = 1) or (PEDIDOS.situacao > 1 and Pedidos.Controle = 0)
AND Pedidos.Emissao = CURRENT_DATE
and Pedidos.tipo not in(2,6)
GROUP BY ITENS_PED.PRODUTO
HAVING ITENS_PED.PRODUTO = :PRODUTO
UNION ALL
Select Sum(Itens_PedFaturar.QUANTIDADE)
From (Itens_PedFaturar Inner Join Ped_Faturar on Ped_Faturar.pedido = Itens_PedFaturar.pedido
and Ped_Faturar.numero = itens_pedfaturar.numero)
WHERE (Ped_Faturar.SITUACAO = 1 AND Ped_faturar.controle=1) or (Ped_Faturar.SITUACAO > 1 and Ped_Faturar.Controle = 0)
AND Ped_Faturar.Emissao = CURRENT_DATE
GROUP BY ITENS_PEDFATURAR.PRODUTO
HAVING ITENS_PEDFATURAR.PRODUTO = :PRODUTO
INTO :SAIDAS
DO
/*PRODUCAO DIARIA POR PRODUTO */
FOR
Select PRODUCAO.QUANTIDADE FROM PRODUCAO
WHERE PRODUCAO.PRODUTO = :PRODUTO
AND PRODUCAO.DATA = CURRENT_DATE
INTO :PRODUCAO
DO
BEGIN END
SUSPEND;
END
end
GOSTEI 0
Emerson Nascimento
26/08/2004
não sei se isso funciona (pois não tenho seu BD e tb não estou com o IB/FB instalado), mas acho dessa forma mais simples de entender:
set term ^ ;
Create Procedure Proc_EstoqueDiario
Returns (
    Produto Integer,
    Nome Varchar(35),
    Nome2 Varchar(35),
    Nome3 Varchar(35),
    Saldo Numeric(12,4),
    Producao Numeric(12,4),
    Vendas Numeric(12,4),
    Saidas Numeric(12,4)
) as
begin
    for select distinct Produtos.ID_Produto, Produtos.Nome, Produtos.Nome2, Produtos.Nome3, Produtos.Saldo,
                   Sum(Itens_Ped.Quantidade) Vendas
            From Produtos
            left join Pedidos
                   on (Pedidos.Emissao = Current_Date and not (Pedidos.Tipo in (2,6)))
            left join Ped_Faturar
                   on (Ped_Faturar.Emissao = Current_Date)
            left join Itens_Ped
                   on (Itens_Ped.Pedido=Pedidos.ID_Pedido and Itens_Ped.Produto=Produtos.ID_Produto)
            left join Itens_PedFaturar
                   on (Itens_PedFaturar.Pedido=Ped_Faturar.ID_Pedido and Itens_PedFaturar.Numero=Ped_Faturar.Numero
                           and Itens_PedFaturar.Produto=Produtos.ID_Produto)
    into :Produto, :Nome, :Nome2, :Nome3, :Saldo
    do
    begin
        /* Quantidade de produtos digitados */
        Vendas = (Select Sum(Itens_Ped.Quantidade)
                            From Itens_Ped
                            inner join Pedidos on (Pedidos.ID_Pedido=Itens_Ped.Pedido and
                                                                           Pedidos.Emissao=Current_Date and
                                                                           not (Pedidos.Tipo in (2,6)) and
                                                                            ((Pedidos.Situacao=0 and Pedidos.Controle=1) or
                                                                               (Pedidos.Situacao<2 and Pedidos.Controle=0))
                                                                        )
                            where Itens_Ped.Produto = :Produto) +
                           (Select Sum(Itens_PedFaturar.Quantidade)
                            From Itens_PedFaturar
                            inner join Ped_Faturar on (Ped_Faturar.Pedido=Itens_PedFaturar.Pedido and
                                                                                   Ped_Faturar.Emissao=Current_Date and
                                                                                   Ped_Faturar.Numero=Itens_PedFaturar.Numero and
                                                                                    ((Ped_Faturar.Situacao = 0 and Ped_faturar.controle=1) or
                                                                                       (Ped_Faturar.Situacao < 2 and Ped_Faturar.Controle=0))
                                                                                )
                            where Itens_PedFaturar.Produto = :Produto);
        /* Quantidade de produtos com notas emitidas */
        Saidas = (Select Sum(Itens_Ped.Quantidade)
                            From Itens_Ped
                            inner join Pedidos on (Pedidos.ID_Pedido=Itens_Ped.Pedido and Pedidos.Emissao=Current_Date
                                                                           and not (Pedidos.Tipo in (2,6)) and
                                                                            ((Pedidos.Situacao=1 and Pedidos.Controle=1) or
                                                                               (Pedidos.Situacao>1 and Pedidos.Controle=0))
                                                                        )
                            where Itens_Ped.Produto = :Produto) +
                           
                           (Select Sum(Itens_PedFaturar.Quantidade)
                            From Itens_PedFaturar
                            inner join Ped_Faturar on (Ped_Faturar.Pedido=Itens_PedFaturar.Pedido and
                                                                                   Ped_Faturar.Emissao=Current_Date and
                                                                                   Ped_Faturar.Numero=Itens_PedFaturar.Numero and
                                                                                    ((Ped_Faturar.Situacao=1 and Ped_faturar.controle=1) or
                                                                                       (Ped_Faturar.Situacao>1 and Ped_Faturar.Controle=0))
                                                                                )
                            where Itens_PedFaturar.Produto = :Produto);
        /* producao diaria do produto */
        producao = (Select Sum(Quantidade)
                                from Producao
                                where Produto = :Produto and Data = Current_Date);
        suspend;
    end
end ^
set term ; ^
set term ^ ;
Create Procedure Proc_EstoqueDiario
Returns (
    Produto Integer,
    Nome Varchar(35),
    Nome2 Varchar(35),
    Nome3 Varchar(35),
    Saldo Numeric(12,4),
    Producao Numeric(12,4),
    Vendas Numeric(12,4),
    Saidas Numeric(12,4)
) as
begin
    for select distinct Produtos.ID_Produto, Produtos.Nome, Produtos.Nome2, Produtos.Nome3, Produtos.Saldo,
                   Sum(Itens_Ped.Quantidade) Vendas
            From Produtos
            left join Pedidos
                   on (Pedidos.Emissao = Current_Date and not (Pedidos.Tipo in (2,6)))
            left join Ped_Faturar
                   on (Ped_Faturar.Emissao = Current_Date)
            left join Itens_Ped
                   on (Itens_Ped.Pedido=Pedidos.ID_Pedido and Itens_Ped.Produto=Produtos.ID_Produto)
            left join Itens_PedFaturar
                   on (Itens_PedFaturar.Pedido=Ped_Faturar.ID_Pedido and Itens_PedFaturar.Numero=Ped_Faturar.Numero
                           and Itens_PedFaturar.Produto=Produtos.ID_Produto)
    into :Produto, :Nome, :Nome2, :Nome3, :Saldo
    do
    begin
        /* Quantidade de produtos digitados */
        Vendas = (Select Sum(Itens_Ped.Quantidade)
                            From Itens_Ped
                            inner join Pedidos on (Pedidos.ID_Pedido=Itens_Ped.Pedido and
                                                                           Pedidos.Emissao=Current_Date and
                                                                           not (Pedidos.Tipo in (2,6)) and
                                                                            ((Pedidos.Situacao=0 and Pedidos.Controle=1) or
                                                                               (Pedidos.Situacao<2 and Pedidos.Controle=0))
                                                                        )
                            where Itens_Ped.Produto = :Produto) +
                           (Select Sum(Itens_PedFaturar.Quantidade)
                            From Itens_PedFaturar
                            inner join Ped_Faturar on (Ped_Faturar.Pedido=Itens_PedFaturar.Pedido and
                                                                                   Ped_Faturar.Emissao=Current_Date and
                                                                                   Ped_Faturar.Numero=Itens_PedFaturar.Numero and
                                                                                    ((Ped_Faturar.Situacao = 0 and Ped_faturar.controle=1) or
                                                                                       (Ped_Faturar.Situacao < 2 and Ped_Faturar.Controle=0))
                                                                                )
                            where Itens_PedFaturar.Produto = :Produto);
        /* Quantidade de produtos com notas emitidas */
        Saidas = (Select Sum(Itens_Ped.Quantidade)
                            From Itens_Ped
                            inner join Pedidos on (Pedidos.ID_Pedido=Itens_Ped.Pedido and Pedidos.Emissao=Current_Date
                                                                           and not (Pedidos.Tipo in (2,6)) and
                                                                            ((Pedidos.Situacao=1 and Pedidos.Controle=1) or
                                                                               (Pedidos.Situacao>1 and Pedidos.Controle=0))
                                                                        )
                            where Itens_Ped.Produto = :Produto) +
                           
                           (Select Sum(Itens_PedFaturar.Quantidade)
                            From Itens_PedFaturar
                            inner join Ped_Faturar on (Ped_Faturar.Pedido=Itens_PedFaturar.Pedido and
                                                                                   Ped_Faturar.Emissao=Current_Date and
                                                                                   Ped_Faturar.Numero=Itens_PedFaturar.Numero and
                                                                                    ((Ped_Faturar.Situacao=1 and Ped_faturar.controle=1) or
                                                                                       (Ped_Faturar.Situacao>1 and Ped_Faturar.Controle=0))
                                                                                )
                            where Itens_PedFaturar.Produto = :Produto);
        /* producao diaria do produto */
        producao = (Select Sum(Quantidade)
                                from Producao
                                where Produto = :Produto and Data = Current_Date);
        suspend;
    end
end ^
set term ; ^
GOSTEI 0
Emerson Nascimento
26/08/2004
corrija a instrução da cláusula FOR. eu a transcrevi de forma errada, pelo acréscimo equivocado do campo Vendas (com a soma de Itens_Ped.Quantidade) e também pelo fato de, como está, trazer todos os produtos cadastrados.
talvez uma maneira que funcione seja essa:
for select distinct Produtos.ID_Produto, Produtos.Nome, Produtos.Nome2, Produtos.Nome3, Produtos.Saldo
        from Produtos
        left join Pedidos
                on (Pedidos.Emissao = Current_Date and not (Pedidos.Tipo in (2,6)))
        left join Ped_Faturar
                on (Ped_Faturar.Emissao = Current_Date)
        left join Itens_Ped
                on (Itens_Ped.Pedido=Pedidos.ID_Pedido and Itens_Ped.Produto=Produtos.ID_Produto)
        left join Itens_PedFaturar
                on (Itens_PedFaturar.Pedido=Ped_Faturar.ID_Pedido and Itens_PedFaturar.Numero=Ped_Faturar.Numero
                        and Itens_PedFaturar.Produto=Produtos.ID_Produto)
        where (not (Itens_Ped.Quantidade is null) and (Itens_Ped.Quantidade > 0))
            or (not (Itens_PedFaturar.Quantidade is null) and (Itens_PedFaturar.Quantidade > 0))
into :Produto, :Nome, :Nome2, :Nome3, :Saldo
talvez uma maneira que funcione seja essa:
for select distinct Produtos.ID_Produto, Produtos.Nome, Produtos.Nome2, Produtos.Nome3, Produtos.Saldo
        from Produtos
        left join Pedidos
                on (Pedidos.Emissao = Current_Date and not (Pedidos.Tipo in (2,6)))
        left join Ped_Faturar
                on (Ped_Faturar.Emissao = Current_Date)
        left join Itens_Ped
                on (Itens_Ped.Pedido=Pedidos.ID_Pedido and Itens_Ped.Produto=Produtos.ID_Produto)
        left join Itens_PedFaturar
                on (Itens_PedFaturar.Pedido=Ped_Faturar.ID_Pedido and Itens_PedFaturar.Numero=Ped_Faturar.Numero
                        and Itens_PedFaturar.Produto=Produtos.ID_Produto)
        where (not (Itens_Ped.Quantidade is null) and (Itens_Ped.Quantidade > 0))
            or (not (Itens_PedFaturar.Quantidade is null) and (Itens_PedFaturar.Quantidade > 0))
into :Produto, :Nome, :Nome2, :Nome3, :Saldo
GOSTEI 0