Construir um SQL ou SP. de contas com saldos anter

Firebird

18/01/2007

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

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

18/01/2007

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


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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



GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/01/2007

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.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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?


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/01/2007

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


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/01/2007

claro. altere como quiser.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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?


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

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.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

alguem pode me ajudar?

Sobe...


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Olah pessoal
Bom vou explicar melhor o que eu preciso:

Tenho uma tabela que esta gravando assim

n1..n2....nivel3..nivel4....n6...n7....nivel8...nivel9.....valor
1....11....1101...110101...1....12....1201....120101...30,00
1....11....1102...110102...2....21....2101....210101...93,00

ai preciso que acumulam a soma de valor cfe.a conta

1-123,00
11-123,00
1101-30,00
1102-93,00
110101-30,00
110102-93,00
12-30,00
1201-30,00
120101-30,00
2-93,00
21-93,00
2101-93,00
210101-93,00

Ai preciso fazer uma SP + ou - igual a que o Emerson postou aqui, com saldo anterior, debito, credito, saldo atual, soh que em vez de fazer pesquisa por numero da conta vai ter que sair de todas as contas, e neste caso teria que ter data inicial e data final da pesquisa, lembrando que nesta tabela tambem vai um campo de data.


Bom acho que eh isso amigos


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Tentando melhorar meu post resolvi fazer somente a soma de duas contas

Tenho gravado no banco assim:
data     nivel1 D     nivel2 C            valor 
31/01/2006  1              2              30,00 
31/01/2006  1              1              45,00 
28/02/2006  2              1              12,00


Reparem que tem duas contas diferentes em dois niveis o nivel1D e nivel2C
31/01/2006 [color=blue:1c19925f66]1[/color:1c19925f66] [color=red:1c19925f66]2[/color:1c19925f66] 30,00 31/01/2006 [color=blue:1c19925f66]1 1[/color:1c19925f66] 45,00 28/02/2006 [color=red:1c19925f66]2[/color:1c19925f66] [color=blue:1c19925f66]1[/color:1c19925f66] 12,00


Ai preciso fazer uma soma de agrupamento de contas saldo anterior+debito-credito=saldo atual.

E tem que gerar um resultado assim:
resultado
data.....nivel.....sal.ant.....debito.....credito.....sal.atual 31/jan...1...........-...........75,00.......45,00.........30,00 31/jan...2...........-..............-...........30,00........(30,00) 28/fev...1..........30,00........-...........12,00...........18,00 28/fev...2.........(30,00)....12,00...........-...........(18,00)
Mais nao estou conseguindo fazer, alguem sabe como faço esta soma?

Quero usar dois edits para digitar a conta inicial e final para pesquisar e gerar as somas.


Grato pela ajuda
Adriano


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Estou tentando fazer um SP usando GROUP BY, mais nao consigo
select conta, coalesce(sum(valor),0) from todomesconta
  where datalcto < :data into :valorcredito group by conta;


Apareçe a segunte mensagem de erro:
[color=blue:f957893f29][i:f957893f29]The next statement causes the following error:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 28, column 45.
group.[/i:f957893f29][/color:f957893f29]

Nao pode fazer group by no SP :?:


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/01/2007

a instrução deve ser montada antes de passar o valor...


select conta, coalesce(sum(valor),0) from todomesconta
where datalcto < :data
group by conta
into :conta, :valorcredito;

ou somente:
select coalesce(sum(valor),0) from todomesconta
where datalcto < :data
into :valorcredito;


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Obrigado mais uma vez Emerson, estou tentando fazer um SP para somar esses valores que postei acima, mais nao funciona de forma alguma
CREATE PROCEDURE SALDO_GRAU1 (
    DATAINICIAL DATE)
