Другие языки программирования и технологии
Как найти самое большое значение в DBGrid (тип поля числовой)?
можно конечно на SQL функцию MAX() использовать, но мне нужно результат "в руке иметь" (чтобы вывести куда нибудь) , можно конечно и перебирать и +совать, но ведь если записей 1000 то ждать придется...
я других вариантов не знаю.
сначало через запрос найти максимум, а потом перебирать до тех пор пока не встретишься с максимальным из запроса
сначало через запрос найти максимум, а потом перебирать до тех пор пока не встретишься с максимальным из запроса
Олег Баранов
В 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;
- Ну да, Как бы если в таблицу 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;
Похожие вопросы
- Excel. Макрос. Найти в Листе1 значение активной ячейки из Листа2.
- Помогите пожалуйста в программе Турбо Паскаль найти наибольшее значение из 4 заданных!
- в матрице Х (8,5) найти среднее арифметическое значение максимальных элементов в каждой строке
- Вводится последовательность чисел, 0 – конец последовательности. Найти два наибольших числа (VB) прошу помощи
- составить программу решения задачи дано 10 чисел определить сколько из них принимает наибольшее значение.как решить?*(((
- Даны 2 матрицы 2х3. Нужно поменять местами наибольшее значение из 1 с наименьшим из 2. На C++
- Найти самое большое число с++
- Можно ли найти фотографии большого размера?
- Помогите решить задачу по программированию, пожалуйста. Найти сумму наименьших значений элементов строк. (вложенные циклы)
- линейный массив. в линейном массиве найти два наибольших числа и переставить их помогите пожалуйста,заранее спасибо)