Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2011, 16:08   #11
WoodHead
Пользователь
 
Регистрация: 12.01.2011
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну тогда каждый Insert обрабатывать по полному циклу (Clear, Add, ExecSQL) или первый вариант
Да, попробую вариант №1 с динамическим массивом, если получится. На крайний случай, создам StingGrid с Visible=false и в него буду заносить промежуточные данные.
WoodHead вне форума Ответить с цитированием
Старый 03.08.2011, 10:01   #12
WoodHead
Пользователь
 
Регистрация: 12.01.2011
Сообщений: 16
По умолчанию

Решил задачу с использованием динамического двухмерного массива для хранения промежуточных данных. Решение немного усложнил, добавив в таблицу БД автоинкрементное поле ('ID'). Т.к. запись в него невозможна (значение само увеличивается на 1 при вызове метода Append), то при записи данных из массива в таблицу это поле пропускается.

Схема решения:
- открываем таблицу;
в цикле (пока таблица не закончится):
- копируем строку в динамический массив из таблицы БД;
- исправляем необходимые данные в строке массива;
в цикле (пока строки в массиве не закончатся):
- добавляем строки из массива в таблицу БД.

Вот код решения.
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  Mas: array of array of string;
  i,j: integer;
  m,n: integer; // используются для определения размерности массива
  NumField: integer;
  AddressName1String, AddressName2String: string;
begin
  AddressName1String:='Москва...';
  AddressName2String:='Омск...';
  n:=0; // инициализация переменной, обозначающей количество строк в массиве Mas
  Mas:=nil;                     // обнуление массива

  ADOTable1.Active:=False;      // делаем таблицу неактивной (закрытие таблицы)
  ADOTable1.TableName:='AddressBook'; // выбираем таблицу в БД
  ADOTable1.Active:=True;       // делаем таблицу активной (открытие таблицы)
  m:=ADOTable1.FieldCount;      // находим количество полей в таблице БД

  ADOTable1.First;              // переходим на первую запись в таблице БД
  While not ADOTable1.eof do    // цикл выполняется, пока таблица не закончится
  begin
    // если найдена нужное значение в выбранном поле таблицы
    if (ADOTable1.fieldbyname('Address').AsString = AddressName1String) then
    begin
      NumField:=ADOTable1.FieldByName('Address').FieldNo; // определяем номер поля таблицы по его имени
      n:=n+1;                                             // увеличиваем количество строк в массиве на 1
      SetLength(Mas,n,m); // задаем количество строк 'n' и столбцов 'm' массива 'Mas' (размерность массива)
      for i := 0 to m-1 do // прогоняем цикл по полям таблицы (нумерация с '0'), .т.е. в результате копируем строку таблицы в строку массива
          Mas[n-1,i]:=ADOTable1.Fields[i].AsString; // копируем данные из поля таблицы 'i' в соответствующий столбец массива
      Mas[n-1,NumField-1]:=AddressName2String;               // заменяем данные в массиве, соответствующие номеру выбранного поля таблицы БД
    end;
    ADOTable1.Next;//переходим на следующую запись
  end;

  // добавляем значения из массива в таблицу БД
  for j := 0 to n-1 do // пробегаем по всем строкам массива
  begin
    ADOTable1.Append;  // добавляем пустую запись в таблицу БД
    begin
      for i := 0 to m-1 do // пробегаем по всем столбцам массива
      // если поле таблицы не автоинкрементное, то заносим значения из массива в таблицу БД
      if (i+1) <> ADOTable1.FieldByName('ID').FieldNo then  // i+1 потому, что нумерация методом FieldNo начинается с 1
        ADOTable1.Fields[i].AsString:=Mas[j,i];
    end;
    ADOTable1.Post; // подтверждаем запись в таблицу БД
  end;
end;

Последний раз редактировалось WoodHead; 03.08.2011 в 10:16.
WoodHead вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файла и копирование с заменой tarakan1983 Общие вопросы Delphi 11 29.04.2010 15:14
Прога на подсчет значений функции: не разрешает в некоторых местах использование jo!! Masha)) Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 20.11.2009 20:24
копирование всех полей класса Juffin Общие вопросы Delphi 1 19.05.2009 19:16
Сохранение значений вычисляемых полей gimbomba БД в Delphi 6 21.02.2009 19:19