RETURNS (
    DATA DATE,
    SALDOANTERIOR NUMERIC(15,2),
    CREDITO NUMERIC(15,2),
    DEBITO NUMERIC(15,2),
    DC VARCHAR(1),
    NIVELD VARCHAR(15),
    NIVELC VARCHAR(15),
    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;
  --contamovimentada2= conta2;
  -- 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                 -- *
  -- ***************************************************************
  for select nivel6, nivel1, coalesce(sum(valor),0) from todomesconta
     where datalcto < :data group by nivel6, nivel1
     into :nivelD, :nivelC, :valordebito do

  for select nivel6, nivel1, coalesce(sum(valor),0) from todomesconta
     where datalcto < :data group by nivel6, nivel1
     into :nivelD, :nivelC, :valorcredito do
   -- obtenho o saldo anterior subtraindo o débito do crédito
  saldoanterior = valordebito - valorcredito;
  -- se o saldo atual for maior que zero
  if (saldoatual > 0) then
     dc = ´D´;
  else
     dc = ´C´;
  -- ***********************************************************************

  -- verifico o movimento dia a dia, até o dia anterior à data atual
  while (data < datafinal) do
  begin
    -- somo os créditos do dia
  for select nivel6, nivel1, coalesce(sum(valor),0) from todomesconta
     where datalcto = :data group by nivel6, nivel1
     into :nivelD, :nivelC, :debito do

  for select nivel6, nivel1, coalesce(sum(valor),0) from todomesconta
     where datalcto = :data group by nivel6, nivel1
     into  :nivelD, :nivelC, :credito do
  -- obtenho o saldo atual
     saldoatual = saldoanterior + (debito - credito);

    -- se houve algum movimento no dia, exibo o registro
    if ((credito > 0) or (debito > 0))  then
      suspend;

    data = data + 1;
    saldoanterior = saldoanterior + (debito - credito);
  end

  -- se o saldo atual for maior que zero
  if (saldoatual > 0) then
     dc = ´D´;
  else
     dc = ´C´;

  -- somo os débitos e créditos da data atual
  for select nivel6, nivel1, coalesce(sum(valor),0) from todomesconta
     where datalcto = :data group by nivel6, nivel1
     into :nivelD, :nivelC, :debito do

  for select nivel6, nivel1, coalesce(sum(valor),0) from todomesconta
     where datalcto = :data group by nivel6, nivel1
     into :nivelD, :nivelC, :credito do

       saldoatual = saldoanterior + (debito - credito);

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


Ja tentei de todos os tipos e nao consigo fazer essa soma de contas


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Como acho que esta dificil desta maneira acima e nao obtive respostas, resolvi usar dois edits e um maskedits(data) e um button para fazer um SQL usando um query
Ai no banco gravei alguns dados
grauD....GrauC....Valor
...2...........1........50,00
...1...........1........85,55
...1...........1........85,55
...2...........2....8.000,00
...2...........2....8.000,00
...2...........2....8.000,00
...2...........2....8.000,00
...2...........2....8.000,00

Ai crei esse SQL
with dm.qtgrau1 do
     begin
         close;
         sql.clear;
         sql.add(´select graud, grauc, coalesce(sum(valor),0)as valor from grau1´);
         sql.add(´where (graud between :pgrauini and :pgraufin) or (grauc between :pgrauini and :pgraufin) and datalcto >= :data group by graud, grauc´);
         Parambyname(´pgrauini´).asSTRING := EdtGrauD.text;
         Parambyname(´pgraufin´).asSTRING := EdtGrauC.text;
         Parambyname(´DATA´).asDATE := StrToDATE(MASKEDIT2.text);
         open;
     end;
end;


Mais o resultado fica assim:

Se eu digitar no edtGrauD(1) e edtGrauC (1)
o resultado fica assim
GrauD....GrauC....Valor
...1...........1.......171,10
...2...........1........50,00
E eu gostaria que ficasse assim
GrauD....GrauC....Valor
...1...........1.......221,10

Se eu digitar no edtGrauD(2) e edtGrauC (2)
o resultado fica assim
GrauD....GrauC....Valor
...2...........1........... 50,00
...2...........2......40.000,00
E eu gostaria que ficasse assim
GrauD....GrauC....Valor
...2...........1......40.050,00

Se eu digitar no edtGrauD(1) e edtGrauC (2)
o resultado fica assim
GrauD....GrauC....Valor
...1...........1...........171,10
...1...........2.............50,00
...2...........2......40.000,00
E eu gostaria que ficasse assim
GrauD....GrauC....Valor
...1...........1...........221,10
...2...........2.......40.050,00

E nao estou conseguindo
Ai pensei que se eu criar duas tabelas uma grauDebito e outra GrauCredito
e fazer um select unindo as duas será que consigo o resultado que desejo?

Se for possivel como posso unir as duas tabelas? usando o [b:5f58d2ec78]INER JOIN[/b:5f58d2ec78] ou [b:5f58d2ec78]UNION[/b:5f58d2ec78]

Desculpe se escrevi errado, nunca uni duas tabelas para criar um resultado.
Mais acho que pode ser por ai o que eu desejo.

Espero que agora seja melhor do pessoal entender minha duvida.

Agradecido
Adriano.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Mudei tudo pra ver se agora algeum pode me ajudar.

Olah pessoal, bom eh o seguinte, tenho 4 tabelas usando o sum e group by assim
[b:a1c5a39678]1ª Tabela usando o group by e sum[/b:a1c5a39678]
with dm.datasetgd1 do
     begin
         close;
         sql.clear;
         sql.add(´select grau1d, coalesce(sum(valor),0)as valordebito from tbgrau1D´);
         sql.add(´where (grau1d between :pgrauini and :pgraufin) and datalcto >= :data group by grau1d´);
         Parambyname(´pgrauini´).asSTRING := EdtContaIni.text;
         Parambyname(´pgraufin´).asSTRING := EdtContaFin.text;
         Parambyname(´data´).asDATE := StrToDATE(MaskData.text);
         open;
     end;


[b:a1c5a39678]2ª Tabela usando o group by e sum[/b:a1c5a39678]
with dm.datasetgc1 do
     begin
         close;
         sql.clear;
         sql.add(´select grau1c, coalesce(sum(valor),0)as valorcredito from tbgrau1C´);
         sql.add(´where (grau1c between :pgrauini and :pgraufin) and datalcto >= :data group by grau1c´);
         Parambyname(´pgrauini´).asSTRING := EdtContaIni.text;
         Parambyname(´pgraufin´).asSTRING := EdtContaFin.text;
         Parambyname(´data´).asDATE := StrToDATE(MaskData.text);
         open;
     end;


[b:a1c5a39678]3ª Tabela usando o group by e sum[/b:a1c5a39678]
with dm.datasetgd2 do
     begin
         close;
         sql.clear;
         sql.add(´select grau2d, coalesce(sum(valor),0)as valordebito from tbgrau2D´);
         sql.add(´where (grau2d between :pgrauini and :pgraufin) and datalcto >= :data group by grau2d´);
         Parambyname(´pgrauini´).asSTRING := EdtContaIni.text;
         Parambyname(´pgraufin´).asSTRING := EdtContaFin.text;
         Parambyname(´data´).asDATE := StrToDATE(MaskData.text);
         open;
     end;


[b:a1c5a39678]4ª Tabela usando o group by e sum[/b:a1c5a39678]
with dm.datasetgc2 do
     begin
         close;
         sql.clear;
         sql.add(´select grau2c, coalesce(sum(valor),0)as valorcredito from tbgrau2C´);
         sql.add(´where (grau2c between :pgrauini and :pgraufin) and datalcto >= :data group by grau2c´);
         Parambyname(´pgrauini´).asSTRING := EdtContaIni.text;
         Parambyname(´pgraufin´).asSTRING := EdtContaFin.text;
         Parambyname(´data´).asDATE := StrToDATE(MaskData.text);
         open;
     end;


Se eu executar o select de cada uma me retorna o valor cfe. passado por parametros EdtContaini, EdtContafin, MaksData, mais ai fica em 4 form diferentes o resultado num dbgrid, e o que eu gostaria eh:

Se tem como juntar este 4 select num soh select, para me mostrar o resultado.




Se alguem puder me ajuda, fico grato
Adriano.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/01/2007

- publique a estrutura da(s) tabela(s) envolvida(s)
- exiba uma grade com alguns registros para tomar como exemplo
- mostre exatamente como você deseja o resultado


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

- publique a estrutura da(s) tabela(s) envolvida(s) - exiba uma grade com alguns registros para tomar como exemplo - mostre exatamente como você deseja o resultado


Estrutura das Tabelas
Tabela1
CREATE TABLE TGRAU1_D ( SEQUENCIA INTEGER, GRAUD VARCHAR(15), N_NIVEL VARCHAR(50), DATALCTO DATE, VALOR NUMERIC(15,2), ANO VARCHAR(4) );


Tabela2
CREATE TABLE TGRAU1_C ( SEQUENCIA INTEGER, GRAUC VARCHAR(15), N_NIVEL VARCHAR(50), DATALCTO DATE, VALOR NUMERIC(15,2), ANO VARCHAR(4) );


Tabela3
CREATE TABLE TGRAU2_D ( SEQUENCIA INTEGER, GRAU2D VARCHAR(15), N_NIVEL VARCHAR(50), DATALCTO DATE, VALOR NUMERIC(15,2), ANO VARCHAR(4) );


Tabela4
CREATE TABLE TGRAU2_C ( SEQUENCIA INTEGER, GRAU2C VARCHAR(15), N_NIVEL VARCHAR(50), DATALCTO DATE, VALOR NUMERIC(15,2), ANO VARCHAR(4) );

****************REFERENCIAS/DEPENDENCIAS****************************************
Todas tabelas tem [b:63f5c8f120]Foreign Keys e referencias a Tabela Mestre[/b:63f5c8f120]
********************************************************************
ALTER TABLE TGRAU2_(X) ADD CONSTRAINT FK_TGRAU2_(X)_1 FOREIGN KEY (SEQUENCIA) REFERENCES [b:63f5c8f120]TODOMESCONTA[/b:63f5c8f120] (SEQUENCIA) ON DELETE CASCADE ON UPDATE CASCADE;
********************************************************************
Como estao sendo gravados os dados
Tabela1 (TGRAU1_D) SEQ----GRAU1D-----N_NIVEL---------------DATALCTO----VALOR---ANO 1-----------2---------PASSIVO--------------31.01.2007-----30,00---2007 2-----------1---------ATIVO-----------------31.01.2007-----45,00---2007 3-----------2---------PASSIVO--------------31.01.2007-----20,00---2007 Tabela2 (TGRAU1_C) SEQ----GRAU1C-----N_NIVEL---------------DATALCTO----VALOR---ANO 1-----------1---------ATIVO-----------------31.01.2007-----30,00---2007 2-----------2---------PASSIVO--------------31.01.2007-----45,00---2007 3-----------1---------ATIVO-----------------31.01.2007-----20,00---2007 Tabela3 (TGRAU2_D) SEQ----GRAU2D-----N_NIVEL---------------DATALCTO----VALOR---ANO 1-----------21---------PASSIVO CIRCUL.---31.01.2007-----30,00---2007 2-----------11---------ATIVO CIRCUL.------31.01.2007-----45,00---2007 3-----------21---------PASSIVO CIRCUL----31.01.2007-----20,00---2007 Tabela4 (TGRAU2_C) SEQ----GRAU2C----N_NIVEL---------------DATALCTO----VALOR---ANO 1-----------11-------ATIVO CIRCUL.--------31.01.2007-----30,00---2007 2-----------21-------PASSIVO CIRCUL.-----31.01.2007-----45,00---2007 3-----------11-------ATIVO CIRCUL.--------31.01.2007-----20,00---2007

Bom esta tabelas ja estao recebendo os valores desta forma acima citada.

Agora eu queria eh fazer um select soh e acho que deve ser com o groupby e datas (apesar que gostaria mesmo eh gerar saldo anterior e saldo atual) como a SP que vc me passou no começo, mais nao cosegui de forma alguma. :cry:
**********************************************************
Entao a ideia a principio eh montar o select que apareça assim na grade
ANO--CONTA----DESCR-----------------VALORDEB------VALORCRED 2007----1--------ATIVO--------------------45,00---------------50,00 2007----2--------PASSIVO-----------------50,00---------------45,00 2007----11------ATIVO CIRCUL.----------45,00---------------50,00 2007----22------PASSIVO CIRCUL.-------50,00---------------45,00

**********************************************************

Se precisar de algo mais explicando eh soh postar.

Se eh a maneira certa? nao sei, mais foi a unica forma que encontrei para jogar as contas nos devidos lugares do plano de contas.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

O maximo que eu consegui usando o [b:3452f8d59f]UNION[/b:3452f8d59f] num SQL foi 3 colunas do dbgrid, meio distante do objetivo que eu preciso, mais pelo menso ja mostrando as somas, mesmo que em 3 colunas em vez de 5
with dm.qtgrau1 do
     begin
         close;
         sql.clear;
         sql.add(´select graud, n_Nivel, coalesce(sum(valor),0)as valordebito from tgrau1_D´);
         sql.add(´where (graud between :pgrauini and :pgraufin) and datalcto >= :data group by graud, n_Nivel´);
         sql.add(´union´);
         sql.add(´select grauc, n_Nivel, coalesce(sum(valor),0)as valorcredito from tgrau1_C´);
         sql.add(´where (grauc between :pgrauini and :pgraufin) and datalcto >= :data group by grauc, n_Nivel´);
         sql.add(´union´);
         sql.add(´select grau2d, n_Nivel, coalesce(sum(valor),0)as valordebito from tgrau2_D´);
         sql.add(´where (grau2d between :pgrauini and :pgraufin) and datalcto >= :data group by grau2d, n_Nivel´);
         sql.add(´union´);
         sql.add(´select grau2c, n_Nivel, coalesce(sum(valor),0)as valorcredito from tgrau2_C´);
         sql.add(´where (grau2c between :pgrauini and :pgraufin) and datalcto >= :data group by grau2c, n_Nivel´);
         Parambyname(´pgrauini´).asSTRING := EdtConta.text;
         Parambyname(´pgraufin´).asSTRING := Edit1.text;
         Parambyname(´DATA´).asDATE := StrToDATE(MASKEDIT2.text);
         open;
     end;
end;


Usando uma SP o maximo que tambem consegui foi isso
begin 
  /* Procedure Text */ 
  data = datainicial; 
  -- datafinal será sempre a data atual do sistema -- 
  datafinal = current_date; 
  -- INICIANDO OS SELECTS DAS 4 TABELAS-- 
  select coalesce(sum(valor),0)as valordebito from tgrau1_d 
     where datalcto < :data into :valordebito; 

  select coalesce(sum(valor),0)as valorcredito from tgrau1_c 
     where datalcto < :data into :valorcredito; 

  select coalesce(sum(valor),0)as valordebito from tgrau2_d 
     where datalcto < :data into :valordebito; 

  select coalesce(sum(valor),0)as valorcredito from tgrau2_c 
     where datalcto < :data into :valorcredito; 
  -- 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> 0) or (debito > 0))  then 
      suspend; 

  data = data + 1; 
  saldoanterior = saldoanterior + (credito - debito); 
  end 

  -- somo os debitos e créditos da data atual 
  select coalesce(sum(valor),0)as valordebito from tgrau1_d 
     where datalcto = :data into :debito; 

  select coalesce(sum(valor),0)as valorcredito from tgrau1_c 
     where datalcto = :data into :credito; 

  select coalesce(sum(valor),0)as valordebito from tgrau2_d 
     where datalcto = :data into :debito; 

  select coalesce(sum(valor),0)as valorcredito from tgrau2_c 
     where datalcto = :data into :credito; 

  saldoatual = saldoanterior + (credito - debito); 

  suspend; 
end
Tambem nao ficou de acordo com minha precisao.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Se eu executar a SP que eu criei esta mostrando erro

[b:55c7b5fed4]Unexpected en of command[/b:55c7b5fed4]

Nao estou entendendo, a SP esta compilando normal, estou usando um query e esta ativando normal, mais assim que executo via programação apareçe o erro acima

olhem como estou tentando executar a SP
with SP do
     begin
         close;
         sql.clear;
         sql.add(´select * from saldo_contames(:conta, :DATAINICIAL´);
         Parambyname(´DATAINICIAL´).AsDate := StrToDate(maskedit2.text);
         Parambyname(´CONTA´).AsString := EdtContaI.text;
         open;
     end;
Entao aqui neste codigo apareçe o erro assim que eh executado.


[color=red:55c7b5fed4]Por enquanto ainda nao achei nenhuma maneira de fazer essa consulta funcionar[/color:55c7b5fed4] :(

Tambem tenteu usar um [b:55c7b5fed4]JOIN[/b:55c7b5fed4] mais nao funcionou ainda

Codigo do SQL
select 
d.graud, d.n_nivel, c.grauc, c.n_nivel, d2.grau2d, c2.grau2c, 
sum(d.valor)as valordebito, 
sum(c.valor)as valorcredito 
from
tgrau1_d d
left outer join
tgrau1_c c on d.sequencia = c.sequencia,
tgrau2_d d2, 
tgrau2_c c2 
group by d.graud, c.grauc,d2.grau2d, c2.grau2c,d.n_nivel, c.n_nivel


Estou aceitando qualquer sujestao, para conseguir unir e somar essas tabelas.

Grato
Adriano.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Se eu executar a SP que eu criei esta mostrando erro

[b:8d85d361d7]Unexpected end of command[/b:8d85d361d7]

Nao estou entendendo, a SP esta compilando normal, estou usando um query e esta ativando normal, mais assim que executo via programação apareçe o erro acima

olhem como estou tentando executar a SP
with SP do
     begin
         close;
         sql.clear;
         sql.add(´select * from saldo_contames(:conta, :DATAINICIAL´);
         Parambyname(´DATAINICIAL´).AsDate := StrToDate(maskedit2.text);
         Parambyname(´CONTA´).AsString := EdtContaI.text;
         open;
     end;
Entao aqui neste codigo apareçe o erro assim que eh executado.


[color=red:8d85d361d7]Por enquanto ainda nao achei nenhuma maneira de fazer essa consulta funcionar[/color:8d85d361d7] :(

Tambem tenteu usar um [b:8d85d361d7]JOIN[/b:8d85d361d7] mais nao funcionou ainda

Codigo do SQL
select 
d.graud, d.n_nivel, c.grauc, c.n_nivel, d2.grau2d, c2.grau2c, 
sum(d.valor)as valordebito, 
sum(c.valor)as valorcredito 
from
tgrau1_d d
left outer join
tgrau1_c c on d.sequencia = c.sequencia,
tgrau2_d d2, 
tgrau2_c c2 
group by d.graud, c.grauc,d2.grau2d, c2.grau2c,d.n_nivel, c.n_nivel


Estou aceitando qualquer sujestao, para conseguir unir e somar essas tabelas.

Grato
Adriano.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/01/2007

faltou um parêntesis!
with SP do
begin
  close;
  sql.clear;
  sql.add(´select * from saldo_contames(:conta, :DATAINICIAL)´); // aqui faltava um parêntesis
  Parambyname(´DATAINICIAL´).AsDate := StrToDate(maskedit2.text);
  Parambyname(´CONTA´).AsString := EdtContaI.text;
  open;
end;



GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Obrigado Emerson, realmente estava faltando mesmo.

Bom continuando com a novela do SP agora preciso saber pq soh pega o resultado das duas tabelas finais ou seja a tgrau2D e tgrau2C

Tanto faz usar o CAST como nao, eu nao consigo obter resultado como preciso.

Se alguem puder dar uma analizada na SP e ver o que esta errado eu agradeço

Olhem o codigo
CREATE PROCEDURE SPTOTALGRAU (
    CONTAI VARCHAR(15),
    DATAINICIAL DATE)
RETURNS (
    DATA DATE,
    SALDOANTERIOR NUMERIC(15,2),
    DEBITO NUMERIC(15,2),
    CREDITO NUMERIC(15,2),
    SALDOATUAL NUMERIC(15,2),
    DC VARCHAR(1),
    CONTAMOVIMENTADA VARCHAR(15))
AS
DECLARE VARIABLE VALORDEBITO NUMERIC(15,2);
DECLARE VARIABLE VALORCREDITO NUMERIC(15,2);
DECLARE VARIABLE DATAFINAL DATE;
begin
  /* Procedure Text */
  data = datainicial; 
  contamovimentada = contaI;
  -- 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)as valordebito from tgrau1_d
     where (cast(graud as integer) between :contai and :contai)  and datalcto < :data into :valordebito;

  select coalesce(sum(valor),0)as valorcredito from tgrau1_c
     where (cast(grauc as integer) between :contai and :contai)  and datalcto < :data into :valorcredito;

  select coalesce(sum(valor),0)as valordebito from tgrau2_d
     where (cast(grau2d as integer) between :contai and :contai) and datalcto < :data into :valordebito;

  select coalesce(sum(valor),0)as valorcredito from tgrau2_c
     where (cast(grau2c as integer) between :contai and :contai) and datalcto < :data into :valorcredito;

  -- 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)as valordebito from tgrau1_d
     where (cast(graud as integer) between :contai and :contai)  and datalcto = :data into :debito;

  select coalesce(sum(valor),0)as valorcredito from tgrau1_c 
     where (cast(grauc as integer) between :contai and :contai)  and datalcto = :data into :credito;

  select coalesce(sum(valor),0)as valordebito from tgrau2_d 
     where (cast(grau2d as integer) between :contai and :contai) and datalcto = :data into :debito;

  select coalesce(sum(valor),0)as valorcredito from tgrau2_c 
     where (cast(grau2c as integer) between :contai and :contai) and datalcto = :data into :credito;

    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)as valordebito from tgrau1_d
     where (cast(graud as integer) between :contai and :contai)  and datalcto = :data into :debito;

  select coalesce(sum(valor),0)as valorcredito from tgrau1_c 
     where (cast(grauc as integer) between :contai and :contai)  and datalcto = :data into :credito;

  select coalesce(sum(valor),0)as valordebito from tgrau2_d 
     where (cast(grau2d as integer) between :contai and :contai) and datalcto = :data into :debito;

  select coalesce(sum(valor),0)as valorcredito from tgrau2_c 
     where (cast(grau2c as integer) between :contai and :contai) and datalcto = :data into :credito;

  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


No aguardo
Adriano.

Espero ainda conseguir fazer essa soma loca...hehehe :D


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Pessoal vamos esqueçer o que postei acima e vamos ver se tem como fazer assim:

O que eu preciso eh unir 4 tabelas, (todas com um campo chamado n_Nivel) em uma soh e mostrar no dbgrid

Exemplo (Todas agrupar pelo campo n_Nivel)
tabela1
adriano
adriano
carlos
pedro

tabela2
pedro
adriano
carlos
marcos

tabela 3
fernanda
simone
carla
alexandra

tabela 4
alexandra
maria
monica
carla


ai criar talvez um JOIN para jogar tudo em uma soh


adriano
carlos
pedro
marcos
alexandra
maria
carla
...

Ou seja agrupar todos que tiverem o mesmo nome nas 4 tabelas independente da tabela aonde estejam gravados e mostrar em apenas uma coluna

Estou tentando usar o join, mais esta mostrando 4 colunas, e preciso que agrupem todas em uma coluna soh

Olha como estou tentando fazer
select d.N_Nivel, c.N_Nivel, d2.n_Nivel, c2.n_Nivel,
sum(coalesce(d.valor,0))as valordebito, 
sum(coalesce(c.valorcredito,0))as valorcredito,
sum(coalesce(d.VALOR,0)) - sum(coalesce(c.VALORCREDITO,0)) as Saldo 
from
tgrau1_d d
left outer join
tgrau1_c c on c.n_Nivel = d.n_Nivel,
tgrau2_d d2, 
tgrau2_c c2 
where d.N_Nivel = d.N_Nivel
group by 1, 2, 3, 4
Eh logico que tem mais alguns campos que vou precisar para fazer somas, mais a principio se alguem puder me ajudar como fazer ao menso agrupar estes niveis em uma coluna soh ja eh o começo.

No aguardo
Espero a ajuda de todos


Grato
Adriano.


GOSTEI 0
Adriano_servitec

Adriano_servitec

18/01/2007

Bom ta muito dificil o resultado entao resolvi fazer por etapas

Novamente esqueçem tudo postado acima pessoal.

Agora minha duvida eh somente com [size=18:255b1bb57a]JOIN[/size:255b1bb57a] nesta duas tabelas.

1º Tenho 2 tabelas A e B e estao gravados assim
Tabela A
AT-------500,00
PS-------500,00
PS-------300,00
AT-------100,00
AT-------100,00

Tabela B
PS-------500,00
PS-------500,00
AT-------300,00
PS-------100,00
AT-------100,00

Entao preciso ao unir as duas tabelas mostrar um resultado assum usando o group by

Na grid----Tab_A----------Tab_B--------saldo
AT---------700,00---------400,00--------300,00
BS---------800,00-------1.100,00------(-300,00)

Entao eu fiz um select entra a tabela_A e a Tabela_B assim
select distinct(a.n_nivel) "Conta Debito/Credito",
sum(coalesce(a.valor,0))"Valor Débito", 
sum(coalesce(b.valor,0))"Valor Crédito",
sum(coalesce(a.VALOR,0)) - sum(coalesce(b.VALOR,0)) "Valor Saldo" 
from tgrau1_d a
full outer join
tgrau1_c b on b.n_nivel = a.n_nivel
where a.n_nivel  = a.n_nivel and a.ano = a.ano
group by 1

Para ver se mostrasse o resultado, mais esta duplicando ou triplicando o nao sei que resultado esta somando, e o resultado na grade esta mostrando assim:

Na grid----Tab_A----------Tab_B--------Saldo
AT-------1.400,00-------1.200,00-------200,00
BS-------2.400,00-------2.200,00-------200,00


GOSTEI 0
POSTAR