Mostrando postagens com marcador TClientDataSet. Mostrar todas as postagens
Mostrando postagens com marcador TClientDataSet. Mostrar todas as postagens

Método [MergeChangeLog]


O nome do método já diz tudo, a mesclagem de todas as alterações contidas no TClientDataSet (inclusão, alteração e exclusão). O que resulta em um arquivo bem pequeno novamente (Apenas os registros e todas as mudanças aplicadas neles). Este método não deve ser executado em multi-camadas, pois ele vai quebrar todas as possíveis chamadas ao método ApplyUpdates que tente fazer.
Dica antes de executar o método MergeChangeLog, é recomendável verificar o valor de ChangeCount, que representa o número de alterações. Apenas se ChangeCount for maior que zero é que você deve executar o método MergeChangeLog.

procedure TFSistema.BtnTesteMergeChangeLogClick(Sender: TObject);
begin
  if ClientDataSet1.ChangeCount > 0 Then begin
    ClientDataSet1.MergeChangeLog ;
    ClientDataSet1.SaveToFile('Configuracoes.xml');
  end;
end;


CloneCursor no ClientDataSet do Delphi


Ao clonar os dados de um ClientDataSet você pode aplicar filtros, índices. Cada clone sera totalmente independente de cada ClientDataSet. Mas toda alteração, inserção, eliminação em um, automaticamente será refletidas para o outro isso porque teoricamente é utilizado a mesma lista de dados. Exemplo se excluir um cliente em um dos ClientDataSet e dar um ApplyUpdates, ao atualizar o outro ClientDataSet não terá este cliente. Vamos começar com o CloneCursor.
O primeiro parâmetro é a fonte dos dados que vc quer clonar ou obter. O Reset ira Resetar toda e qualquer propriedade que possa já existir
cds.CloneCursor(cdsClientes, Reset, KeepSettings);

Vamos a definição do método
procedure CloneCursor(Source :TCustomClientDataSet; Reset: Boolean;
  KeepSettings: Boolean = False);

Com isto percebemos que para clonar um ClientDataSet teremos então três situações
CdsClone.CloneCursor(CdsFonteDeDados, False, False);//Propriedade do cdsClientes
CdsClone.CloneCursor(CdsFonteDeDados, False, True); // Propriedade do CdsClone
CdsClone.CloneCursor(CdsFonteDeDados, True, False/True); //Propriedade do CdsClone são RESETADAS

Vamos para o nosso exemplo: 
Vamos pegar 3 ClientDataSet, um com o nome cdsClientes que será vinculado com o provider e nas properties Filter coloque "VALOR > 10", vamos incluir uma tabela cdsComFiltros que receberá os dados do cdsClientes com as propriedades que esta adicionado, vamos incluir uma tabela cdsSemFiltros que receberá os dados do cdsClientes sem as propriedades que esta adicionado!


No primeiro botão vamos coloca o código para continuar com as propriedades duplicadas para o próximo ClientDataSet
procedure TFSistema.Button2Click(Sender: TObject);
begin
  cdsComFiltros.CloneCursor(cdsClientes, False, True);
end;

No segundo botão vamos coloca o código para não replicar as propriedades do ClientDataSet
procedure TFSistema.Button3Click(Sender: TObject);
begin
  cdsSemFiltros.CloneCursor(cdsClientes, True, True);
end;

Resultado do CloneCursor com e sem duplicar as propriedades: 




Exemplo: Download do exemplo

Geração de parcelas



É super normal em nossos sistemas ter parcelas, principalmente em Vendas/Compras. Para criarmos o exemplo, vamos imaginar uma vendas em que o cliente queira parcelar o valor total em 12 vezes. Neste cenário, informaremos o valor total, a quantidade de parcelas e a quantidade entre os vencimentos.



Vamos precisar de:

2 - TDBGrid { dbgridCDSPai, dbgridCDSFilho };
2 - TClientDataSet { CDSPai, CDSFilho };
2 - TDataSource { dsCDSPai, dsCDSFilho };

Coloque os componente de acordo com a estrutura abaixo;

Na tabela CDSPai crie os campos:
DESCRICAO "string"; 
CODIGO "Integer"; 
NUMERO_PARCELA "Integer"; 
DIAS_ENTRE_PARCELAS "Integer"; 
VALOR "currency"; 


Na tabela CDSFilho crie os campos:
DATA_VENCIMENTO "Date"; 
NUMERO_PARCELA "Integer"; 
VALOR "currency"; 

Vamos começar com os códigos;

No evento OnNewRecord do componente CDSFilho
procedure TFPrincipal.CDSFilhoNewRecord(DataSet: TDataSet);
begin
   CDSFilhoCODIGO.Value := CDSPaiCODIGO.Value;
end;
No Change dos campos VALOR, PARCELA e NUMERO_PARCELA coloque o código abaixo;
procedure TFPrincipal.CDSPaiVALORChange(Sender: TField);
Var
  k: Integer;
  wData : TDate;
  wValorTotal : Double;
begin
  wData := Date;
  wValorTotal := CDSPaiVALOR.Value;
  if (CDSPaiNUMERO_PARCELA.Value > 0) and (CDSPaiVALOR.Value > 0) and (CDSPaiDIAS_ENTRE_PARCELAS.Value > 0) then begin
    for k := 1 to CDSPaiNUMERO_PARCELA.Value do begin
      if not CDSFilho.Locate('NUMERO_PARCELA', k, []) then begin
        CDSFilho.Append;
        CDSFilho.FieldByName('NUMERO_PARCELA').AsInteger := k;
      end else
        CDSFilho.Edit;
      wData := wData + CDSPaiDIAS_ENTRE_PARCELAS.AsInteger;
      CDSFilhoDATA_VENCIMENTO.AsDateTime := wData;
      CDSFilhoVALOR.AsCurrency := CDSPaiVALOR.Value / CDSPaiNUMERO_PARCELA.Value;
      CDSFilho.Post;
      wValorTotal := wValorTotal - CDSFilhoVALOR.AsCurrency;
    end;
    CDSFilho.Last;
    while CDSFilhoNUMERO_PARCELA.AsInteger > CDSPaiNUMERO_PARCELA.Value do
      CDSFilho.Delete;
    if CompareValue(wValorTotal, 0.00, 0.001) <> EqualsValue then begin
      CDSFilho.Edit;
      CDSFilhoVALOR.AsCurrency := CDSFilhoVALOR.AsCurrency + wValorTotal;
      CDSFilho.Post;
    end;
    CDSFilho.First;
  end;
end;
No código acima passamos dividindo o valor total entre a quantidade de parcelas, e a data de vencimento vamos acrescentando o campo dias entre parcelas "Normalmente e 30 dias" mas sempre tem suas exerções.

Resultado


Campo auto-incremento no ClientDataSet


Exemplo simples de auto incremento sem conexão com banco de dados:
procedure TFAutoInc.DoCreate;
begin
  inherited;
  with CDSTestes.FieldDefs do begin
    Add('CODIGO_MAX', ftAutoInc,  0, False);
    Add('DESCRICAO_100'  ,ftString ,  100, False);
  end;
  CDSTestes.CreateDataSet;
  CDSTestes.Open;
end;

Exemplo: Download do exemplo