Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi и базы данных

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
rem22
0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 4
#1

Dbgrideh - подсчет строки "на лету". Событие окончания редактирования ячейки - Delphi БД

17.09.2014, 12:12. Просмотров 1527. Ответов 6
Метки нет (Все метки)

подскажите новичку пожалуйста:

есть связка dbgrigeh-memtableeh-adodatadrivereh-adoquery-adoconnect

dbgrideh отображает сводную таблицу, он должен редактироваться (с этим все нормально)

нужно высчитывать сумму строки и показывать ее в последнем столбце (этой же строки) по мере ее заполнения.
то-есть чтобы сумма введенных чисел выводилась ВО ВРЕМЯ заполнения СТРОКИ |1|2|1|1|1 | --> 6 |

событие beforePost memtableeh не подходит т.к. нужно переместиться на следующую запись.
подскажите как это можно реализовать?

Вот нашел в интернете обработчик на событие завершение редактирования ячейки, но к, сожалению, не хватает знаний допилить его до нужного состояния. Проблема в том, что при завершении редактирования ячеки, датасет остаеется в режиме редактирования, соответственно, попытка вставить что-то в другую ячейку вызывает stack overflow. Дальше комментарии в коде:


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
type
 TForm1 = class(TForm)
   db: TDatabase;
   Table1: TTable;
   DBGrid1: TDBGrid;
   DataSource1: TDataSource;
   Label1: TLabel;
   procedure FieldValidate(Sender: TField);
   procedure FormCreate(Sender: TObject);
   procedure DataSource1StateChange(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
 
var
 Form1: TForm1;
 FieldValue: Variant;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FieldValidate(Sender: TField);
var
 tf: Variant;
 
begin
 tf := DBGrid1.DataSource.DataSet.FieldValues[DBGrid1.SelectedField.FullName];
 if tf<>FieldValue then
 begin
   ShowMessage("!");
 
//попытки здесь добавить что -то в датасет не привели к нужному результату
//дальше пример того, что я пытался делать У СЕБЯ в программе , это чтобы было понятно -
// Вроде даже идет запись но я столбец QNT но, некорректно отображается ячейка ввода (пусто).
 
{
memtableeh.Post
memtableeh.Edit;
memtableeh.fieldbyname('QNT').asstring:='test';
}
 
 end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
 i: Integer;
begin
 for i := 0 to Table1.FieldCount-1 do
 begin
   Table1.Fields[i].OnValidate := FieldValidate;
 end;
end;
 
procedure TForm1.DataSource1StateChange(Sender: TObject);
begin
 if DBGrid1.DataSource.DataSet.State=dsEdit then
 begin
   FieldValue := DBGrid1.DataSource.DataSet.FieldValues[DBGrid1.SelectedField.FullName];
 end;
end;
 
end.
Я так понимаю, здесь проблема с записью значения ячейки и открытия на запись другого значения.Помогите разобраться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2014, 12:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Dbgrideh - подсчет строки "на лету". Событие окончания редактирования ячейки (Delphi БД):

Фильтр Combobox "На лету" - Delphi БД
Подскажите, пожалуйста, как фильтровать Combobox &quot;На лету&quot;. Т.е. имеется Combobox, в него программно вписаны Items, К примеру-Items: ...

Как создать событие "по клику правой кнопкой мыши"? - Delphi
Здравствуйте! Подскажите пожалуйста, как в Delphi создать обработчик события для SpeedButton &quot;по клику правой кнопкой мыши&quot;?

Замена строки "С" на "На" StrReplace - Delphi
Вот голову сломал уже, нужно заменить слова в тексте. Функций нашёл и написал много, но при файле более 10 мб они работаю ОЧЕНЬ медленно....

Программа для накрутки "мне нравиться" "подписчиков"" - Delphi
Народ привет тут увидал прогу называеться FVCheat она накручивает ВК подписчиков сердечек (мне нравиться) друзей и т.д там просто...

Как раскрасить ячейки DBGridEh - Delphi БД
Добрый день, есть форма с данными по путевым листам. Как мне раскрасить ячейку если остаток на начало по авто не сходиться с остатком на...

Ошибка при добавлении записи в таблицу БД "Could not convert variant of type "NULL" into type "OleStr" - Delphi БД
Здравствуйте. При работе программы вылетает ошибка &quot;Could not convert variant of type &quot;NULL&quot; into type &quot;OleStr&quot; &quot;, когда пользователь...

6
SAMZ
1261 / 704 / 13
Регистрация: 21.12.2009
Сообщений: 2,255
17.09.2014, 16:12 #2
У объекта TDBGrid (и у его колумнов) есть группа свойств, начинающаяся с Footer. Если правильно настроить эти свойства (а это не сложно), можно без хлопот получить так назыаемую "подвальную" строку, в котороы в зависимости от настроек получите то, что Вам необходимо: можно сумму по строкам, можно среднее арифметическое, можно количество. В общем там все по уму сделано, грех не пользоваться!
Можно даже организовать несколько подвальных строк с отображением в них разных агрегатов колонки.
0
rem22
0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 4
17.09.2014, 16:38  [ТС] #3
Спасибо за ответ. я в курсе про футеры. Но мне нужно чтобы высчитывалась сумма СТРОКИ в режиме редактирования ячеек ЭТОЙ строки и показывалась в этой же строке в другом столбце. Примерно как если бы в экселе применить формулу суммирования ячеек в ОДНОЙ СТРОКЕ к и вывести результат в ТОЙ же строке но в другом столбце. Надеюсь понятно объяснил.
0
SAMZ
1261 / 704 / 13
Регистрация: 21.12.2009
Сообщений: 2,255
17.09.2014, 16:49 #4
Цитата Сообщение от rem22 Посмотреть сообщение
Примерно как если бы в экселе применить формулу суммирования ячеек в ОДНОЙ СТРОКЕ к и вывести результат в ТОЙ же строке но в другом столбце. Надеюсь понятно объяснил.
Это еще проще. Создай вычисляемое поле в DataSet и в обработчике OnCalcFields вычисляй то, что необходимо. Как только ты изменишь содержание ячейки и сохранишь изменения в результирующей ячейке строки автоматически отобразится результат.
0
rem22
0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 4
18.09.2014, 13:31  [ТС] #5
Проблема с вычисляемым полем такая - я не знаю как его динамически создать. Дело в том, что данные в датасет передаются из adoquery который строит запрос динамически (на основе 3 таблиц, клиенты, товар, заказы). Когда я пытаюсь создать поле программно или через дизайнер на уровне датасета, то, кроме него в грид ничего не выводится. Присвоить значение поля как вычисляемому тоже не получается, потому-что нужно сначала закрыть датсет. Как решить данную проблему? Подскажите.
0
SAMZ
1261 / 704 / 13
Регистрация: 21.12.2009
Сообщений: 2,255
18.09.2014, 14:08 #6
Цитата Сообщение от rem22 Посмотреть сообщение
данные в датасет передаются из adoquery который строит запрос динамически (на основе 3 таблиц, клиенты, товар, заказы)
Я не пользуюсь в работе компонентами ADO и, может быть, поэтому не понял как это данные передаются из adoquery в датасет. Во-первых пропиши запрос статически. Во вторых какими бы ты не пользовался компонентами, там должна быть возможность автоматического или ручного создания любых видов полей, как вычисляемых, так и не вычисляемых. Посмотри документацию на ADO. там все неплохо описано!
0
rem22
0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 4
18.09.2014, 16:43  [ТС] #7
Спасибо за ответ. Буду думать.
Связка такая dbgrigeh-memtableeh-adodatadrivereh-adoquery-adoconnect
статически запрос прописать не могу, потому-что сводная таблица формируется, по мере заполнения справочников клиентов и товара. На уровне ADOquery тоже пока ничего вразумительного не получается.

Добавлено через 2 часа 4 минуты
Проблема решена.
Нужно динамически создать поля memtableeh c названиями полей как в запросе + добавить вычисляемое поле.
0
18.09.2014, 16:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2014, 16:43
Привет! Вот еще темы с ответами:

MS Access База "Учет товара": На кнопку "Поступило товаров" организовать поиск по Дате поступления - Delphi БД
Доброй ночи , помогите пожалуйста на кнопку &quot;Поступило товаров&quot; организовать поиск по Дате поступления

Заполнение атрибута "marks" всех кортежей таблицы "example" случайными числами используя ADO Table - Delphi БД
Написать программу заполнения атрибута &lt;&lt; marks &gt;&gt; всех кортежей таблицы &lt;&lt; example &gt;&gt; случайными числами используя ADO Table. Каждое число...

Отправка "отчётов об ошибках", сообщений об AV, логов и прочего дебага "для чайников" - Delphi
Как известно, нельзя поправить неизвестный баг. Не знаю как кого, а меня пока тестер не тыкнет носом, я ничего не исправлю, и мои бедные...

с помощью стрелок "вверх","вниз" увеличивать или уменьшать размер рисунка - Delphi
с помощью стрелок &quot;вверх&quot;,&quot;вниз&quot; увеличивать или уменьшать размер рисунка


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru