Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278

Создание вычисляемого поля между двумя DBGrid

25.11.2019, 02:29. Показов 4217. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имеется главная и зависимая таблицы Пара и Выступление. в таблице Пара есть атрибут "результат", а в зависимой таблице Выступление есть атрибут "Баллы". Необходимо создать такое поле, чтобы в атрибут "результат" в главной таблице записывалось количество баллов, т.е. баллы из нескольких записей зависимой таблицы. Также при добавлении новых записей, либо при удалении, необходимо чтобы этот "результат" также обновлялся. Для баз данных использую Firebird. Подскажите, пожалуйста, как это можно реализовать? И как будет сделать лучше, в Delphi, или, например, в IBExpert?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.11.2019, 02:29
Ответы с готовыми решениями:

Создание Вычисляемого Поля
Здравствуйте, помогите/подскажите как создать вычисляемое поле. Мне нужно сделать чтоб считалось по формуле Стоимость за 1 единицу...

Отображение определенных записей и создание вычисляемого поля
Добрый день. Есть таблица Students, созданная через Датабейз. До этого работал с ней через компонент Table ,но понял что много чего...

Связь между двумя DBGrid
нужно связать два DBGrid если используеться ADOQuery

28
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
25.11.2019, 08:20
Если данные в таблице есть (записи баллов), то задача, видимо, в том, чтобы показывать эти баллы как результат пары в приложении.
Показывать баллы из нескольких записей для каждой пары, скорее всего, придется в другом компоненте DBGrid, который располагается рядом с компонентом, который показывает остальные данные пар.
(Может быть автор темы придумал как в программе это делать по-другому?)

При показе баллов в другом гриде можно использовать способ master-detail.
Другой способ в том, чтобы в базе создать просмотр (VIEW), в котором отбираются баллы для каждой из пар, а затем в приложении селективный запрос с параметром вытаскивает нужные баллы и показывает их для той пары, которая выделена.
И тот и другой способ не требуют какого-то специального поля "результат" и поэтому нет необходимости в заботе об обновлении "результата" при любом изменении баллов.

Как-то так. Насколько понят вопрос.

Добавлено через 8 минут
Кстати, если показывать баллы в другом гриде, то и просмотр создавать не обязательно
При выделении пары в одном гриде, в свойстве его датасета AfterScroll передавать параметр идентификатора пары в заранее подготовленный запрос датасета другого грида, который вытаскивает баллы из таблицы Выступление и показывает их.
В резюме: для показа баллов либо master-detail, либо запрос с параметрами.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
25.11.2019, 10:13
с одной стороны, конечно, можно сделать, чтобы было такое автовычисляемое поле - суммирование по detail-таблице
даже обычный SQL запрос с этим справится
с другой стороны, "баллы" у пар чаще всего считаются не просто суммой, но более сложными алгоритмами, поэтому архитектурно лучше вынести вычисление в отдельное действие, и выполнять его по нажатию кнопки, чтобы результат явно записывался в поле и хранился там.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
25.11.2019, 16:13
Цитата Сообщение от krapotkin Посмотреть сообщение
с другой стороны, "баллы" у пар чаще всего считаются не просто суммой
Здесь речь идет не о вычислении баллов, а о том, что баллы уже вычислины (на очередном выступлении), помещены в базу и их нужно просто показать.
Но ТС не реагирует, поэтому сложно предполагать что-либо.
0
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
26.11.2019, 12:55  [ТС]
krapotkin, схема следующая. Допустим, в зависимой таблице "Выступление" есть два выступления, за одно было получено 18 баллов, за второе 22 балла. Тогда, в главной таблице "Пара" в графе результат должна быть автоматически скорректирована сумма результата, а именно, в данном случае, 40 баллов. Приложу скриншот, чтобы было понятнее. Вот какой-то такой нужен алгоритм. (В данном случае должна быть автокорректировка 40+30=70, но сейчас это не так, это отдельные поля которые не влияют друг на друга)
Миниатюры
Создание вычисляемого поля между двумя DBGrid  
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
26.11.2019, 13:28
вам нужно прочитать справочник по SQL ключевое слово SUM
http://www.sql.ru/docs/sql/u_sql/
0
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
26.11.2019, 16:13  [ТС]
krapotkin, я знаю это, использовал в запросах со связкой SELECT, но куда мне можно вставить этот запрос? Я используя fibplus, можете подсказать, пожалуйста?

Добавлено через 5 минут
krapotkin, более того, учитывая факт того, что таблицы разные, еще тяжелее разобраться что к чему.

