Ir para conteúdo
Fórum Script Brasil
  • 0

Conta corrente em Delphi e Firebird


alemoraes

Pergunta

Estou fazendo um pequeno conta corrente com Delphi 7 banco de dados Firebird 2.5 TIBDatabase, TIBTransaction e ligação das tabelas com TIBDataset e tenho as seguintes tabelas:

Na seção Uses declarei IB

TBPROPRIETARIO

TBBANCO

TBCONTA

TBHISTORICO

TBLANCAMENTO  (Cadastro plano de contas de Entradas e Saídas ex: Receitas, Salários, Conta de luz, aluguel, etc...)

TBTIPOPGTO  (Cadastro das formas de pagamento ex: boleto, recibo, cheque, cartão, etc...)

a tabela TBPROPRIETARIO é tabela Pai de TBBANCO

a tabela TBBANCO é tabela Pai de TBCONTA

a tabela TBCONTA é tabela Pai de TBHISTORICO

Está ocorrendo o seguinte erro: Quando faço o lançamento do primeiro registro no preenchimento dos campos do formulário

não dá erro mas quando salvo só ficam aparecendo no formulário os dados das tabelas TBPROPRIETARIO, TBBANCO  e TBCONTA.

os dados lançados no DBGrid referente a tabela TBHISTORICO somem.

Outro detalhe é que quando verifico o Banco de dados no IBExpert as chaves estrangeiras estão com os campos todos Null (todas as tabelas relacionadas)

Peço ajuda a todos, por favor. Não tenho experência com o Delphi.

segue o script das tabelas:

 

/* Tabela: TBPROPRIETARIO */

CREATE TABLE TBPROPRIETARIO (

    PRO_CODIGO INTEGER NOT NULL,

    PRO_NOMECURTO VARCHAR (20) CHARACTER SET WIN1252 COLLATE WIN1252,

    PRO_NOME VARCHAR (50) CHARACTER SET WIN1252 COLLATE WIN1252);

 

/* Primary keys definition */

ALTER TABLE TBPROPRIETARIO ADD CONSTRAINT PK_TBPROPRIETARIO PRIMARY KEY (PRO_CODIGO);

SET TERM ^ ;

 

/* Triggers definition */

 

/* Trigger: AI_TBPROPRIETARIO_PRO_CODIGO */

CREATE TRIGGER AI_TBPROPRIETARIO_PRO_CODIGO FOR TBPROPRIETARIO ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

  IF (NEW.PRO_CODIGO IS NULL) THEN

      NEW.PRO_CODIGO = GEN_ID(PRO_CODIGO_GEN, 1);

END

^

SET TERM ; ^

 

/* Tabela: TBBANCO */

CREATE TABLE TBBANCO (

    BAN_CODIGO INTEGER NOT NULL,

    BAN_NOME VARCHAR (20) CHARACTER SET WIN1252 COLLATE WIN1252,

    BAN_AGENCIA VARCHAR (15) CHARACTER SET WIN1252 COLLATE WIN1252,

    BAN_ENDERECO VARCHAR (30) CHARACTER SET WIN1252 COLLATE WIN1252,

    BAN_CIDADE VARCHAR (25) CHARACTER SET WIN1252 COLLATE WIN1252,

    BAN_CEP CHAR (9) CHARACTER SET WIN1252 COLLATE WIN1252,

    BAN_UF CHAR (2) CHARACTER SET WIN1252 COLLATE WIN1252,

    BAN_PROCODIGO INTEGER);

 

/* Primary keys definition */

ALTER TABLE TBBANCO ADD CONSTRAINT PK_TBBANCO PRIMARY KEY (BAN_CODIGO);

 

/* Foreign keys definition */

ALTER TABLE TBBANCO ADD CONSTRAINT FK_TBBANCO FOREIGN KEY (BAN_PROCODIGO) REFERENCES TBPROPRIETARIO (PRO_CODIGO);

 

/* Indices definition */

CREATE INDEX FK_TBBANCO ON TBBANCO (BAN_PROCODIGO);

