<?xml version="1.0" encoding="utf-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Applying updates to more than one ClientDataSet in a single transaction with RemObjects SDK</title>
	<atom:link href="http://www.ericksasse.com.br/applying-updates-to-more-than-one-clientdataset-in-a-single-transaction/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ericksasse.com.br/applying-updates-to-more-than-one-clientdataset-in-a-single-transaction/</link>
	<description>Desenvolvimento de software, tecnologia e afins.</description>
	<lastBuildDate>Tue, 07 Feb 2012 19:36:31 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Roberto Novakosky</title>
		<link>http://www.ericksasse.com.br/applying-updates-to-more-than-one-clientdataset-in-a-single-transaction/comment-page-1/#comment-286049</link>
		<dc:creator>Roberto Novakosky</dc:creator>
		<pubDate>Sat, 27 Mar 2010 13:53:11 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=558#comment-286049</guid>
		<description>Estou procurando algo parecido com o código acima, gostaria de fazer uma só transação com diversos ClientDataSets, mas que o ChangeLog seja restaurado de todos os CDS caso algum apply dê erro. O código abaixo funciona para a transação, mas os CDS não ficam com seus changeLogs pendentes novamente...
 (Usando ADO) Transação de teste:

...
Várias operações com vários CDS... cds1, cds2, cds3
...

try
   ADOConn.BeginTrans;
   if cds1.ChangeCount &gt; 0  then
   if cds1.ApplyUpdates(0)  0 then //OK !!! 
      raise Exception.Create(&#039;Erro ....&#039;); 
 
  //Forço aqui um erro depois do primeiro ApplyUpdates para entrar no rollback de propósito para este teste:
  raise Exception.Create(&#039;Erro para teste....&#039;);  //Força ir para except 
 
   if cds2.ChangeCount &gt; 0  then
   if cds2.ApplyUpdates(0)  0 then 
      raise Exception.Create(&#039;Erro ....&#039;);
 ... 
   //
   ADOConn.CommitTrans;  OK !!!
  except
  on E:Exception do
    begin
    ADOConn.RollbackTrans; OK !!! Continua tudo certinho no banco de dados, õ aplly do cds1 não efetivou no banco de dados.
    // * Mas aqui o cds1.ChangeCount está com valor zero, pois o ChangeLog do CDS1 foi esvaziado no momento do ApplyUpdate dele, e não foi restaurado após o fato do rollback..
    end;
  end;

* Já que houve o rollback, eu gostaria de restaurar o changelod do clientDataSet para que as alterações se tornem pendentes nele novamente, alguma idéia de como fazer isso ?</description>
		<content:encoded><![CDATA[<p>Estou procurando algo parecido com o código acima, gostaria de fazer uma só transação com diversos ClientDataSets, mas que o ChangeLog seja restaurado de todos os CDS caso algum apply dê erro. O código abaixo funciona para a transação, mas os CDS não ficam com seus changeLogs pendentes novamente&#8230;<br />
 (Usando ADO) Transação de teste:</p>
<p>&#8230;<br />
Várias operações com vários CDS&#8230; cds1, cds2, cds3<br />
&#8230;</p>
<p>try<br />
   ADOConn.BeginTrans;<br />
   if cds1.ChangeCount &gt; 0  then<br />
   if cds1.ApplyUpdates(0)  0 then //OK !!!<br />
      raise Exception.Create(&#8216;Erro &#8230;.&#8217;); </p>
<p>  //Forço aqui um erro depois do primeiro ApplyUpdates para entrar no rollback de propósito para este teste:<br />
  raise Exception.Create(&#8216;Erro para teste&#8230;.&#8217;);  //Força ir para except </p>
<p>   if cds2.ChangeCount &gt; 0  then<br />
   if cds2.ApplyUpdates(0)  0 then<br />
      raise Exception.Create(&#8216;Erro &#8230;.&#8217;);<br />
 &#8230;<br />
   //<br />
   ADOConn.CommitTrans;  OK !!!<br />
  except<br />
  on E:Exception do<br />
    begin<br />
    ADOConn.RollbackTrans; OK !!! Continua tudo certinho no banco de dados, õ aplly do cds1 não efetivou no banco de dados.<br />
    // * Mas aqui o cds1.ChangeCount está com valor zero, pois o ChangeLog do CDS1 foi esvaziado no momento do ApplyUpdate dele, e não foi restaurado após o fato do rollback..<br />
    end;<br />
  end;</p>
<p>* Já que houve o rollback, eu gostaria de restaurar o changelod do clientDataSet para que as alterações se tornem pendentes nele novamente, alguma idéia de como fazer isso ?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Fellipe</title>
		<link>http://www.ericksasse.com.br/applying-updates-to-more-than-one-clientdataset-in-a-single-transaction/comment-page-1/#comment-201099</link>
		<dc:creator>Fellipe</dc:creator>
		<pubDate>Fri, 25 Jan 2008 11:48:59 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=558#comment-201099</guid>
		<description>Não entendi esta parte: Tratar a exceção na chamada à ApplyUpdates:
Como faria isso?</description>
		<content:encoded><![CDATA[<p>Não entendi esta parte: Tratar a exceção na chamada à ApplyUpdates:<br />
Como faria isso?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Erick Sasse</title>
		<link>http://www.ericksasse.com.br/applying-updates-to-more-than-one-clientdataset-in-a-single-transaction/comment-page-1/#comment-171225</link>
		<dc:creator>Erick Sasse</dc:creator>
		<pubDate>Wed, 05 Sep 2007 23:00:42 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=558#comment-171225</guid>
		<description>Vale pela dica Jeferson, tratar os erros sem dúvida é muito importante.</description>
		<content:encoded><![CDATA[<p>Vale pela dica Jeferson, tratar os erros sem dúvida é muito importante.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jeferson Oliveira</title>
		<link>http://www.ericksasse.com.br/applying-updates-to-more-than-one-clientdataset-in-a-single-transaction/comment-page-1/#comment-171219</link>
		<dc:creator>Jeferson Oliveira</dc:creator>
		<pubDate>Wed, 05 Sep 2007 21:48:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=558#comment-171219</guid>
		<description>Olá Erick!

Muito bom e útil esse artigo. Parabéns!

O único incômodo ao utilizar TDataSetProvider.ApplyUpdates ao invés TClientDataSet.ApplyUpdates, é que podemos saber que houve erros, consultando ErrorCount, mas não podemos tratar, ou enviar para a aplicação cliente, detalhes do erro, o que normalmente seria feito no evento OnReconcileError do ClientDataSet.

Uma forma de resolver isso:

1) Implementar um método para levantar a exceção com a mensagem de erro exata:

  procedure TNewService.ProviderUpdateError(Sender: TObject;
    DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;
    var Response: TResolverResponse);
  begin
    raise EDatabaseError.Create(E.Message);
  end;

2) Associar esse método ao evento OnUpdateError de todos os providers do DataModule;

3) Tratar a exceção na chamada à ApplyUpdates:

  try
    Provider.ApplyUpdates(VariantFromBinary(ADeltaArray[i].Delta), 0, ErrorCount);
  except
    on E: Exception do
    begin
      raise Exception.Create(Format(&#039;Ocorreram %d erros na atualização do provider &quot;%s&quot;. Erro: %s&#039;,
        [ErrorCount, ADeltaArray[i].ProviderName, E.Message]));
    end;
  end;

Fica aí essa dica que talvez seja útil para outros desenvolvedores.

Um abraço!</description>
		<content:encoded><![CDATA[<p>Olá Erick!</p>
<p>Muito bom e útil esse artigo. Parabéns!</p>
<p>O único incômodo ao utilizar TDataSetProvider.ApplyUpdates ao invés TClientDataSet.ApplyUpdates, é que podemos saber que houve erros, consultando ErrorCount, mas não podemos tratar, ou enviar para a aplicação cliente, detalhes do erro, o que normalmente seria feito no evento OnReconcileError do ClientDataSet.</p>
<p>Uma forma de resolver isso:</p>
<p>1) Implementar um método para levantar a exceção com a mensagem de erro exata:</p>
<p>  procedure TNewService.ProviderUpdateError(Sender: TObject;<br />
    DataSet: TCustomClientDataSet; E: EUpdateError; UpdateKind: TUpdateKind;<br />
    var Response: TResolverResponse);<br />
  begin<br />
    raise EDatabaseError.Create(E.Message);<br />
  end;</p>
<p>2) Associar esse método ao evento OnUpdateError de todos os providers do DataModule;</p>
<p>3) Tratar a exceção na chamada à ApplyUpdates:</p>
<p>  try<br />
    Provider.ApplyUpdates(VariantFromBinary(ADeltaArray[i].Delta), 0, ErrorCount);<br />
  except<br />
    on E: Exception do<br />
    begin<br />
      raise Exception.Create(Format(&#8216;Ocorreram %d erros na atualização do provider &#8220;%s&#8221;. Erro: %s&#8217;,<br />
        [ErrorCount, ADeltaArray[i].ProviderName, E.Message]));<br />
    end;<br />
  end;</p>
<p>Fica aí essa dica que talvez seja útil para outros desenvolvedores.</p>
<p>Um abraço!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Erick Sasse</title>
		<link>http://www.ericksasse.com.br/applying-updates-to-more-than-one-clientdataset-in-a-single-transaction/comment-page-1/#comment-77217</link>
		<dc:creator>Erick Sasse</dc:creator>
		<pubDate>Tue, 17 Oct 2006 12:53:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=558#comment-77217</guid>
		<description>Frainer, não tenho o artigo em português, mas você pode usar um tradutor online para ler. A idéia é criar um método no servidor para aplicar os updates em vários ClientDataSets em uma única transação.</description>
		<content:encoded><![CDATA[<p>Frainer, não tenho o artigo em português, mas você pode usar um tradutor online para ler. A idéia é criar um método no servidor para aplicar os updates em vários ClientDataSets em uma única transação.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Frainer</title>
		<link>http://www.ericksasse.com.br/applying-updates-to-more-than-one-clientdataset-in-a-single-transaction/comment-page-1/#comment-77215</link>
		<dc:creator>Frainer</dc:creator>
		<pubDate>Tue, 17 Oct 2006 11:56:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.ericksasse.com.br/?p=558#comment-77215</guid>
		<description>Bom dia Erick, sou acompanhante assiduo de seu blog.
Como não domino o idioma ingles, gostaria se possivel,
publicar ou me mandar este post em portugues, o assunto 
me pareceu bem interessante.

t+ ,

Frainer Mauri</description>
		<content:encoded><![CDATA[<p>Bom dia Erick, sou acompanhante assiduo de seu blog.<br />
Como não domino o idioma ingles, gostaria se possivel,<br />
publicar ou me mandar este post em portugues, o assunto<br />
me pareceu bem interessante.</p>
<p>t+ ,</p>
<p>Frainer Mauri</p>
]]></content:encoded>
	</item>
</channel>
</rss>