Добавлено через 17 минут
Скандербег, дело даже не в том, чтобы показывать результат суммы баллов, а именно записывать его и "запоминать" в базе данных. Нужно чтобы поле "результат" в другой таблице изменялось.
0
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
26.11.2019, 16:18  [ТС]
Скандербег, вот такие две таблицы. Сумма полученных баллов должна выводиться в поле результат, в плане, не просто выводиться визуально, а именно обновлять результат непосредственно в главной таблице
Миниатюры
Создание вычисляемого поля между двумя DBGrid  
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
26.11.2019, 20:07
Если, допустим (не вся задача понятна до конца), при добавлении, изменении, удалении записей о баллах пары нужно чтобы в "главной" таблице обновлялся результат, то в этом нет никакой проблемы.

Есть записанные в таблицу баллы для конкретной пары. Тогда, при изменении этих записей (значений баллов), по ним вычисляется результат и запросом UPDATE отправляется в "главную" таблицу БД меняя значение результата. После этого набор данных в датасете обновляется, указатель в нём устанавливается снова на ранее выбранную пару и пользователь видит новый результат этой пары.
В чем здесь сложность?
0
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
26.11.2019, 20:27  [ТС]
Скандербег, да, нужно именно так. Например, я добавил новую запись для конкретной пары, указал там н-ное количество баллов, и это количество баллов записалось в главную в результат. Удалил, изменил - то же самое. Вот как раз не знаю, как реализовать непосредственно сам этот алгоритм. Можете помочь?
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
26.11.2019, 21:10
Судя по картинке, в проекте реализуется непосредственное редактирование в DBGrid, который показывает баллы.
Тогда можно использовать два события, одно из которых реагирует на добавление/изменение записей в таблицу Выступление (AfterPost), второе AfterDelete, реагирующее на удаление записи из этой таблицы (в принципе можно создать общую процедуру расчета результата, записи его в таблицу базу и отображения нового результата в гриде, а в упомянутых процедурах событий вызывать эту процедуру).

В этих событиях (или в отдельной процедуре) и надо:
- рассчитать результат, а затем...
- записать рассчитанный результат в "главную" таблицу базы;
- запомнить значение идентификатора пары, которая выбрана в гриде, который их показывает;
- вызвать метод Requery, если вытаскивает пары из базы TADOQuery, или пару методов Close/Open, если датасет для пар TADTable;
- с помощью метода Locate (который есть и вTADOQuery, и в TADTable) установить указатель на ту пару, которая была выбрана и по которой рассчитывался результат.
Как то так.
1
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
26.11.2019, 23:46  [ТС]
Скандербег, а как именно расчитать результат? Тут получается нужно применять агрегатную функцию SUM? и если да, то как именно её нужно применить в данной ситуации? я испоьзую для БД FibPlus. Для обработки запросов там используется DataSet.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
27.11.2019, 07:08
Из последней картинки неясен алгоритм вычисления результата (баллов в двух записях 30 и 40, а результат = 40 , явно не суммирование), поэтому рекомендовать простое суммирование в запросе, скорее всего, преждевременно. krapotkin об этом говорил в посте №3.
При таком раскладе надо выяснить алгоритм вычисления, затем уже придумывать реализацию такого вычисления.

Если, все же, результат - это просто суммирование баллов, то нужно в отдельном датасете сформировать SQL запрос с использованием функции SUM, записать полученную сумму в поле "результат" и далее сделать как сказано в посте №11, чтобы результат отобразился.
Запрос для суммирования баллов может выглядеть примерно так:
select SUM(Баллы) from Выступление where id_пара = <значение идентификатора пары из табл. Пары>

Наименования полей и таблиц условные, т.к. настоящая структура БД не представлена.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,664
Записей в блоге: 21
27.11.2019, 12:41
от фонаря ессно, ни таблиц ни полей не знаю
SQL
1
2
3
4
5
SELECT t1.f1,t1.f2,t1.f3, SUM(t2.FF) 
FROM table1 t1
JOIN table2 t2 ON (t1.keyfield=t2.parentkeyfield)
GROUP BY 
  t1.f1,t1.f2,t1.f3
Добавлено через 1 минуту
в Dataset помещается SQL запрос
надеюсь IBExpert у вас есть в наличии
там SQL разрабатываем, в Dataset.SelectSQL кладем
1
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
27.11.2019, 23:22  [ТС]
Скандербег, на скриншоте не суммирование. Там результат 40 взят просто из головы, потому что пока что эти поля, а именно "результат" и "баллы" являются самостоятельными и не зависят друг от друга. Честно, тяжело со слов понять, как это сделать) может я скину проект, сможете посмотреть? вы не против?

Добавлено через 3 минуты
krapotkin, аааа, сложно) Таблицы относятся к датасетам, т.е. датасет главной таблицы "Пара" это dstPair, а зависимой выступление датасет dstVistupl (Дата сурсы для них соответственно dsPair и dsVistupl). Поля, что касается поля "результат" это поле OCHKI, а конкретно отдельные баллы - BALLI. Можете еще поподробнее, пожалуйста? Не смог понять. Могу проект скинуть
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
27.11.2019, 23:27
Не против, разумеется, но алгоритм подсчета результатов по баллам для меня всё равно загадка.
Где этому учат?

Если результат - это суммирование баллов, то не будет никаких проблем. Если не просто суммирование,
то опять же, кто скажет как это делается...

Добавлено через 2 минуты
Уже 15 постов, но так никто и не рассказал как считать результат.
А проект давно надо было уже скинуть вместе с базой.
Правда, не все пользуются FIBом и у себя придется переделывать проект под IBX.
0
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
27.11.2019, 23:33  [ТС]
krapotkin, Скандербег, в общем, не стал ждать ответа, решил сразу скинуть проект, если будет время, посмотрите, пожалуйста. Форма SW - нужная форма.
Вложения
Тип файла: rar bd.rar (1.00 Мб, 2 просмотров)
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
27.11.2019, 23:43
Файл базы нужен. Во вложении базы нет.
0
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
28.11.2019, 00:30  [ТС]
Скандербег, без проблем, вот.
Вложения
Тип файла: rar database.rar (47.0 Кб, 3 просмотров)
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
28.11.2019, 02:14
Лучший ответ Сообщение было отмечено Komputershik как решение

Решение

Т.к. алгоритм подсчета результата всё еще неизвестен, то, собственно, предложить нечего.
Вот какие запросы сделаны по структуре в базе в IBExpert (FIBPlus у меня на борту нет):
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
--отображение танцевальных пар:
SELECT PK_PAIR, OCHKI, FK_PAIR_1, FK_PAIR_2, D1.fam fam1, D2.fam fam2
FROM PAIR JOIN dancer D1 ON D1.pk_dancer = pair.fk_pair_1
          JOIN dancer D2 ON D2.pk_dancer = pair.fk_pair_2
--FK_PAIR_1, FK_PAIR_2 в гриде не нужно и показывать
 
--отображение баллов пары
SELECT PK_VISTUPL, DATA, BALLI, PK_FK_VISTUPL_1
FROM VISTUPL
WHERE PK_FK_VISTUPL_1 = :PK_PAIR
 
--запрос, возвращающий сумму баллов конкретной пары (алиас RES для примера), 
--которую затем можно записать в поле OCHKI
SELECT SUM(balli) res FROM vistupl WHERE PK_FK_VISTUPL_1 = :PK_PAIR
Последний запрос можно повесить на событие AfterScroll датасета, который отображает пары.
Там же реализовать запись результата.

Добавлено через 7 минут

Не по теме:

Советы:
- поля фио не надо разделять, проще записывать ФИО в одно поле; от такого разделения одни проблемы;
- наименования полей лучше делать "говорящими". К примеру вместо PK_FK_VISTUPL_1 - id_pair

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2019, 02:14
Помогаю со студенческими работами здесь

Создание поля в DBGrid, значение которого присваивается ориентируясь на значение поля в базе данных SQL
Добрый день! Возник такой вопрос: Есть таблица базы данных, которая в числе прочих имеет параметр, показывающий, к какому отделу...

Вычисляемые поля между двумя таблицам ADOQuery
Здравствуйте. Ситуация такая. Имеется две таблицы ADOQuery1 и ADOQuery2 первая таблица ФИО Платеж1 Платеж2 Задолженность по Платеж1...

Создание связи между dblookupcombobox с dbgrid
Добрый день. У меня возник вопрос при создании связи между dblookupcombobox с dbgrid Дело в том что они у меня расположены в разных...

Заполнение вычисляемого поля
Необходимо чтобы для каждой записи таблице &quot;Учет&quot; вычисляемое поля считало сумму соответствующую индексу в таблице &quot;Продажи&quot; ...

Запись в БД значение вычисляемого поля
Доброго времени суток! Задача следующего плана: Есть два столбца в БД, столбец1 и столбец2, столбец3=столбец1*столбец2. Столбец3 -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru