Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 976

/ вопрос решён /

Здравствуйте!
Работаю с MS Access через ADO в BDS 2006
База содержит две таблицы:

Заказы - orders:
id, date, id_client

Клиенты - clients:
id_client, name, tel, addr

компоненты ADO: ADOConnection1, ADOTableClients, ADOTableOrders
вывод в DBGrid1

в таблице ADOTableOrders добавил новое lookup-поле, связал с полем name таблицы client

всё замечательно - поле выводится, можно подставлять любого из клиентов из выпадающего списка не по id, а по реальному имени.
но! нельзя редактировать поле name в DBgrid1 - т.е. можно выбрать кого-то из клиентов из готового списка, а отредактировать его нельзя - даже просто стереть или добавить букву (не иванова, а иванов). вообще редактировать нельзя никак. выбрать из списка можно.
но мне нужно сделать так, чтобы можно было вводить любые значения - я бы потом это перехватывал в обработчике beforePost, анализировал и если такого имени клиента во второй таблице нет, то автоматом бы добавлял туда. а так - никак отредактировать нельзя.
смотрел методы onSetText, onGetText - не помогает. onChange и onValidate - вообще не вызываются.
пробовал делать поле не lookup, а Calculated (заполнять выпадающий список умею) - опять отредактировать нельзя, даже из списка не вставляется.
все таблицы и поля стоят НЕ read only.
как быть?
может, можно хотя бы создать временный столбец, так, только для ввода-вывода - я бы анализировал потом то, что в него ввели и нормальный вывод делал бы куда надо? тогда это как сделать?

Егор Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Егор (статус: 10-ый класс)
Вопрос отправлен: 8 июля 2009, 08:12
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 9 июля 2009, 12:20; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 8 июля 2009, 11:11 [#1]:

Он lookup - значит только для подстановки, а не редактирования. Обычно делается "редактор справочника" и поле для lookup'а заполняется в отдельной таблице.
Либо полностью отказаться от грида и сделать свою форму ввода. Почему? а завтра захочеться сделать проверку вводимых данных с какой то хитрой спецификой и упрётесь в другие ограничения грида. В нормальных редакторах таблиц так и делают.
Галочка "подтверждения прочтения" - вселенское зло.
Егор

Егор (статус: 10-ый класс), 9 июля 2009, 11:49 [#2]:

Спасибо за ответ.
Насчёт будущего этого проекта - не знаю, что там и как. Сейчас не думаю, что буду что-то уж очень навороченное делать. Скорее всего сделаю сейчас и всё, больше проект развивать не буду (разовая работа).

Нашёл я ответ. Даже три :)
1. Как вы и советуете - написать свой DBGrid (или ADOTable). Даже не старался сделать. Ибо долго.
2. Нашёл очень оригинальный способ (и даже опробовал его) - завести невидимый CombщBox, а затем отслеживать отрисовку в таблице (onDrawColumnCell) и если обнаруживаю, что сейчас отрисовывается нужная ячейка и на ней фокус ввода. показываю поверх неё ComboBox с занесёнными предварительно туда значениями :) Получилось очень прикольно и почти и незаметно. что это не сам DBGrid. Но вылезла куча, скажем так, особенностей, связанных с несинхронизацией поведения DBGrid'a и ComboBox'а при изменении размеров столбцов, а также при переключении фокуса, ну и сложность выхода из ComboBox'а с клавиатуры :). Но работало.
3. Использовать не ADOTable, а ADOQuery безо всяких lookup-полей - все поля прописывать ручками в SQL запросе. Работает. Даже, вопреки утверждению Фаронова ("Программирование баз данных в Delphi 7") запрос получился Live, т.е. изменяемый. Ну, а обработку "некорректно" введённых данных (типа, ещё несуществующей фамилии) я и так собирался ручками делать.
Спасибо.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Вадим К

Вадим К (статус: Академик), 9 июля 2009, 12:20 [#3]:

по поводу пункта 1. я такого не говорил и не предлагал.
2 - плохая идея
3 Фараонов далеко не все знает. А способ как раз хорош.
Галочка "подтверждения прочтения" - вселенское зло.

7 апреля 2011, 19:30: Статус вопроса изменён на решённый (изменил автор вопроса — Егор): использовал вариант 2. как самый лёгкий и быстрый в реализации.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.02 сек.