GARANTIR DESCONTO

Fórum Construir um SQL ou SP. de contas com saldos anter #57707

18/01/2007

0

Olah pessoal, bom minha duvida eh o seguinte

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

Adriano_servitec

Responder

Posts

18/01/2007

Emerson Nascimento

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

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...


Responder

Gostei + 0

18/01/2007

Adriano_servitec

Olah Emerson, eh isso, mesmo o problema eh que nao soube explicar certo, bom eh o seguinte queria que fosse somando mes a mes e dando o saldo, eh para um programa de contabilidade que estou tentando fazer. Ai quando for pesquisar uma conta ele me retorna o saldo entre as duas tabelas.

A ideia seria uma consulta + ou - assim referente algum periodo data---------|conta------|saldo anterior|debito-----|credito----|saldo atual 31/01/06-------6---------------0,00--------0,00--------[color=green:6932b70ac6]60,00[/color:6932b70ac6]--------[color=blue:6932b70ac6]60,00[/color:6932b70ac6] 28/02/06-------6--------------[color=blue:6932b70ac6]60,00[/color:6932b70ac6]--------0,00--------[color=green:6932b70ac6]30,00[/color:6932b70ac6]--------[color=blue:6932b70ac6]90,00[/color:6932b70ac6] 31/03/06-------6--------------[color=blue:6932b70ac6]90,00[/color:6932b70ac6]-------[color=red:6932b70ac6]40,00[/color:6932b70ac6]---------0,00--------[color=blue:6932b70ac6]50,00[/color:6932b70ac6] 30/04/06-------6--------------[color=blue:6932b70ac6]50,00[/color:6932b70ac6]-------[color=red:6932b70ac6]60,00[/color:6932b70ac6]---------0,00--------[color=red:6932b70ac6](10,00)[/color:6932b70ac6] Pode ser mostrado em uma dbgrid ou similar. Obrigado por me ajudar.

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



Responder

Gostei + 0

19/01/2007

Emerson Nascimento

essa procedure exibe o extrato de uma conta, a partir de uma data informada, exibindo dia a dia, até o dia atual.
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:
A ideia seria uma consulta + ou - assim referente algum periodo data---------|conta------|saldo anterior|debito-----|credito----|saldo atual 31/01/06-------6---------------0,00--------0,00--------[color=green:b35e697c83]60,00[/color:b35e697c83]--------[color=blue:b35e697c83]60,00[/color:b35e697c83] 28/02/06-------6--------------[color=blue:b35e697c83]60,00[/color:b35e697c83]--------0,00--------[color=green:b35e697c83]30,00[/color:b35e697c83]--------[color=blue:b35e697c83]90,00[/color:b35e697c83] 31/03/06-------6--------------[color=blue:b35e697c83]90,00[/color:b35e697c83]-------[color=red:b35e697c83]40,00[/color:b35e697c83]---------0,00--------[color=blue:b35e697c83]50,00[/color:b35e697c83] 30/04/06-------6--------------[color=blue:b35e697c83]50,00[/color:b35e697c83]-------[color=red:b35e697c83]60,00[/color:b35e697c83]---------0,00--------[color=red:b35e697c83](10,00)[/color:b35e697c83]

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.


Responder

Gostei + 0

19/01/2007

Adriano_servitec

Primeiramente.
Muitíssimo obrigado Emerson, eh do jeito que eu preciso.

Mais, tenho uma pergunta
o que significa este erro
The next statement causes the following error: Undefined name. Dynamic SQL Error. SQL error code = -204. Table unknown. CREDITO. At line 29, column 3.


Eu nao sei nada de SP, desculpe o tipo de pergunta.


Responder

Gostei + 0

19/01/2007

Adriano_servitec

Opa, desculpe, ja descobri era o nome da tabela que eu mudei :oops:

Valeu amigo, acho que agora posso continuar

Mais uma vez muito obrigado.


Responder

Gostei + 0

19/01/2007

Adriano_servitec

Bom amigo, a SP esta criada, tive que mudar os nomes das tabelas pq tinha mudado aqui. :D

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?


Responder

Gostei + 0

19/01/2007

Adriano_servitec

Bom amigo, a SP esta criada, tive que mudar os nomes das tabelas pq tinha mudado aqui. :D

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?


Responder

Gostei + 0

19/01/2007

Emerson Nascimento

select * from SALDO_CONTA( :Conta, :DataInicial )
e passe os parâmetros conforme o critério desejado, da mesma forma que você faz com selects ´normais´.


Responder

Gostei + 0

19/01/2007

Adriano_servitec

select * from SALDO_CONTA( :Conta, :DataInicial ) e passe os parâmetros conforme o critério desejado, da mesma forma que você faz com selects ´normais´.


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.


Responder

Gostei + 0

19/01/2007

Adriano_servitec

So mais uma duvida amigo, eu posso colocar mais um campo aonde se o saldo atual for credor apareça [b:eba1e56c81]C[/b:eba1e56c81] e se for saldo devedor apareça [b:eba1e56c81]D[/b:eba1e56c81]

Grato pela ajuda.


Responder

Gostei + 0

19/01/2007

Emerson Nascimento

claro. altere como quiser.


Responder

Gostei + 0

19/01/2007

Adriano_servitec

Mais entao eu coloco um tipo de IF no SP? Eh isso?

Tipo assim

if saldoatual < 0 then
campoDC = ´D´
else
campoDC = ´C´;

ou dentro do form?


Responder

Gostei + 0

19/01/2007

Adriano_servitec

Consegui amigo :D
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.


Responder

Gostei + 0

20/01/2007

Adriano_servitec

surgiu a necessidade de criar outra Stored procedure com os mesmos efeitos soh que para gerar balançetes num plano de contas ai preciso que seja + ou - assim (Achei este modelo de plano aqui no forum)
[b:aad4bc7326]Estrutura do plano de contas[/b:aad4bc7326]
CODIGO VARCHAR(4) NOT NULL, DESCRICAO VARCHAR(60) NOT NULL, NIVEL VARCHAR(10) NOT NULL, CONTA INTEGER de preferencia varchar NIVEL varchar(1)) tenho uma tabela de movimentacao de Caixa DATA DATA NOT NULL, CONTA INTEGER NOT NULL, VALOR NUMERIC(9,2) as 2 tabelas fazen junção com o campo CONTA que existem em ambas as tabelas Agora preciso tirar meu plano de Contas como segue a imagem e colocar os totais nas contas cabeças igual contabilidade, como segue o exemplo; 1 . Pagamentos 1.1 - Pagamento Funcionarios 1.1.1 - Pagamento de Funcionarios da Empresa 1.1.1.1 Salario 1.1.1.2 13º Salario 1.1.1.3 Ferias 1.1.1.4 Horas Extras Se Tiver feito pagamento de 1.000 vai ser distribuido nas suas sub-contas 1 . Pagamentos 1.000,00 1.1 - Pagamento Funcionarios 800,00 1.1.1 - Pagamento de Funcionarios da Empresa 800,00 1.1.1.1 Salario 400,00 1.1.1.2 13º Salario 200,00 1.1.1.3 Ferias 150,00 1.1.1.4 Horas Extras 50,00 -------------------------------------------------------------- Total 800,00 1.2 - Pagamento Impostos 200.00 1.2.1 - Pagamento de Imposto de Salario 200.00 1.2.1.1 - INSS 80,00 1.2.1.2 - FGTS 90,00 1.2.1.3 - Imposto Diversos 30,00 ---------------------------------------------------------------------- Total 200.00 preciso fazer a somatoria das sub-contas e jogar o total das sub-contas nas contas principais.
Podem ver que as somais totais referem-se ao nivel da conta, mais no caso nao quero somente o total e sim como a StoredProcedure acima tendo SALDO ANTERIOR -- DEBITO -- CREDITO -- SALDO ATUAL, mais nas suas devidas contas nos devidos niveis.

Alguem sabe como fazer isso?
To quebrando a cabeça aqui e nao tenho uma ideia fixa.


Responder

Gostei + 0

24/01/2007

Adriano_servitec

alguem pode me ajudar?

Sobe...


Responder

Gostei + 0

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

Aceitar