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