Fórum Construir um SQL ou SP. de contas com saldos anter #57707
18/01/2007
0
Tenho duas tabelas uma chamada debito e outra credito
a estrutura de cada uma eh assim
Tabela Debito
sequencia, (I) fk
ano, (v) 4
data, date
conta_d (v) 15
valor (n) 15,2
DC (v) 1
e a tabela Credito
sequencia, (I) fk
ano, (v) 4
data, date
conta_C (v) 15
valor (n) 15,2
DC (v) 1
as duas recebem o mesmo dados iguais referente a tabela mestre(Movimento).
Tipo assim
Debito
Sequencia|ano--------|data---------------|conta_D---|valor
1----------2006--------31/01/2006--------151----------60,00
2----------2006--------28/02/2006---------25----------30,00
Credito
Sequencia|ano--------|data---------------|conta_C---|valor
1----------2006--------31/01/2006-------- 6----------60,00
2----------2006--------28/02/2006--------- 6----------30,00
Ai quero ver se eh possivel criar uma query(SQL) ou Stored Procedure das duas tabelas puchando os saldos cfe. a conta que eu digitar num edit
Nao sei como montar com as duas tabelas
tipo sair assim:
se eu digitar a conta 6 por exemplo (essa conta pode estar tanto no campo conta_d como conta_c Aqui que me enrrosquei)
ai jogar os saldos numa tabela
data---------|conta------|saldo anterior|debito-----|credito----|saldo atual
31/01/06-------6---------------0,00--------0,00--------90,00--------90,00
e assim por diante
Nao tenho a minima ideia como fazer.
No aguardo
Grato a todos
Adriano.
Adriano_servitec
Curtir tópico
+ 0Posts
18/01/2007
Emerson Nascimento
não entendi direito a saída de informações.
porque o saldo anterior para a conta 6 é 0 (zero) e o saldo nesse dia é 90? o saldo não deveria ser 60?
ou o correto não deveria ser
data---------|conta------|saldo anterior|debito-----|credito----|saldo atual
28/02/2006-------6---------------60,00--------0,00-------30,00-------90,00
?
explique melhor...
Gostei + 0
18/01/2007
Adriano_servitec
Queria uma SP + ou - assim
set term ^ ; create procedure sp_saldoconta( conta integer ) returns ( saldo numeric(15,2) ) declare variable credito numeric(15,2); declare variable debito numeric(15,2); begin select coalesce( sum( valor ) , 0 ) from Credito where conta_c = :conta into :credito; select coalesce( sum( valor ) , 0 ) from Debito where conta_d = :conta into :debito; saldo = credito - debito; suspend; end ^ set term ; ^
Gostei + 0
19/01/2007
Emerson Nascimento
CREATE PROCEDURE SALDO_CONTA ( conta varchar(15), datainicial date) returns ( data date, contamovimentada varchar(15), saldoanterior numeric(15,2), credito numeric(15,2), debito numeric(15,2), saldoatual numeric(15,2)) as declare variable valorcredito numeric(15,2); declare variable valordebito numeric(15,2); declare variable datafinal date; begin data = datainicial; contamovimentada = conta; -- datafinal será sempre a data atual do sistema -- datafinal = current_date; -- ************************************************************** -- estas linhas estão fora do while para que sejam -- * -- executadas apenas 1 vez, aumentando a performance. -- * -- depois apenas faço a soma dos valores obtidos dia a dia -- * -- para sempre obter o saldo anterior correto -- * -- ************************************************************** select coalesce(sum(valor),0) -- * from credito -- * where conta_c = :conta and data < :data into :valorcredito; -- * -- * select coalesce(sum(valor),0) -- * from debito -- * where conta_d = :conta and data < :data into :valordebito; -- * -- * -- obtenho o saldo anterior subtraindo o débito do crédito -- * saldoanterior = valorcredito - valordebito; -- * -- ************************************************************** -- verifico o movimento dia a dia, até o dia anterior à data atual while (data < datafinal) do begin -- somo os créditos do dia select coalesce(sum(valor),0) from credito where conta_c = :conta and data = :data into :credito; -- somo os débitos do dia select coalesce(sum(valor),0) from debito where conta_d = :conta and data = :data into :debito; saldoatual = saldoanterior + (credito - debito); -- se houve algum movimento no dia, exibo o registro if ((credito > 0) or (debito > 0)) then suspend; data = data + 1; saldoanterior = saldoanterior + (credito - debito); end -- somo os créditos da data atual select coalesce(sum(valor),0) from credito where conta_c = :conta and data = :data into :credito; -- somo os débitos da data atual select coalesce(sum(valor),0) from debito where conta_d = :conta and data = :data into :debito; saldoatual = saldoanterior + (credito - debito); -- exibe o registro com o saldo do dia atual suspend; end
seguindo o exemplo que você passou:
se o extrato fosse tirado hoje ([b:b35e697c83]19/01/2007[/b:b35e697c83]), com data inicial em 01/[b:b35e697c83]01[/b:b35e697c83]/2006, o resultado seria:
data |conta |saldo anterior | debito | credito | saldo atual 31/01/06 6 0,00 0,00 60,00 60,00 28/02/06 6 60,00 0,00 30,00 90,00 31/03/06 6 90,00 40,00 0,00 50,00 30/04/06 6 50,00 60,00 0,00 -10,00 19/01/07 6 -10,00 0,00 0,00 -10,00
se o extrato fosse tirado hoje ([b:b35e697c83]19/01/2007[/b:b35e697c83]), com data inicial em 01/[b:b35e697c83]03[/b:b35e697c83]/2006, o resultado seria:
data |conta |saldo anterior | debito | credito | saldo atual 31/03/06 6 90,00 40,00 0,00 50,00 30/04/06 6 50,00 60,00 0,00 -10,00 19/01/07 6 -10,00 0,00 0,00 -10,00
[b:b35e697c83]o dia 19/01/2007 sempre é exibido porque é a data atual (apesar de não ter lançamentos), para que se saiba o saldo real da conta, da mesma forma que os extratos bancários[/b:b35e697c83]
veja se isso te ajuda e/ou adapte para a sua necessidade.
Gostei + 0
19/01/2007
Adriano_servitec
Muitíssimo obrigado Emerson, eh do jeito que eu preciso.
Mais, tenho uma pergunta
o que significa este erro
Eu nao sei nada de SP, desculpe o tipo de pergunta.
Gostei + 0
19/01/2007
Adriano_servitec
Valeu amigo, acho que agora posso continuar
Mais uma vez muito obrigado.
Gostei + 0
19/01/2007
Adriano_servitec
Soh mais uma pergunta amigo, como chamo esta SP no form?
Usando um IBQuery
e pra mostrar os extratos no dbgrid fazendo filtros usando maskedits para data e edit para a conta que necessito mostrar na tela?
tipo assim tem como mostrar no form um select preenchendo os edits?
Gostei + 0
19/01/2007
Adriano_servitec
Soh mais uma pergunta amigo, como chamo esta SP no form?
Usando um IBQuery
e pra mostrar os extratos no dbgrid fazendo filtros usando maskedits para data e edit para a conta que necessito mostrar na tela?
tipo assim tem como mostrar no form um select preenchendo os edits?
Gostei + 0
19/01/2007
Emerson Nascimento
e passe os parâmetros conforme o critério desejado, da mesma forma que você faz com selects ´normais´.
Gostei + 0
19/01/2007
Adriano_servitec
Muito obrigado pela ajuda amigo, ficou show :D
Valeu mesmo amigo, era o que eu precisava, alem de estar aprendendo como se criar SP e Trigger.
Gostei + 0
19/01/2007
Adriano_servitec
Grato pela ajuda.
Gostei + 0
19/01/2007
Emerson Nascimento
Gostei + 0
19/01/2007
Adriano_servitec
Tipo assim
if saldoatual < 0 then
campoDC = ´D´
else
campoDC = ´C´;
ou dentro do form?
Gostei + 0
19/01/2007
Adriano_servitec
SET TERM ^ ; CREATE PROCEDURE SALDO_TODASCONTA ( CONTA VARCHAR(15), DATAINICIAL DATE) RETURNS ( DATA DATE, CONTAMOVIMENTADA VARCHAR(15), SALDOANTERIOR NUMERIC(15,2), CREDITO NUMERIC(15,2), DEBITO NUMERIC(15,2), DC VARCHAR(1), SALDOATUAL NUMERIC(15,2)) AS DECLARE VARIABLE VALORCREDITO NUMERIC(15,2); DECLARE VARIABLE VALORDEBITO NUMERIC(15,2); DECLARE VARIABLE DATAFINAL DATE; begin data = datainicial; contamovimentada = conta; -- datafinal será sempre a data atual do sistema -- datafinal = current_date; -- ************************************************************** -- estas linhas estão fora do while para que sejam -- * -- executadas apenas 1 vez, aumentando a performance. -- * -- depois apenas faço a soma dos valores obtidos dia a dia -- * -- para sempre obter o saldo anterior correto -- * -- *********************************************************************** select coalesce(sum(valor),0) -- * from credito_mestotal -- * where conta_c = :conta and datalcto < :data into :valorcredito; -- * -- * select coalesce(sum(valor),0) -- * from debito_mestotal -- * where conta_d = :conta and datalcto < :data into :valordebito; -- * -- * -- obtenho o saldo anterior subtraindo o débito do crédito -- * saldoanterior = valorcredito - valordebito; -- * -- *********************************************************************** -- verifico o movimento dia a dia, até o dia anterior à data atual while (data < datafinal) do begin -- somo os créditos do dia select coalesce(sum(valor),0) from credito_mestotal where conta_c = :conta and datalcto = :data into :credito; -- somo os débitos do dia select coalesce(sum(valor),0) from debito_mestotal where conta_d = :conta and datalcto = :data into :debito; saldoatual = saldoanterior + (credito - debito); -- se o saldo atual for maior que zero if (saldoatual > 0) then dc = ´D´; else dc = ´C´; -- se houve algum movimento no dia, exibo o registro if ((credito > 0) or (debito > 0)) then suspend; data = data + 1; saldoanterior = saldoanterior + (credito - debito); end -- somo os créditos da data atual select coalesce(sum(valor),0) from credito_mestotal where conta_c = :conta and datalcto = :data into :credito; -- somo os débitos da data atual select coalesce(sum(valor),0) from debito_mestotal where conta_d = :conta and datalcto = :data into :debito; saldoatual = saldoanterior + (credito - debito); -- se o saldo atual for maior que zero if (saldoatual > 0) then dc = ´D´; else dc = ´C´; -- exibe o registro com o saldo do dia atual suspend; end^ SET TERM ; ^ GRANT SELECT ON CREDITO_MESTOTAL TO PROCEDURE SALDO_TODASCONTA; GRANT SELECT ON DEBITO_MESTOTAL TO PROCEDURE SALDO_TODASCONTA; GRANT EXECUTE ON PROCEDURE SALDO_TODASCONTA TO SYSDBA;
Agora estou aprendendo mais ainda sobre SP
Mais uma vez muito obrigado pela ajuda ai amigo
Abraços
Adriano.
Gostei + 0
20/01/2007
Adriano_servitec
[b:aad4bc7326]Estrutura do plano de contas[/b:aad4bc7326]
Alguem sabe como fazer isso?
To quebrando a cabeça aqui e nao tenho uma ideia fixa.
Gostei + 0
24/01/2007
Adriano_servitec
Sobe...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)