Parcelas
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
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
Curtidas 0
Respostas
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.
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
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
parcelas(id_parcela,nrparcela,vencimento,pagamento,valor,valorpago)
Perdoe-me!!!
[]´s
Evaristo
GOSTEI 0
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.
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
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
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.
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