Fórum Erro na SP #46309

26/08/2004

0

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


Bruno_solucao

Bruno_solucao

Responder

Posts

26/08/2004

Afarias

qual a mensagem de erro completa?



T+


Responder

Gostei + 0

26/08/2004

Bruno_solucao

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 80, char 5.
END.


Responder

Gostei + 0

26/08/2004

Bruno_solucao

sendo que o char 5 é o E do end


Responder

Gostei + 0

26/08/2004

Afarias

{...} INTO :SAIDAS DO END [color=red:6f901e02cf]<---- BEGIN no lugar desse end[/color:6f901e02cf] */ SUSPEND; end



T+


Responder

Gostei + 0

26/08/2004

Bruno_solucao

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)


Responder

Gostei + 0

26/08/2004

Afarias

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+


Responder

Gostei + 0

26/08/2004

Bruno_solucao

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


Responder

Gostei + 0

26/08/2004

Afarias

:roll: :lol:


Responder

Gostei + 0

26/08/2004

Bruno_solucao

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


Responder

Gostei + 0

26/08/2004

Emerson Nascimento

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 ; ^


Responder

Gostei + 0

27/08/2004

Emerson Nascimento

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


Responder

Gostei + 0

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

Aceitar