Вычисляемое поле в DBGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Вычисляемое поле в DBGrid

Сообщение Plato » 20.11.2014 22:18:13

Есть 2 таблицы DBGrid.
Каждая расположена на отдельном TabSheet.
Вычисляемое прописываю так:
Код: Выделить всё
procedure TForm1.SQLQuery3CalcFields(DataSet: TDataSet);
begin
  SQLQuery3Summa1.AsInteger:=SQLQuery3LongintField.AsInteger*SQLQuery2LongintField.AsInteger;
end;

Проблема в том, что вычисляется не правильно.
SQLQuery3Summa1=Summa
SQLQuery3LongintField=Количество
SQLQuery2LongintField=Цена за штуку
Изображение

На просторах нашёл только :
Warning:
When the dataset is the master table of a master-detail relationship, OnCalcFields occurs before detail sets have been synchronized with the master table.
Аватара пользователя
Plato
новенький
 
Сообщения: 13
Зарегистрирован: 25.10.2014 21:09:03

Re: Вычисляемое поле в DBGrid

Сообщение sign » 21.11.2014 07:16:32

Почему не пользуетесь вычисляемым полем и его OnGetText(Sender: TField; var aText: string; DisplayText: Boolean);
Получите правильный результат:
Код: Выделить всё
  procedure TDM.SQLQuery1r2_1GetText(Sender: TField; var aText: string; DisplayText: Boolean);
begin
  aText := SQLQuery3LongintField.AsInteger * SQLQuery2LongintField.AsInteger;
end;



1.jpg


2.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Вычисляемое поле в DBGrid

Сообщение 7bit » 21.11.2014 16:47:21

Правильный результат получите, если поля будут в одном датасете. Добавьте поле "Цена за штуку" в SQLQuery3.
7bit
новенький
 
Сообщения: 41
Зарегистрирован: 01.10.2011 12:35:52

Re: Вычисляемое поле в DBGrid

Сообщение Plato » 22.11.2014 00:05:49

sign писал(а):Почему не пользуетесь вычисляемым полем и его OnGetText(Sender: TField; var aText: string; DisplayText: Boolean);
Получите правильный результат:
КОД: ВЫДЕЛИТЬ ВСЁ
  procedure TDM.SQLQuery1r2_1GetText(Sender: TField; var aText: string; DisplayText: Boolean);
begin
  aText := SQLQuery3LongintField.AsInteger * SQLQuery2LongintField.AsInteger;
end;

Выдаёт ошибку :
Код: Выделить всё
Error: Incompatible types: got "LongInt" expected "AnsiString"
Аватара пользователя
Plato
новенький
 
Сообщения: 13
Зарегистрирован: 25.10.2014 21:09:03

Re: Вычисляемое поле в DBGrid

Сообщение sign » 22.11.2014 07:08:31

Ну, а кто за вас будет преобразовывать тип - aText := IntToStr(...)?

Хм. Я то подумал, что намёка достаточно. Оказывается, нет.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Вычисляемое поле в DBGrid

Сообщение Plato » 22.11.2014 14:21:13

sign писал(а):Ну, а кто за вас будет преобразовывать тип - aText := IntToStr(...)?

Хм. Я то подумал, что намёка достаточно. Оказывается, нет.

В результате всё осталось как и было. Количество всегда умножается на 4.

Код: Выделить всё
aText:=IntToStr(SQLQuery3LongintField.AsInteger*SQLQuery2LongintField.AsInteger);
Аватара пользователя
Plato
новенький
 
Сообщения: 13
Зарегистрирован: 25.10.2014 21:09:03

Re: Вычисляемое поле в DBGrid

Сообщение Vapaamies » 22.11.2014 16:29:57

Plato писал(а):Количество всегда умножается на 4.

Так правильно, на первой же записи стоим, никуда не двигаемся.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Вычисляемое поле в DBGrid

Сообщение svk12 » 23.11.2014 03:44:06

Мастер-деталь тут не при чём. Надо делать соединение двух таблиц - явный JOIN:

Код: Выделить всё
SELECT  A.Дата,A.Наименование товара,A.Имя клиента,A.Количество,A.Количество * B.Цена за штуку AS Summa
FROM Заказы A  JOIN Товары B  ON B.Наименование товара = A.Наименование товара


Или неявный:

Код: Выделить всё
SELECT  A.Дата,A.Наименование товара,A.Имя клиента,A.Количество,A.Количество * B.Цена за штуку AS Summa
FROM Заказы A  ,Товары B  WHERE B.Наименование товара = A.Наименование товара
svk12
постоялец
 
Сообщения: 409
Зарегистрирован: 09.06.2008 18:42:47


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 238

Рейтинг@Mail.ru
cron