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

(Resolvido) Gerar Pagamentos


mago_danger

Pergunta

Bom dia pessoal...

Estou com um probleminha aqui num sistema que estou desenvolvendo.

(BD - ACCESS)

Eu preciso que o sistem gere sozinho as parcelas (mensalidades).

Tenho os campos:

Valor:

Meses: (quantidade de mes, ou seja, aprcelas)

Vencimento: (exemplo: se for todo dia 15... aqui nesse campo coloco só 15 e ele automaticamente gera os recibos referente a quantidade de mês que coloquei no campo "meses")

Porém eu não faço nem idéia de como começar.. procurei umas coisas aqui mas não entendi. =/

alguém pode me da uma forcinha?

valeu!!

Link para o comentário
Compartilhar em outros sites

23 respostass a esta questão

Posts Recomendados

  • 0

olá pessoal...

venho tentando fazer essa forma de gerar pagamentos... mas não dá jeito de conseguir!

por favor me ajudem...

meu BD é access...

eu tenho na tabela pagamentos (tbl_pagamentos) os seguites campos:

- valor

- data vencimento

- parcelas

O que eu precio é por exemplo, preencher assim: (vamos supor que estou fazendo esse cadastro hoje. Considerando o mês 04)

Valor: R$ 180,00

Vencimento: 21

Quantidade de Parcelas: 10

Então ao clicar no botão GERAR, iriar gerar e gravar no banco de dados da seguinte forma:

Parcela: 1/10 Valor: R$ 180,00 Vencimento: 21/05/2011

Parcela: 2/10 Valor: R$ 180,00 Vencimento: 21/06/2011

Parcela: 3/10 Valor: R$ 180,00 Vencimento: 21/07/2011

Parcela: 4/10 Valor: R$ 180,00 Vencimento: 21/08/2011

Parcela: 5/10 Valor: R$ 180,00 Vencimento: 21/09/2011

Parcela: 6/10 Valor: R$ 180,00 Vencimento: 21/10/2011

Parcela: 7/10 Valor: R$ 180,00 Vencimento: 21/11/2011

Parcela: 8/10 Valor: R$ 180,00 Vencimento: 21/12/2011

Parcela: 9/10 Valor: R$ 180,00 Vencimento: 21/01/2012

Parcela: 10/10 Valor: R$ 180,00 Vencimento: 21/02/2012

IMPORTANTE: o valor será sempre o mesmo para todos os mêses, pois é mensalidade de aula. Portanto não precisa ser dividido pela quantidade de parcelas.

Por favor pessoal, preciso muito disso e desde que criei esse tópico tenho tentado fazer, mas não consigo.

Agradeço a ajuda.

Link para o comentário
Compartilhar em outros sites

  • 0

exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var valor : real; venc, qtde_parc, i : integer; s : string;
begin
  valor := 180;
  Venc := 21;
  Qtde_parc := 10;
  memo1.Clear;

  for i := 1 to Qtde_parc do
     begin
        s := 'Parcela: '+ inttostr(i) +'/'+inttostr(Qtde_parc)+
        ' -  Valor: R$ '+ formatfloat('0.00',valor) + ' - Vencimento: ' +
        inttostr(venc) + copy(datetostr(now+(30*i)),3,8);

        memo1.Lines.Append(s);
     end;

end;

modifique o código para o seu uso

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Amigo, colocar os dados em um banco de dados é muito simples

exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var valor : real; venc, qtde_parc, i : integer; s : string;
begin
  valor := 180;
  Venc := 21;
  Qtde_parc := 10;
  memo1.Clear;

  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  for i := 1 to Qtde_parc do
     begin
        Query1.Last;  // ultimo registro
        Query1.Append;  //  adicionar novo registro
        Query1.Edit;  // editar registro

        {s := 'Parcela: '+ inttostr(i) +'/'+inttostr(Qtde_parc)+
        ' -  Valor: R$ '+ formatfloat('0.00',valor) + ' - Vencimento: ' +
        inttostr(venc) + copy(datetostr(now+(30*i)),3,8);

        memo1.Lines.Append(s);}

        // Atribuir os valores das variaveis aos campos do registro na tabela

        Query1Parecela.Value   :=  inttostr(i) +'/'+inttostr(Qtde_parc);  // campo String
        Query1Valor.Value      :=  valor;  // campo Float
        Query1Vencimento.Value :=  now+(30*i);  // campo Data

        Query1.Post;  // salvar o registro
        Query1.ApplyUpdates; // atualizar o registro

     end;

end;

OBS: Tente fazer...

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

olá amigo...

antes de tentar fazer diretamente no meu sistema... fiz um outro para teste, e ficou dessa forma:

var valor : real;
venc, parcelas, i : integer;
s : string;

begin
  valor := 180;
  Venc := 21;
  parcelas := 10;
  memo1.Clear;

  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  for i := 1 to parcelas do
     begin
        Query1.Last;  // ultimo registro
        Query1.Append;  //  adicionar novo registro
        Query1.Edit;  // editar registro

        {s := 'Parcela: '+ inttostr(i) +'/'+inttostr(Qtde_parc)+
        ' -  Valor: R$ '+ formatfloat('0.00',valor) + ' - Vencimento: ' +
        inttostr(venc) + copy(datetostr(now+(30*i)),3,8);

        memo1.Lines.Append(s);}

        // Atribuir os valores das variaveis aos campos do registro na tabela

        Query1parcelas.Value   :=  inttostr(i) +'/'+inttostr(parcelas);  // campo String
        Query1Valor.Value      :=  valor;  // campo Float
        Query1Vencimento.Value :=  now+(30*i);  // campo Data

        Query1.Post;  // salvar o registro
        Query1.UpdateRecord; // atualizar o registro

  end;
end;

PORÉM.... quando aperto F9 roda normal, só que quando clico no botão aparece o seguinte erro:

'Query1: Dataset not in edit or insert mode'.

Porque está ocorrendo esse erro?

Obrigado pela força que está dando.

abração

Link para o comentário
Compartilhar em outros sites

  • 0

vamos fazer algumas modificações:

primeiro voce deve criar uma tabela que tenha os seguintes campos:

Parcelas -> tipo string 10

Valor -> tipo float ( 10, 2 )

Data -> tipo data

depois voce cria a instrução SQL na query1

Select * from MinhaTabela

para acessar o banco de dados voce vai usar

TQuery, TDataSetProvider, TClientDataSet e um DataSource

faça a ligação entre os componentes

depois de clique duplo no componente ClientDataSet1 para adicionar os campos

veja a alteração no código:

var valor : real;
venc, parcelas, i : integer;
s : string;

begin
  valor := 180;
  Venc := 21;
  parcelas := 10;
  memo1.Clear;

  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  for i := 1 to parcelas do
     begin
        ClientDataSet1.Last;  // ultimo registro
        ClientDataSet1.Append;  //  adicionar novo registro
        ClientDataSet1.Edit;  // editar registro

        {s := 'Parcela: '+ inttostr(i) +'/'+inttostr(Qtde_parc)+
        ' -  Valor: R$ '+ formatfloat('0.00',valor) + ' - Vencimento: ' +
        inttostr(venc) + copy(datetostr(now+(30*i)),3,8);

        memo1.Lines.Append(s);}

        // Atribuir os valores das variaveis aos campos do registro na tabela

        ClientDataSet1parcelas.Value   :=  inttostr(i) +'/'+inttostr(parcelas);  // campo String
        ClientDataSet1Valor.Value      :=  valor;  // campo Float
        ClientDataSet1Vencimento.Value :=  now+(30*i);  // campo Data

        ClientDataSet1.Post;  // salvar o registro
        ClientDataSet1.ApplyUpdates(-1);// atualizar o registro

  end;
end;

OBS: isso é só um exemplo, entendendo o funcionamento, depois voce faz uma adaptação ao seu código

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

ixi... não estou conseguindo..

agora aparece o erro:

ClientDataSet: Missing data provider or data packet

Para conectar oa banco de dados fiz da seguinte forma:

- ADOConection (liguei ele com o BD Access)

- ADOQuery1 (liguei ele com no conection com o ADOConection e liguei ele com a tabela no SQL: select * from pagamentos)

- DataSetProvider1 (no DataSet linkei com a Query1)

- ClientDataSet1 (no MasterSource liguei com o DataSetProvider1 dei 2 cliques nele e criei os 3 campos com as mesmas caracteristicas que criei no banco de dados e depois cliquei com o botão direito sobre ele e fui em creat dataset)

