С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31

Изменение номера таблицы базы данных в цикле

12.12.2012, 09:44. Показов 2782. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При одновременной работе с базой данных нужно выполнить поочередно одинаковые действия с несколькими таблицами базы данных. Хотелось бы эти действия выполнить в цикле, но не знаю как менять в цикле номер таблицы.
Пример таблицы ADOtable1,ADOtable2... ADOtable10. Можно ли номер таблицы сделать переменным? В некоторых языках существует процедура склеивания нескольких частей слова (например 'Table' + '1') и использование потом этого слова в виде переменной. А иначе получается нужно писать одинаковые куски программ отличающиеся только номером таблицы. Подскажите пожалуйста.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2012, 09:44
Ответы с готовыми решениями:

Изменение набора данных ADOQuery без изменения подключенной к нему базы данных
Проблема следующая Есть база данных, есть подключенный к ней ADOQuery, в котором ЧАСТЬ записей базы. Я хочу поменять данные только в...

Как вывести записей(строк) таблици базы данных mdb в мемо, в цикле for?
Подскажите пожалуйста, как сделать выборку по определенным полям таблици, и вывести результат в memo? Пробою вот так, но почему-то...

Изменение базы данных
В stringgrid имеется запрос , далее пользователь изменяет значение ячейки или ячеек , необходимо применить эти изменения в базе данных...

27
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
12.12.2012, 10:07
ADOTable - это не таблица базы данных. Это компонент доступа к таблицам баз данных.
Следовательно, можно применить один компонент TADOTable, меняя в цикле имя таблицы БД в свойстве компонента TableName.
Если наименования таблиц БД, к которым должно быть обращение в цикле не поддаются нумерации (table1,table2... table10), то эти наименования можно сохранить в константном строковом массиве и использовать в цикле.
0
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31
12.12.2012, 10:13  [ТС]
Я не нашел такого компонента в списке ADO, есть только ADOTable
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
12.12.2012, 10:22
Цитата Сообщение от sc Посмотреть сообщение
Я не нашел такого компонента в списке ADO, есть только ADOTable
ADOTable - это и есть тот самый компонент, о котором речь. Сравните названия: свое и мной приведенное (ADOTable = ADOTable).
0
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31
12.12.2012, 10:25  [ТС]
В первом сообщении был указан компонент TADOTable, я его и искал
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
12.12.2012, 10:33
Понятно.
Иногда пишут с буквой Т - что указывает на класс объекта.
В общении можно принять что это один и тот же компонент.
0
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31
12.12.2012, 10:38  [ТС]
т.е не нужно на форме располагать все нужные таблицы, можно расположить только одну, а что тогда указывается в строке Name Инспектора объекта?
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
12.12.2012, 11:55
Надо называть вещи принятыми именами (это обычно делают чтобы люди понимали друг друга).
ADOTable - это не таблица, а компонент доступа к таблицам БД.
Действительно, его нужно иметь только в одном экземпляре, если предполагается последовательно обрадаться
с его помощью к разным таблицам базы данных. В его свойстве Name можно ничего не указывать, а оставить то, которое дала среда Дельфи (ADOTable1, например).
А вот в его свойстве TableName нужно указать имя таблицы базы данных с которой предполагается работать.
1
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
12.12.2012, 12:01
ОФФТОП конечно, но что за одинаковые действия, которые нужно выполнять с разными таблицами, да еще неоднократно (иначе зачем весь сыр-бор)? Если это не студенческое задание, то есть подозрение на плохой дизайн БД
1
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31
12.12.2012, 16:51  [ТС]
По порядку
База данных содержит ряд таблиц в которые занесены данные определенных узлов трансформатора, в т.ч. есть 6 таблиц в которых занесены данные обмоток. Конфигурация таблиц одинакова, а данные естественно разные.
О действиях - при открытии каждой таблицы ее нужно позиционировать на определенной записи, которая отвечает типу трансформатора. Кроме того есть необходимость делать выборку данных в определенной последовательности, которая одинакова для всех обмоток. Поэтому если можно было бы это все сделать циклом, это сократило бы текст программы.
Теперь об операции с таблицами. Сейчас для открытия таблицы записывается команда ADOTable1.open. Если не обращаться к указанной форме, то как должна выглядеть команда на открытие таблицы. Например если для таблицы ADOTable1 свойство TableName - "Core", как записать команду Open.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
12.12.2012, 17:26
Цитата Сообщение от sc Посмотреть сообщение
База данных содержит ряд таблиц в которые занесены данные определенных узлов трансформатора, в т.ч. есть 6 таблиц в которых занесены данные обмоток. Конфигурация таблиц одинакова, а данные естественно разные.
Почему эти данные нельзя держать в 1 таблице?
1
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31
12.12.2012, 17:30  [ТС]
Мне показалось, что так будет удобней с точки зрения контроля записи, ведь каждая таблица содержит порядка 150 полей
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
12.12.2012, 18:16
Если надо открывать 6 таблиц БД, то, разумеется, надо это делать шестью разными датасетами (6-ю ADOTable),
Но экономить здесь не стоит. Хотя, можно, например, держать ссылки на экземпляры компонентов в массиве.
Тогда в цикле можно обращаться через индексы массива.
А массив типа такого:
Delphi
1
2
3
4
5
6
7
8
9
10
var
  ArrTbl : [1..6] of TADOTable;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  ArrTbl[1] := ADOTable1;
  ArrTbl[2] := ADOTable6;
  ...
  ArrTbl[6] := ADOTable6;
end;
Такое присвоение делается один раз. В приложении, затем, можно везде обращаться к элементам массива как к самим комонентам.
Например, ArrTbl[2].Open;
Понятно, что это всего лишь вариант. Не зная деталей проекта предлагать более оптимальные решения сложно.
1
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31
12.12.2012, 19:08  [ТС]
Спасибо, это как раз и позволит работать в цикле, попробую.
И попутно еще вопрос - какой наиболее простой путь позиционирования таблицы на определенной записи. Я пробовал через Locate, но уверенной работы не получалось. Получился более длинный путь через кодовое поле

ADOTable2.Active:=true;
ADOTable2.First;
i:=0;
repeat
if length(trim(ADOTable2.Fields[0].AsString))<>0 then
if trim(ADOTable2.Fields[0].AsString)=trim(frmdr0.ADOTable1.Fields[1].AsString)
then i:=ADOTable2.RecNo;
ADOTable2.Next;
until ADOTable2.Eof;
if i<>0 then begin
ADOTable2.First;
ADOTable2.MoveBy(i-1) end.
Получилось конечно топорно, но другого придумать не смог. Хочется чего-то попроще.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
13.12.2012, 01:13
Все равно для позиционирования лучше Locate ничего нет (правда, для таких БД, как Аксесс есть еще RecNo).
Для правильной работы Locate нужно представлять что такое в вашей таблице "определенная запись".
Locate может производить поиск не только по одному, но и по двум и более полям (в сочетании). Это полезно для строковых (текстовых) полей.
Если есть поле с уникальными значениями, то его использование при поиске самый надежный способ переехать на нужную строку. При условии, что значение это известно.

----
Циклы с постусловием (repeat) при перемещении по записям не применяют - есть шанс нарваться на пустой результат запроса с последующим AV (access violation) при обращении к несуществующим значениям полей.
Безопаснее будет так:
Delphi
1
2
3
4
  while not ADOTable2.Eof do begin
    ...
    ADOTable2.Next;
  end;
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
13.12.2012, 09:45
Цитата Сообщение от sc Посмотреть сообщение
Мне показалось, что так будет удобней с точки зрения контроля записи, ведь каждая таблица содержит порядка 150 полей
Не понял, каким образом при 6 таблицах лучше контроль записи (кстати, а что это?). Как раз при нескольких таблицах сложнее писать SQL-запросы (разные имена таблиц) да и твоей проблемы с циклом не было бы. А представь себе, что у тебя было бы не 6 трансформаторов, а 1000. Что, 1000 таблиц делать? А если 10000? А если миллион?
В реале даже если состав колонок по разным изделиям не сильно отличается, и то используют одну таблицу на все, а уж если состав одинаков - это вообще само собой разумеется.
0
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31
13.12.2012, 11:36  [ТС]
"Определенная запись" в моем случае это тип тр-ра, который заносится в головную таблицу, а все последующие таблицы используют именно это значение. Таблицы индексированы по этому полю и поиск идет по ему же. Как я понял схему поиска, которую я использовал, вы считаете возможным оставить, только вместо repeat использовать while?
Переделывать под Locate сейчас я уже не буду, но попозже может еще раз попробую.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
13.12.2012, 11:47
Как я понял схему поиска, которую я использовал, вы считаете возможным оставить
Кто же знает какую "схему поиска" с Locate вы использовали. Никто. кроме вас, ее не видел.
А по поводу repeat я, по-моему, был убедителен.
0
sc
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 31
13.12.2012, 11:51  [ТС]
Как я уже писал количесво трансформаторов - это количество записей в таблице, их действительно может быть много. А я говорил о количестве полей (или колонок, как ты пишешь), оно определено конфигурацией программы. Я не очень представляю себе, как работать с таблицей в которой 500 полей и более, если все 6 таблиц свалить в одну.
Например каждая таблица имеет следующие поля: volyage1, volyage2, volyage3, volyage4 ...volyage_n. Если таких таблиц 6 и полей в каждой до 150, то общая таблица будет иметь до 600 полей. Для меня это очень неудобно с точки зрения программы и с точки зрения просмотра БД( для контроля записи визуально). Возможно я не очень понимаю идеологию объединения таблиц, поясните.

Добавлено через 2 минуты
Я имел в виду схему поиска, которуюя вам написал. А с Locate я уже не помню, как она выглядела.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
13.12.2012, 12:15
Как я уже писал количесво трансформаторов - это количество записей в таблице, их действительно может быть много.
Интересно, а чего больше - количество трансформаторов или полей во всех таблицах?
Если полей 600, то количество устройств больше или меньше?

Тем не менее, присоединяюсь к мнению Grossmeister'а, что все поля в одной таблице существенно уменьшают головную боль разработчика БД.
Хотя, бывают случаи, когда принципами приходится поступаться.
Я не очень представляю себе, как работать с таблицей в которой 500 полей и более, если все 6 таблиц свалить в одну.
А мы, например, с коллегой Grossmeister'ом не представляем как это можно управляться с 6-ю таблицами одинаковой структуры. Попробуй как их синхронизировать, если добавляется трансформатор или удаляется. Крови выпьет такая организация БД немало.

P.S. А может voltage, а не volyage?
- И просто непонятно что за устройства такие, для характеристики которых надо 500-600 значений хранить.
- Правда, не все СУБД могут иметь в таблице 500 полей.
- А какая СУБД у вас используется?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2012, 12:15
Помогаю со студенческими работами здесь

Изменение значения у поля базы данных по адресу
Нажимая на панель, значения поля, которое находится в таблице ZAL1, в столбце R1, у которого столбец Mesto=1, должно меняться на...

Заполнение таблицы базы данных Paradox
Я создал базу данных на Paradox. Объясните пожалуйста как мне ее заполнить записями.

Разработать структуры записи таблицы базы данных
&quot;Работа с автономными СУБД на ПК. Создание таблиц с помощью DatabaseDesktop. Структура&quot; Задание к исполнению 1. Создать псевдоним...

Копирование таблицы с одной Базы Данных в Другую
доброго времени суток такое дело, надо из одной базы данных одной таблицы скопировать в другую бд индеетичной таблицы скриншот окна с...

Перенос значения из Memo в ячейку таблицы базы данных
Здравствуйте. Для переноса значения из Memo в ячейку таблицы базы данных использую следующую строку ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru