"Oleg LOA" <[EMAIL PROTECTED]> сообщил/сообщила в новостях следующее: news:[EMAIL PROTECTED]
"Мадорский Г.В." <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED]

Давно уже голову ломаю, может кто подкинет идею.
  Упаковка полученных файлов в zip и удаление *.cds.
except
  Err := True;
end;

За память не переваливаешь где? Код-то покажи до except?


Показываю, тока тут идет обращение к самописным функциям, я их лет пять пользую, глюков не замечал.
Функции опишу вкратце:

IbCreateMemCursor - создает TClientDataSet и копирует в него данные из переданного в параметрах DataSet. IbCreateRoDataSet - создает TIbQuery на основе переданного в параметре текста SQL.
IbCreateSQL - создает TIbSQL на основе переданного в параметре текста SQL.

   Qr := IbCreateRoDataSet(Dm.DbRepl,
         'select a.tablename, a.idrec, a.opr, a.dt ' +
         'from logtbl a ' +
         'left join replord o on a.tablename = o.nmtable ' +
         'where pacnum = 0 ' +
         'order by o.ord, a.id ',
   nil, Dm.TrRepl);

   with IbCreateMemCursor(Qr) do
   begin
     SaveToFile(Dm.Path+'Replication\Out\AllRec.cds');
     Close;
     Free;
   end;
   Qr.Free;

   PK := IbCreateSQL(Dm.DbRepl,
    'select i.rdb$field_name ' +
    'from rdb$relation_constraints r, rdb$index_segments i ' +
    'where r.rdb$relation_name= :TableName and ' +
    'r.rdb$constraint_type= :PK and r.rdb$index_name=i.rdb$index_name ' +
    'order by i.rdb$field_position ', Dm.TrRepl, False);
   PK.ParamByName('PK').AsString := 'PRIMARY KEY';

Tables := IbCreateSQL(Dm.DbRepl, 'select distinct tablename from logtbl where pacnum = 0', Dm.TrRepl);
   while not Tables.Eof do begin
     PK.ParamByName('TableName').AsString := Tables.Fields[0].AsString;
     PK.ExecQuery;
     if PK.RecordCount > 0 then begin
St := Format('select l.opr, t.* from logtbl l inner join %s t on t.%s = l.idrec where l.pacnum = 0',
                    [Tables.Fields[0].AsString, PK.Fields[0].AsString]);
     end;

     Qr := IbCreateRoDataSet(Dm.DbRepl, St, nil, Dm.TrRepl);

     with IbCreateMemCursor(Qr) do begin
       
SaveToFile(Dm.Path+'Replication\Out\'+Tables.Fields[0].AsTrimString+'.cds');
       Close;
       Free;
     end;

     Qr.Free;

     PK.Close;
     Tables.Next;
   end;

   with IbCreateSQL(Dm.DbRepl, 'Select Max(pacnum)+1 From logtbl') do begin
     PackNum := Fields[0].AsTrimString;
     Result := Fields[0].AsInteger;
     Close;
     SQL.Clear;
     SQL.Add('update logtbl set pacnum = '+ PackNum + ' where pacnum = 0');
     ExecQuery;
     Close;
     Free;
   end;

   With TZip.create(Application) do begin
     ShowProgressDialog := False;
     DllPath := Dm.Path;
     Filename := Dm.Path+'Replication\Out\'+ PackNum + '.zip';
     AddPath := Dm.Path+'Replication\Out';
     FileSpecList.Add('*.Cds');
     Add;
     Free;
   end;

Выборки по объему данных небольшие, так как репликация каждые 5 минут выполняется. Размер zip файла получается не больше 10 Кб. Так что врядли по памяти вылетаю. Хотя...

With b/r. Gleb.

Ответить