|
|
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
Есть БД с двумя связанными таблицами. Обе представлены каждая своим Гридом на единой форме. Ходишь по Гриду родительской, и в ГРИДе дочерней появляются записи, соответствующие первичному ключу родительской. (Спасибо, Владимиру М. & others. Понял преимущества БД перед F/tables. Только подумал, а за тебя все сделано. :) Хотелось бы сделать так, чтобы при хождении по записям Грида родителя видеть итоговую подсумму для текущей записи(еще лучше для всех сразу), являющую результатом сложения поля child.nSUMMA. И так, чтобы была возможность отслеживать изменение подсуммы в случае коррекции поля nSUMMA соответствующих записей в дочерней. Загнать все подсуммы в массив перед открытием формы через цикл и выводить значения из него или после AFTERCOLROWCHANGE в parent бегать в child мне кажется несолидным решением. Верю, что есть что-то получше. Как быть? PS Всех с наступающим! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2005, 21:03 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
Hi men dea! Использовать не Relation, а представления. При хождении в "главном" гриде перезапрашивать все "дочерние" представления. Дочерних представления будет 2 - одно просто вынимает все записи с кодом внешнего ключа соответствующим коду первичного ключа из "главной" таблицы (из текущей записи там). Второе - будет выполнять SUM(nField1) AS nSumField1 ну и т.п. Пересчёт/перезапрос будет идти конечно в AfeterRowColChange главного грида... Если ОЧЕНЬ важно считать сумму ДО сохранения данных, то вместо второго представления надо использовать простой запрос с опцией WITH (BUFFERING = ..T.) - для VFP9, или старые добрые CALCULATE SUM() TO ... - но уже из большего числа мест - в частности из Valid/LostFocus контролов, которые связаны с полями учитываемыми суммой (т.е. текстбоксы в колонках грида), либо из AfterRowColChange второго грида... Считать конечно всё это надо только для ОДНОЙ записи главной таблицы. держать (а главное СЧИТАТЬ) ВСЕ суммы - бессмысленно. Если у тебя 10000 записей (в главной таблице), то это долго и нудно - а юзер никогда все 10000 документов смотреть и не будет - зайдёт в те несколько что ему нужны и всё. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 02:30 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
Я, наконец, внял вашим советам и сделал эти представления. Вроде как все работало, нужные записи отфильтровывало. Но потом посыпались проблемы. Поменял где-то наименование поля,- и представление разрушилось. Переименовал файл – опять всякая хрень выплывает. Хлипкая конструкция - это представление. Ну, ладно бы просто сообщало об ошибке и не работало, но позволяло вносить исправления, вызванные внешним воздействием. Так нет, никуда не хочет пускать, удаляет что-то... 1. В представлении нормально ссылаться на другое представление или нет? Если первое просто вынимает все записи с кодом внешнего ключа соответствующим коду первичного ключа из "главной" таблицы (из текущей записи там), то я еще могу сослаться на родительскую таблицу. Но каждое следующее представление, которое будет выбирать записи из некоей следующей по "дочерности" таблицы, получается должно ссылаться на ранее представление соответствующего родительской таблицы? А то получается такая ерунда: если начать модифицировать какое-нибудь промежуточное представление, то оно тут же сообщает, что не найден базисный alias (родительское представление). А если табличку или представление запихнуть в поле VIEW-дизайнера, то ее появление сразу рушит фильтры и т.п., строит без моего желания связи и т.п. 2. Стоит ли "параметризовать" в этом случае фильтр, не указывая явно в дизайнере ссылку на фильтрующее поле из другого представления? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2006, 00:39 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
Posmotri http://www.foxclub.ru/sol/index.php?act=view&id=510 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2006, 11:52 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
FoxFox! Cпасибо за внимание, но пример не по теме. Там всего один файл, нет БД и представлений, а производится банальный пересчет суммы по колонкам Грида. PS Дополняю предыдущее третьим вопросом. Не лучше ли создавать представления вручную, не используя дизайнер, коли там все такое капризное при вложенности представлений>2 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2006, 14:13 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
Local View - это НЕ таблица. Физически - это обычная команда Select-SQL. Теперь, представь себе, что в программе ты написал команду SELECT Field1, Field2 FROM MyTab А потом взял и удалил из таблицы MyTab поле Field1. Т.е. этого поля в таблице просто не стало. Физически. Как именно должна прореагировать программа на такое действие? Правильно, "обложит" тебя нехорошими словами. На все это накладывается еще то, что ты, видимо, редактируешь Local View через дизайнер. Т.е. вступают в силу еще дополнительные ограничения, налагаемые самой программой-дизайнером. Так что здесь все "как положено". Вовсе это не "хлипкая конструкция". Просто ты сам же разрушаешь основу, на которой она построена. Претензии не по адресу. Надо тщательнЕе проектировать структуру базы данных. Делать Local View на базе другого Local View можно. Но опять же, следует понимать, что именно ты делаешь. Физически - это означает 2 последовательных SQL-запроса. Ну, что-то вроде: SELECT * FROM MyTab INTO CURSOR View1 NOFILTER READWRITE SELECT * FROM View1 INTO CURSOR View2 NOFILTER READWRITE Т.е. сам понимаешь, получить View2 невозможно, если предварительно не создать View1. FoxPro это проделает автоматически при первом открытии View2. Но вот для того, чтобы обновить содержимое View2 придется сначала обновить содержимое View1. Другими словами, сопровождение таких Local View построенных на базе других Local View это достаточно кропотливое занятие. Если есть возможность, лучше делать Local View напрямую из таблиц-источников. Минуя посредников в виде других Local View. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2006, 18:49 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
В1. Из этого что, следует вывод стараться пользоваться LV-дизайнером лишь для создания SQL-кода, а потом самостоятельно вставлять его в текст программы, где уже можно будет потом исправить его в случае нужды? Иначе не вижу возможность что-то подправлять в QUERY через VIEW SQL. Например, в случае, переименования поля в таблице, непосредственные исправления старого имени на новое через дизайнерское VIEW SQL не ведут к успеху. Все равно возникает ошибка: где-то еще поселились ссылки на прежнее имя поля, которые остаются неисправленными. В2. Интересно где? В3. И как напрямую делать LV, минуя посредников, разве что не "денормализуя" БД? Если есть последовательно связанные A,B,C-таблицы, чтобы смотреть содержимое А и видеть значения подсумм из дочерней таблицы С, придется всегда хранить соответствующие значения в таблице B. Тут либо "тщательнЕе", либо "нормализованнее"... Немного повозившись со вложенными LV, склоняюсь в пользу первого. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 12:08 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
Тихо сам с собою ?... Ты хоть дай цитаты к которым ты эти вопросы задал. На что отвечать-то? men deaВ1. Из этого что, следует вывод ... Из чего из этого? В любом случае, вывод неправильный. Тем более можно редактировать код SQL-запроса напрямую в дизайнере View (это можно делать в VFP9) men deaВ2. Интересно где? Интересно что? men deaВ3. И как напрямую делать LV, минуя посредников, разве что не "денормализуя" БД? Зависит от версии FoxPro и постановки задачи. Далеко не всегда необходимо именно Local View. Кроме того, если я написал "если есть возможность", не надо понимать это как "обязательно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2006, 14:59 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Вообще-то все эти непонятные вопросы возникли после чтения вашего первоначального ответа, реализации совета Королева (у меня все вышло, как он советовал) и моих изысканий с LV. А ниже, после своего вопроса, я объяснил причину такого вывода: после исправлений SQL-кода в дизайнере, не получается привести все в работоспособное состояние по там же описанным причинам - где-то остаются старые ссылки. Код: plaintext Речь идет об этих самых ссылках - следах использования прежнего названия поля. Когда исправляешь через дизайнер, сообщение об ошибке не исчезает. Вот, и вопрос где живут еще прежние имена полей, как не в SQL VIEW? Версия VFP 9 + ХР Еще мне интересно, обычно вы используете получаемый через дизайнер код для организации LV, вставляя его вручную в программу и удаляя все остальное дизайнерское "творчество" или все-таки цепляете то, что получилось в дизайнере, как готовое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 00:24 |
|
||
|
Подсумма для родителя от дочки.
|
|||
|---|---|---|---|
|
#18+
Физически, само Local View хранится в контейнере базы данных (файле DBC). При модификации Local View замена происходит по типу "удалить все/создать заново" так что в самом определении Local View ничего от старого определения остаться не может. Но это только в том случае, если на базе изменяемого Local View не было сделано другого Local View. В этом случае в дочернем Local View ничего изменено не будет. Соответственно, попытка открытия дочернего Local View вызовет сообщение об ошибке. Т.е., если есть "иерархия" Local View то необходимо начать изменение структуры с дочерних Local View. Сначала удалить из них ссылки на те поля, имена которых предполагается изменить. Затем проделать то же самое с родительским Local View. Когда не останется ссылок на эти изменяемые поля провести собственно модификацию в исходных таблицах. Затем восстановить ссылки уже на новые поля. Для гарантии, можно сделать упаковку базы данных, чтобы физически удалить старые ссылки. Контейнер базы данных - это обычная таблица. Поэтому под термином "удалить" понимается всего-лишь установка метки на удаление. Но физически, запись помеченная как удаленная все еще находится в контейнере базы данных. Упаковка базы данных удаляет такие записи физически. В режиме модификации контейнера базы данных это пункт меню DataBase - Clean Up DataBase или программно: OPEN DATABASE MyBase EXCLUSIVE PACK DATABASE Если мне нужен Local View то я делаю его через дизайнер. Никаких дополнительных "телодвижений" делать не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2006, 13:23 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33469236&tid=1592663]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
183ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 517ms |

| 0 / 0 |
