Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];

Вниз

Сумма нарастающим итогом в DBGrid   Найти похожие ветки 

 
Леонид   (2002-04-24 11:34) [0]

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


 
Praco   (2002-04-24 11:52) [1]

А что за база?


 
Леонид   (2002-04-24 12:08) [2]

DBF-файлы


 
SONY   (2002-04-24 12:39) [3]


поле f2 делаешь вычисляемым
на обработке OnCalcfield
сначала делаешь запрос (TQuery)
select sum(f1) from table1
и пишеш DataSet.FieldByNAme(f2).Value := FieldByNAme(f2).Value+Query1["SUM"]



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

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


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

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


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

> 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:59) [7]

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



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

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

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



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

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


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

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


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

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


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

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


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

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


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

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

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


 
Sergey13   (2002-04-25 11:25) [15]

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


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

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


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

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


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

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


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

>Fareader ©

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


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

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

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

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


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

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

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


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

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


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

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

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

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

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


 
Johnmen   (2002-04-26 09:53) [24]

>Sergey13 © :
1. это типа 1С-шный вариант, он имеет существенные недостатки, какие - я думаю понятно... :)
2. с одним НД и только с ним - не получится...
3. аналогичная идея уже высказана Lusha © (25.04.02 10:02).


 
Lusha   (2002-04-26 10:16) [25]

Для ежедневного получения справок по зарплате работников за несколько лет, вы что собираетесь каждый раз считать ее (зарплату)?
Не надо передергивать на счет ежедневного... :)

И для этого хранить тонны информации по больничным, тарифам, переработкам и т.д. и т.п....
Именно... А иначе придется хранить тонны бумаги, чтобы иметь возможность восстановить причину появления той или иной цифры...

Проще будет такую информацию (по нарастающему итогу) выводить не в гриде...
Какая разница где выводить? Вопрос - ОТКУДА БРАТЬ?

Я кажется въехал в наши разногласия. Мой метод действительно будет работать корректно только на добавление записей в конец...
Ничего то Вы не поняли... По большому счету Ваш метод не будет работать и с двумя НД... Достаточно предположить количество пользователей в системе более одного...


 
Kouzmine   (2002-04-26 10:40) [26]

Я так понял, что нарастающий итог нужен по каждому человеку в отдельно. Если это так, то имеется главная таблица и подчиненная. Тогда, на смену записи в главной, сделать так в подчиненной. (Дополнительное поле необходимо)
var
Sum : Double;

Sum := 0;
X.Edit;
Sum := X.FieldByName("A").Value //Самая первая сумма
X.FieldByName("Y").Value := Sum;
X.Post;
while not X.Eof do
begin
Sum := Sum + X.FieldByName("A").Value
X.Edit;
X.FieldByName("Y").Value := Sum;
X.Post;
X.Next;
end;

По моему опыту, количество записей для обсчета не превышают за год 20-30. Работать должно почти мгновенно.


 
Sergey13   (2002-04-26 10:45) [27]

2Lusha © (26.04.02 10:16)
>Именно... А иначе придется хранить тонны бумаги, чтобы иметь >возможность восстановить причину появления той или иной цифры...
Ню-ню...

>Какая разница где выводить? Вопрос - ОТКУДА БРАТЬ?
Просто при таком подходе можно обрабатывать запрос типа
select sum(field1) from table where id<:id_current. Получится намного быстрей и проще.

>Ничего то Вы не поняли... По большому счету Ваш метод не будет >работать и с двумя НД... Достаточно предположить количество >пользователей в системе более одного...
Интересно как это повлияет на работоспособность метода (с учетом оговорок Sergey13 © (26.04.02 09:42))


 
Lusha   (2002-04-26 10:50) [28]

Просто при таком подходе можно обрабатывать запрос типа
select sum(field1) from table where id<:id_current. Получится намного быстрей и проще...

Быстро, просто, но неправильно. Второй пользователь тоже не дремлет... :)

Интересно как это повлияет на работоспособность метода (с учетом оговорок Sergey13 © (26.04.02 09:42))...
Катастрофически...


 
Johnmen   (2002-04-26 10:51) [29]

>Kouzmine © : Ты не совсем осознаешь, что может скрываться за X в твоем примере, и того факта, что в его НД никак не учитывается порядок !


 
Kouzmine   (2002-04-26 11:04) [30]

Срать на порядок. Будет пересчитываться в текущем порядке.


 
Kouzmine   (2002-04-26 11:07) [31]

А Х может быть что угодно. Это вообще не важно. Единственное, что для прядка надо сделать X.First;


 
Sergey13   (2002-04-26 11:13) [32]

2Lusha © (26.04.02 10:50)
>Быстро, просто, но неправильно. Второй пользователь тоже не дремлет... :)
Ну по этой логике с БД вообще нельзя работать больше чем одному пользователю (больше двух не собираться!!!8=). Такой запрос вернет ПРАВИЛЬНОЕ значение на ТЕКУЩИЙ момент времени.

>Катастрофически...
Голословно...


 
Kouzmine   (2002-04-26 11:18) [33]

Ребята. Все это фигня. Справки для одного человека двадцать бухгалтеров делать не будут по простой причине, что эти справки выдаются по требованию. И только дебил будет просить их сделать у всех имеющихся бухгалтеров, тем более одновременно. А так пересчет идет не по всей базе, а подчиненных записях, только!!!!! одного человека.


 
Johnmen   (2002-04-26 11:23) [34]

>Kouzmine © (26.04.02 11:04)
Что есть "текущий порядок" ?


 
Sergey13   (2002-04-26 11:24) [35]

2Lusha © (26.04.02 10:50)
Блин, это ж DBF! Тогда ты прав. Я все в мозгах SQL держу. Сори.


 
Kouzmine   (2002-04-26 11:28) [36]

Johnmen`у. Это наложенный индекс. Или по порядку записей. И вообще - это тоже не важно.


 
Johnmen   (2002-04-26 11:41) [37]

>Kouzmine © (26.04.02 11:28)
К сожалению, у тебя нет глубокого понимания таких вещей как "порядок","индекс" и т.п. -
отсюда высказывания, типа "... по порядку записей...", " И вообще - это тоже не важно."

PS Без обид...


 
Lusha   (2002-04-26 11:45) [38]

>Sergey13 © (26.04.02 11:24)
Гы-гы. Я вообще то тоже об SQL...

>Sergey13 © (26.04.02 11:13)
Такой запрос вернет ПРАВИЛЬНОЕ значение на ТЕКУЩИЙ момент времени
Вот именно. А набор данных отображаемый в гриде на какой момент времени сформирован? А что произошло за это время? Что другой пользователь не мог записей добавить? Мог конечно. А у нас, извините, определение значения CalcField на любое перемещение по НД и его модификации...
... и в итоге нам этот запрос такое возвратит, что пользователь за голову возьмется... Добавил запись с суммой 10, а нарастающий итог увеличился на 100... :)

Голословно...
А я не думаю, что мое утверждение требует доказательств...

>Леонид
Что молчите то? Уже отлегло... Больше не хочется? :)

>Kouzmine © (26.04.02 11:18)
Какие справки... Прочитайте ветку внимательно с самого начала...


 
Kouzmine   (2002-04-26 11:46) [39]

Johnmen`у - возьми книжку и почитай. Когда поймешь, тогда будешь давать советы другим. Без обид.


 
Johnmen   (2002-04-26 11:51) [40]

>Kouzmine © (26.04.02 11:46)
В твоем возрасте уже пора быть повежливей и не приводить детских аргументов вроде "сам дурак"....


 
Kouzmine   (2002-04-26 11:53) [41]

Лаше. Цитирую. "Для ежедневного получения справок по зарплате работников за несколько лет, вы что собираетесь каждый раз считать ее (зарплату)?
Не надо передергивать на счет ежедневного... :)"
Помни о чем пишешь.



 
Sergey13   (2002-04-26 11:55) [42]

2Lusha © (26.04.02 11:45)
>Гы-гы. Я вообще то тоже об SQL...
Под SQL я понимал SQL-сервер.

>Вот именно. А набор данных отображаемый в гриде на какой момент >времени сформирован? А что произошло за это время? Что другой >пользователь не мог записей добавить? Мог конечно. А у нас, >извините, определение значения CalcField на любое перемещение >по НД и его модификации...
>... и в итоге нам этот запрос такое возвратит, что пользователь >за голову возьмется... Добавил запись с суммой 10, а >нарастающий итог увеличился на 100... :)
Почему? Ведь я предлагаю вычислять поле по уже закачаному набору. Поле минус значение этого поля в первой записи. Никакого дополнительного обращению к серверу (которого оказывается нет 8-) не будет.

Все скоро 12.00 Щас инет отрубят. До понедельника. Если получится.


 
Kouzmine   (2002-04-26 12:08) [43]

При чем тут SQL сервер? Файлы DBF. Не надо золотить контакты на лампочке в туалете. Легче будет жить.



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.007 c
14-73353
LazorenkoX
2002-04-11 16:58
2002.05.23
DelphiX


1-73136
Art1
2002-05-13 16:03
2002.05.23
Как получить управление программой?


1-73206
PShadow
2002-05-14 15:51
2002.05.23
Не могу запустить Excel


14-73372
ATLANTIDO
2002-04-14 21:01
2002.05.23
Каааак ?


7-73431
Sasha9
2002-02-23 14:28
2002.05.23
Как сделать чтобы приложение не закрылось и при этом не зависло, когда в win98 меняешь полбзователя(log off)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский