Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115

Добавление в связанные таблицы.

15.05.2017, 18:20. Показов 3004. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Пытаюсь добавить записи в связанные таблицы, но выходит ошибка "Feild ID cant be modifed".
Связь 1 ко 1 через ID (счётчик). В accesse в схеме всё связал. Если заполнить данные через Access, то все отображается нормально
Добавляю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
with Form_MainMenu.adoquery2 do begin form_MainMenu.ADOConnection2:=form_MainMenu.ADOConnection2;
Form2.adoquery2.Insert;
Form2.ADOQuery2.FieldByName('Tachka').AsString:=Edit_result.Text;
form2.adoquery2.FieldByName('Nomer').AsString:=Edit_Tachka.Text;
Form2.adoquery2.post;
end;
with  Form_MainMenu.adoquery1 do begin  Form_MainMenu.adoconnection1:= Form_MainMenu.adoconnection1 ;
Form_MainMenu.adoquery1.insert;
Form_MainMenu.adoquery1.fieldbyname('FIO').AsString:=Edit1.text;
Form_MainMenu.adoquery1.fieldbyname('Mobile').AsString:=Edit2.text;
Form_MainMenu.adoquery1.post
end;
Тачка дочерняя должна быть, а человек главная. Но при связке получилось походу наоборот. У тачки, есть человек. Но не важно наверно, главное чтобы добавляло нормально, а оно не добавляет. Если сначало добавлять данные про человека, а потом про тачку, то ошибок нет, но добавлявляет ТОЛЬКО человека, а тачку не добавялет
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2017, 18:20
Ответы с готовыми решениями:

Добавление данных в связанные таблицы
Доброго времени суток. У меня есть две таблицы, связанных полем IDЗаказа. Написала кот для добавления данных.Все работало. Но по...

Добавление новой записи в связанные таблицы
Допустим у меня есть 2 таблицы. первая IDтрек(ключевое), Трек, IDжанр вторая IDжанр(ключевое), Жанр Связаны...

Добавление новой записи в связанные таблицы
Всем доброго времени суток! Пожалуйста подскажите кто разбирается в sql запросах. очень нужно для курсовой... Допустим у меня есть 2...

21
5966 / 4542 / 1094
Регистрация: 29.08.2013
Сообщений: 28,154
Записей в блоге: 3
15.05.2017, 19:14
это что за фигня?
Цитата Сообщение от CfgHack Посмотреть сообщение
Form_MainMenu.adoconnection1:= Form_MainMenu.adoconnection1
проблемы со связями это не к делфи вопрос, а к аксессу
ЗЫ зачем вообще в аксессе связывать? почему бы не самому?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
15.05.2017, 23:18
Цитата Сообщение от CfgHack Посмотреть сообщение
Связь 1 ко 1 через ID (счётчик)
ID (счётчик) - это только в главной таблице. В подчиненной должен быть iD - ЦЕЛОЕ

ПОСЛЕ Form2.adoquery2.post; В form2.adoquery2.FieldByName('Id').asInte ger должен быть id вставленой записи, вот его и надо присвоить в качестве Id-а подчиненной записи
Delphi
1
Form_MainMenu.adoquery1.fieldbyname('id').AsInteger:= form2.adoquery2.FieldByName('Id').asInteger
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
16.05.2017, 14:15  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
зачем вообще в аксессе связывать? почему бы не самому?
А можно пример? Как это можно сделать
Цитата Сообщение от YuryK Посмотреть сообщение
ID (счётчик) - это только в главной таблице. В подчиненной должен быть iD - ЦЕЛОЕ
ПОСЛЕ Form2.adoquery2.post; В form2.adoquery2.FieldByName('Id').asInte ger должен быть id вставленой записи, вот его и надо присвоить в качестве Id-а подчиненной записи
Delphi
Поменял убрал счетчик, поставил числовой, сделал ID_rent. Связал. Но ничего не выходит опять, либо какую-то гиганскую ошибку выводит, либо добавляет данные только в таблицу человек . скорее всего я что-то не так делаю
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
with Form_MainMenu.adoquery2 do begin form_MainMenu.ADOConnection2:=form_MainMenu.ADOConnection2;
Form2.adoquery2.Insert;
Form2.ADOQuery2.FieldByName('Tachka').AsString:=Edit_result.Text;
form2.adoquery2.FieldByName('Nomer').AsString:=Edit_Tachka.Text;
Form2.adoquery2.post; end;
with  Form_MainMenu.adoquery1 do begin  Form_MainMenu.adoconnection1:= Form_MainMenu.adoconnection1 ;
Form2.adoquery1.insert;
Form2.ADOQuery1.FieldByName('ID_rent').AsString:=Form2.adoquery1.fieldbyname('ID').AsString;
Form2.adoquery1.fieldbyname('FIO').AsString:=Edit1.text;
Form2.adoquery1.fieldbyname('Mobile').AsString:=Edit2.text;
Form2.adoquery1.post
end;
Добавлено через 5 минут
точнее вот так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
with  Form_MainMenu.adoquery1 do begin  Form_MainMenu.adoconnection1:= Form_MainMenu.adoconnection1 ;
Form2.adoquery1.insert;
Form2.adoquery1.fieldbyname('FIO').AsString:=Edit1.text;
Form2.adoquery1.fieldbyname('Mobile').AsString:=Edit2.text;
Form2.adoquery1.post
end;
with Form_MainMenu.adoquery2 do begin form_MainMenu.ADOConnection2:=form_MainMenu.ADOConnection2;
Form2.adoquery2.Insert;
Form2.ADOQuery2.FieldByName('ID_rent').AsString:=Form2.adoquery1.fieldbyname('ID').AsString;
Form2.ADOQuery2.FieldByName('Tachka').AsString:=Edit_result.Text;
form2.adoquery2.FieldByName('Nomer').AsString:=Edit_Tachka.Text;
Form2.adoquery2.post; end;
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
16.05.2017, 14:39
Цитата Сообщение от CfgHack Посмотреть сообщение
либо какую-то гиганскую ошибку выводит
ждем экстрасенсов, может они скажут, что за ошибка

Цитата Сообщение от CfgHack Посмотреть сообщение
Form_MainMenu.adoconnection1:= Form_MainMenu.adoconnection1 ;
Цитата Сообщение от CfgHack Посмотреть сообщение
form_MainMenu.ADOConnection2:=form_MainM enu.ADOConnection2;
у вас уже спрашивали, зачем это?
уточню, зачем ДВА РАЗНЫХ ADOConnection?
в отладчике посмотрите после Form2.adoquery1.post значение Form2.adoquery1.fieldbyname('ID').AsStri ng определено?
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
16.05.2017, 14:59  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
у вас уже спрашивали, зачем это?
Тут косяк с end; возник, не там поставил его. Теперь все добавило, однако с ошибкой "Индекс или ключ не может содержать пустое значение null"
и данные не сохраняет
Сделал сейчас вот так вот:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
with  Form_MainMenu.adoquery1 do begin 
Form2.adoquery1.insert;
Form2.adoquery1.fieldbyname('FIO').AsString:=Edit1.text;
Form2.adoquery1.fieldbyname('Mobile').AsString:=Edit2.text;
Form2.adoquery1.post
end;
with Form_MainMenu.adoquery2 do begin 
Form2.adoquery2.Insert;
Form2.ADOQuery2.FieldByName('ID_rent').AsString:=Form2.adoquery1.fieldbyname('ID').AsString;
Form2.ADOQuery2.FieldByName('Tachka').AsString:=Edit_result.Text;
form2.adoquery2.FieldByName('Nomer').AsString:=Edit_Tachka.Text;
Form2.adoquery2.post; end;
Добавлено через 8 минут
В отладчике самый последник end; помечается в процедуре кнопки. воозможго не так провел его
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
16.05.2017, 15:01
значит после post fieldbyname('ID') в набор не возвращается. Тогда найдите эту запись, основные критерии поиска то у вас есть

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
with  Form_MainMenu.adoquery1 do begin 
  Form2.adoquery1.insert;
  Form2.adoquery1.fieldbyname('FIO').AsString:=Edit1.text;
  Form2.adoquery1.fieldbyname('Mobile').AsString:=Edit2.text;
  Form2.adoquery1.post;
  Form2.adoquery3.Close;
  Form2.adoquery3.fieldbyname('FIO').AsString:=Edit1.text;
  Form2.adoquery3.fieldbyname('Mobile').AsString:=Edit2.text;
  Form2.adoquery3.Open;
end;
...
  Form2.ADOQuery2.FieldByName('ID_rent').AsString:=Form2.adoquery3.fieldbyname('ID').AsString;
где в Form2.adoquery3 (или другом компоненте, если adoquery3 уже есть) параметрический запрос на поиск последней добавленной записи
SQL
1
SELECT MAX(IS) AS ID FROM <куда там человеков пишите> WHERE FIO = :FIO AND Mobile = :Mobile
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
16.05.2017, 15:55  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
значит после post fieldbyname('ID') в набор не возвращается. Тогда найдите эту запись, основные критерии поиска то у вас есть
Странно, пишет поле ID не найдено. Кстате, там где было ID_rent, я сделал просто ID.
Сделал так, добавил новый adoquery, связал его с adoconnction и с datasource (Из таблицы человеки) сделал такой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
with  Form_MainMenu.adoquery1 do begin 
  Form2.adoquery1.insert;
  Form2.adoquery1.fieldbyname('FIO').AsString:=Edit1.text;
  Form2.adoquery1.fieldbyname('Mobile').AsString:=Edit2.text;
  Form2.adoquery1.post;
  Form2.adoquery3.Close;
  Form2.adoquery3.fieldbyname('FIO').AsString:=Edit1.text;
  Form2.adoquery3.fieldbyname('Mobile').AsString:=Edit2.text;
  Form2.adoquery3.Open;
end;
with Form_MainMenu.adoquery2 do begin 
Form2.adoquery2.Insert;
Form2.ADOQuery2.FieldByName('ID').AsString:=Form2.adoquery3.fieldbyname('ID').AsString;
Form2.ADOQuery2.FieldByName('Tachka').AsString:=Edit_result.Text;
form2.adoquery2.FieldByName('Nomer').AsString:=Edit_Tachka.Text;
Form2.adoquery2.post; end;
В новый adoquery3 в свойствах, в SQL написал вот:
SQL
1
SELECT MAX(IS) AS ID FROM Piples WHERE FIO = :FIO AND Mobile = :Mobile
У меня больше полей в таблицах, в SQL прописал почти все, там дальше.
Не понятно, почему пишет ошибку при добавлении "Adoquery3:поле ID не найдено"

Добавлено через 6 минут
В отладке эта строка:
Delphi
1
Form2.ADOQuery2.FieldByName('ID').AsString:=Form2.adoquery3.fieldbyname('ID').AsString;
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
16.05.2017, 16:05
MAX(IS)
опечатка
MAX(ID)

Добавлено через 1 минуту
Цитата Сообщение от CfgHack Посмотреть сообщение
У меня больше полей в таблицах, в SQL прописал почти все, там дальше.
больше то зачем, если при добавлении определяем только два?
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
16.05.2017, 16:14  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
больше то зачем, если при добавлении определяем только два?
Тоже об этом подумал.
Он серавно ругается на поле ID. В отладке на эту строчку

Delphi
1
Form2.ADOQuery2.FieldByName('ID').AsString:=Form2.adoquery3.fieldbyname('ID').AsString;
перепровряю сижу, вроде же всё правильно и в таблце есть это поле все указал
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
16.05.2017, 16:20
connection у нового компонента adoquery3 проставили?
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
16.05.2017, 16:24  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
connection у нового компонента adoquery3 проставили?
Да, всё выставил. Привязал connection к adoconnection1 и datasource к datasource1
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
16.05.2017, 16:36
Цитата Сообщение от CfgHack Посмотреть сообщение
и datasource к datasource1
зачем?

Добавлено через 3 минуты
пора уже проект заливать, если все попытки исправить самостоятельно проваливаются а то у меня через полчаса полночь и
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
16.05.2017, 16:36  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
зачем?
По разному пробовать уже начал. Сейчас оставил только к adoconnection1 связку. Случайно кроме adpquery3 ничего больше добавлять не надо?
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
16.05.2017, 17:18  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
пора уже проект заливать
вот накидал. даже так, серавно ошибка эта, эх
версия Xe
Вложения
Тип файла: rar пример.rar (2.12 Мб, 13 просмотров)
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
16.05.2017, 23:34
Цитата Сообщение от CfgHack Посмотреть сообщение
вот накидал. даже так
базу данных кинуть забыл. А та что есть не соответствует коду программы.
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
17.05.2017, 13:11  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
базу данных кинуть забыл. А та что есть не соответствует коду программы
База данных лежит рядом с exe. В папке win32/Debug/
А почему коду не соответствует? Также пытаюсь добавить, та-же самая ошибка. Правда тут она почему-то сохраняет данные в первую таблицу
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
17.05.2017, 15:26
Цитата Сообщение от CfgHack Посмотреть сообщение
База данных лежит рядом с exe. В папке win32/Debug/
а у меня ехе в папке проекта был, потому базу и не находил, точнеее там старый вариант остался. Сорри.

Кстати, у меня все нормально с adoquery1.fieldbyname('Id').AsInteger после Post.

Поэтому такой код (без третьего query) вполне рабочий.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.Button1Click(Sender: TObject);
begin
with  adoquery1 do begin
  adoquery1.insert;
  adoquery1.fieldbyname('FIO').AsString:=Edit1.text;
  adoquery1.fieldbyname('Mobile').AsString:=Edit2.text;
  adoquery1.fieldbyname('Fax').AsString:=Edit3.text;
  adoquery1.post;
end;
with adoquery2 do begin
adoquery2.Insert;
ADOQuery2.FieldByName('ID').AsInteger:=adoquery1.fieldbyname('Id').AsInteger;
ADOQuery2.FieldByName('Tachka').AsString:=Edit1.Text;
adoquery2.FieldByName('NomerTachki').AsString:=Edit2.Text;
adoquery2.post; end;
end;
А с третьим query я там перемудрил с полями и параметрами
0
0 / 0 / 0
Регистрация: 07.02.2015
Сообщений: 115
17.05.2017, 16:15  [ТС]
Цитата Сообщение от YuryK Посмотреть сообщение
Поэтому такой код (без третьего query) вполне рабочий
Действительно работает.
Но в основном проекте пишет "Индекс или ключ не моджет содержать пустое значпение null".
У меня еще условия есть, там есть поле пол, пол выбирается через radiobutt. И условие вставки картинки. Условия задаются в основной таблице, ну туда данные добавляет из условий этих
Delphi
1
2
3
if radiobutt1.checked=true then form2.adoquery1.fieldbyname('Пол').asstring:='Мужской';
if radiobutt2.checked=true then form2.adoquery1.fieldbyname('Пол').asstring:='Женский';
if edit_locate<>'' then begin <код вставления картинки в базу> end;
Где edit_locate - это путь, указывается через диалоговое окно. Поставил сверку т.к. если не указать картинку, то крашило прогу, типо защита.
Возможно из-за этого ошибки? А может быть из-за того. что form2. Тоесть обращение с окна добавления к основному окну?
Фактически код такой же, отличие в только в этих условиях
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
17.05.2017, 16:28
Цитата Сообщение от CfgHack Посмотреть сообщение
Действительно работает.
Но в основном проекте пишет "Индекс или ключ не может содержать пустое значение null".
Успехов в поисках ошибки по-аналогии, если код основного проекта настолько засекречен
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.05.2017, 16:28
Помогаю со студенческими работами здесь

Добавление записей в связанные таблица
Имеются две таблицы в PostgreSQL. В Таблице KTR содержится информация о детали. В таблице ROUTE содержится маршрут движения детали по...

Добавление записей в две связанные Dbtable
У меня есть 2 базы данных связанные полями Фамилия и Имя (Скрин 1). Нужно что бы при добавлении информации в таблицу каждая шла на свое...

Связанные таблицы
Сделал связанные таблицы все работает но когда выходишь из программы он выдает ошибку перевод: Нарушение прав доступа по адресу...

Связанные таблицы
Здравствуйте. Помогите плиз чайнику. У меня 2 таблицы связанные друг с другом(один ко многим). И я через форму добавляю данные. Фото: ...

В Excel - связанные таблицы
Здравствуйте! Подскажите, пожалуйста, как выгрузить в Excel данные из двух связанных таблиц? или, хотя бы - одну строку родительской...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru