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

Связанные таблицы, присвоение значений

30.07.2019, 09:22. Показов 2722. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Из за нехватки опыта, сильно парюсь со следующей проблемой! Может кто нибудь на пальцах объяснить?
Не могу присвоить значения ключей.
Есть 3 таблицы. Ttypedoc(id, namedoc), tdoc(id,idtypedoc, data, numdoc), tsklad(id, iddoc, idkompl, quantity, price)
Таблицы связаны ttypedoc.id - tdoc.idtypedoc, tdoc.id - tsklad.iddoc
Вот как при создании документа сделать так чтобы tdoc.idtypedoc принимал значение нужного id таблицы ttype, и tsklad.iddoc id этого документа
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.07.2019, 09:22
Ответы с готовыми решениями:

Связанные таблицы
Здравствуйте, у меня есть 2 таблицы связанные между собой. Как можно пройтись по второстепенной таблице от начала до конца в делфи 7 ?

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

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

39
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
30.07.2019, 09:33
Цитата Сообщение от fya Посмотреть сообщение
как при создании документа сделать так
Ну так смотря как у тебя формируется PK родительской таблицы. Способы есть разные и они обычно зависят от используемой СУБД.
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 09:35  [ТС]
Бд postgresql, в базе связаны ключами. А как в Делфи это сделать?!
0
Модератор
 Аватар для D1973
9923 / 6459 / 2457
Регистрация: 21.01.2014
Сообщений: 27,409
Записей в блоге: 3
30.07.2019, 09:35
Цитата Сообщение от fya Посмотреть сообщение
чтобы tdoc.idtypedoc принимал значение нужного id таблицы ttype
SQL
1
2
SELECT tdoc.ID, TtypeDoc.NameDoc, tdoc.Data, tdoc.numdoc
FROM TtypeDoc INNER JOIN tdoc ON TtypeDoc.ID = tdoc.idtypedoc
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 09:38  [ТС]
Чтобы он записывал эти значения !?
Например создаю документ приход:
И при этом чтобы в таблицу tdoc.idtypedoc запивалась 1 - Id значения приход таблицы ttypedoc
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
30.07.2019, 09:57
Цитата Сообщение от fya Посмотреть сообщение
Id значения приход таблицы ttypedoc
Еще раз. Как формируется значения PK родительской таблицы? Например, если оно формируется вручную, то использовать его для дочерней таблицы вообще никаких проблем.
Остальные способы зависят от СУБД. Например, в Oracle часто используется способ формирования в триггере с выборкой очередного значения из последовательности. Для получения этого значения в клиентской программе существует инструкция
SQL
1
INSERT INTO tab1 ... VALUES (...) RETURNING fld1 INTO var1  -- в var1 как раз и сохраняется значение PK, записанного в триггере
В MySQL для подобных целей служит функция LAST_INSERT_ID.
Что для этого существует в PostgreSQL - лучше спросить на соответствующем форуме.
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 11:09  [ТС]
Цитата Сообщение от Grossmeister Посмотреть сообщение
Еще раз. Как формируется значения PK родительской таблицы?
Извините за глупые вопросы, я один раз уточню! Что такое РК? Скорее всего вручную формируется.
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
30.07.2019, 11:28
PK - primary key (главный ключ). Уникальный идентификатор записи в таблице, может быть только один для таблицы. В качестве такого идентификатора может использоваться одно поле или группа полей. Очень хорошо для создания PK подходит поле - счетчик, т.к. всегда создает уникальный для таблицы номер 1,2,3...1000000, но вполне допустима последовательность значений для PK - 1,150,76,10000. Абсолютно не важен разрыв между числами и порядок этих номеров - системе так удобнее работать Поэтому такое поле считается системным и обычный смертный его видеть вообще не должен.
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 11:30  [ТС]
А! Это вручную задавал!
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
30.07.2019, 12:32
Цитата Сообщение от fya Посмотреть сообщение
Это вручную задавал
Тогда в чем проблема подставить это же значение в дочернюю таблицу?
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 13:12  [ТС]
Delphi
1
2
SELECT tdoc.ID, TtypeDoc.NameDoc, tdoc.Data, tdoc.numdoc
FROM TtypeDoc INNER JOIN tdoc ON TtypeDoc.ID = tdoc.idtypedoc
Вот таким способом?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
30.07.2019, 14:51
мы сейчас о вставке говорим???
я уже не в первый раз удивляюсь нежеланию читать доки даже на русском
https://postgrespro.ru/docs/po... -returning
если главная таблица имеет автоинкрементный ID
а подчиненная ссылается на нее полем MASTER_ID
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
q.sql.text:='insert into MASTER_TABLE (FIELD1, FIELD2) values (:VALUE1, :VALUE2) returning ID)';
q2.sql.text := 'insert into DETAIL_TABLE (MASTER_ID, FIELD1, FIELD2) values (:ID, :V1, :V2)';
 
.....
q.parambyname('VALUE1').asstring := 'xxxxx';
q.parambyname('VALUE2').asstring := 'yyyyyy';
q.open; // не уверен, можно сначала попробовать ExecSQL
ID := q.fieldbyname('ID').asInteger;
q.close; // если ExecSQL норм, то Close не нужно
 
q2.parambyname('ID').asinteger := ID;
q2.parambyname('V1').asstring := 'ssssss';
q2.parambyname('V2').asstring := 'uuuuuuu';
q2.execsql;
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 15:32  [ТС]
Спасибо, что поясняете! Буду пробовать! А читал я много, не ленюсь! До того, что каша в голове! Попробую, отпишусь потом
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
30.07.2019, 16:37
что там придумывать
вам надо, чтобы в одной таблице был код из другой таблицы
отсюда алгоритм
надо сначала получить этот код в главной таблице, потом его использовать при вставке в подчиненную
и помнить, что кроме автоинкремента, никаких других авто там нет) все программировать
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 19:06  [ТС]
Да я понимаю что все программировать, много примеров смотрел. Пока получается dblookupcombobox привязать. Он чётко вставляет значения. Dbedit. И обновляю таблицу. Получилось странным образом связать документы, но мне не нравится. Пробую ещё

Добавлено через 2 часа 8 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
если главная таблица имеет автоинкрементный ID
а подчиненная ссылается на нее полем MASTER_ID
короче я по ходу тупой......
посмотрел пример, хорошо....
По факту у меня таблица ttypeDoc, в ней 2 значения, Приход и Реализация. И больше туда ничего не вставляю.
есть таблица tdoc, в ней поле id, idtypeDoc, datadoc, numDoc.
Мне надо при нажатии на кнопку, при которой откроется форма - если это приход, то idtypeDoc = 1, если реализация, то idtypeDoc = 2,
и они свяжутся. Я все читал что Вы скинули и про returning и т.п. Но я в таблицу typeDoc ничего не вставляю.
Если по тупому взять значение id и при отображении формы присвоить это значение idtypedoc? Так делают вообще?
Просто я смотрел что ставят элементы dbedit и через них связывают - на форме они не отображаются.... но это мне кажется странный вариант

Добавлено через 51 секунду
Я по этому и интересуюсь тут! Хочется мнение людей которые практически кодят, а то у меня заборы какие то....
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 21:19  [ТС]
вообщем пока только так получилось....
Delphi
1
2
3
4
5
6
7
8
9
10
if (dbEdit1.Text = '') or (DBLookupCombobox1.Text = '') or (dbedit2.Text = '') then
    begin
      Application.MessageBox(PChar('Заполните ВСЕ поля!'), 'Внимание!', MB_OK+MB_ICONINFORMATION);
      Exit;
    end
      else
if dm.fqSklad.Modified then dm.fqSklad.Post;
        dm.fqSklad.Refresh;
        dm.fqSklad.Insert;
        dblookupcombobox1.SetFocus;
Миниатюры
Связанные таблицы, присвоение значений  
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 22:07  [ТС]
В целом схема выглядит так:
у меня тупик с таблицами в нижней части.
По моей логике:
есть форма документы: на ней dbgrid с таблицей документов, приходы, реализация. так же 2 кнопки 1) Добавить приход и 2) Реализация
По моей задумке, при нажатии на Приход открывается форма(уже этой записи присвоено значение из ttypedoc) на ней дата, номер документа (по идее должен быть id этой записи) и DBgrid со связанными таблицами tdoc и tsklad
Delphi
1
2
dm.fqSklad.SQL.Text := 'select tdoc.id, tdoc.datadoc, tdoc.numdoc, tsklad.idkompl from tdoc ' +
                        'INNER JOIN tsklad ON tdoc.id = tsklad.idKompl';
есть dbnavigator при нажатии на + открывается форма, там выбираются комплектующие, их количество и цена, считается сумма и заносятся в таблицу sklad, потом я сохраняю документ и он присваивает tdoc.id - tsklad.idDoc

Но как это реализовать в коде я уже 3 день выдумываю.... Вроде не сложно выглядит, но и не получается.
Миниатюры
Связанные таблицы, присвоение значений  
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
30.07.2019, 22:07  [ТС]
В целом схема выглядит так:
у меня тупик с таблицами в нижней части.
По моей логике:
есть форма документы: на ней dbgrid с таблицей документов, приходы, реализация. так же 2 кнопки 1) Добавить приход и 2) Реализация
По моей задумке, при нажатии на Приход открывается форма(уже этой записи присвоено значение из ttypedoc) на ней дата, номер документа (по идее должен быть id этой записи) и DBgrid со связанными таблицами tdoc и tsklad
Delphi
1
2
dm.fqSklad.SQL.Text := 'select tdoc.id, tdoc.datadoc, tdoc.numdoc, tsklad.idkompl from tdoc ' +
                        'INNER JOIN tsklad ON tdoc.id = tsklad.idKompl';
есть dbnavigator при нажатии на + открывается форма, там выбираются комплектующие, их количество и цена, считается сумма и заносятся в таблицу sklad, потом я сохраняю документ и он присваивает tdoc.id - tsklad.idDoc

Но как это реализовать в коде я уже 3 день выдумываю.... Вроде не сложно выглядит, но и не получается.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
31.07.2019, 10:04
1. по поводу #16
эти проверки уж точно должны проверять не компоненты на экране а значения нужных вам полей
поэтому лучше это делать в событии датасета например OnBeforePost
2. там же. строка else не нужна. она просто путает, потому что по смыслу должно стоять else begin ..... end;
3. зачем вообще вам ttypedoc если приход количество >0 расход <0 ??
учитывая, что вы работаете с датасетами, что является не самой удобной и устарешей концепцией, но...
вам придется открыть форму, ввести количество, и после закрытия формы, умножить это количество на -1 если это расход.
подробнее тут
4. уже не первый раз пишу, что никакую сумму никуда писать не надо. сумма это количество*цена
5. таблица склад тоже не нужна. если у вас несколько складов, то либо добавьте поле в таблицу движение товаров, либо сделайте привязанную таблицу движению товаров, 1-1, которая будет хранить, на какой склад перемещен товар.
6. про комплектующие и остальное - непонятно ТЗ.
если у вас есть "производство", т.е. ваш товар не пришел от поставщика, а вы его сами сделали из комплектующих, то
логично иметь таблицу "строки счета", которая пойдет в строки выставляемого счета, и таблицу комплектования, которая будет подчиненной к строкам счета. тогда логично сделать форму, где в верхней части будет список строк счета, а в нижней список комплектации для каждой строки счета. обе части редактируются.
Тут хитрость будет в обработчике OnNewRecord у каждого датасета в нем будет подставляться значение поля для связи с мастер таблицей прямо из мастера. типа такого
Delphi
1
qDetailTableMASTER_ID.AsInteger := qMasterTableID.AsInteger;
и пользоваться надо FDQuery+FDUpateSQL или как там оно, могу спутать

в целом, ваш вопрос несколько более объемный, чем можно описать в одном посте. тут нужно целую статью писать((
надеюсь, про комплектацию я понятно описал?
0
0 / 0 / 0
Регистрация: 26.05.2015
Сообщений: 68
31.07.2019, 12:24  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
3. зачем вообще вам ttypedoc если приход количество >0 расход <0 ??
учитывая, что вы работаете с датасетами, что является не самой удобной и устарешей концепцией, но...
вам придется открыть форму, ввести количество, и после закрытия формы, умножить это количество на -1 если это расход.
а какая альтернатива датасета?
На чем писали бы Вы подобную задачу?
ttypeDoc - это для названия документа.
по ТЗ ситуация следующая - мы берем комплектующие, есть производство, на одну готовую продукцию есть только одна комплектующая, которых пять видов. Мне как то надо сделать так(это последний этап), что Реализация я выбираю готовую продукцию из справочника, которая привязана к своим комплектующим, указываю количество готовой продукции и это значение вычитается из каждой комплектующей - это и будет расход. Самое главное контролировать кол-во пришло, и кол-во сколько затратили.
Поле сумма нужно, так как я ценой будет среднее значение ..... хотя Ваша правда есть!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2019, 12:24
Помогаю со студенческими работами здесь

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

QReport связанные таблицы
Добрый день. Есть две таблицы Водитель и Груз. Как создать отчет чтобы он выводил ФИО водителя и все заказы(груз) этого водителя на...

ADOQery + связанные таблицы
Здравствуйте, подскажите как добавлять/изменять записи с помощью адо со связанными таблицами? допустим есть 2 таблицы: 1) id, name,...

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

Добавление в связанные таблицы.
Всем привет. Пытаюсь добавить записи в связанные таблицы, но выходит ошибка &quot;Feild ID cant be modifed&quot;. Связь 1 ко 1 через ID...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru