Logo abaixo podemos ver a definição 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 definição da classe é bastante simples e possui apenas funções de classe, nada de parser's de sql complicados. O argumento "AWhere' já deve estar formatado ao chamar a função, dando mais liberdade ao desenvolvedor para manipular a claúsula 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 não foi utilizado, é importante quando temos um sql que possui um subselect antes da claúsula 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 = 2
Por padrão a claúsula "Where" será adicionada ao primeiro "from' encontrado, no caso, adicionando imediatamente após "Tabela2". Para evitar que isso aconteça, devemos informar qual é a tabela principal do sql, passando como argumento para o método 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');
Também temos o método ChangeOrdeBy, que adiciona ou modifica a cláusula "Order by". O modo de usar o mesmo é 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 último, o método RemoveOrderBy, que remove qualquer cláusula "Order by" que exista.
O código completo contendo os testes unitários está disponível aqui.
Qualquer sugestão, bug ou melhoria, façam um fork, modifiquem e façam um pull request que eu atualizo aqui, ou abra uma Issue no site do projeto, mais não deixe de me avisar. ;)
Abraços.
Nenhum comentário:
Postar um comentário