Oi estou passando so para dizer que tem um sorteio super legal no blog da Sibele.http://sibelearteemeva.blogspot.com.br/ Ola, ha algum tempo eu havia desenvolvido uma rotina para modificar a clausula Where de sql statements(pelo menos dos mais simples). Agora surgiu a oportunidade de compartilhar a solucao, entao aqui esta.Logo abaixo podemos ver a definicao da classe.TSqlBuilder = class private public class function AddWhere(ASql, AWhere: String; AMainTable: String = ''): String; class function ChangeOrdeBy(ASql, AOrderFields: String): String; class function RemoveOrderBy(ASql: String): String; end;Como podem ver a definicao da classe e bastante simples e possui apenas funcoes de classe, nada de parser's de sql complicados. O argumento "AWhere' ja deve estar formatado ao chamar a funcao, dando mais liberdade ao desenvolvedor para manipular a clausula Where da maneira mais conveniente, por exemplo:var qry: TAlgumTipoDeQuery;begin (...) qry.Sql.Text := 'Select * from TabelaA Where X = 1'; //Native Types qry.Sql.Text := TSqlBuilder.AddWhere(qry.Sql.Text, ' Y = ''a'''); qry.Open; //Bind Parameters qry.Sql.Text := TSqlBuilder.AddWhere(qry.Sql.Text, ' Y = :Y'); qry.ParamByName('Y').AsString := 'a' qry.Open;end; O argumento adicional "AMainTable" que ainda nao foi utilizado, e importante quando temos um sql que possui um subselect antes da clausula from, por exemplo, veja o sql abaixo:Select a, (select b.b from Tabela2 b where b.x = 3) as b from Tabela1 a where a.x = 2Por padrao a clausula "Where" sera adicionada ao primeiro "from' encontrado, no caso, adicionando imediatamente apos "Tabela2". Para evitar que isso aconteca, devemos informar qual e a tabela principal do sql, passando como argumento para o metodo AddWhere o valor "Tabela1".qry.Sql.Text := 'Select a, ' + ' (select b.b from Tabela2 b where b.x = 3) as b ' + ' from Tabela1 a ' + ' where a.x = 2'; qry.Sql.Text := TSqlBuilder.AddWhere(qry.Sql.Text, ' Y = :Y', 'Tabela1'); Tambem temos o metodo ChangeOrdeBy, que adiciona ou modifica a clausula "Order by". O modo de usar o mesmo e como segue:var qry: TAlgumTipoDeQuery;begin (...) qry.Sql.Text := 'Select * from TabelaA'; qry.Sql.Text := TSqlBuilder.ChangeOrdeBy(qry.Sql.Text, 'a'); //Retorna "Select * from TabelaA order by a" qry.Sql.Text := 'Select * from TabelaA oder by a'; qry.Sql.Text := TSqlBuilder.ChangeOrdeBy(qry.Sql.Text, 'b asc, c desc'); //Retorna "Select * from TabelaA order by b asc, c desc"E por ultimo, o metodo RemoveOrderBy, que remove qualquer clausula "Order by" que exista.O codigo completo contendo os testes unitarios esta disponivel aqui.Qualquer sugestao, bug ou melhoria, facam um fork, modifiquem e facam um pull request que eu atualizo aqui, ou abra uma Issue no site do projeto, mais nao deixe de me avisar. ;)Abracos. Muitos de voces ja devem ter se aborrecido com a ferramenta de diff(comparacao entre arquivos) que vem junto com o TortoiseSVN. Ela nao consegue resolver sozinha varios tipos de conflitos e a resolucao manual e complicada.Procurando uma ferramenta melhor tempos atras, encontrei esse post do Erick Sasse onde ele recomendava a ferramenta DiffMerge que e gratuita e funciona no Windows, Mac OS X e Linux.Um dos diferenciais do DiffMerge e o suporte a merge de 3 arquivos, ou seja, quando mais de um desenvolvedor altera um arquivo ele considera o arquivo base e as duas versoes alteradas.