Parcelas

Delphi

10/11/2010

olá a todos
imagina o seguinte: quero ler todos os clientes, gerar duplicatas(pai) e parcelas(filho) com base num valor fixo, por exemplo 50 por mes
durante 12 meses
a saber as tabelas:
clientes(idcliente,nomecliente,endereco)
parcelas(id_parcela,qtparcela,emissao,total,idcliente)
duplicatas(id_parcela,nrparcela,vencimento,pagamento,valor,valorpago)
[]´s
Evaristo
Evaristo Neto

Evaristo Neto

Curtidas 0

Respostas

Ana Carolina

Ana Carolina

10/11/2010

Bom dia,

Uma pergunta, já que duplicata é pai o campo idcliente deveria estar nela não?
E os campo qtparcela da tabela parcelas e nrparcela da tabela duplicatas deveriam ser invertidos, pois creio que ficaria melhor assim,

As duplicatas tem uma quantidade de parcelas (qtparcela = 12)
E a parcela gerada corresponde a parcela nº 1, parcela nº 2 (nrparcela = 1, nrparcela = 2) e assim po diante.
GOSTEI 0
Evaristo Neto

Evaristo Neto

10/11/2010

Na verdade me enganei no nome das tabelas. duplicata((id_parcela,qtparcela,emissao,total,idcliente)
parcelas(id_parcela,nrparcela,vencimento,pagamento,valor,valorpago)
Perdoe-me!!!
[]´s
Evaristo
GOSTEI 0
Ana Carolina

Ana Carolina

10/11/2010

Baseado no componente Tquery

qrycliente.sql.text := 'Select * from clientes';
qrycliente.open;

if not (qryclientes.isempty) then
begin
qryclientes.First;
while not qryclientes.EOF do
begin

   qryduplicatas.insert;
   qryduplicatas.FieldByName('Idparcela').AsString := 'CódigoGerado';
   // Os demais campos
   qryduplicatas.post;

   for i := 1 to 12 do
   begin
      qryparcelas.insert;
     qryparcelas.FieldByName('Idparcela').AsString := qryduplicatas.FieldByName('Idparcela').AsString
     qryparcelas.FieldByName('Nrparcela').AsInteger := i;
      qryduplicatas.post;
   end;
   qryclientes.next;
end;

end;


Não sei se é isso que você quer, mas a rotina ficaria mais ou menos assim.
GOSTEI 0
Rodrigo Bertelle

Rodrigo Bertelle

10/11/2010

Bom dia Evaristo não sei mas não concordo com o layout da sua tabela pq é um relacionamento de 1:N veja o modelo abaixo, é assim que que trabalho:


CERATE TABLE DUPLICATA
(
      IDDUPLICATA INTEGER NOT NULL,
      IDCLIENTE INTEGER NOT NULL,
      VALORDUPLICATA FLOAT NOT NULL,
      DATACRIACAO DATETIME NOT NULL,
      QTCEPARCELAS INTEGER NOT NULL
      PRIMARY KEY (IDDUPLICATA),
      FORENGIN KEY (IDCLIENTE) REFERENCES CLIENTE (IDCLIENTE)
);

CERATE TABLE PARCELAS

(

      PARCELA INTEGER NOT NULL,

      IDDUPLICATA INTEGER NOT NULL,

      VALORPARCELA FLOAT NOT NULL,

      DATACRIACAO DATETIME NOT NULL,
      DTPAGAMENTO DATETIME,
      VALORPAGO FLOAT,
      STATUS CHAR (1)

      PRIMARY KEY (IDDUPLICATA, PARCELA),

      FORENGIN KEY (IDDUPLICATA) REFERENCES DUPLICATA (IDDUPLICATA) ON DELETE CASCATE

);

E ainda voce pode ter uma tabela de pagamentos

CERATE TABLE PAGAMENTO


(
      IDPAGAMENTO INTEGER NOT NULL,


      PARCELA INTEGER NOT NULL,


      IDDUPLICATA INTEGER NOT NULL,


      VALORPAGO FLOAT NOT NULL,


      DATAPAGAMENTO DATETIME NOT NULL,


      PRIMARY KEY (IDPAGAMENTO),


      FORENGIN KEY ([IDDUPLICATA], [PARCELA]) REFERENCES PARCELAS ([IDDUPLICATA], [PARCELA]) ON DELETE CASCATE


);

Então Evaristo ao meu ver essa estrutura é mais coerente.

Espero ter ajudado...

t +

qualquer coisa meu msn é rpurgato@hotmail.com




GOSTEI 0
Evaristo Neto

Evaristo Neto

10/11/2010

Agradeço de coração a todos que de uma forma ou de outra me ajudaram. Embora não tenha usado fielmente o que me passaram, cheguei a seguinte solução:
procedure TfrmCadParcelasT.BitBtn1Click(Sender: TObject);
var pc, i, idParc: Smallint;
   ValorTotal, ValorParcela : real;
begin
   dm.cdsListaClientes.Open;
   dm.cdsListaClientes.First;
   pc := StrToInt(edtParcelas.Text); //Qtde PC
   ValorParcela := StrToFloat(CurrencyEditEx1.Text); //Valor Parcela
   ValorTotal :=  ValorParcela * pc; //Valor Total
   while not dm.cdsListaClientes.Eof do
   begin
   //Inicia criação do Mestre
   dm.Start;
   try
      with dm.spParcelas do
      begin
         Params[0].AsInteger := 0; //0 Para criar automatico
         Params[1].AsInteger := pc; //Qtde Parcelas
         Params[2].AsInteger := dm.cdsListaClientesID_CLIENTE.AsInteger; //Codigo do cliente
         Params[3].AsDate := DateTimePicker1.Date; //Data Emissao
         Params[4].AsBCD := ValorTotal;
         ExecProc;
         dm.Comit;
         idParc := Params[5].AsInteger;
      end;
   except
      dm.RollBack;
   end;
   //Adiciona as parcelas
   try
      with dm.spPagamentos do
         begin
         for i:=1 to pc do
         begin
            dm.Start;
            Params[0].AsInteger := idParc; //Id Duplicata
            Params[1].AsInteger := i; //Id Parcela
            Params[2].AsDate := DateTimePicker2.Date + ((i - 1) * 30); //Vencimento
            Params[3].AsBCD := ValorParcela;
            Params[4].AsBCD := 0.00;
            //i:=i+1;
            //dm.Comit;
            ExecProc;
            dm.Comit;
         end;
         end;
   except
      //DeleteParcelas(idParc);
      dm.RollBack;
   end;
   dm.cdsListaClientes.Next; //Proximo cliente
   end;
   dm.cdsListaClientes.Close; //Fecha clientes
   dm.cdsListaParcelas.Close; //Fecha parcelas
   dm.cdsParcelas.Close; //Fecha parcelas
   dm.cdsPagamentos.Close; //Fecha pagamentos
   Application.MessageBox('Parcelas geradas com sucesso!','Atenção',0);
end;

Ainda falta alguns ajustes mas o essencial já está fazendo.

GOSTEI 0
POSTAR