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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2018, 15:50   #1
Skyhawk
 
Регистрация: 25.04.2018
Сообщений: 4
По умолчанию Вывод отдельных полей из таблицы

Пишу что-то вроде словаря. Есть таблица с полями "Слово" "Произношение" "Перевод" и поле с картинкой. К этим полям привязаны DBEdit'ы, DBMemo и DBImage. Если использовать DBGrid и вручную перемещаться по записям, все связанные компоненты работают, но надо сделать без DBGrid и перемещаться по таблице программно.
Надо все записи из поля "Слово" добавить в ListBox или ListView, а при выделении итема, по индексу/номеру записи вывести в компоненты уже полную инфу. Количество записей я нашел - ADOTable1.RecordCount, а как мне получить все записи из конкретного поля? И можно ли по индексу/номеру записи считать данные из всех полей и каким методом?
Skyhawk вне форума Ответить с цитированием
Старый 23.07.2018, 16:03   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

если использовать обычные LsitBox / ListView - то при заполнении данными сохранять и ключевое поле (например, Integer в свойство TListItem.Tag )
потом, в событии выбора брать этот ключ и по нему получать данные из датасета.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.07.2018, 17:48   #3
Skyhawk
 
Регистрация: 25.04.2018
Сообщений: 4
По умолчанию

есть индексное поле-счетчик Index специально для того чтобы можно было по номеру записи обращаться к данным имеющим одинаковое значение. Я нашел два метода один для поиска, другой для перехода между записями:
поиск всех записей и добавление в ListBox -

procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
res:Variant;
begin
i:=ADOTable1.RecordCount;

for i := 1 to ADOTable1.RecordCount do
begin
res:=ADOTable1.Lookup('Index',IntTo Str(i),'Word');
if not VarIsNull(res) then
begin
ListBox1.Items.Add(VarToStr(res));
end else ShowMessage('Error');
end;
end;


поиск и "установка курсора" на запись для вывода данных в компоненты, привязанные к полям таблицы. Список не сортированный, поэтому номер итема+1 будет индексным номером записи -

procedure TForm1.ListBox1Click(Sender: TObject);
begin
if ListBox1.ItemIndex<>-1 then
begin
if not AdoTable1.Locate('Index',IntToStr(L istBox1.ItemIndex+1),[]) then ShowMessage('Не найдено.');
end;
end;


Правильно ли использовать эти методы либо это кривая затея и есть способ лучше?
Skyhawk вне форума Ответить с цитированием
Старый 23.07.2018, 17:54   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Skyhawk Посмотреть сообщение
.Locate('Index
в таблице (выборке) есть уникальное поле Index ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.07.2018, 19:40   #5
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от Skyhawk Посмотреть сообщение
Пишу что-то вроде словаря. Есть таблица с полями "Слово" "Произношение" "Перевод" и поле с картинкой.
На некоторый языке на одну слову - может будет (несколько слов перевода)
-- На пример как на Русском языке обращение к мужчине и женщине (Он - Она) а на некоторый языке нету такого.
Для этого я бы на Tab_1 оставил поля (id=PK, Слово) и на Tab_2 (id, Перевод, Произношение, FK) связь между ними один ко многим
Цитата:
Сообщение от Skyhawk Посмотреть сообщение
а как мне получить все записи из конкретного поля?
Заменил бы AdoTable на AdoQuery и работал через SQL-запрос
xxbesoxx вне форума Ответить с цитированием
Старый 23.07.2018, 21:15   #6
Skyhawk
 
Регистрация: 25.04.2018
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
в таблице (выборке) есть уникальное поле Index ?
Да есть, именно для доступа по номеру записи к данным одинаковыми значениями.
Теперь вопрос - корректно ли мое решение или есть способ лучше, с SQL например? Если встраивать функцию быстрого поиска наверное SQL грамотнее использовать будет?

Последний раз редактировалось Skyhawk; 23.07.2018 в 21:18.
Skyhawk вне форума Ответить с цитированием
Старый 24.07.2018, 00:00   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от Skyhawk Посмотреть сообщение
Если встраивать функцию быстрого поиска наверное SQL грамотнее использовать будет?
Если у Вас на всё одна таблица - достаточно просто использовать Filter, не привлекая SQL
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 24.07.2018, 00:36   #8
Skyhawk
 
Регистрация: 25.04.2018
Сообщений: 4
По умолчанию

Спасибо всем.
Skyhawk вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консолидация отдельных полей отдельных файлов на один лист Paramount Microsoft Office Excel 15 30.01.2013 17:41
Вывод значений полей таблицы в текстовые поля Умагаджи SQL, базы данных 2 27.08.2012 22:58
Очищение отдельных Edit полей. Mrsqler Общие вопросы Delphi 9 25.03.2012 19:29
Access ограничить значение поля таблицы значениями полей другой таблицы Сергей089 Microsoft Office Access 10 08.12.2010 02:22
Как выводить значения отдельных полей таблицы при выборе записи в DBGrid Sinker БД в Delphi 9 25.03.2009 12:28