SET TERM ^ ;

 

/* Triggers definition */

/* Trigger: AI_TBBANCO_BAN_CODIGO */

CREATE TRIGGER AI_TBBANCO_BAN_CODIGO FOR TBBANCO ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

  IF (NEW.BAN_CODIGO IS NULL) THEN

      NEW.BAN_CODIGO = GEN_ID(TBBANCO_BAN_CODIGO_GEN, 1);

END

^

SET TERM ; ^

 

/* Tabela: TBCONTA */

CREATE TABLE TBCONTA (

    CON_CODIGO INTEGER NOT NULL,

    CON_NOME VARCHAR (30) CHARACTER SET WIN1252 COLLATE WIN1252,

    CON_DEBITO DOUBLE PRECISION,

    CON_CREDITO DOUBLE PRECISION,

    CON_SALDO DOUBLE PRECISION,

    CON_BANCODIGO INTEGER);

 

/* Primary keys definition */

ALTER TABLE TBCONTA ADD CONSTRAINT PK_TBCONTA PRIMARY KEY (CON_CODIGO);

 

/* Foreign keys definition */

ALTER TABLE TBCONTA ADD CONSTRAINT FK_TBCONTA FOREIGN KEY (CON_BANCODIGO) REFERENCES TBBANCO (BAN_CODIGO);

 

/* Indices definition */

CREATE INDEX FK_TBCONTA ON TBCONTA (CON_BANCODIGO);

SET TERM ^ ;

 

/* Triggers definition */

/* Trigger: AI_TBCONTA_CON_CODIGO */

CREATE TRIGGER AI_TBCONTA_CON_CODIGO FOR TBCONTA ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

  IF (NEW.CON_CODIGO IS NULL) THEN

      NEW.CON_CODIGO = GEN_ID(CON_CODIGO_GEN, 1);

END

^

SET TERM ; ^

 

/* Tabela: TBLANCAMENTO */

 

CREATE TABLE TBLANCAMENTO (

    LAN_CODIGO INTEGER NOT NULL,

    LAN_NOME VARCHAR (40) CHARACTER SET WIN1252 COLLATE WIN1252);

 

/* Primary keys definition */

ALTER TABLE TBLANCAMENTO ADD CONSTRAINT PK_TBLANCAMENTO PRIMARY KEY (LAN_CODIGO);

SET TERM ^ ;

 

/* Triggers definition */

 

/* Trigger: AI_TBLANCAMENTO_LAN_CODIGO */

CREATE TRIGGER AI_TBLANCAMENTO_LAN_CODIGO FOR TBLANCAMENTO ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

  IF (NEW.LAN_CODIGO IS NULL) THEN

      NEW.LAN_CODIGO = GEN_ID(LAN_CODIGO_GEN, 1);

END

^

SET TERM ; ^

 

 

/* Tabela: TBTIPOPGTO */

CREATE TABLE TBTIPOPGTO (

    TIP_CODIGO INTEGER NOT NULL,

    TIP_NOME VARCHAR (20) CHARACTER SET WIN1252 COLLATE WIN1252);

 

/* Primary keys definition */

ALTER TABLE TBTIPOPGTO ADD CONSTRAINT PK_TBTIPOPGTO PRIMARY KEY (TIP_CODIGO);

SET TERM ^ ;

 

/* Triggers definition */

/* Trigger: AI_TBTIPOPGTO_TIP_CODIGO */

CREATE TRIGGER AI_TBTIPOPGTO_TIP_CODIGO FOR TBTIPOPGTO ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

  IF (NEW.TIP_CODIGO IS NULL) THEN

      NEW.TIP_CODIGO = GEN_ID(TIP_CODIGO_GEN, 1);

END

^

SET TERM ; ^

 

/* Tabela: TBHISTORICO */

