Stored procedure esta duplicando o valor?

Firebird

22/07/2011

Tenho um problema com uma SP aqui...

O problema é com o fechamento do caixa.

Se eu evetuar uma venda e pagar com creditos do cliente, e depois fechar o caixa, mais ai o cliente desiste e resolve cancelar a venda, ai faço o extorno dos seus creditos normal, mais ao emitir o relatorio do fechamento do caixa, alem de aparecer a venda, esta duplicando o valor.

A SP é esta

CREATE PROCEDURE SP_REL_VENDAS_PGTS (
    codigo_caixa_entrada integer)
returns (
    data_hora date,
    hora time,
    codigo_cliente integer,
    cliente_nome varchar(70),
    codigo integer,
    numero_parcela integer,
    data_vencimento date,
    valor_parcela double precision,
    pagamento_renegociado char(3),
    apelido varchar(16),
    codigo_usuario integer,
    data_abertura timestamp,
    data_fechamento timestamp,
    codigo_caixa integer,
    empresa_nome varchar(100),
    descricao varchar(100),
    valor_em_creditos_usados double precision)
as
declare variable cod_temp integer;
BEGIN

  SELECT NOME
    FROM RELATORIOS_CONF
    INTO :EMPRESA_NOME;

  FOR SELECT
       VENDAS.DATA_HORA,
       VENDAS.HORA,
       VENDAS.CODIGO_CLIENTE,
       CLIENTES.NOME,
       VENDAS.CODIGO,
       VENDAS_PAGAMENTO.NUMERO_PARCELA,
       VENDAS_PAGAMENTO.DATA_VENCIMENTO,
       VENDAS_PAGAMENTO.VALOR_PARCELA,
       VENDAS_PAGAMENTO.PAGAMENTO_RENEGOCIADO,
       VENDAS_PAGAMENTO.DESCRICAO,
       USUARIOS.APELIDO,
       CAIXA.CODIGO_USUARIO,
       CAIXA.DATA_ABERTURA,
       CAIXA.DATA_FECHAMENTO,
       VENDAS.CODIGO_CAIXA
  FROM
       VENDAS_PAGAMENTO,
       VENDAS,
       CAIXA,
       USUARIOS,
       CLIENTES

  WHERE
       VENDAS_PAGAMENTO.CODIGO_CAIXA = :CODIGO_CAIXA_ENTRADA AND
       VENDAS.CODIGO = VENDAS_PAGAMENTO.CODIGO AND
       CAIXA.CODIGO = VENDAS_PAGAMENTO.CODIGO_CAIXA AND
       VENDAS_PAGAMENTO.ANULADO_NO_CAIXA_VENDA IS NULL AND
       ( VENDAS_PAGAMENTO.CODIGO_CAIXA_NEGOCIACAO <>
       VENDAS_PAGAMENTO.CODIGO_CAIXA OR
       VENDAS_PAGAMENTO.CODIGO_CAIXA_NEGOCIACAO IS NULL ) AND
       VENDAS.TIPO IS NULL AND
       VENDAS.CANCELADO IS NULL AND
       USUARIOS.CODIGO = VENDAS.CODIGO_USUARIO AND
       CLIENTES.CODIGO = VENDAS.CODIGO_CLIENTE

  ORDER BY
       VENDAS_PAGAMENTO.DESCRICAO,
       VENDAS.DATA_HORA,
       VENDAS.HORA

  INTO
       :DATA_HORA,
       :HORA,
       :CODIGO_CLIENTE,
       :CLIENTE_NOME,
       :CODIGO,
       :NUMERO_PARCELA,
       :DATA_VENCIMENTO,
       :VALOR_PARCELA,
       :PAGAMENTO_RENEGOCIADO,
       :DESCRICAO,
       :APELIDO,
       :CODIGO_USUARIO,
       :DATA_ABERTURA,
       :DATA_FECHAMENTO,
       :CODIGO_CAIXA

 DO BEGIN

       IF ( PAGAMENTO_RENEGOCIADO > 0  ) THEN
         PAGAMENTO_RENEGOCIADO = 'Sim';
       ELSE
         PAGAMENTO_RENEGOCIADO = 'Não';

   SUSPEND;

 END

  /* Inicializa variaveis que não serão Preenchida por esse for select */
  NUMERO_PARCELA = 0;

  FOR SELECT CLIENTES_CREDITOS.VALOR_ALTERADO,
             CLIENTES_CREDITOS.CODIGO_CAIXA,
             CLIENTES_CREDITOS.CODIGO_CLIENTE,
             CLIENTES_CREDITOS.CODIGO_USUARIO,
             CLIENTES_CREDITOS.CODIGO_VENDA,
             VENDAS.DATA_HORA,
             VENDAS.HORA,
             CLIENTES.NOME,
             USUARIOS.APELIDO,
             CAIXA.DATA_ABERTURA,
             CAIXA.DATA_FECHAMENTO,
             VENDAS.CODIGO_CAIXA
        FROM
             CLIENTES_CREDITOS,
             VENDAS,
             CLIENTES,
             USUARIOS,
             CAIXA
       WHERE
             CLIENTES_CREDITOS.CODIGO_CAIXA = :CODIGO_CAIXA_ENTRADA AND
             CAIXA.CODIGO = :CODIGO_CAIXA_ENTRADA AND
             CLIENTES_CREDITOS.CODIGO_VENDA = VENDAS.CODIGO AND
             CLIENTES_CREDITOS.CODIGO_USUARIO = USUARIOS.CODIGO AND
             CLIENTES_CREDITOS.CODIGO_CLIENTE = CLIENTES.CODIGO
        INTO
             :VALOR_EM_CREDITOS_USADOS,
             :CODIGO_CAIXA,
             :CODIGO_CLIENTE,
             :CODIGO_USUARIO,
             :CODIGO,
             :DATA_HORA,
             :HORA,
             :CLIENTE_NOME,
             :APELIDO,
             :DATA_ABERTURA,
             :DATA_FECHAMENTO,
             :COD_TEMP

   DO BEGIN

    IF ( :VALOR_EM_CREDITOS_USADOS > 0 ) THEN
    BEGIN
      DESCRICAO = 'Crédito do Cliente';
      VALOR_PARCELA = VALOR_EM_CREDITOS_USADOS;
      DATA_VENCIMENTO = DATA_HORA;
    END

    IF ( CODIGO_CAIXA <> COD_TEMP ) THEN
      PAGAMENTO_RENEGOCIADO = 'Sim';
    ELSE
      PAGAMENTO_RENEGOCIADO = 'Não';


    SUSPEND;

  END