- DataSource (liguei com a Query1)

O que tem de errado agora nisso que eu fiz??

=////

obrigado novamente!

Link para o comentário
Compartilhar em outros sites

  • 0
O que tem de errado agora nisso que eu fiz??

os componentes que voce deve usar são:

ADOQuery1 , DataSetProvider1, ClientDataSet1 e DataSource1

DataSetProvider1 ligado ao ADOQuery1 pela propriedade DataSet.

ClientDataSet1 ligado ao DataSetProvider1 pela propriedade ProviderName.

DataSource1 ligado ao ClientDataSet1 pela propriedade DataSet.

NOTA: no ClientDataSet1, não é preciso criar os campos .. de duplo clique do mouse no componente e na janelinha que aparece, voce clica com o botão direito do mouse e clica em Add all fields.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

amigo deu certoo!!!! :rolleyes: :rolleyes: :rolleyes: :rolleyes:

agora tem 2 probleminhas....

1) eu clico no botão é como se não tivesse aconteceido nada... não aparece na DBGrid os dados e tal...

dai eu coloquei um outro datasource ligado com o query1... mas dai só aparece se eu fechar e abrir novamente o sistema...

2) no campo vencimento está saindo além da tada... a hora também.. como faço pra não sair a hora e sim só a data?

obrigado!!!

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0
1) eu clico no botão é como se não tivesse aconteceido nada... não aparece na DBGrid os dados e tal...

dai eu coloquei um outro datasource ligado com o query1... mas dai só aparece se eu fechar e abrir novamente o sistema...

No final do processamento use:

Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

os registros serão atualizados no dbgrid

2) no campo vencimento está saindo além da tada... a hora também.. como faço pra não sair a hora e sim só a data?

o campo tem que ser tipo Data e não DataTime

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

basta limitar o numero de caracteres que vai mostrar a data

de duplo clique do mouse no ClientDataSet1 e na janelinha que aparece, voce clica no campo DATA e no object inspector voce altera a propriedade EditMask para !99/99/0000;1;_

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

olá amigo... ainda estou com problemas...

A data de vencimento estava sendo calculada em relação a data de hoje independente do valor que fosse inserido no campo VENCIMENTO. Fiz umas alterações, e ficou asim:

var
valor : real;
venc : double;
parcelas, i : integer;

begin
  valor := StrToFloat(Edit1.text);
  Venc := StrToFloat (Edit2.text);
  parcelas := StrToInt(Edit3.text);
  memo1.Clear;
  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  for i := 1 to parcelas do
     begin
        ClientDataSet1.Last;  // ultimo registro
        ClientDataSet1.Append;  //  adicionar novo registro
        ClientDataSet1.Edit;  // editar registro

        // Atribuir os valores das variaveis aos campos do registro na tabela

        ClientDataSet1parcelas.Value   :=  inttostr(i) +'/'+inttostr(parcelas);  // campo String
        ClientDataSet1Valor.Value      :=  valor;  // campo Float
        ClientDataSet1Vencimento.Value :=  venc+date+(-30+30*i);  // campo Data
        ClientDataSet1.Post;  // salvar o registro
        ClientDataSet1.ApplyUpdates(-1);// atualizar o registro

  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

    end;
end;

Agora está quase certo, ao não ser a data que vai diminuindo sempre 1 dia!!

Ou seja, hoje é dia 29 porém eu posso fazer um cadastro de um cliente cujo vencimento vai ser todo dia 10.

Então no campo VENCIMENTO eu colocaria 10, e todos os vencimento seriam dia 10.

ASSIM:

10/06/2011

10/07/2011

10/08/2011

PORÉM... com essa programação se eu colocar o vencimento dia 10 (e vamos supor que forem 5 parcelas), fica assim:

08/06/2011

08/07/2011

07/08/2011

06/09/2011

06/10/2011

como posso alterar a programação pra fazer isso?

Obrigado.

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0

var
valor : real;
venc : double;
parcelas, i, mes : integer;

