Construir um SQL ou SP. de contas com saldos anter
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
Respostas
Emerson Nascimento
18/01/2007
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...
Adriano_servitec
18/01/2007
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 ; ^
Emerson Nascimento
18/01/2007
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.
Adriano_servitec
18/01/2007
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.
Adriano_servitec
18/01/2007
Valeu amigo, acho que agora posso continuar
Mais uma vez muito obrigado.
Adriano_servitec
18/01/2007
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?
Adriano_servitec
18/01/2007
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?
Emerson Nascimento
18/01/2007
e passe os parâmetros conforme o critério desejado, da mesma forma que você faz com selects ´normais´.
Adriano_servitec
18/01/2007
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.
Adriano_servitec
18/01/2007
Grato pela ajuda.
Emerson Nascimento
18/01/2007
Adriano_servitec
18/01/2007
Tipo assim
if saldoatual < 0 then
campoDC = ´D´
else
campoDC = ´C´;
ou dentro do form?
Adriano_servitec
18/01/2007
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.
Adriano_servitec
18/01/2007
[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.
Adriano_servitec
18/01/2007
Sobe...
Adriano_servitec
18/01/2007
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
Adriano_servitec
18/01/2007
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
Ai preciso fazer uma soma de agrupamento de contas saldo anterior+debito-credito=saldo atual.
E tem que gerar um resultado assim:
resultado
Quero usar dois edits para digitar a conta inicial e final para pesquisar e gerar as somas.
Grato pela ajuda
Adriano
Adriano_servitec
18/01/2007
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 :?:
Emerson Nascimento
18/01/2007
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;
Adriano_servitec
18/01/2007
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
Adriano_servitec
18/01/2007
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.
Adriano_servitec
18/01/2007
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.
Emerson Nascimento
18/01/2007
- exiba uma grade com alguns registros para tomar como exemplo
- mostre exatamente como você deseja o resultado
Adriano_servitec
18/01/2007
Estrutura das Tabelas
Tabela1
Tabela2
Tabela3
Tabela4
****************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
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
**********************************************************
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.
Adriano_servitec
18/01/2007
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
Adriano_servitec
18/01/2007
[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;
[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.
Adriano_servitec
18/01/2007
[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;
[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.
Emerson Nascimento
18/01/2007
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;
Adriano_servitec
18/01/2007
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
Adriano_servitec
18/01/2007
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
No aguardo
Espero a ajuda de todos
Grato
Adriano.
Adriano_servitec
18/01/2007
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