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: 10
    19 jun 2015

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

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