![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сумма нарастающим итогом в DBGrid
Леонид © (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 ИМХО долго придется ждать результатов.