Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление данных в таблицы по технологии ADO, Не получается с добавлением данных. 
V
    Опции темы
ivanfr
  Дата 10.3.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проблема такая: есть две связные таблицы схему можно посмотреть на рисунке
Ссылка на схему данных http://s2.ipicture.ru/uploads/20110310/RZDK9VHM.jpg

используя ниже приведенный код я запишу данные в соответствующие столбцы, но так как у меня таблицы связные один ко многим, 
то данные запишутся отдельно каждые в свою таблицу и связи между ними не будет. 
А хотелось, чтобы в ячейку ФИО подставлялось значение из таблицы автоматом(чтобы связь была).
Как исправить?
 
Код

Form2.ADOTable_persona_stor.Append;
  Form2.ADOTable_persona_stor.FieldByName('Дата увольнения').AsDateTime:=StrToDate(temp_data_from_xls[1]);
  Form2.ADOTable_persona_stor.FieldByName('ФИО работника').AsString:=temp_data_from_xls[2];  // при такой записи будет ошибка, потому что числовое значение, так как идет подстановка из другой таблицы.
  Form2.ADOTable_persona_stor.FieldByName('Табельный номер').AsInteger:=StrToInt(temp_data_from_xls[3]);
  Form2.ADOTable_fio_work.Append;
  Form2.ADOTable_fio_work.FieldByName('ФИО').AsString:=temp_data_from_xls[2];
 Form2.ADOTable_fio_work.Post
  Form2.ADOTable_persona_stor.Post;

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


Шустрый
*


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

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



Извини но не вчитывался в код. Я бы решил это 2-мя запросами, но сперва:
1. переименовал бы названия полей.(хотя бы транслитом)
2. Если мне не изменяет память Access ставит связи нормально (на против того что связано), тогда во второй таблице поле не ФИО работника, а его id (название немного вводит в заблуждение)

Самое первое что приходит на ум:
1. если у нас поле в первой табл. id_fio_work - счетчик, тогда следует, иначе к П.2: 
  1.1. добавить новую запись 
  1.2. прочитать id последней записи
  1.3. переходим на П.3.
2. если у нас поле в первой табл. id_fio_work  не счетчик - тогда:
  2.1. выбираем максимальный элемент id_fio_work 
  2.2. вставляем данные в первую таблицу
  2.3. переходим на П.3.
3. С пункта 1 или 2 мы узнали id_fio_work
  3.1. Вставляем с помощью запроса данные во вторую таблицу


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

По поводу ошибок:
Цитата

Код

Form2.ADOTable_persona_stor.FieldByName('ФИО работника').AsString:=temp_data_from_xls[2];  // при такой записи будет ошибка, потому что числовое значение, так как идет подстановка из другой таблицы.


 может не AsString а Value, а если нужно чтобы было String, так IntToStr(temp_data_from_xls[2]) если нужно Integer перевести в String...

Программа наверно для экспорта данных из Excel в Access
--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
ivanfr
Дата 11.3.2011, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 
Схема данных в бд http://s1.ipicture.ru/uploads/20110311/cVw4tCvD.jpg
Код


DataModule1.ADOTable_fio_work.Insert;
  DataModule1.ADOTable_fio_work.FieldByName('fio_work').AsString:=temp_data_from_xls[3];
  DataModule1.ADOTable_fio_work.Post;
  DataModule1.ADOTable_persona_stor.Insert;
  DataModule1.ADOTable_persona_stor.FieldByName('date_uvolnenie').AsDateTime:=StrToDate(temp_data_from_xls[2]);
  DataModule1.ADOTable_persona_stor.FieldByName('id_fio_work').AsInteger:=DataModule1.ADOTable_fio_work.RecordCount;
  DataModule1.ADOTable_persona_stor.FieldByName('tabel_nomer').AsInteger:=strtoint(temp_data_from_xls[4]);
  DataModule1.ADOTable_persona_stor.Post;/// выдет ошибку First chance exception at $7C812AFB. Exception class EOleException with message 'Невозможно добавление или изменение записи. Для обеспечения целостности данных необходимо наличие связанной записи в таблице 'fio_work''. Process uvol_work.exe (3312)


Как быть?

Это сообщение отредактировал(а) ivanfr - 11.3.2011, 14:02
PM MAIL   Вверх
Antimol
Дата 11.3.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

DataModule1.ADOTable_persona_stor.FieldByName('id_fio_work').AsInteger:=DataModule1.ADOTable_fio_work.RecordCount;

Невозможно добавление или изменение записи. Для обеспечения целостности данных необходимо наличие связанной записи в таблице 'fio_work''. Process uvol_work.exe (3312)



RecordCount - не всегда совпадает с id таблицы, про что свидетельствует  сообщение об ошибке.

можно попробовать так

Код

DataModule1.ADOTable_fio_work.FieldByName('id_fio_work').AsInteger

--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
ivanfr
Дата 14.3.2011, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Благодарю. Пока все работает как надо.  Вопрос закрыт
PM MAIL   Вверх
Antimol
Дата 14.3.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пожалуйста  smile , лучше бы рейтингом поблагодарил  smile , ну да ладно.

Проблему я вижу одну, при вставке в первую таблицу, не ясно на последнюю запись мы переходим, или остаемся на той же. Если переходим - все отлично. Если нет - привязка будет только к одному пользователю в первой таблица, на котором мы "стоим" в данный момент
--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


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

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

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


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

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


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

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


 




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


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

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