Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сумма нарастающим итогом в DBGrid


Страницы:   1 2 3

Леонид ©   (2002-04-24 11:34:00) 

DBGrid c 2-я колонками. В первую заносятся числа. Необходимо, стобы после завершения ввода в ячейку в каждой ячейке 2-й колонки появилась сумма ячеек 1-й нарастающим итогом.


Sergey13   (2002-04-26 09:42:00) [21]

Вчера не успел, инет отрубили 8-(

2Lusha © (25.04.02 11:49)
>Согласитесь, что хранить вычисляемые данные (к тому же не >несущие абсолютно никакой полезной информации) некорректно по >определению...
По определению чего? 3 нормальной формы. Так это не закон и не догма, а метод оптимизации. Для ежедневного получения справок по зарплате работников за несколько лет, вы что собираетесь каждый раз считатьее (зарплату)? И для этого хранить тонны информации по больничным, тарифам, переработкам и т.д. и т.п.... Или все же проще один раз посчитать и результат сохранить в итоговой таблице.

>Что касается предложенного Вами варианта, то он будет работать >лишь при наличии двух НД, а это опять таки проблемы с >быстродействием...
Возможно и с 1НД, но возможно возникнут некоторые трудности. С двумя НД действительно проще и понятнее. Насчет быстродействия -иногда 10 НД обработаются быстрее 1. Тут важно что за НД.

2Johnmen © (25.04.02 11:32)
Я кажется въехал в наши разногласия. Мой метод действительно будет работать корректно только на добавлениезаписей в конец в выборках типа "показать последние за...". То есть для системы с четкой неизменяемой хронологией. При вставке строки не в конец, или при модификации поля метод работать не будет. Тут надо голову ломать. Проще будет такую информацию (по нарастающему итогу) выводить не в гриде, а в отдельном Edite для текущей записи. Иначе накладные расходы "сожрут" все удобство.


Fareader   (2002-04-25 11:52:00) [22]

Я чего-то в этой ветке совсем запутался, автор вопроса может еще раз толково пояснить что ему нужно.


Johnmen   (2002-04-25 11:51:00) [23]

Используя только лишь НД и всевозможные приемы работы с ним никакая задача типа "нарастающий итог" не может быть решена...

И повторюсь :
>Леонид : Ты скажи конкретно, зачем это надо по жизни


Lusha   (2002-04-25 11:49:00) [24]

>Fareader © (25.04.02 11:29)
Про CachedUpdates тут речь не идет вовсе...

>Sergey13 © (25.04.02 11:25)
Согласитесь, что хранить вычисляемые данные (к тому же не несущие абсолютно никакой полезной информации) некорректно по определению... Что касается предложенного Вами варианта, то он будет работать лишь при наличии двух НД, а это опять таки проблемы с быстродействием...

>Леонид (24.04.02 12:08)
Постановка задачи корявая (и это мягко сказано). В принципе подобные задачи не должны возникать вообще...


Johnmen   (2002-04-25 11:42:00) [25]

>Fareader ©

1. Я ничего не имею в виду под "предыдущее", это не ко мне.
2. Имелось в виду совсем другое... :)


Sergey13   (2002-04-25 11:39:00) [26]

2Johnmen © (25.04.02 11:32)
Че то мы друг друга не понимаем.
Тут надо разбираться с условиями задачи.
Ау-у-у Леонид!!!


Johnmen   (2002-04-25 11:32:00) [27]

>Sergey13 © Можно прочитать текущую запись из выборки, но это вовсе не значит, что она является предыдущей применительно к описанию "предыдущая" !


Fareader   (2002-04-25 11:29:00) [28]

>Johnmen © В том-то и проблема, что нет критерия "предыдущее"
если ты имеешь в виду предыдущее значение поля то это не совсем так, можно в событии BeforePost получить NewValue и OldValue.


Sergey13   (2002-04-25 11:25:00) [29]

2Johnmen © (25.04.02 11:16)
>В том-то и проблема, что нет критерия "предыдущее" !!!
Почему нет? Это же не в OnCalcField надо а просто при вставке новой строки. Что нельзя прочитать предыдущую запись из выборки?


Johnmen   (2002-04-25 11:16:00) [30]

>Sergey13 ©
>...Добавить статическое (sum_stat например) поле в таблицу, в
>которое писать значение как новое введенное+ sum_stat.

В том-то и проблема, что нет критерия "предыдущее" !!!


Sergey13   (2002-04-25 11:07:00) [31]

2Johnmen © (25.04.02 10:51)
Все правильно. Именно поэтому у меня и возникли сомнения по поводу высказывания SONY (24.04.02 12:39). Но в моем варианте в вычисляемом поле будет просто из значения в статическом поле вычитаться какое-то число. Для чистоты эксперимента можно это чисто получать не как первое из текущей выборки, а из отдельной выборки возвращающей одну запись. Ты наверное не внимательно прочитал мой пост Sergey13 © (25.04.02 10:16), или я не понятно объяснил идею. Основная мысль была в добавлении нового поля (не вычисляемого а реального ) в таблицу. А если в вычисляемом поле нельзя показывать разницу другого (статического) поля и какой то постоянной (для данной выборки) величины, то тогда что вообще в нем можно?


Johnmen   (2002-04-25 10:51:00) [32]

>Sergey13 © : Потому, что вызов процедуры вычисления поля OnCalcField происходит каждый раз при обращении к записи, для которой необходимо вычислить значение калк.поля, например при отрисовке значения к.поля в гриде.


Sergey13   (2002-04-25 10:41:00) [33]

2Johnmen © (25.04.02 10:20)
Почему?


Johnmen   (2002-04-25 10:20:00) [34]

>Sergey13 © : Поясняю, что таки макаром, через вычисляемое поле, ничего не получится ! Кроме полного бреда !


Sergey13   (2002-04-25 10:16:00) [35]

ИМХО можно сделать так. Добавить статическое (sum_stat например) поле в таблицу, в которое писать значение как новое введенное+предыдущее sum_stat. При выборке читать значение sum_stat у первой записи в переменную. И в созданом вычисляемом поле (sum_calc например) вычитать из текущего sum_stat значение переменной. На первый взгляд должно работать побыстее.


Lusha   (2002-04-25 10:02:00) [36]

>Praco © (25.04.02 09:52)
Тогда уж не переменную, а массив (причем динамический. Читай TList)... Массив записей типа...

TSubtotal = record
Bookmark : TBookmarkStr; // Индекс записи
Value : double; // Собственно значение
end;


Johnmen   (2002-04-25 09:59:00) [37]

>Praco © : Где же будет выполняться приведенный код ? :)


Praco   (2002-04-25 09:52:00) [38]

> SONY (24.04.02 12:39)
Sergey13 © (25.04.02 09:36) прав, SQL для DBF будет работать медленно. Проще завести переменную (поле) и в ней накапливать нарастающий итог.

IncSum := IncSum + DataSet.FieldByNAme("f1").Value;
DataSet.FieldByNAme("f2").Value := IncSum;

> All
Чисто на SQL проблема по-моему не решается. Или как?



Johnmen   (2002-04-25 09:43:00) [39]

>Леонид : Ты скажи конкретно, зачем это надо по жизни, а такие решения - это полный изврат...да к тому же еще и не работающий...


Sergey13   (2002-04-25 09:36:00) [40]

2Леонид (24.04.02 11:34)
А нарастающий итог нужен по всей таблице или по произвольной выборке?
2SONY (24.04.02 12:39)
При этом методе, учитывая количество записей и частоту вызова обработчика OnCalcfield ИМХО долго придется ждать результатов.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо