Сохранение таблицы в SQL-скрипте

Архангельский Андрей

       Сохранение таблицы возможно с любого уровня с использованием процедуры PeopleGetChild2 и таблицы PeopleLev. Так если получить всех детей какого-нибудь узла с помощью вышеописанной процедуры PeopleGetChild2 и сохранить их идентификаторы в таблице PeopleLev с помощью следующего запроса:

Insert into PeopleLev(PeopleID,PIDParnt,PIDLevel)
select Chld,rPnt,rLev from PeopleGetChild2(SelNode,0);

       то из полученного набора можно получить скрипт двумя способами:
       1) вставляя значения в том порядке, в котором просматривалось дерево, т.е. — 1 ребенок, 1 внук, 1 правнук, 2 ребенок, 1 внук 2 ребенка и т.д.
       2) вставляя значения по уровням дерева, начиная от текущего узла. В этом случае можно формировать дерево не полностью, а на глубину, например, N уровней.
       Реально, при этом используется один и тот же запрос, с различным способом сортировки. В примере {Example01} процедура сохранения таблицы в SQL-скрипт привязана к пункту всплывающего меню с выбором способа сортировки. Полностью процедура приведена ниже:

procedure TForm1.SaveToSQLFile(X : Integer);
Var
  rpPathName : String;
  flReprt : TextFile;
  Str1,Str2,sFld : String;
  rFld : Double;
  SvCursor : TCursor;
begin
   rpPathName := ExtractFilePath(Application.ExeName);
   SvCursor := Screen.Cursor;
   Screen.Cursor := crHourGlass;

// Создание файла и каталога, если необходимо
   If not DirectoryExists(rpPathName+'\DtSave') then
      If not CreateDir(rpPathName+'\DtSave') then
         raise Exception.Create('Cannot create '+rpPathName+'\DtSave');
   AssignFile(flReprt,rpPathName+'\DtSave\People.txt');  ReWrite(flReprt);
   WriteLn(flReprt,'/* Заполнение таблицы People */');

       Для сохранения скрипта используется каталог DtSave, там же где находится приложение. Если каталога не существует, то он будет создан. Имя файла скрипта People.txt соответствует имени таблицы. Одновременно в скрипте создаются комментарии.

// Очистка вспомогательной таблицы PeopleLev
   qrExeProc.Close;      qrExeProc.SQL.Clear;
   qrExeProc.SQL.Add('Delete from PeopleLev');
   qrExeProc.ExecSQL;    qrExeProc.Close;

       Перед началом работы вспомогательная таблица PeopleLev очищается от предыдущих результатов.

// Выборка ID всех детей от указанного узла
   qrExeProc.Close;      qrExeProc.SQL.Clear;
   qrExeProc.SQL.Add('Insert into PeopleLev(PeopleID,PIDParnt,PIDLevel)');
   qrExeProc.SQL.Add(' select Chld,rPnt,rLev from PeopleGetChild2('
                     +IntToStr(tvPeople.Selected.ImageIndex)+',0)');
   qrExeProc.ExecSQL;    qrExeProc.Close;

       Вспомогательная таблица PeopleLev заполняется идентификаторами записей, которые являются детьми выбранного узла tvPeople.Selected.

//  Получение всех полей для формирования скрипта используется запрос
   qrExeProc.Close;  qrExeProc.SQL.Clear;
   qrExeProc.SQL.Add('Select t1.PSurName,t1.PBrDate,t1.PStatus,t1.PSalary,');
   qrExeProc.SQL.Add(' t1.POrder, t2.PSurName as ParentName,');
   qrExeProc.SQL.Add(' t2.PBrDate as ParentDate, pl.PGenNo, pl.PIDLevel');
   qrExeProc.SQL.Add('  from People t1, People t2, PeopleLev pl');
   qrExeProc.SQL.Add('  where t1.PID=pl.PeopleID');
   qrExeProc.SQL.Add('    and t2.PID=pl.PIDParnt');
   If X=1 then  qrExeProc.SQL.Add('  order by PIDLevel');
   If X=2 then  qrExeProc.SQL.Add('  order by PGenNo');
   qrExeProc.Open;    qrExeProc.First;

       Для построения скрипта используется запрос, который выбирает все поля для записей с полученными идентификаторами, и поля PSurName, PBrDate для идентификаторов родителей. Переменная X определяет порядок сортировки результирующего запроса и, следовательно, порядок вывода записей в скрипт. После чего каждая запись в цикле преобразуется ряд строк, формирующие запрос на вставку записи, как это было описано в разделе "Заполнение древовидной таблицы из SQL-скрипта"

   While not qrExeProc.EOF do Begin
      Str1 := 'Insert into People(Parent,PSurName,PBrDate';
      Str2 := '  Select PID,''';
      Str2 := Str2 + qrExeProc.FieldValues['PSurName']+''',''';
      sFld := qrExeProc.FieldValues['PBrDate'];
      Str2 := Str2 + FormatDateTime('mm"/"dd"/"yyyy',StrToDateTime(sFld))+'''';
      If not VarIsNull(qrExeProc.FieldValues['PStatus']) then begin
         If qrExeProc.FieldValues['PStatus']<>'' then Begin
            Str1 := Str1 + ',PStatus';
            Str2 := Str2 + ','''+ qrExeProc.FieldValues['PStatus']+'''';
            end;
         end;
      If not VarIsNull(qrExeProc.FieldValues['PSalary']) then begin
            Str1 := Str1 + ',PSalary';
            rFld := qrExeProc.FieldValues['PSalary'];
            sFld := StringReplace(FormatFloat('0.00',rFld),
                      ',','.',[rfReplaceAll,rfIgnoreCase]);
            Str2 := Str2 + ','+ sFld;
         end;
      If not VarIsNull(qrExeProc.FieldValues['POrder']) then begin
            Str1 := Str1 + ',POrder';
            Str2 := Str2 + ',' + IntToStr(qrExeProc.FieldValues['POrder']);
         end;

       Вывод значений полей основывается на двух строковых переменных Str1, Str2. Если значение какого-либо поля не пустое (not null), то к переменной Str1 добавляется имя этого поля, а к переменной Str2 добавляется значение этого поля, преобразованное в строку. После вывода переменных Str1, Str2 в файл, на них же строится завершение запроса, которое определяет условия нахождения родительского идентификатора. После вывода строк условия, в запросе выбирается следующая запись и все начинается сначала.

      WriteLn(flReprt,Str1);  WriteLn(flReprt,Str2);
      Str1 := qrExeProc.FieldValues['ParentDate'];
      Str1 := FormatDateTime('mm"/"dd"/"yyyy',StrToDateTime(Str1));
      Str2 := qrExeProc.FieldValues['ParentName'];
      WriteLn(flReprt,'  from People');
      WriteLn(flReprt,'  Where PSurName='''+ Str2 +'''');
      WriteLn(flReprt,'    and PBrDate=''' + Str1 +''';');
      qrExeProc.Next;
   end; // While not qrExeProc.EOF do
   WriteLn(flReprt,'Commit;');
   CloseFile(flReprt);
Screen.Cursor := SvCursor;
end;

       По окончании цикла файл заканчивается командой Commit; и закрывается. При желании в файл можно записать дополнительную информацию, например, количество выведенных записей.

© 01.08.2009, Архангельский А.Г.

<<Пред. Оглавление
Об Авторе
Все персоны
Главная страница
След.>>



Поддержите культуру
ЯндексЯндекс. ДеньгиХочу такую же кнопку

Google
 
Web azdesign.ru az-libr.ru


Дата последнего изменения:
Wednesday, 23-Oct-2013 09:02:58 UTC