Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 20:13   #1
Hayaname
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 12
По умолчанию Проблема с добавлением записей (сервер приложений + clientdataset)

Вступление (для более полного понимания проблемы):

Имеется сервер приложений, подключенный через ADO к таблицам в MS Access (LichData, Doljnost, Telephones, Adres). Поле ключ в таблице LichData автоинкрементное - через него организуется связь "главная-подчиненная" между таблицами.
Doljnost, Telephones и Adres связаны с LichData по этому полю.

Связь клиентского приложения с удаленным модулем данных организуется посредством модуля: DCOM.
Для связи с наборами данных используется компонент ClientDataSet.

Вот мы соединились с сервером:
Код:
 
procedure TfMain.BitBtn3Click(Sender: TObject);
begin
fDM.CDSLichData.Append;
fDM.CDSTelephones.Append;
fDM.CDSDoljnost.Append;
fDM.CDSAdres.Append;
fEditor.ShowModal;
end;
В появившуюся форму мы вносим данные и нажимаем на кнопку Сохранить и выйти:
Код:
procedure TfEditor.BitBtn1Click(Sender: TObject);
begin
if fDM.CDSLichData.Modified then
fDM.CDSLichData.Post;
if fDM.CDSDoljnost.Modified then
fDM.CDSDoljnost.Post;
if fDM.CDSAdres.Modified then
fDM.CDSAdres.Post;
if fDM.CDSTelephones.Modified then
fDM.CDSTelephones.Post;
Close;
end;

Теперь проблема: когда пытаюсь записать данные на сервер
Код:
procedure TfMain.bSaveToDBClick(Sender: TObject);
begin
fDM.CDSLichData.ApplyUpdates(0);
DM.CDSTelephones.ApplyUpdates(0);
DM.CDSDoljnost.ApplyUpdates(0);
fDM.CDSAdres.ApplyUpdates(0);
ShowMessage('Данные сохранены');
end;
То изменения сохраняются только в LichData, в таблицах - Doljnost, Telephones, Adres все пусто. Так же записи добавляются начиная с 25 номера, а не с 1го (поле Ключ).

В общем прошу помощи, уважаемые форумчане.

Последний раз редактировалось Stilet; 23.10.2011 в 20:28.
Hayaname вне форума Ответить с цитированием
Старый 24.10.2011, 09:42   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Так же записи добавляются начиная с 25 номера, а не с 1го
Наверно удаляли записи раньше, в автоинкриментном поле дырки по-новой не заполняются.
Цитата:
Поле ключ в таблице LichData автоинкрементное - через него организуется связь "главная-подчиненная" между таблицами
А как у вас этот ключ передается в дочерние таблицы? Похоже никак
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.10.2011, 16:48   #3
Hayaname
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 12
По умолчанию

Цитата:
Наверно удаляли записи раньше, в автоинкриментном поле дырки по-новой не заполняются.
В том то и дело, что таблицы пустые и в них ничего не добавлялось ранее. Я просто думал что эти проблемы связаны.
В принципе главное чтобы добавлялись записи, а поле ключ все равно будет не видимым для пользователя.
Цитата:
А как у вас этот ключ передается в дочерние таблицы? Похоже никак
Сама связь между таблицами реализуется следующим образом:

На сервере приложений я добавил один DataSource, в его свойстве DataSet
выбрал TLichData (нашу главную таблицу) . Сама организация связи производится в подчиненных таблицах (TTelephones, TDoljnost, TAdres), то бишь в MasterSource
выбрано dsLichData, а в MasterFields выбираются нужные поля для связи:





Сами подчиненные таблицы подключены к серверу через главную таблицу, а не напрямую.
Hayaname вне форума Ответить с цитированием
Старый 24.10.2011, 18:13   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не понял как на сервере приложений можно организовать такую связь. У вас там должно быть 4 AdoQuery, для каждого их них свой DataSetProvider, на каждый из которых из клиентской части ссылается свой ClientDataSet. На клиентской части это возможно. Теперь дальше. Выполняется CDSLichData.ApplyUpdates - в базе создается запись и появляется значение ключа, о котором ни сервер приложений, ни клиент не имеют ни малейшего понятия. Выполняете CDSTelephones.ApplyUpdates - ключ в нем NULL, и будет таким пока вы не засунете туда его значение. Откуда его брать - это проблема. Решить ее можно выбрав MAX ключа запросом после вставки родительской записи. И вообще сама идея Access и трех-звенка вызывает недоумение, имхо. У вас что, предполагается многопользовательский режим? Тогда в RemoteDateModule нужно организовывать синхронизацию для чтения-обновления данных с другими копиями RemoteDateModule. Сама Access не предполагает использования в таком режиме
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.10.2011, 19:26   #5
Hayaname
Пользователь
 
Регистрация: 23.10.2011
Сообщений: 12
По умолчанию

Цитата:
Не понял как на сервере приложений можно организовать такую связь. У вас там должно быть 4 AdoQuery, для каждого их них свой DataSetProvider, на каждый из которых из клиентской части ссылается свой ClientDataSet.
Все так и есть, только не 4 AdoAuery, а 4 AdoTable.

Цитата:
Выполняете CDSTelephones.ApplyUpdates - ключ в нем NULL, и будет таким пока вы не засунете туда его значение. Откуда его брать - это проблема.
Вот уже начинаю понимать...что ж, бессоная ночь)

Цитата:
У вас что, предполагается многопользовательский режим?
Да да, хотелось бы организовать такую ситуацию.

Цитата:
Сама Access не предполагает использования в таком режиме
Если так, то какую бы связку вы посоветовали?

P.S.: сама БД на всякий пожарный: http://ifolder.ru/26535743 пароль: 125

Последний раз редактировалось Hayaname; 24.10.2011 в 19:29.
Hayaname вне форума Ответить с цитированием
Старый 24.10.2011, 20:41   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Насчет использования AdoTable на сервере приложений. В жизни его там не использовал и затрудняюсь сказать правомочно ли вообще его использование в таком качестве. Как минимум очевидный недостаток - тянет все записи из таблицы, пока их мало нет проблем, но когда много - проблемы. Что касается базы - ищите нормальную СУБД поддерживающую многопользовательский режим, триггера, пользовательские процедуры и функции, транзакции, без них нормальная эксплуатация - гроб с музыкой. Есть платные, есть бесплатные. Какую? Я в основном по MSSQL, очень мощная, но не бесплатная. Хотя какая-то версия сейчас бесплатно распространяется, про ее возможности не скажу. Достоточно много других СУБД, гуглите, что-то найдете.
Что касается автоинкриментных ключей - их использование при создании много-табличных документов не рационально, удобнее создавать уникальные ключи другими средствами, по крайней мере для таблиц-родителей, имхо. Я по началу тоже пытался их использовать, но набив шишки полностью отказался
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.10.2011 в 20:51.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с добавлением стиля Tradua JavaScript, Ajax 1 21.07.2011 02:38
Добавление FieldDefs в ClientDataSet без потери записей shock-in Общие вопросы Delphi 1 04.12.2009 01:18
Проблема с добавлением ILOR БД в Delphi 11 21.05.2009 18:35
Проблема с добавлением столбца Аццкий прогер БД в Delphi 3 27.02.2009 08:45
Проблема с добавлением в БД VenMaster БД в Delphi 8 03.06.2008 21:02