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

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

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

Ответить
Аватара пользователя
Plato
новенький
Сообщения: 13
Зарегистрирован: 25.10.2014 21:09:03

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

Сообщение Plato »

Есть 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.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение 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;



1.jpg


2.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
7bit
новенький
Сообщения: 43
Зарегистрирован: 01.10.2011 12:35:52

Сообщение 7bit »

Правильный результат получите, если поля будут в одном датасете. Добавьте поле "Цена за штуку" в SQLQuery3.
Аватара пользователя
Plato
новенький
Сообщения: 13
Зарегистрирован: 25.10.2014 21:09:03

Сообщение Plato »

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"
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

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

Хм. Я то подумал, что намёка достаточно. Оказывается, нет.
Аватара пользователя
Plato
новенький
Сообщения: 13
Зарегистрирован: 25.10.2014 21:09:03

Сообщение Plato »

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

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

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

Код: Выделить всё

aText:=IntToStr(SQLQuery3LongintField.AsInteger*SQLQuery2LongintField.AsInteger);
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

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

Так правильно, на первой же записи стоим, никуда не двигаемся.
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

Мастер-деталь тут не при чём. Надо делать соединение двух таблиц - явный 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.Наименование товара
Ответить