Array
(
)

Script de update dinamico

Jbr
   - 05 jun 2015

Tenho a seguinte procedure onde gera o script de atualização dos campos alterados.
Só que está gerando errado em determinadas situações e colocando uma ( , ) virgula antes do WHERE.
O que será que está errado ?
#Código
procedure TPrincipal.GerarUpdate(A: TDBAtribute);
Var
I, J:Integer;
E:string;
Upd:Boolean;
begin
Upd:=False;
A.UpdateSQL.SQL[usModified].Clear;
A.UpdateSQL.SQL[usModified].Add('UPDATE '+A.TableName+' SET');
for I := 0 to A.DataSet.FieldCount - 1 do begin
if (A.FieldLis.IndexOf(A.DataSet.Fields[I].FieldName) <> -1)
AND (A.DataSet.Fields[I].OldValue <> A.DataSet.Fields[I].NewValue)then begin
Upd:=True;
if I < A.DataSet.FieldCount - 2 then E:=',' Else E:='';
A.UpdateSQL.SQL[usModified].Add(Format(' %s = :%s%s',[A.DataSet.Fields[I].FieldName,
A.DataSet.Fields[I].FieldName,
E]));
end;
end;
if Upd then begin
for J := Low(A.KeyFilters) to High(A.KeyFilters) do
if J=0 then
A.UpdateSQL.SQL[usModified].Add(Format('WHERE %s=:OLD_%s',[A.DataSet.Fields[J].FieldName,
A.DataSet.Fields[J].FieldName]))
else
A.UpdateSQL.SQL[usModified].Add(Format(' AND %s=:OLD_%s',[A.DataSet.Fields[J].FieldName,
A.DataSet.Fields[J].FieldName]));
if Length(A.KeyFilters)=0 then
A.UpdateSQL.SQL[usModified].Add(Format('WHERE %s=:OLD_%s',[A.KeyFieldName,
A.KeyFieldName]))
else
A.UpdateSQL.SQL[usModified].Add(Format(' AND %s=:OLD_%s',[A.KeyFieldName,
A.KeyFieldName]));
end;
A.UpdateSQL.SQL[usModified].SaveToFile('Testete.txt');
if not Upd then
A.UpdateSQL.SQL[usModified].Clear;
end;

Dorivan Sousa
|
MVP
Pontos: 320
    19 jun 2015

if I < A.DataSet.FieldCount - 2 then E:=',' Else E:='';

pq - 2 ?? nao seria -1 para verificar se é o ultimo field?