Другие языки программирования и технологии

Как найти самое большое значение в DBGrid (тип поля числовой)?

можно конечно на SQL функцию MAX() использовать, но мне нужно результат "в руке иметь" (чтобы вывести куда нибудь) , можно конечно и перебирать и +совать, но ведь если записей 1000 то ждать придется...
Олег Баранов
Олег Баранов
1 440
я других вариантов не знаю.
сначало через запрос найти максимум, а потом перебирать до тех пор пока не встретишься с максимальным из запроса
{Amatory} {Amatory}
{Amatory} {Amatory}
422
Лучший ответ
Олег Баранов В SQL функция MAX() сразу определяет максимальное значение и создает новое временное поле в DBGRid для его отображения, но как этот результат "взять в руки"
Вопрос изначально неправелен. DBGrid - это средство отображения информации (части информации - в смысле показывает только часть её) из таблиц и т. д. Работать в любом случае придется с таблицей (курсором) так что только запрос
Олег Баранов Да это понятно что DBGrid только отображает, написал так чтобы сразу было все понятно
ты имеешь в виду найти самое большое значение в числовом поле ТБД?

- Ну да, Как бы если в таблицу 3 записи например со значениями: 1020, 2005, 9400, найти в этих трех значениях самое максимальное, в данном случае это 9400.

_____________________
Вот тебе конкретная функция:

Внимание! только собрал не тестил, если есть ошибки исправляй

function GetMaxValue(const NameTable: string; const NameFieldNumerical: string): variant;

var
adq:TADOQuery;
sql:string;
FI:TField; // взятый обект поля в котором должно храниться запрашиваемое значение
FIDT:TDataType; // тип поля FI

begin
result:= null;

adq:= TADOQuery.Create(nil);
adq.Connection:= сошлись на объект класса TADOConnection;
adq.LockType:= ltReadOnly;
adq.SQL.Text:= format('select Max(%s) from %s',[NameFieldNumerical,NameTable]);

try
adq.open;
if not adq.IsEmpty then begin
FI:= adq.Fields[0];
FIDT:= FI.DataType;
if FIDT = ftInteger then
result:= FI.AsInteger else
if FIDT = ftFloat then
result:= FI.AsFloat else
result:= FI.Value;
end;
finally
adq.Free;
end;
end;
_____________________
ВОТ тебе унив. функция (она конечно неидеальна, сейчас я её переделывать не буду, но это сделать несложно... )

TTypeValue = (tvMax, tvMin, tvAvg, tvSum, tvCount);

function GetValueField(TypeValue: TTypeValue; NameTable, NameFieldNumerical, Filter: string): variant;
// возвращает вычисленное значение по признаку от указанного числового поля таблицы.
// в случае неудачи результат = -1

// ВАЖНО! данную функцию нежелательно использвать в циклах, если к примеру необходимо получать
// мак. значение из набора записей, а лучше на основе её сделать индив. функцию,
// т. о. увеличив время выполнения.

// TypeValue - указанный признак того, что необходимо получить, к пр: мин или макс значение
// NameTable, NameFieldNumerical - имя ТБД и имя числового поля
// Filter - не обязательный фильтр для ТБД

var
adq:TADOQuery;
sql:string;
FI:TField; // взятый обект поля в котором должно храниться запрашиваемое значение
FIDT:TDataType; // тип поля FI

begin
result:= '';
adq:= TADOQuery.Create(self);
try
case TypeValue of
tvMax: sql:= format('select Max(%s) from %s',[NameFieldNumerical,NameTable]);
tvMin: sql:= format('select Min(%s) from %s',[NameFieldNumerical,NameTable]);
tvAvg: sql:= format('select Avg(%s) from %s',[NameFieldNumerical,NameTable]);
tvSum: sql:= format('select Sum(%s) from %s',[NameFieldNumerical,NameTable]);
tvCount: sql:= format('select Count(%s) from %s',[NameFieldNumerical,NameTable]);
end;
if trim (filter) <> '' then
sql:= format('%s where %s',[sql, Filter]);
if OpenTableR(adq,sql) and (not adq.IsEmpty) then begin
FI:= adq.Fields[0];
FIDT:= FI.DataType;
// ShowTypeField(FIDT); // тестовая строка кода
if FIDT = ftInteger then
result:= FI.AsInteger else
if FIDT = ftFloat then
result:= FI.AsFloat else
result:= FI.Value;
end;
finally
adq.Free;
end;
end;

function OpenTableR(ADQ: TADOQuery; const ASQL: string): boolean; // 2009.01.13 zh
begin
try
with ADQ do begin
close;
Connection:= ...;
SQL.Text:= ASQL;
LockType:= ltReadOnly;
open;
result:= active;
end;
except
result:= false;
end;
end;

Похожие вопросы