Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Базы данных и репортинг > FireDAC неверное отбражение Lookup field |
Автор: Beltar 1.4.2015, 11:19 |
XE6 Build 20.0.15596.9843 В общем столкнулся с тем, что при редактировании таблицы в dbgrid для Lookup-поля после Insert отображается первое значение из связанной таблицы еще до того, как его ввели. На ADO проблема отсутствует. Тестовый проект с простейшей базой. |
Автор: Beltar 1.4.2015, 11:20 |
Выглядит вот так: |
Автор: Beltar 1.4.2015, 11:21 |
База (MS SQL 2008R2) |
Автор: Beltar 1.4.2015, 13:55 |
Я же не лукап редактирую, а поле вместо которого этот лукап отображается (Id_завода). т лукапа требуется толкьо список допустимых значений отображать. Обычная техника со времен появления Delphi. |
Автор: superVad 1.4.2015, 15:00 |
Beltar, просто интересно, а можно отказаться от лукап поля и просто присоединить нужную таблицу в запросе? Я в доставшемся мне проекте так и сделал со всеми лукап полями. Сильно оно все усложняло и работало порой странно. |
Автор: Alexeis 1.4.2015, 15:51 | ||
Тогда причина может скрываться в запросе select dataseta из которого делается lookup. У меня обычно не было проблем, если этот датасет не имеет связи с мастер датасетом в котором выводится лукап поле. Т.е. нет отношений master-detail у основного датасета и того из которого делается lookup. |
Автор: Beltar 1.4.2015, 15:58 |
А пользователям тогда показывать неизвестное им число Id? Не думаю, что они это оценят. |
Автор: Alexeis 1.4.2015, 16:03 | ||
Насколько я понял, что для работы механизма lookup связь master-detail не нужна. Датасеты сами разбираются меж собой, что откуда брать. Если не поможет, то можно попробовать раскидать их даже на разные транзакции. Не исключено, что перевод главного датасета в режим edit автоматически закрывает транзакцию, которую использует 2й датасет. Я с фаредаком не работал, так что могу предполагать только по общей схеме DataSet/DataSource/DBGrid. |
Автор: Beltar 1.4.2015, 16:08 |
Все связи там, обычный Foreign Key в базе. Заводы: Id:Int PK Название:Varchar Оборудование: Id:Int PK Id_Завода:Int FK к Заводы.Id Название: Varchar Lookup Завод: String через Id_Завода к Заводы.Id Больше в Delphi ничего не делается, Master-detail не формируется. Все, что мне нужно, работать с понятным названием завода вместо его Id. Это делали на автомате еще в эпоху BDE. Оно же мне зачем-то показывает сразу после инсерта первую строку из заводов, еще до того, как пользователь что-то выбрал. Да, можно ес-но выбрать нужный завод, и оно все нормально запишется, но, если пользователя отображаемый пункт устраивает, он просто нажмет сохранить и получит эксепшен, что Id_Завода required. |
Автор: Alexeis 2.4.2015, 10:31 | ||
Слушай, а может там (в таблице) ID завода имеет дефолтное значение и при инсерте автоматически проставляет дефолт? Я бы еще поковырял транзакции. Чтобы не вышло ситуации что зависимый датасет сбрасывается. Или может запрос refresh неверно сформирован. Т.е. для этой строки делает refresh и он подставляет что-то. |
Автор: Beltar 2.4.2015, 12:26 | ||||
Неа.
Запустил SQL-профайлер, но как и ожидалось TDataset.Insert отрабатывает исключительно на клиенте, и пока Post не вызовут, никаких обращений к серверу не происходит, что логично. Тут у TFDQuery какая-то непонятка, что он не NULL возвращает. |