Stored procedure esta duplicando o valor?
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
Obrigado.
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
Curtidas 0
Respostas
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
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