begin
  valor := StrToFloat(Edit1.text);
  Venc := StrToFloat (Edit2.text);
  parcelas := StrToInt(Edit3.text);
  memo1.Clear;
  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  Present:= Now;  //  coloque a data inicial aqui ( no lugar do now )
  DecodeDate(Present, Year, Month, Day);
  mes := month;

  for i := 1 to parcelas do
     begin
        ClientDataSet1.Last;  // ultimo registro
        ClientDataSet1.Append;  //  adicionar novo registro
        ClientDataSet1.Edit;  // editar registro

        // Atribuir os valores das variaveis aos campos do registro na tabela

        if mes > 11 then
           begin
              mes := 1;
              Year := Year + 1;
           end
        else
           inc(mes);

        ClientDataSet1parcelas.Value   :=  inttostr(i) +'/'+inttostr(parcelas);  // campo String
        ClientDataSet1Valor.Value      :=  valor;  // campo Float
        ClientDataSet1Vencimento.Value :=  strtodate(IntToStr(Day) + '/' + IntToStr(Mes) + '/' + IntToStr(Year)));  // campo Data
        ClientDataSet1.Post;  // salvar o registro
        ClientDataSet1.ApplyUpdates(-1);// atualizar o registro

    end;

  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Amigo, tentei fazer agora isso...

mas aparecem os seguintes erros:

undeclared identifier: 'Present'

undeclared identifier: 'Year'

Types of actual and formal var parameters must be identical

como resolver isso?

obrigado e desculpe por tantas perguntas.... :wacko:

Link para o comentário
Compartilhar em outros sites

  • 0

Amigo, deu tudo certo aqui... mas tem só 1 um detalhezinho....

primeiro como ficou:

Coloquei aonde vai a data inicial (que antes era um Edit) um "TDateEdit"

depois:

Venc := StrToDate (DateEdit1.text);
Present:= venc;  //  coloque a data inicial aqui ( no lugar do now )
  DecodeDate(Present, Year, Month, Day);
  mes := month;

ficou bem legal, era exatamente isso que eu precisava!!!

Agora o único problema pra finalizar é:

vamos supor que eu coloque o vencimento todo dia 30 (tenho muito dessa caso aqui...)

então quando chega em Fevereiro, o sistema da erro falando que não existe "30/02/2012"...

como eu faço para quando o mês for "2" ele automaticamente jogar para o dia 28?

obrigado mais uma vez!! :blush:

Link para o comentário
Compartilhar em outros sites

  • 0

olá... li umas coisas que achei e tentei fazer isso... mas não deu certo...

não dá erro.. mas também não gerar parcelas... (não acontece nada quando clico no botão gerar)...

var
  valor : real;
  venc : double;
  mes2 : double;
  parcelas, i, mes : integer;
  Present: TDateTime;
  Year, Month, Day: Word;

begin
  valor := StrToFloat(Edit1.text);
  Venc := StrToDate (DateEdit1.text);
  parcelas := StrToInt(Edit3.text);
  memo1.Clear;
  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  Present:= venc;  //  coloque a data inicial aqui ( no lugar do now )
  DecodeDate(Present, Year, Month, Day);
  if month <> 2 then
  mes2 := month
  else
   begin
       if not IsLeapYear(year) then
          begin
             Inc(Month);
             Day := 2;
             mes2 := EncodeDate(year, month, day);
          end
          else
          begin
          Inc(Month);
               Day := 1;
               mes2 := EncodeDate(year, month, day);

  for i := 1 to parcelas do
     begin
        ClientDataSet1.Last;  // ultimo registro
        ClientDataSet1.Append;  //  adicionar novo registro
        ClientDataSet1.Edit;  // editar registro

        // Atribuir os valores das variaveis aos campos do registro na tabela

        if mes2 > 11 then
           begin
              mes2 := 1;
              Year := Year + 1;
           end
        else
        inc(mes);
        ClientDataSet1parcelas.Value   :=  inttostr(i) +'/'+inttostr(parcelas);  // campo String
        ClientDataSet1Valor.Value      :=  valor;  // campo Float
        ClientDataSet1Vencimento.Value :=  strtodate(IntToStr(Day) + '/' + FloatToStr(Mes2) + '/' + IntToStr(Year));  // campo Data
        ClientDataSet1.Post;  // salvar o registro
        ClientDataSet1.ApplyUpdates(-1);// atualizar o registro

    end;

  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

end; end; end;

Editado por MagoDanger
Link para o comentário
Compartilhar em outros sites

  • 0

faça assim

var
  valor : real;
  venc : double;

  parcelas, i, mes : integer;
  Present: TDateTime;
  Year, Month, Day: Word;

begin
  valor := StrToFloat(Edit1.text);
  Venc := StrToDate (DateEdit1.text);
  parcelas := StrToInt(Edit3.text);
  memo1.Clear;
  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  Present:= venc;  //  coloque a data inicial aqui ( no lugar do now )
  DecodeDate(Present, Year, Month, Day);

  mes := month; // atribui o mes atual

  for i := 1 to parcelas do
     begin
        ClientDataSet1.Last;  // ultimo registro
        ClientDataSet1.Append;  //  adicionar novo registro
        ClientDataSet1.Edit;  // editar registro

        // Atribuir os valores das variaveis aos campos do registro na tabela

        if mes > 11 then
           begin
              mes := 1;
              Year := Year + 1;
           end
        else
           inc(mes);

        if (mes = 2) and (Day > 28) then
           Day := 28;

        ClientDataSet1parcelas.Value   :=  inttostr(i) +'/'+inttostr(parcelas);  // campo String
        ClientDataSet1Valor.Value      :=  valor;  // campo Float
        ClientDataSet1Vencimento.Value :=  strtodate(IntToStr(Day) + '/' + FloatToStr(mes) + '/' + IntToStr(Year));  // campo Data
        ClientDataSet1.Post;  // salvar o registro
        ClientDataSet1.ApplyUpdates(-1);// atualizar o registro

    end;

  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

end;

Copie o código como esta aqui

OBS: quando o ano for bissexto, o mes de fevereiro é 29 ... pesquise no forum

http://scriptbrasil.com.br/forum/index.php...amp;hl=bissexto

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

olá amigo, funcionou quase certo....

só que vamos supor que eu gere hoje 24 parcelas com vencimento no dia 30...

ai acontece assim, até chegar em fevereiro do ano que vem todos os vencimentos ficam para dia 30... só que dai de fevereiro pra frente ficam todos 28...

como faço para só o mês 2 ficar com o vencimento dia 28 e depois voltar para o dia 30? :unsure:

Link para o comentário
Compartilhar em outros sites

  • 0

var
  valor : real;
  venc : double;

  parcelas, i, mes, dia : integer; //  acrescente a variavel dia
  Present: TDateTime;
  Year, Month, Day: Word;

begin
  valor := StrToFloat(Edit1.text);
  Venc := StrToDate (DateEdit1.text);
  parcelas := StrToInt(Edit3.text);
  memo1.Clear;
  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

  Present:= venc;  //  coloque a data inicial aqui ( no lugar do now )
  DecodeDate(Present, Year, Month, Day);

  mes := month; // atribui o mes atual
  dia := Day;

  for i := 1 to parcelas do
     begin
        ClientDataSet1.Last;  // ultimo registro
        ClientDataSet1.Append;  //  adicionar novo registro
        ClientDataSet1.Edit;  // editar registro

        // Atribuir os valores das variaveis aos campos do registro na tabela

        if mes > 11 then
           begin
              mes := 1;
              Year := Year + 1;
           end
        else
           inc(mes);

        if (mes = 2) and (Day > 28) then
           Day := 28
        else
           Day := dia;

        ClientDataSet1parcelas.Value   :=  inttostr(i) +'/'+inttostr(parcelas);  // campo String
        ClientDataSet1Valor.Value      :=  valor;  // campo Float
        ClientDataSet1Vencimento.Value :=  strtodate(IntToStr(Day) + '/' + FloatToStr(mes) + '/' + IntToStr(Year));  // campo Data
        ClientDataSet1.Post;  // salvar o registro
        ClientDataSet1.ApplyUpdates(-1);// atualizar o registro

    end;

  Query1.Active := false;
  ClientDataSet1.Active := false;
  Query1.Active := true;
  ClientDataSet1.Active := true;

end;

voce não esta sabendo fazer coisas básicas ... então sugiro que voce leia as apostilas disponiveis no forum, ou outras que voce encontra na Net.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

poxa cara.... obrigado mesmo por essa força, de coração!

eu precisava muito resolver esse problema...

agora vou fazer as adaptações no meu sistema, e vou começar a ler as apostilas e estudar mais...

também vou atras da biblia do delphi....

mais uma vez, muito obrigado!!!

abração!

Editado por MagoDanger
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,2k
    • Posts
      651,9k
×
×
  • Criar Novo...