|
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
|
|
Создание вычисляемого поля между двумя DBGrid25.11.2019, 02:29. Показов 4217. Ответов 28
Метки нет (Все метки)
Здравствуйте. Имеется главная и зависимая таблицы Пара и Выступление. в таблице Пара есть атрибут "результат", а в зависимой таблице Выступление есть атрибут "Баллы". Необходимо создать такое поле, чтобы в атрибут "результат" в главной таблице записывалось количество баллов, т.е. баллы из нескольких записей зависимой таблицы. Также при добавлении новых записей, либо при удалении, необходимо чтобы этот "результат" также обновлялся. Для баз данных использую Firebird. Подскажите, пожалуйста, как это можно реализовать? И как будет сделать лучше, в Delphi, или, например, в IBExpert?
0
|
|
| 25.11.2019, 02:29 | |
|
Ответы с готовыми решениями:
28
Создание Вычисляемого Поля Отображение определенных записей и создание вычисляемого поля Связь между двумя DBGrid |
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
|
| 25.11.2019, 08:20 | |
|
Если данные в таблице есть (записи баллов), то задача, видимо, в том, чтобы показывать эти баллы как результат пары в приложении.
Показывать баллы из нескольких записей для каждой пары, скорее всего, придется в другом компоненте DBGrid, который располагается рядом с компонентом, который показывает остальные данные пар. (Может быть автор темы придумал как в программе это делать по-другому?) При показе баллов в другом гриде можно использовать способ master-detail. Другой способ в том, чтобы в базе создать просмотр (VIEW), в котором отбираются баллы для каждой из пар, а затем в приложении селективный запрос с параметром вытаскивает нужные баллы и показывает их для той пары, которая выделена. И тот и другой способ не требуют какого-то специального поля "результат" и поэтому нет необходимости в заботе об обновлении "результата" при любом изменении баллов. Как-то так. Насколько понят вопрос. Добавлено через 8 минут Кстати, если показывать баллы в другом гриде, то и просмотр создавать не обязательно При выделении пары в одном гриде, в свойстве его датасета AfterScroll передавать параметр идентификатора пары в заранее подготовленный запрос датасета другого грида, который вытаскивает баллы из таблицы Выступление и показывает их. В резюме: для показа баллов либо master-detail, либо запрос с параметрами.
0
|
|
|
|
|
| 25.11.2019, 10:13 | |
|
с одной стороны, конечно, можно сделать, чтобы было такое автовычисляемое поле - суммирование по detail-таблице
даже обычный SQL запрос с этим справится с другой стороны, "баллы" у пар чаще всего считаются не просто суммой, но более сложными алгоритмами, поэтому архитектурно лучше вынести вычисление в отдельное действие, и выполнять его по нажатию кнопки, чтобы результат явно записывался в поле и хранился там.
0
|
|
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
||
| 25.11.2019, 16:13 | ||
|
Но ТС не реагирует, поэтому сложно предполагать что-либо.
0
|
||
|
26 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 278
|
|
| 26.11.2019, 12:55 [ТС] | |
|
krapotkin, схема следующая. Допустим, в зависимой таблице "Выступление" есть два выступления, за одно было получено 18 баллов, за второе 22 балла. Тогда, в главной таблице "Пара" в графе результат должна быть автоматически скорректирована сумма результата, а именно, в данном случае, 40 баллов. Приложу скриншот, чтобы было понятнее. Вот какой-то такой нужен алгоритм. (В данном случае должна быть автокорректировка 40+30=70, но сейчас это не так, это отдельные поля которые не влияют друг на друга)
0
|
|
|
|
|
| 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 [ТС] | |
|
Скандербег, вот такие две таблицы. Сумма полученных баллов должна выводиться в поле результат, в плане, не просто выводиться визуально, а именно обновлять результат непосредственно в главной таблице
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
|
|
|
|
||||||
| 27.11.2019, 12:41 | ||||||
|
от фонаря ессно, ни таблиц ни полей не знаю
в 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 - нужная форма.
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 [ТС] | |
|
Скандербег, без проблем, вот.
0
|
|
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
||||||
| 28.11.2019, 02:14 | ||||||
Сообщение было отмечено Komputershik как решение
Решение
Т.к. алгоритм подсчета результата всё еще неизвестен, то, собственно, предложить нечего.
Вот какие запросы сделаны по структуре в базе в IBExpert (FIBPlus у меня на борту нет):
Там же реализовать запись результата. Добавлено через 7 минут Не по теме: Советы:
0
|
||||||
| 28.11.2019, 02:14 | |
|
Помогаю со студенческими работами здесь
20
Создание поля в DBGrid, значение которого присваивается ориентируясь на значение поля в базе данных SQL Вычисляемые поля между двумя таблицам ADOQuery Создание связи между dblookupcombobox с dbgrid
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
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, то после закрытия окошка. . .
|