CREATE TABLE TBHISTORICO (

    HIS_CODIGO INTEGER NOT NULL,

    HIS_DATA DATE,

    HIS_TIPO CHAR (1) CHARACTER SET WIN1252 COLLATE WIN1252,

    HIS_LANCODIGO INTEGER,

    HIS_TIPOCODIGO INTEGER,

    HIS_DESCRICAO VARCHAR (50) CHARACTER SET WIN1252 COLLATE WIN1252,

    HIS_VALOR DOUBLE PRECISION,

    HIS_CONCODIGO INTEGER);

 

/* Primary keys definition */

 

ALTER TABLE TBHISTORICO ADD CONSTRAINT PK_TBHISTORICO PRIMARY KEY (HIS_CODIGO);

 

/* Foreign keys definition */

ALTER TABLE TBHISTORICO ADD CONSTRAINT FK_TBHISTORICO FOREIGN KEY (HIS_LANCODIGO) REFERENCES TBLANCAMENTO (LAN_CODIGO);

ALTER TABLE TBHISTORICO ADD CONSTRAINT FK_TBHISTORICO1 FOREIGN KEY (HIS_TIPOCODIGO) REFERENCES TBTIPOPGTO (TIP_CODIGO);

ALTER TABLE TBHISTORICO ADD CONSTRAINT FK_TBHISTORICO2 FOREIGN KEY (HIS_CONCODIGO) REFERENCES TBCONTA (CON_CODIGO);

 

/* Indices definition */

CREATE INDEX FK_TBHISTORICO ON TBHISTORICO (HIS_LANCODIGO);

CREATE INDEX FK_TBHISTORICO1 ON TBHISTORICO (HIS_TIPOCODIGO);

CREATE INDEX FK_TBHISTORICO2 ON TBHISTORICO (HIS_CONCODIGO);

 

SET TERM ^ ;

 

/* Triggers definition */

 

/* Trigger: AI_TBHISTORICO_HIS_CODIGO */

CREATE TRIGGER AI_TBHISTORICO_HIS_CODIGO FOR TBHISTORICO ACTIVE

BEFORE INSERT POSITION 0

AS

BEGIN

  IF (NEW.HIS_CODIGO IS NULL) THEN

      NEW.HIS_CODIGO = GEN_ID(HIS_CODIGO_GEN, 1);

END

^

SET TERM ; ^

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

a tabela TBCONTA é tabela Pai de TBHISTORICO

os dados lançados no DBGrid referente a tabela TBHISTORICO somem.

(todas as tabelas relacionadas)

primeiro tente usar o comando REFRESH depois de salvar os dados

   IBQuery1.Refresh;  ou    IBDataSet1.Refresh;  ou o ClientDataSet.Refresh  ...  o que voce estiver usando

se não funcionar, assim como voce salva os dados da tabela TBCONTA experimente salvar tambem os dados da tabela TBHISTORICO e veja o que acontece

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas boa tarde

Em primeiro lugar muito obrigado pela ajuda.

Desculpe a demora em responder, pois estava trabalhando com IBDataset e fiz os testes que você passou, porém

os IBDatasets estavam dando problemas com master / detail e resolvi usar o componente IBTable.

Com o componente IBTable fiz o que me passou, ou seja, depois do Post em cada tabela coloquei o comando

refresh de cada tabela e funcionou, gravou em todas as tabelas os lançamentos.

Agora apareceu um dúvida. Na tabela TBHISTORICO eu digito os lançamentos no próprio DBGrid.

Acontece o seguinte: Vou preenchendo os campos no DBGrid e vou pressionando Enter.

Quando estou na segunda linha em diante, quando dou Enter na coluna 5 para passar para a coluna 6,

em vez da edição do registro ficar na mesma linha, ela pula sempre para o primeiro registro. Como posso corrigir isto?

Segue os códigos que fiz: Obrigado

procedure TfrmCaixaBanco.DBGrid2Enter(Sender: TObject);

begin

       if (dbeditBanco.Text = '') or (dbeditConta.Text = '') then begin

        showmessage('Preencha os campos acima antes de movimentar a conta!');

         abort;

          end;

        keypreview := false;

         dmDados.tblConta.Edit;

          dmDados.tblConta.Post;

            dmDados.tblConta.Refresh;        

end;

 

procedure TfrmCaixaBanco.DBGrid2KeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

begin

        if key= 13 then begin

          dbgrid2.SelectedIndex := dbgrid2.SelectedIndex + 1;

        if dbgrid2.SelectedIndex = 5 then  

       // COLUNA 1 É DA HIS_DATA

       // COLUNA 2 É DA HIS_TIPO 

       // COLUNA 3 É DA HIS_LANCODIGO

       // COLUNA 4 É DA HIS_TIPOCODIGO

       // COLUNA 5 É DA HIS_DESCRICAO 

       // COLUNA 6 É DO HIS_VALOR

         totalizarexecute(self);

        end;

        if key= 27 then

       dbgrid2.SelectedIndex := dbgrid2.SelectedIndex - 1;

end;

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Acontece o seguinte: Vou preenchendo os campos no DBGrid e vou pressionando Enter.

Quando estou na segunda linha em diante, quando dou Enter na coluna 5 para passar para a coluna 6, em vez da edição do registro ficar na mesma linha, ela pula sempre para o primeiro registro. Como posso corrigir isto?

use o evento  OnKeyPress do DBGrid

procedure TFCadmov1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin


   if Key = #13 then
      begin
         if not (ActiveControl is TDBGrid) then
            begin
               //Key := #0;
               //Perform(WM_NEXTDLGCTL, 0, 0);
            end
         else
            begin
               if (ActiveControl is TDBGrid) then
                  with TDBGrid(ActiveControl) do
                  if selectedindex < (fieldcount -1) then
                     selectedindex := selectedindex + 1
                  else
                     selectedindex := 0;
            end;         
     end;
                                                
end;                                                

OBS: quando o cursor ultrapassar a ultima coluna do DBGrid, automaticamente ele pula para a 1ª  coluna da linha de baixo.

Se não pular, basta dar um append e Last no registro da tabela.

Ao invés de usar  o evento OnKeyDown do DBGrid eu usaria o Evento OnColEnter

procedure TfrmCaixaBanco.DBGrid2ColEnter(Sender: TObject);
begin

        if dbgrid2.SelectedIndex = 5 then  
        begin
       // COLUNA 1 É DA HIS_DATA
       // COLUNA 2 É DA HIS_TIPO 
       // COLUNA 3 É DA HIS_LANCODIGO
       // COLUNA 4 É DA HIS_TIPOCODIGO
       // COLUNA 5 É DA HIS_DESCRICAO 
       // COLUNA 6 É DO HIS_VALOR
         totalizarexecute(self);
        end;

end;

abraço

 

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas boa noite

Fiz os testes conforme você passou os códigos e não funcionou em parte.

Coloquei o primeiro código no evento OnKeyPress do dbgrid2 (No form sempre deixei o keypreview = true)

e exclui o evento Onkeydown e coloquei o segundo código que em passou no evento OnColEnter do dbgrid2.

Aconteceu o seguinte: por exemplo estava na 2a.  linha, quando dei Enter da coluna 5 para a coluna 6 a linha toda foi subiu para a primeira linha e o registro que estava na primeira linha passou para a segunda linha. O cursor ficou na coluna 6 esperando ser digitado o valor. Quando digitei o valor e dei Enter o valor ficou na coluna em questão, mas não atualizou o saldo e os lançamentos continuaram invertidos. (Mesmo dando Enter várias vezes o cursor não vai para a linha de baixo, só navega na mesma linha).

02 coisas:

Primeiro: não consegui descobrir onde posso colocar o Append e o Last, acredito que você se refere a tabela TBHISTORICO 

nos códigos que me passou.

Segundo: será que o procedimento totalizarexecute pode estar influenciando a coluna 6 do dbgrid? peço a gentileza se

você puder dar uma olhada no código:  Obrigado

tblHistorico (IBTable)

tblConta (IBTable)

procedure TfrmCaixaBanco.totalizarExecute(Sender: TObject);

var

tot1, tot2: real;

bookmark : tbookmarkstr;

begin

     bookmark := dmDados.tblHistorico.Bookmark;

     try

      dmDados.tblHistorico.DisableControls;

      tot1 := 0;

      tot2 :=0;

    try

    dmDados.tblHistorico.First;

    while not dmDados.tblHistorico.Eof do begin

    if (dmDados.tblHistorico['HIS_VALOR'] <> null) then begin

    if (dmDados.tblHistorico['HIS_TIPO'] ='C') then

       tot1 := tot1 + (dmDados.tblHistoricoHIS_VALOR.Value)

    else if (dmDados.tblHistorico['HIS_TIPO'] ='D') then

       tot2 := tot2 + (dmDados.tblHistoricoHIS_VALOR .Value);

    end;

    dmDados.tblHistorico.next;

    end;

    finally

    dmDados.tblHistorico.EnableControls;

   end;

    finally

    begin

    dmDados.tblHistorico.Bookmark := bookmark;

    end;

    end;

    dmDados.tblConta.edit;

    dmDados.tblConta['CON_DEBITO'] := tot2;

    dmDados.tblConta['CON_CREDITO'] := tot1;

    dmDados.tblConta['CON_SALDO'] := tot1 - tot2;

    dmDados.tblConta.post;

    dmDados.tblConta.Refresh;

end;

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

como voce já sabe, o dbgrid é um espelho dos registros contidos em uma tabela

esses comandos:

dmDados.tblHistorico.First;

dmDados.tblHistorico.next;

fazem com que o cursor vá para o primeiro registro da tabela e depois para o proximo.

isso sera refletido no dbgrid .... 

se voce quer efetuar calculos de colunas não deve usar while not dmDados.tblHistorico.Eof do begin

a não ser somente no final da inclusão de todos os registros.

voce tambem deve tomar cuidado ao usar bookmark, pois ele somente deve ser usado para registros especificos.

no evento OnKeyPress do DBGrid faça assim ( isso é um exemplo, voce deve adaptar ao seu código )

procedure TFCadmov1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
   CDS_Tabela.Edit; ///  deixe erm modo de edição o registro da tabela

   if Key = #13 then
      begin
         if not (ActiveControl is TDBGrid) then
            begin
               //Key := #0;
               //Perform(WM_NEXTDLGCTL, 0, 0);
            end
         else
            begin
               if (ActiveControl is TDBGrid) then
                  with TDBGrid(ActiveControl) do
                  if selectedindex < (fieldcount -1) then
                     selectedindex := selectedindex + 1
                  else
                     selectedindex := 0;
            end;         
     end;
                                                
     ///  AQUI VOCE QUER REALIZAR ALGUM CALCULO 
     /// botao = 1 é uma variavel para saber se é inclusão(1), alteração(2) ou exclusão(3) de              
     /// registro 
                                                
   if (botao = 1) and (DBGrid1.SelectedIndex > 5) then
     begin
       CDS_Tabela.Edit;
       CDS_TabelaCON_SALDO,vALUE := CDS_TabelaCON_CREDITO.Value - CDS_TabelaCON_DEBITO.Value; 

       CDS_Tabela.Post;
       CDS_Tabela.Append;
       DBGrid1.SelectedIndex := 0;
     end;
                                                
end;                                                

                                                

Observe no final que, coloquei uma condição para saber se o registro era inclusão

quando o cursor pular a coluna 5, ele fará o calculo do Saldo e colocará o resultado na coluna 6

ao mesmo tempo, vai dar um post e um append no registro, fazendo com que o cursor va para a proxima linha do DBGrid e volte para a coluna inicial do DBGrid.

OBS: A sua procedure TfrmCaixaBanco.totalizarExecute(Sender: TObject); é que esta causando isso que voce relatou.

procure mudar essa lógica, a não ser que seja extremamente necessario usar o bookmark

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas boa tarde

Fiz uns testes no evento OnKeyPress do DBGrid mas não está salvando.

A coluna 6 é somada de acordo com a coluna 2  HIS_TIPO.

Se HIS_TIPO = C  soma a coluna 6 HIS_VALOR para atualizar CON_CREDITO

Se HIS_TIPO = D soma a coluna 6 HIS_VALOR para atualizar CON_DEBITO

Nota: Não estou mais utilizando a procedure totalizarExecute.

Se tiver alguma idéia para me passar, te agradeço

Segue o código:

procedure TfrmCaixaBanco.DBGrid2KeyPress(Sender: TObject; var Key: Char);

var

tot1, tot2: Real;

botao: integer;

begin

    dmDados.tblHistorico.Edit; ///  deixe em modo de edição o registro da tabela

   tot1:= 0;

   tot2:= 0;

   if Key = #13 then

      begin

         if not (ActiveControl is TDBGrid) then

            begin

               //Key := #0;

               //Perform(WM_NEXTDLGCTL, 0, 0);

            end

         else

            begin

               if (ActiveControl is TDBGrid) then

                  with TDBGrid(ActiveControl) do

                  if selectedindex < (fieldcount -1) then

                     selectedindex := selectedindex + 1

                  else

                     selectedindex := 0;

             end;

     end;

     ///  AQUI VOCE QUER REALIZAR ALGUM CALCULO

     /// botao = 1 é uma variavel para saber se é inclusão(1), alteração(2) ou exclusão(3) de

     /// registro

     if (botao = 1) and (DBGrid2.SelectedIndex > 5) then begin

      if (dmDados.tblHistorico['HIS_VALOR'] <> null) and (dmDados.tblHistorico['HIS_TIPO'] ='C') then

          tot1:= tot1 + (dmDados.tblHistoricoHIS_VALOR.Value)

      else if (dmDados.tblHistorico['HIS_TIPO'] ='D') then

          tot2:= tot2 + (dmDados.tblHistoricoHIS_VALOR.Value);

      end;

     dmDados.tblConta.edit;

     dmDados.tblConta['CON_CREDITO'] := tot1;

     dmDados.tblConta['CON_DEBITO'] := tot2;

     dmDados.tblConta['CON_SALDO'] := tot1 - tot2;

     dmDados.tblConta.post;

     dmDados.tblConta.Refresh;

     dmDados.tblHistorico.Append;

     DBGrid2.SelectedIndex:= 0;

end;

 

Link para o comentário
Compartilhar em outros sites

  • 0

Eu não sei como voce definiu o seu Form, mas por padrão voce utiliza no Form um botão para Inclusão , um botão para Alteração, um botão para Exclusão e um botão para Impressão;

então no Botão < Incluir >  ( variavel botao := 1 ) voce coloca o código para abrir a tabela e adicionar novo registro

Fiz uns testes no evento OnKeyPress do DBGrid mas não está salvando.

no evento OnKeyPress do DBgrid voce modifica o código para salvar o registro

     dmDados.tblConta.edit;

     dmDados.tblConta['CON_CREDITO'] := tot1;

     dmDados.tblConta['CON_DEBITO'] := tot2;

     dmDados.tblConta['CON_SALDO'] := tot1 - tot2;

     dmDados.tblConta.post;

//=======>>>>>   dmDados.tblConta.ApplyUpdates(-1) ou  
//=======>>>>>   dmDados.tblConta.ApplyUpdates;

     dmDados.tblConta.Refresh;

     dmDados.tblHistorico.Append;

     DBGrid2.SelectedIndex:= 0;

OBS: Caso voce precise calcular a coluna de varios registros, use um select para filtrar os registros que voce quer e depois bastara voce criar uma rotina para ler os registros e ir fazendo os calculos e jogando os valores na coluna desejada e depois é só salvar os registros modificados.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Botão Novo

procedure TfrmCaixaBanco.btnnovoClick(Sender: TObject);
begin
     novoexecute(self);
end;

 

procedure TfrmCaixaBanco.novoExecute(Sender: TObject);
begin
          dmDados.tblProprietario.Insert;
            dbeditProprietario.setfocus;
              btngravar.Enabled:=true;
                btncancelar.Enabled := true;
end;

 

Para gravar tem tanto a rotina do botão Salvar quanto no evento Enter de DBEdits

procedure TfrmCaixaBanco.btngravarClick(Sender: TObject);

begin

         dmDados.tblProprietario.Edit;

         dmDados.tblProprietario.Post;

          dmDados.tblBanco.Edit;

           dmDados.tblBanco.Post;

             dmDados.tblConta.Edit;

              dmDados.tblConta.Post;

                dmDados.tblHistorico.Edit;

                 dmDados.tblHistorico.Post;

                  btngravar.Enabled:=false;

                  btncancelar.Enabled:=false;

end;

 

procedure TfrmCaixaBanco.DBEditBancoEnter(Sender: TObject);
begin
    dmDados.tblProprietario.Edit;   // TBPROPRIETARIO TABELA PAI DA TABELA TBBANCO
      dmDados.tblProprietario.Post;
       dmDados.tblProprietario.Refresh;
end;

 

procedure TfrmCaixaBanco.DBEditContaEnter(Sender: TObject);
begin
    dmDados.tblBanco.Edit;   // TBBANCO TABELA PAI DA TABELA TBCONTA
    dmDados.tblBanco.Post;
    dmDados.tblBanco.Refresh;
end;

 

e também no DBGridEnter

procedure TfrmCaixaBanco.DBGrid2Enter(Sender: TObject);

begin

       if (dbeditBanco.Text = '') or (dbeditConta.Text = '') then begin

        showmessage('Preencha os campos acima antes de movimentar a conta!');

         abort;

          end;

        keypreview := false;

         dmDados.tblConta.Edit;    // TBCONTA TABELA PAI DE TBHISTORICO

          dmDados.tblConta.Post;

            dmDados.tblConta.Refresh;        

end;

Neste Banco conta corrente não tem botão para Excluir lançamentos.

Segue o Print do Form

59d03ab34d492_TelaContaCorrente.JPG.877a4e5f63c128d1260096cd245d9a1c.JPG

 

 

OBS: Caso voce precise calcular a coluna de varios registros, use um select para filtrar os registros que voce quer e depois bastara voce criar uma rotina para ler os registros e ir fazendo os calculos e jogando os valores na coluna desejada e depois é só salvar os registros modificados.

Nesta Obs que você citou acima eu consegui fazer 02 Querys para pegar a soma da Coluna HIS_VALOR de acordo com a coluna HIS_TIPO (Se for "C"  Crédito se for "D" Débito), mas não consigo avançar por falta de conhecimento. Por favor peço sua estimada ajuda.

Segue as Querys que fiz:

PARA SOMAR CRÉDITO

procedure TfrmCaixaBanco.QuerySomaCredito(Sender: TObject);

begin

 IBQuery1.Active:= true;

 IBQuery1.Close;

 IBQuery1.SQL.Clear;

 IBQuery1.SQL.Add('Select HIS_TIPO, SUM(HIS_VALOR) As TotalCredito');

 IBQuery1.SQL.Add('From TBHISTORICO');

 IBQuery1.SQL.Add('Where HIS_TIPO = ''C''');

 IBQuery1.SQL.Add('GROUP BY HIS_TIPO');

 IBQuery1.Open;

end;

PARA SOMAR DÉBITOS

procedure TfrmCaixaBanco.QuerySomaDebito(Sender: TObject);

begin

 IBQuery2.Active:= true;

 IBQuery2.Close;

 IBQuery2.SQL.Clear;

 IBQuery2.SQL.Add('Select HIS_TIPO, SUM(HIS_VALOR) As TotalDebito');

 IBQuery2.SQL.Add('From TBHISTORICO');

 IBQuery2.SQL.Add('Where HIS_TIPO = ''D''');

 IBQuery2.SQL.Add('GROUP BY HIS_TIPO');

 IBQuery2.Open;

end;

 

Obrigado

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

TotalCredito e TotalDebito são campos virtuais ?

se forem,  basta voce jogar o valor desses campos nos campos da sua tabela e salvar

exemplo:

IBQuery2.Edit;

IBQuery2.HIS_VALOR.Value :=  TotalCredito ;

IBQuery2.Post;

IBQuery2.ApplyUpdates;

IBQuery2.Refresh;

OBS: Dê duplo clique no IBQuery2 para adicionar o campo virtual no componente.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas bom dia

Pegando seu exemplo, fiz alterações no SQL das IBQuerys e na instrução OnKeyPress do DBGrid. Quando vou passar da coluna 5 para a coluna 6 do DBGrid gera um Erro com a seguinte mensagem:

Class EDataBaseError with message 'IBQuery1: Cannot Modify a Read-Only Dataset. Process stopped.

por favor me ajude, segue os códigos:

No IBQuery1 ficou assim a instrução SQL

select HIS_TIPO, HIS_VALOR, SUM(HIS_VALOR)  As TOTALCREDITO

From TBHISTORICO

Where HIS_TIPO = 'C' GROUP BY HIS_TIPO, HIS_VALOR

No IBQuery2 ficou assim a instrução SQL

select HIS_TIPO, HIS_VALOR, SUM(HIS_VALOR) As TOTALDEBITO

From TBHISTORICO

Where HIS_TIPO = 'D' GROUP BY HIS_TIPO, HIS_VALOR

No DBGrid evento OnKeyPress

procedure TfrmCaixaBanco.DBGrid2KeyPress(Sender: TObject; var Key: Char);

begin

    dmDados.tblHistorico.Edit; ///  deixe erm modo de edição o registro da tabela

  if Key = #13 then

      begin

         if not (ActiveControl is TDBGrid) then

            begin

               //Key := #0;

               //Perform(WM_NEXTDLGCTL, 0, 0);

            end

         else

            begin

               if (ActiveControl is TDBGrid) then

                  with TDBGrid(ActiveControl) do

                  if selectedindex < (fieldcount -1) then

                     selectedindex := selectedindex + 1

                  else

                     selectedindex := 0;

             end;

     end;

     ///  AQUI VOCE QUER REALIZAR ALGUM CALCULO

     if (DBGrid2.SelectedIndex > 5) then begin

  // COLUNA 1 É DA HIS_DATA

  // COLUNA 2 É DA HIS_TIPO

  // COLUNA 3 É DA HIS_LANCODIGO

  // COLUNA 4 É DA HIS_TIPOCODIGO

  // COLUNA 5 É DA HIS_DESCRICAO

  // COLUNA 6 É DO HIS_VALOR


 

     IBQuery1.Close;

     IBQuery1.Open;

     IBQuery1.Edit;

     IBQuery1HIS_VALOR.Value:= IBQuery1TOTALCREDITO.Value;

     IBQuery1.Post;

     IBQuery1.ApplyUpdates;

     IBQuery1.Refresh;

     //

     IBQuery2.Close;

     IBQuery2.Open;

     IBQuery2.Edit;

     IBQuery2HIS_VALOR.Value:= IBQuery2TOTALDEBITO.Value;

     IBQuery2.Post;

     IBQuery2.ApplyUpdates;

     IBQuery2.Refresh;

     //

     dmDados.tblConta.edit;

     dmDados.tblContaCON_CREDITO.Value:= IBQuery1HIS_VALOR.Value;

     dmDados.tblContaCON_DEBITO.Value:= IBQuery2HIS_VALOR.Value;

     dmDados.tblContaCON_SALDO.Value:= dmDados.tblContaCON_CREDITO.Value - dmDados.tblContaCON_DEBITO.Value;

     dmDados.tblConta.Post;

     dmDados.tblConta.Refresh;

     //

     dmDados.tblHistorico.Append;

     DBGrid2.SelectedIndex:= 0;

     end;

end;

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...