|
Вопрос # 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. как самый лёгкий и быстрый в реализации.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|