Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FIBPlus и вставка данных в табл связи справочников, Как это делаете вы? 
:(
    Опции темы
4EVERCooL
Дата 6.7.2009, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Продублирую свой пост на sql.ru, может вы охотнее поможете?  smile .

Итак, база данных состоит к примеру из трех таблиц - справочника людей, справочника сертификатов этих людей и таблицы связи "многие ко многим" человек/сертификат.
Представьте себе форму, на ней два грида и два датасета. Один показывает список людей, второй связан с первым по мастер-деталь и показывает список сертификатов у человека, выбранного в данный момент в первом датасете. Первый датасет прекрасно редактируется из делфей, тут проблем нет. Во втором оператор выбора данных такой:
Код


SELECT
d.reg_id,
a.CERT_ID,
   a.CERT_TITLE,
b.ENT_ID,
    b.ENT_TITLE,
    d.ISSUEDON,
    d.VALIDUNTIL,
    d.CERTSCAN,
    d.qualif,
d.employees_emp_id,
d.certificates_cert_id,
d.issuedby_ent_id  
FROM
    MAINTABLE d
left join certificates a on d.certificates_cert_id=a.cert_id
left join issuedby b on d.issuedby_ent_id=b.ent_id 
 
where employees_emp_id=:mas_emp_id
, то есть чтобы данные в гриде нормально выглядели делаем джойн из нескольких таблиц.

А оператор вставки вот такой:
Код

INSERT INTO MAINTABLE(
    REG_ID,
    ISSUEDON,
    VALIDUNTIL,
    CERTSCAN,
    QUALIF,
    EMPLOYEES_EMP_ID,
    CERTIFICATES_CERT_ID,
    ISSUEDBY_ENT_ID
)
VALUES(
    :REG_ID,
    :ISSUEDON,
    :VALIDUNTIL,
    :CERTSCAN,
    :QUALIF,
    :MAS_EMPLOYEES_EMP_ID,
    :MAS_CERTIFICATES_CERT_ID,
    :ISSUEDBY_ENT_ID
)

Компонент доступа как вы догадались - ФИБПлюс. И вот тут затык. Ввожу в новой форме данные сертификата выбранного человека:
procedure TFADDCert.bsSkinButton1Click(Sender: TObject);
Код

begin
Form1.DSCert.Insert;
Form1.DSCert.FieldByName('CERT_TITLE').AsString:=FAddCert.ECerttitle.Text;
Form1.DSCert.FieldByName('ISSUEDON').AsDateTime:=Faddcert.bsSkinDateEdit1.Date;
Form1.DSCert.FieldByName('VALIDUNTIL').AsDateTime:=Faddcert.bsSkinDateEdit2.Date;
Form1.DSCert.FieldByName('QUALIF').asstring:=Faddcert.bsSkinEdit1.Text;
Form1.DSCert.Post;
Form1.DSCert.FullRefresh;

end;


И эта сволочь ругается на то, что не может произвести вставку, поскольку на поле EMPLOYEES_EMP_ID наложено ограничение not null . Так вот мой вопрос. Насколько я понял, добавление суффикса MAS_ к имени поля означает, что ID человека из справочника, выбранного в данный момент в мастер-датасете, будет добавляться АВТОМАТОМ в таблицу связей (поле EMPLOYEES_EMP_ID). Но этого не происходит... Подскажите пожалуйста, что я делаю не так. Заранее сэнкс.  smile 
PM MAIL   Вверх
Romikgy
Дата 6.7.2009, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 4
Всего: 146



имхо мало инфы для корректной помощи ,
хоть бы показал как создавались таблицы и какие поля есть в них
Цитата(4EVERCooL @  6.7.2009,  02:01 Найти цитируемый пост)
добавление суффикса MAS_ к имени поля означает

к чему это вообще не понятно ((


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
former
Дата 6.7.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

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



Цитата(4EVERCooL @  6.7.2009,  03:01 Найти цитируемый пост)
И эта сволочь ругается

Необходимо у компонентов DataSet настроить AutoUpdate Options (см. офф. документацию стр. 106).

Цитата(Romikgy @  6.7.2009,  09:46 Найти цитируемый пост)
к чему это вообще не понятно (( 

Romikgy, прочти в офф. руководстве стр. 39.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Romikgy
Дата 6.7.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 4
Всего: 146



former
Цитата(former @  6.7.2009,  11:44 Найти цитируемый пост)
прочти в офф. руководстве стр. 39. 

к чему офф руководство ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Akella
Дата 6.7.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(4EVERCooL @  6.7.2009,  03:01 Найти цитируемый пост)
, то есть чтобы данные в гриде нормально выглядели делаем джойн из нескольких таблиц.

Может сделать лучше без соединений, но с lookup-полями smile ?
PM MAIL   Вверх
former
Дата 6.7.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

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



Цитата(Romikgy @  6.7.2009,  14:14 Найти цитируемый пост)
к чему офф руководство ? 

к FIBPlus


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
4EVERCooL
Дата 6.7.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Akella @ 6.7.2009,  14:49)
Цитата(4EVERCooL @  6.7.2009,  03:01 Найти цитируемый пост)
, то есть чтобы данные в гриде нормально выглядели делаем джойн из нескольких таблиц.

Может сделать лучше без соединений, но с lookup-полями smile ?


Думаю, что не лучше. Официально ведь рекомендуетсяв Firebird использовать именно соединения smile. А вот про autoupdate options почитаем. Я так думаю в свойстве AutoParamstofield собака порылась  smile . Сейчас все работает через хранимую процедуру которой я перегонял данные из экселевского файла - она как нельзя лучше подошла к этому делу, но просто хотел до конца разобраться с возможностями FIBPlus.
PM MAIL   Вверх
Akella
Дата 6.7.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(4EVERCooL @  6.7.2009,  16:42 Найти цитируемый пост)
Думаю, что не лучше. Официально ведь рекомендуетсяв Firebird использовать именно соединения

Думаю, что ничего у тебя не выйдет. Ну или придётся попотеть.
PM MAIL   Вверх
4EVERCooL
Дата 6.7.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Akella @ 6.7.2009,  17:18)
Цитата(4EVERCooL @  6.7.2009,  16:42 Найти цитируемый пост)
Думаю, что не лучше. Официально ведь рекомендуетсяв Firebird использовать именно соединения

Думаю, что ничего у тебя не выйдет. Ну или придётся попотеть.

А почему?  smile . Я кстати в FB даже и не знаю как делать лукап  smile . Ну нету там такого типа поля, как в том же аксессе.
PM MAIL   Вверх
Romikgy
Дата 6.7.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 4
Всего: 146



Цитата(former @  6.7.2009,  11:44 Найти цитируемый пост)
прочти в офф. руководстве стр. 39. 

прочитал 
Код

1) Прописываем  у  MDS  в  SelectSQL  запрос 
select id, name  from clients
2) Прописываем  у  DDS  в  SelectSQL  запрос 
select * from orders where client_id = :mas_id.
3) У детального датасета DDS  присваиваем в свойство DataSource ссылку на  MasterSrc.

имхо возможно что из за того проблемка что в руководстве запрос простой , а у автора
Цитата(4EVERCooL @  6.7.2009,  02:01 Найти цитируемый пост)
SELECT
d.reg_id,
a.CERT_ID,
   a.CERT_TITLE,
b.ENT_ID,
    b.ENT_TITLE,
    d.ISSUEDON,
    d.VALIDUNTIL,
    d.CERTSCAN,
    d.qualif,
d.employees_emp_id,
d.certificates_cert_id,
d.issuedby_ent_id  
FROM
    MAINTABLE d
left join certificates a on d.certificates_cert_id=a.cert_id
left join issuedby b on d.issuedby_ent_id=b.ent_id 
 
where employees_emp_id=:mas_emp_id

где то здесь упоминалось о редактируемости запросов и не редактируемости .... могу и ошибаться...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Bose
Дата 6.7.2009, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 9
Всего: 51



AutoUpdateOptions тут не причём.

1й вариант - добавить второму(detail) датасету обработчик события OnBeforePost с кодом:
Код

  if DSCert.FieldByName('MAS_EMPLOYEES_EMP_ID').IsNull then
    DSCert.FieldByName('MAS_EMPLOYEES_EMP_ID').Value := ИмяПервогоДатасета.FieldByName('mas_emp_id').Value;


2й вариант - добавить в код вставки записи строку:
Код

begin
Form1.DSCert.Insert;
Form1.DSCert.FieldByName('CERT_TITLE').AsString:=FAddCert.ECerttitle.Text;
Form1.DSCert.FieldByName('ISSUEDON').AsDateTime:=Faddcert.bsSkinDateEdit1.Date;
Form1.DSCert.FieldByName('VALIDUNTIL').AsDateTime:=Faddcert.bsSkinDateEdit2.Date;
Form1.DSCert.FieldByName('QUALIF').asstring:=Faddcert.bsSkinEdit1.Text;
  if Form1.DSCert.FieldByName('MAS_EMPLOYEES_EMP_ID').IsNull then
    Form1.DSCert.FieldByName('MAS_EMPLOYEES_EMP_ID').Value := ИмяПервогоДатасета.FieldByName('mas_emp_id').Value;
Form1.DSCert.Post;
Form1.DSCert.FullRefresh;
end;


3-й вариант. Будет работать при условии, что master-detail сделано через свойство DataSource+MasterField(или как они там называются). Изменить SQL для вставки на следующий.:
Код

INSERT INTO MAINTABLE(
    REG_ID,
    ISSUEDON,
    VALIDUNTIL,
    CERTSCAN,
    QUALIF,
    EMPLOYEES_EMP_ID,
    CERTIFICATES_CERT_ID,
    ISSUEDBY_ENT_ID
)
VALUES(
    :REG_ID,
    :ISSUEDON,
    :VALIDUNTIL,
    :CERTSCAN,
    :QUALIF,
    :employees_emp_id,
    :MAS_CERTIFICATES_CERT_ID,
    :ISSUEDBY_ENT_ID
)


PM MAIL WWW Skype   Вверх
Akella
Дата 7.7.2009, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(4EVERCooL @  6.7.2009,  17:33 Найти цитируемый пост)
Я кстати в FB даже и не знаю как делать лукап

Ты, по-моему, даже не имеешь представления, что такое lookup и с чем его едят.
PM MAIL   Вверх
former
Дата 7.7.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

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



Цитата(Bose @  6.7.2009,  22:52 Найти цитируемый пост)
AutoUpdateOptions тут не причём.

Очень даже причем. Набросал небольшой пример.

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  MasterDetail_AU.rar 82,57 Kb


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
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.0935 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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