Fórum Parcelas #390252
10/11/2010
0
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
Curtir tópico
+ 0Posts
10/11/2010
Ana Carolina
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
10/11/2010
Evaristo Neto
parcelas(id_parcela,nrparcela,vencimento,pagamento,valor,valorpago)
Perdoe-me!!!
[]´s
Evaristo
Gostei + 0
10/11/2010
Ana Carolina
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
10/11/2010
Rodrigo Bertelle
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
10/11/2010
Evaristo Neto
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
Clique aqui para fazer login e interagir na Comunidade :)