ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Ajuda com Procedure Livro Caixa

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
renanbg
Mestre
Mestre


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 837

MensagemEnviada: Qui Ago 31, 2017 10:36 am    Assunto: Ajuda com Procedure Livro Caixa Responder com Citação

Amigos, tenho um sistema antigo que tem 2 procedures, que trabalham em conjunto, para listar o livro caixa. Não consegui entender direito o motivo disso, pois não fui eu quem fez.

Alguém consegue me explicar o motivo e dizer se tem como fazer apenas 1?

Procedure 1

Código:
SET TERM ^ ;

create or alter procedure SP_LISTAITM (
    BANCOCTA varchar(50),
    DATINI date,
    DATFIM date)
returns (
    BANCO varchar(50),
    DATA date,
    DESCRICAO varchar(100),
    OBS varchar(100),
    VALORDEB numeric(15,2),
    VALORCRE numeric(15,2))
as
declare variable DATAINI date;
declare variable DATAFIM date;
declare variable DATASALDO date;
declare variable VALOR decimal(15,2);
declare variable NATUREZA char(1);
BEGIN
  /* Busca dados da conta: Data de referencia e saldo inicial */
  SELECT DATA FROM TBBANCOS
  WHERE NOME = :BANCOCTA
  INTO DATASALDO;

  /* Se a data inicial pedida for nula, considera a data de referencia da conta */
  IF (DATINI IS NULL) THEN
     DATINI = :DATASALDO;

  /* Se a data final pedida for nula, considera a data de hoje */
  IF (DATFIM IS NULL) THEN
     DATFIM = CURRENT_TIMESTAMP;

  /* Se a data inicial pedida for inferior a data de referencia, considera como data inicial a data de referencia */
  DATAINI = :DATINI;
  IF (DATASALDO > DATINI) THEN
     DATAINI = :DATASALDO;
 
  DATAFIM = :DATFIM;
  IF (DATASALDO > DATAFIM) THEN
     DATAFIM = :DATASALDO;
 
  IF (BANCOCTA IS NULL OR DATASALDO IS NULL OR BANCOCTA = '') THEN BEGIN
     /* Se a conta nao for encontrada ou nao fornecida, retorna registro em branco */
     BANCO = '';
     DATA = NULL;
     DESCRICAO = '';
     OBS = '';
     VALORDEB = 0;
     VALORCRE = 0;

     SUSPEND;
  END ELSE BEGIN
     /* Busca todos os registros de movimento da conta especificada e dentro do periodo especificado */
     FOR SELECT NOME_BANCO, DATA, VALOR, TIPO, LANCAMENTO, OBS
         FROM TBHISTORICO_BANCOS
         WHERE NOME_BANCO = :BANCOCTA AND
               DATA >= :DATAINI AND
               DATA <= :DATAFIM
         INTO BANCO, DATA, VALOR, NATUREZA, DESCRICAO, OBS
     DO BEGIN
        VALORDEB = 0;
        VALORCRE = 0;

        /* Natureza. 0= Debito, 1= Credito */
        IF (NATUREZA = 'D') THEN
           VALORDEB = :VALOR;
        ELSE
           VALORCRE = :VALOR;

        SUSPEND;
     END
  END
END^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT SELECT ON TBBANCOS TO PROCEDURE SP_LISTAITM;
GRANT SELECT ON TBHISTORICO_BANCOS TO PROCEDURE SP_LISTAITM;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_LISTAITM TO SYSDBA;


procedure 2
Código:
SET TERM ^ ;

create or alter procedure SP_LISTA (
    BANCOCTA varchar(50),
    DATINI date,
    DATFIM date)
returns (
    BANCO varchar(50),
    DATA date,
    DESCRICAO varchar(100),
    OBS varchar(100),
    VALORDEB numeric(15,2),
    VALORCRE numeric(15,2),
    SALDO numeric(15,2))
as
declare variable DATAINI date;
declare variable DATAFIM date;
declare variable DATASALDO date;
declare variable VALOR decimal(15,2);
declare variable NATUREZA char(1);
BEGIN
  /* Busca dados da conta: Data de referencia e saldo inicial */
  SELECT DATA, SALDOINI FROM TBBANCOS
  WHERE NOME = :BANCOCTA
  INTO DATASALDO, SALDO;

  /* Se a data inicial pedida for nula, considera a data de referencia da conta */
  IF (DATINI IS NULL) THEN
     DATINI = :DATASALDO;

  /* Se a data final pedida for nula, considera a data de hoje */
  IF (DATFIM IS NULL) THEN
     DATFIM = CURRENT_TIMESTAMP;

  /* Se a data inicial pedida for inferior a data de referencia, considera como data inicial a data de referencia */
  DATAINI = :DATINI;
  IF (DATASALDO > DATINI) THEN
     DATAINI = :DATASALDO;
 
  DATAFIM = :DATFIM;
  IF (DATASALDO > DATAFIM) THEN
     DATAFIM = :DATASALDO;
 
  IF (BANCOCTA IS NULL OR DATASALDO IS NULL OR BANCOCTA = '') THEN BEGIN
     /* Se a conta nao for encontrada ou nao fornecida, retorna registro em branco */
     BANCO = '';
     DATA = NULL;
     DESCRICAO = '';
     OBS = '';
     VALORDEB = 0;
     VALORCRE = 0;
     SALDO = 0;

     SUSPEND;
  END ELSE BEGIN
     /* Busca todos os lancamentos antes da data inicial pedida para calculo do saldo inicial */
     FOR SELECT VALOR, TIPO FROM TBHISTORICO_BANCOS
         WHERE NOME_BANCO = :BANCOCTA AND
               DATA    >= :DATASALDO AND
               DATA    <  :DATAINI
         INTO VALOR, NATUREZA
     DO BEGIN
        IF (NATUREZA = 'D') THEN
           SALDO = :SALDO - :VALOR;
        ELSE
           SALDO = :SALDO + :VALOR;
     END

     /* Monta registro de saldo inicial */
     BANCO     = '';
     DATA      = :DATAINI;
     DESCRICAO = 'SALDO INICIAL';
     OBS       = '';
     VALORDEB  = 0;
     VALORCRE  = 0;
     SUSPEND;

     FOR SELECT BANCO,
                DATA,
                DESCRICAO,
                OBS,
                VALORDEB,
                VALORCRE
         FROM SP_LISTAITM(:BANCOCTA,  :DATAINI,  :DATAFIM)
         ORDER BY DATA
         INTO BANCO, DATA, DESCRICAO, OBS, VALORDEB, VALORCRE
     DO BEGIN
        /* Atualiza o saldo */
        SALDO = :SALDO + :VALORCRE - :VALORDEB;
        SUSPEND;
     END
  END
END^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT SELECT ON TBBANCOS TO PROCEDURE SP_LISTA;
GRANT SELECT ON TBHISTORICO_BANCOS TO PROCEDURE SP_LISTA;
GRANT EXECUTE ON PROCEDURE SP_LISTAITM TO PROCEDURE SP_LISTA;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_LISTA TO SYSDBA;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10157
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qui Ago 31, 2017 9:10 pm    Assunto: Responder com Citação

Ter uma maneira de ser somente uma, tem jeito sim, mas te dará um pouco de trabalho para fazer isto na aplicação, já que terá de mudar algumas coisas nela, dependendo de quantas vezes esta sp é chamada.


No caso você pode chamar tipo uma operação, criando um parâmetro de entrada tipo char(1), como por exemplos op char(1)

e depois do END ELSE BEGIN

Código:
if (op = 'L') then
begin
    // código da primeira função depois do else begin aqui...
end
else
begin
    // outro código da segunda função depois do else begin aqui...
end

Assim você teria apenas uma função para atender a todos, pois em essência parece-me que ela é bem dizer idêntica a não ser por este else begin.


Eis um exemplo que tirei de outro banco:

Código:
  IF (OP = 'S1') THEN 
  BEGIN
    OP = 'S';
    SELECT TIPO
      FROM TIPOSAIDA
     WHERE CODTIPOSAI = :ORIGEM
      INTO :ORIGEM;
  END ELSE
  IF (OP = 'S2') THEN
    OP = 'S';


outro

Código:
    IF (TIPO = 'Devolução') THEN
    BEGIN
      SELECT NOMECLI
        FROM CLIENTE
       WHERE CODCLI = :CODCLI
        INTO :NOMEFORN;
    END ELSE
    BEGIN
      SELECT NOMEFORN
        FROM FORNECEDOR
       WHERE CODFORN = :CODFORN
        INTO :NOMEFORN;
    END



Estes são trechos de código DML e não estão completos, somente para elucidar o que lhe falei.



bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I


Editado pela última vez por johnny-walker em Qui Set 14, 2017 5:17 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
renanbg
Mestre
Mestre


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 837

MensagemEnviada: Sex Set 01, 2017 10:05 am    Assunto: Responder com Citação

Pois é, estou na duvida agora.
Achei algumas procedures no forum, mas elas trazem o livro caixa sem o filtro por conta bancária e preciso disso, para exibir o extrato como se fosse de um banco.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10157
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qui Set 07, 2017 5:26 am    Assunto: Responder com Citação

Neste caso cria-se uma view e extrai-se as informações desta, assim evita-se codificações desnecessárias. Bastando depois filtrar pela conta o retorno da sal.
Também pode-se criar uma SP que já retorna desta forma.


Bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
renanbg
Mestre
Mestre


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 837

MensagemEnviada: Seg Set 11, 2017 10:17 am    Assunto: Responder com Citação

Hum, acho que vou ficar nas 2 procedures mesmo.

Obrigado pelas dicas.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Mestre
Mestre


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 837

MensagemEnviada: Qua Set 13, 2017 2:23 pm    Assunto: Responder com Citação

Ainda buscando uma forma de trabalhar com uma unica procedure...
Achei essa dica do colega adriano.

http://www.activedelphi.com.br/forum/viewtopic.php?t=44209&sid=c07e221ca3201f32fd540c48c212533c

Porém não consigo adaptar a minha tabela.

minha estrutura é na tabela MOVIMENTACAO

Código:
codigo integer
cod_conta integer
data
lancamento varchar(40)
tipo char (1) //credito ou debito
valor
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Mestre
Mestre


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 837

MensagemEnviada: Qui Set 14, 2017 7:33 am    Assunto: Responder com Citação

Aqui tem um espelho com os dados da minha tabela, pra facilitar o entendimento.

Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB