Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FireDAC неверное отбражение Lookup field 
:(
    Опции темы
Beltar
Дата 1.4.2015, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



XE6 Build 20.0.15596.9843
В общем столкнулся с тем, что при редактировании таблицы в dbgrid для Lookup-поля после Insert отображается первое значение из связанной таблицы еще до того, как его ввели. На ADO проблема отсутствует. Тестовый проект с простейшей базой.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Тест.rar 56,37 Kb


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Beltar
Дата 1.4.2015, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



Выглядит вот так:

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  Id_Завода_NULL_1.jpg 27,95 Kb


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Beltar
Дата 1.4.2015, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



База (MS SQL 2008R2)

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  FDTest.rar 380,44 Kb


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Alexeis
Дата 1.4.2015, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: нет
Всего: 459



Цитата(Beltar @  1.4.2015,  12:19 Найти цитируемый пост)
В общем столкнулся с тем, что при редактировании таблицы в dbgrid для Lookup-поля после Insert отображается первое значение из связанной таблицы еще до того, как его ввели.

  Честно говоря, я всегда думал, что Lookup нельзя редактировать (вводить через DBGrid). Ведь Insert ты делаешь для текущего датасета, а Insert для Lookup поля расположен в другом датасете. Соответственно, нужно переводить в режим Edit не основной датасет, а связанный. Тут наверняка могут быть особенности по настройке самих датасетов. По крайней мере нужно проверить что при переводе DBGrid-а в режим редактирования зависимый датасет тоже перейдет в режим edit. Если не так, то нужно курить маны по фаредаку на предмет связанных датасетов. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Beltar
Дата 1.4.2015, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



Я же не лукап редактирую, а поле вместо которого этот лукап отображается (Id_завода). т лукапа требуется толкьо список допустимых значений отображать. Обычная техника со времен появления Delphi.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
superVad
Дата 1.4.2015, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Beltar, просто интересно, а можно отказаться от лукап поля и просто присоединить нужную таблицу в запросе?
Я в доставшемся мне проекте так и сделал со всеми лукап полями. Сильно оно все усложняло и работало порой странно.
PM MAIL   Вверх
Alexeis
Дата 1.4.2015, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: нет
Всего: 459



Цитата(Beltar @  1.4.2015,  14:55 Найти цитируемый пост)
Я же не лукап редактирую, а поле вместо которого этот лукап отображается (Id_завода). т лукапа требуется толкьо список допустимых значений отображать

  Тогда причина может скрываться в запросе select dataseta из которого делается lookup. У меня обычно не было проблем, если этот датасет не имеет связи с мастер датасетом в котором выводится лукап поле. Т.е. нет отношений master-detail у основного датасета и того из которого делается lookup.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Beltar
Дата 1.4.2015, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



А пользователям тогда показывать неизвестное им число Id? Не думаю, что они это оценят.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Alexeis
Дата 1.4.2015, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: нет
Всего: 459



Цитата(Beltar @  1.4.2015,  16:58 Найти цитируемый пост)
А пользователям тогда показывать неизвестное им число Id? Не думаю, что они это оценят. 

  Насколько я понял, что для работы механизма lookup связь master-detail не нужна. Датасеты сами разбираются меж собой, что откуда брать. Если не поможет, то можно попробовать раскидать их даже на разные транзакции. Не исключено, что перевод главного датасета в режим edit автоматически закрывает транзакцию, которую использует 2й датасет. 
Я с фаредаком не работал, так что могу предполагать только по общей схеме DataSet/DataSource/DBGrid.

Это сообщение отредактировал(а) Alexeis - 1.4.2015, 16:06


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Beltar
Дата 1.4.2015, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



Все связи там, обычный 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.

Это сообщение отредактировал(а) Beltar - 1.4.2015, 16:13


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Alexeis
Дата 2.4.2015, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: нет
Всего: 459



Цитата(Beltar @  1.4.2015,  17:08 Найти цитируемый пост)
Оно же мне зачем-то показывает сразу после инсерта первую строку из заводов, еще до того, как пользователь что-то выбрал.

  Слушай, а может там (в таблице) ID завода имеет дефолтное значение и при инсерте автоматически проставляет дефолт? Я бы еще поковырял транзакции. Чтобы не вышло ситуации что зависимый датасет сбрасывается. Или может запрос refresh неверно сформирован. Т.е. для этой строки делает refresh и он подставляет что-то.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Beltar
Дата 2.4.2015, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



Неа.

Код

USE [FDTest]
GO

/****** Object:  Table [dbo].[Заводы]    Script Date: 04/02/2015 10:53:34 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Заводы](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Название] [varchar](50) NOT NULL,
 CONSTRAINT [PK_Заводы] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


Код

USE [FDTest]
GO

/****** Object:  Table [dbo].[Оборудование]    Script Date: 04/02/2015 10:53:41 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Оборудование](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Название] [varchar](50) NOT NULL,
    [id_Завода] [int] NOT NULL,
 CONSTRAINT [PK_Оборудование] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Оборудование]  WITH CHECK ADD  CONSTRAINT [FK_Оборудование_Заводы] FOREIGN KEY([id_Завода])
REFERENCES [dbo].[Заводы] ([Id])
GO

ALTER TABLE [dbo].[Оборудование] CHECK CONSTRAINT [FK_Оборудование_Заводы]
GO


Запустил SQL-профайлер, но как и ожидалось TDataset.Insert отрабатывает исключительно на клиенте, и пока Post не вызовут, никаких обращений к серверу не происходит, что логично. Тут у TFDQuery какая-то непонятка, что он не NULL возвращает.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.