Como criar uma tabela virtual

Delphi

05/07/2012

Olá pessoal!

Já ouvi falar sobre tabela virtual. Gostaria de saber se no meu caso é viável.

Bem, o programa em que estou trabalhando, gera várias promissórias pertencentes a seus respectivos contratos.
Essas promissórias são as parcelas a serem pagas pelos clientes.
Preciso fazer uma tela (ja a fiz) para calcular o saldo devedor das parcelas que estão em abertas.
Estou utilizando o clientdataset. Não dá pra fazer usando query devido a necessidade de alguns valores serem alterados pelo cliente, como multa por exemplo.
Todos os registros passam por uma atulização monetária. Registro à registro.
Quando é feita essa atualização em um único cliente ou contrato, beleza, mas se for fazer em um empreendimento que contém vários contratos, ai a coisa fica feia!
Seria ideal se pudesse utilizar uma tabela virutal que me possibilita-se atualiza-las utilizando updates.

Se for o caso, disponibilizo acesso por teamview ou Ammyy.
Qualquer coisa para conseguir resolver isso da forma mais ideal possível.
estou disponível também pelo skype (nome skype: Vagner_CA - RJ / email:vca-rj@bol.com.br)

Agradeço desde já qualquer ajuda.
Vagner Almeida

Vagner Almeida

Curtidas 0

Respostas

Flavia Santos

Flavia Santos

05/07/2012

Boa tarde!

Posta o seu código amigo, assim fica mais fácil ajudarmos.

Abraços.
GOSTEI 0
Vagner Almeida

Vagner Almeida

05/07/2012

Não se se isso vai ajudar muito!

procedure Tfrm_saldodevedor.CarregarSD; // Carrega/popula a tabela -> ClientDataSet
begin
if not cdsSD.Active then
cdsSD.CreateDataSet;

with frm_consulpromissorias.ibq_condet do begin
First;
while not Eof do begin
if FieldByName(men_status).AsString = NP then begin
cdsSD.Append;
cdsSDcontr.AsInteger := FieldByName(con_codigo).AsInteger;
cdsSDtipo.AsString := FieldByName(men_tipo).AsString;
cdsSDparc.AsString := FieldByName(parcela).AsString;
cdsSDvenc.AsDateTime := FieldByName(men_vencimento).AsDateTime;
cdsSDvalor_a.AsFloat := FieldByName(valor).AsFloat;
cdsSDincc.AsFloat := FieldByName(percincc).AsFloat;
cdsSDchv.AsFloat := FieldByName(percchave).AsFloat;
cdsSDvalor_n.AsFloat := FieldByName(vlapagar).AsFloat;
cdsSDatraso.AsInteger := FieldByName(diasatraso).AsInteger;
cdsSDmulta.AsFloat := FieldByName(men_jurosatraso).AsFloat;
cdsSDvalor_p.AsFloat := FieldByName(vlapagar).AsFloat;
cdsSD.Post;
end;

if chv = 0 then
if FieldByName(men_entregachave).AsString = S then
chv := 1;

Next;
end;
cdsSD.First;
end;
end;

function Tfrm_saldodevedor.BuscaINCC(dt: TDate): Double;
begin
ibq_sd.SQL.Clear;
ibq_sd.SQL.Add(select * from INCC where incc_codigo = :codincc);
ibq_sd.ParamByName(codincc).AsString := InsertZeros(MonthOf(incMonth(dt,-1)),2)+/+InsertZeros(YearOf(incMonth(dt,-1)),4);
ibq_sd.Open;

if not ibq_sd.IsEmpty then
Result := ibq_sd.FieldByName(incc_percentual).AsFloat
else
Result := 0;
end;

procedure Tfrm_saldodevedor.CalcularSD;
var vlr, idx, incc: Real;
venc: TDate;
contrato: Integer;
begin
vlr := 0;
idx := 0;
incc := 0;
contrato := 0;
venc := 0;

cdsSD.First;
contrato := cdsSDcontr.AsInteger;
repeat
if venc = cdsSDvenc.AsDateTime then begin
cdsSD.Next;
Continue;
end;

venc := cdsSDVenc.AsDateTime;
incc := BuscaINCC(venc);
idx := (incc + chv) / 100;
ShowMessage(Contrato: +IntToStr(contrato)+ | +DateToStr(venc));

repeat
cdsSD.Edit;

if venc <> cdsSDvenc.AsDateTime then
cdsSDvalor_a.AsFloat := cdsSDvalor_a.AsFloat + (cdsSDvalor_a.AsFloat * idx);

if venc = cdsSDvenc.AsDateTime then begin
cdsSDincc.AsFloat := incc;
cdsSDchv.AsFloat := chv;
end;

if cdsSDincc.AsFloat = 0 then begin
cdsSDvalor_n.AsFloat := cdsSDvalor_a.AsFloat + (cdsSDvalor_a.AsFloat * idx);
cdsSDvalor_p.AsFloat := cdsSDvalor_a.AsFloat + (cdsSDvalor_a.AsFloat * idx);
end;

cdsSD.Post;
cdsSD.Next;
until (contrato <> cdsSDcontr.AsInteger) or (cdsSD.Eof);

cdsSD.Locate(contr;venc,VarArrayOf([contrato,DateToStr(venc)]),[]);
ShowMessage(Contrato: +IntToStr(contrato)+ | +DateToStr(venc));

cdsSD.Next;

if contrato <> cdsSDcontr.AsInteger then begin
contrato := cdsSDcontr.AsInteger;
venc := 0;
end;

until cdsSD.Eof; // or (cod <> cdsSDcontr.AsInteger);
end;
GOSTEI 0
Alvaro Vieira

Alvaro Vieira

05/07/2012

Vagner, boa tarde.
Respondendo a sua primeira pergunta, sim o cds (ClientDataSet) é uma ótima idéia para resolver seu problema, mas quanto a dificuldade em utilizar a query, aí já não concordo.
Pelo que entendi, você calcula os títulos abertos e precisa de uma confirmação do usuário para gerar as duplicatas alteradas por multas, etc., certo?
Bem, não vejo o por quê não utilizar uma query para apresentar os valores, exibi-los numa grade e aguardar o OK do cliente.
Lendo seu código, vejo que você não ligou o cds ao um Provider, por isso o está criando em tempo de execução usando o método CreateDataSet (o que creio que seja o que você chamou de tabela virtual). O cds pode estar ligado a um Provider Geral e isso só vai te ajudar, ou seja, o seu SQLDataSet Geral não precisa ter um comando definido, ele vai aceitar a instrução que você passar, para isso o DataSetProvider deve conter as opções [poCascadeDeletes,poCascadeUpdates,poAllowCommandText]. Essa sugestão baseia-se numa solução 3 camadas, se você não souber como cria-la, procure pelos tutoriais aqui no fórum, é bem simples e mais recomendável que a client-server, porém a instrução também funciona em 2 camadas.
Veja se a idéia abaixo pode te ajudar:
1-Criar uma tabela onde o usuário preencha diariamente os valores das moedas envolvidas (você provavelmente já fez isso);
2-Utilizando um cds onde a instrução já linque as parcelas abertas com seus valores atualizados pela tabela do item 1, inclusive já demonstrando os juros pertinentes a cada contrato;
3-Mostrar resultados numa grade ou em duas onde a primeira mostraria o contrato e a segunda as parcelas tipo master-detail;
4-Permitir alteração de valores diretamente na grade (você pode controlar que o usuário altere apenas as colunas de multa/acréscimo, por ex.);
5-Após a aceitação, o sistema grava também via query todos os contratos exibidos (independentemente se foram alterados ou não).
Você verá que essa solução diminuirá sensivelmente o seu código.
Abraço.


GOSTEI 0
Vagner Almeida

Vagner Almeida

05/07/2012

Obrigado...

Fiz uma StoredProcedure para fazer todos os cálculos e me retornar os dados de que preciso, ficou extremamente rápido.
As alterações fiz conforme você me sugeriu, ficou ótimo.
Em comparação ao que eu tinha pensado é como se eu tivesse andando em um fusquinha e agora estou numa ferrari.

Valeu mesmo!

Abraços...
GOSTEI 0
POSTAR