END


Obrigado.
Adriano Dolce

Adriano Dolce

Curtidas 0

Respostas

Adriano Dolce

Adriano Dolce

22/07/2011

Creio qui o problema aqui estava na logica da SP ai coloquei mais esta condição e aparentemente resolveu

BEGIN

  SELECT NOME
    FROM RELATORIOS_CONF
    INTO :EMPRESA_NOME;

  FOR SELECT
       VENDAS.DATA_HORA,
       VENDAS.HORA,
       VENDAS.CODIGO_CLIENTE,
       CLIENTES.NOME,
       VENDAS.CODIGO,
       VENDAS_PAGAMENTO.NUMERO_PARCELA,
       VENDAS_PAGAMENTO.DATA_VENCIMENTO,
       VENDAS_PAGAMENTO.VALOR_PARCELA,
       VENDAS_PAGAMENTO.PAGAMENTO_RENEGOCIADO,
       VENDAS_PAGAMENTO.DESCRICAO,
       USUARIOS.APELIDO,
       CAIXA.CODIGO_USUARIO,
       CAIXA.DATA_ABERTURA,
       CAIXA.DATA_FECHAMENTO,
       VENDAS.CODIGO_CAIXA
  FROM
       VENDAS_PAGAMENTO,
       VENDAS,
       CAIXA,
       USUARIOS,
       CLIENTES

  WHERE
       VENDAS_PAGAMENTO.CODIGO_CAIXA = :CODIGO_CAIXA_ENTRADA AND
       VENDAS.CODIGO = VENDAS_PAGAMENTO.CODIGO AND
       CAIXA.CODIGO = VENDAS_PAGAMENTO.CODIGO_CAIXA AND
       VENDAS_PAGAMENTO.ANULADO_NO_CAIXA_VENDA IS NULL AND
       ( VENDAS_PAGAMENTO.CODIGO_CAIXA_NEGOCIACAO <>
       VENDAS_PAGAMENTO.CODIGO_CAIXA OR
       VENDAS_PAGAMENTO.CODIGO_CAIXA_NEGOCIACAO IS NULL ) AND
       VENDAS.TIPO IS NULL AND
       VENDAS.CANCELADO IS NULL AND
       USUARIOS.CODIGO = VENDAS.CODIGO_USUARIO AND
       CLIENTES.CODIGO = VENDAS.CODIGO_CLIENTE

  ORDER BY
       VENDAS_PAGAMENTO.DESCRICAO,
       VENDAS.DATA_HORA,
       VENDAS.HORA

  INTO
       :DATA_HORA,
       :HORA,
       :CODIGO_CLIENTE,
       :CLIENTE_NOME,
       :CODIGO,
       :NUMERO_PARCELA,
       :DATA_VENCIMENTO,
       :VALOR_PARCELA,
       :PAGAMENTO_RENEGOCIADO,
       :DESCRICAO,
       :APELIDO,
       :CODIGO_USUARIO,
       :DATA_ABERTURA,
       :DATA_FECHAMENTO,
       :CODIGO_CAIXA

 DO BEGIN

       IF ( PAGAMENTO_RENEGOCIADO > 0  ) THEN
         PAGAMENTO_RENEGOCIADO = 'Sim';
       ELSE
         PAGAMENTO_RENEGOCIADO = 'Não';

   SUSPEND;

 END

  /* Inicializa variaveis que não serão Preenchida por esse for select */
  NUMERO_PARCELA = 0;

 IF (EXISTS(SELECT * FROM clientes_creditos
 WHERE CLIENTES_CREDITOS.CODIGO_CAIXA = :CODIGO_CAIXA_ENTRADA
 AND clientes_creditos.TIPO_MOVIMENTACAO = '-')) then


      FOR SELECT CLIENTES_CREDITOS.VALOR_ALTERADO,
                 CLIENTES_CREDITOS.CODIGO_CAIXA,
                 CLIENTES_CREDITOS.CODIGO_CLIENTE,
                 CLIENTES_CREDITOS.CODIGO_USUARIO,
                 CLIENTES_CREDITOS.CODIGO_VENDA,
                 VENDAS.DATA_HORA,
                 VENDAS.HORA,
                 CLIENTES.NOME,
                 USUARIOS.APELIDO,
                 CAIXA.DATA_ABERTURA,
                 CAIXA.DATA_FECHAMENTO,
                 VENDAS.CODIGO_CAIXA
            FROM
                 CLIENTES_CREDITOS,
                 VENDAS,
                 CLIENTES,
                 USUARIOS,
                 CAIXA
           WHERE
                 CLIENTES_CREDITOS.CODIGO_CAIXA = :CODIGO_CAIXA_ENTRADA AND
                 CAIXA.CODIGO = :CODIGO_CAIXA_ENTRADA AND
                 CLIENTES_CREDITOS.CODIGO_VENDA = VENDAS.CODIGO AND
                 CLIENTES_CREDITOS.CODIGO_USUARIO = USUARIOS.CODIGO AND
                 CLIENTES_CREDITOS.CODIGO_CLIENTE = CLIENTES.CODIGO
            INTO
                 :VALOR_EM_CREDITOS_USADOS,
                 :CODIGO_CAIXA,
                 :CODIGO_CLIENTE,
                 :CODIGO_USUARIO,
                 :CODIGO,
                 :DATA_HORA,
                 :HORA,
                 :CLIENTE_NOME,
                 :APELIDO,
                 :DATA_ABERTURA,
                 :DATA_FECHAMENTO,
                 :COD_TEMP
    
       DO BEGIN
    
        IF ( :VALOR_EM_CREDITOS_USADOS > 0 ) THEN
        BEGIN
          DESCRICAO = 'Crédito do Cliente';
          VALOR_PARCELA = VALOR_EM_CREDITOS_USADOS;
          DATA_VENCIMENTO = DATA_HORA;
        END
    
        IF ( CODIGO_CAIXA <> COD_TEMP ) THEN
          PAGAMENTO_RENEGOCIADO = 'Sim';
        ELSE
          PAGAMENTO_RENEGOCIADO = 'Não';


    SUSPEND;

  END

END

GOSTEI 0
Adriano Dolce

Adriano Dolce

22/07/2011

Acho que agora assim desta forma esta concluido.

ALTER PROCEDURE SP_REL_VENDAS_PGTS (
    codigo_caixa_entrada integer)
returns (
    data_hora date,
    hora time,
    codigo_cliente integer,
    cliente_nome varchar(70),
    codigo integer,
    numero_parcela integer,
    data_vencimento date,
    valor_parcela double precision,
    pagamento_renegociado char(3),
    apelido varchar(16),
    codigo_usuario integer,
    data_abertura timestamp,
    data_fechamento timestamp,
    codigo_caixa integer,
    empresa_nome varchar(100),
    descricao varchar(100),
    valor_em_creditos_usados double precision)
as
declare variable cod_temp integer;
BEGIN

  SELECT NOME
    FROM RELATORIOS_CONF
    INTO :EMPRESA_NOME;

  FOR SELECT
       VENDAS.DATA_HORA,
       VENDAS.HORA,
       VENDAS.CODIGO_CLIENTE,
       CLIENTES.NOME,
       VENDAS.CODIGO,
       VENDAS_PAGAMENTO.NUMERO_PARCELA,
       VENDAS_PAGAMENTO.DATA_VENCIMENTO,
       VENDAS_PAGAMENTO.VALOR_PARCELA,
       VENDAS_PAGAMENTO.PAGAMENTO_RENEGOCIADO,
       VENDAS_PAGAMENTO.DESCRICAO,
       USUARIOS.APELIDO,
       CAIXA.CODIGO_USUARIO,
       CAIXA.DATA_ABERTURA,
       CAIXA.DATA_FECHAMENTO,
       VENDAS.CODIGO_CAIXA
  FROM
       VENDAS_PAGAMENTO,
       VENDAS,
       CAIXA,
       USUARIOS,
       CLIENTES

  WHERE
       VENDAS_PAGAMENTO.CODIGO_CAIXA = :CODIGO_CAIXA_ENTRADA AND
       VENDAS.CODIGO = VENDAS_PAGAMENTO.CODIGO AND
       CAIXA.CODIGO = VENDAS_PAGAMENTO.CODIGO_CAIXA AND
       VENDAS_PAGAMENTO.ANULADO_NO_CAIXA_VENDA IS NULL AND
       ( VENDAS_PAGAMENTO.CODIGO_CAIXA_NEGOCIACAO <>
       VENDAS_PAGAMENTO.CODIGO_CAIXA OR
       VENDAS_PAGAMENTO.CODIGO_CAIXA_NEGOCIACAO IS NULL ) AND
       VENDAS.TIPO IS NULL AND
       VENDAS.CANCELADO IS NULL AND
       USUARIOS.CODIGO = VENDAS.CODIGO_USUARIO AND
       CLIENTES.CODIGO = VENDAS.CODIGO_CLIENTE

  ORDER BY
       VENDAS_PAGAMENTO.DESCRICAO,
       VENDAS.DATA_HORA,
       VENDAS.HORA

  INTO
       :DATA_HORA,
       :HORA,
       :CODIGO_CLIENTE,
       :CLIENTE_NOME,
       :CODIGO,
       :NUMERO_PARCELA,
       :DATA_VENCIMENTO,
       :VALOR_PARCELA,
       :PAGAMENTO_RENEGOCIADO,
       :DESCRICAO,
       :APELIDO,
       :CODIGO_USUARIO,
       :DATA_ABERTURA,
       :DATA_FECHAMENTO,
       :CODIGO_CAIXA

 DO BEGIN

       IF ( PAGAMENTO_RENEGOCIADO > 0  ) THEN
         PAGAMENTO_RENEGOCIADO = 'Sim';
       ELSE
         PAGAMENTO_RENEGOCIADO = 'Não';

   SUSPEND;

 END

  /* Inicializa variaveis que não serão Preenchida por esse for select */
  NUMERO_PARCELA = 0;

 IF (NOT EXISTS(SELECT *
            FROM
               CLIENTES_CREDITOS
            WHERE
               CLIENTES_CREDITOS.CODIGO_CAIXA = :CODIGO_CAIXA_ENTRADA
            AND
               CLIENTES_CREDITOS.TIPO_MOVIMENTACAO = '+')) THEN


      FOR SELECT CLIENTES_CREDITOS.VALOR_ALTERADO,
                 CLIENTES_CREDITOS.CODIGO_CAIXA,
                 CLIENTES_CREDITOS.CODIGO_CLIENTE,
                 CLIENTES_CREDITOS.CODIGO_USUARIO,
                 CLIENTES_CREDITOS.CODIGO_VENDA,
                 VENDAS.DATA_HORA,
                 VENDAS.HORA,
                 CLIENTES.NOME,
                 USUARIOS.APELIDO,
                 CAIXA.DATA_ABERTURA,
                 CAIXA.DATA_FECHAMENTO,
                 VENDAS.CODIGO_CAIXA
            FROM
                 CLIENTES_CREDITOS,
                 VENDAS,
                 CLIENTES,
                 USUARIOS,
                 CAIXA
           WHERE
                 CLIENTES_CREDITOS.CODIGO_CAIXA = :CODIGO_CAIXA_ENTRADA AND
                 CAIXA.CODIGO = :CODIGO_CAIXA_ENTRADA AND
                 CLIENTES_CREDITOS.CODIGO_VENDA = VENDAS.CODIGO AND
                 CLIENTES_CREDITOS.CODIGO_USUARIO = USUARIOS.CODIGO AND
                 CLIENTES_CREDITOS.CODIGO_CLIENTE = CLIENTES.CODIGO
            INTO
                 :VALOR_EM_CREDITOS_USADOS,
                 :CODIGO_CAIXA,
                 :CODIGO_CLIENTE,
                 :CODIGO_USUARIO,
                 :CODIGO,
                 :DATA_HORA,
                 :HORA,
                 :CLIENTE_NOME,
                 :APELIDO,
                 :DATA_ABERTURA,
                 :DATA_FECHAMENTO,
                 :COD_TEMP
    
    DO BEGIN
    
        IF ( :VALOR_EM_CREDITOS_USADOS > 0 ) THEN
        BEGIN
          DESCRICAO = 'Crédito do Cliente';
          VALOR_PARCELA = VALOR_EM_CREDITOS_USADOS;
          DATA_VENCIMENTO = DATA_HORA;
        END
    
        IF ( CODIGO_CAIXA <> COD_TEMP ) THEN
          PAGAMENTO_RENEGOCIADO = 'Sim';
        ELSE
          PAGAMENTO_RENEGOCIADO = 'Não';


        SUSPEND;

    END

END

GOSTEI 0
POSTAR