![]() |
|
|
#1
|
|||
|
|||
|
Здравствуйте, не получается подсчитать кол-во спортсменов по каждому виду спорта в определённом поле..
Смысл задания таков: создать вычисляемое поле и сделать там подсчёт. У меня выходит следующая процедура: Код:
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
var i,sum: Integer;
begin
sum:=0;
with Table1.Fields.FieldByName('Sport') do begin {В этом поле данных надо подсчитать кол-во спортсменов}
for i:=0 to Table1.RecordCount-1 do begin
if Table1.Fields[i].Value=Table1.Fields[i+1].Value then begin {На этой строке выдаёт ошибку}
sum:=sum+1; end;
Table1Quantity.Value:=sum; {Сюда заносим результат}
end;
end;
end;Но при такой процедуре возникает ошибка конвертации: "Could not convert variant of type (String) into type (Double)" Что я делаю не так? Заранее спасибо. |
|
#2
|
||||
|
||||
|
Может надо Table1.Fields[i].AsFloat ?
|
|
#3
|
||||
|
||||
|
"Все смешалось ... ".
О чем это я?. Ах да - i проходит циклом по строкам таблицы, а используется для перебора столбцов. ... Приведите для начала структуру таблицы. Не думаю, что у вас ... - ( честно говоря даже и не знаю что не думаю ). Чтобы вычисляемым полем, это надо бы два TADOQuery ( с BDE не работаю принципиально ), но можно и не ADO а TSQLQuery . Один выводит виды спорта и у него добавляется вычисляемый столбец, который используя второй Query подсчитывает количество. А можно и одним запросом ели в SQL написать агрегатное поле. Если только база нормальной структуры, а если каждому виду спорта по столбцу ... . Тогда по другому и немного похоже на твой код |
|
#4
|
||||
|
||||
|
Цитата:
То - один столбец ( поле ) имеет тип String, другое Double. Например таблица "Велосипеды" {Наименование, Количество} Правда количество с запятой не пишут - тогда { ткань, метраж }. Вот и попробуйте сравнить значения в этих столбцах "If [Наименование] = [Количество] then // ..." Хотя, с другой стороны, чего только не бывает. |
|
#5
|
|||
|
|||
|
Вот тут структура.
Я хотел просто сравнить в поле данных Спорт первую запись со второй, вторую с третьей и т.д., но реализация, как я понял, хромает. ![]() К сожалению, по заданию нужно это реализовать без SQL-запроса.. Последний раз редактировалось mrtt, 17.12.2010 в 23:15. |
|
#6
|
||||
|
||||
|
Все таки BDE.
Извини - если будет время и удастся создать что нибуть работающее и подключаемое к этой таблице, то постараюсь помочь. Кстати и BDE есть Tquery и там делают выборку из таблицы, а пробежаться по всем записям той же таблицы в событии вычисления поля таблицы нельзя - при смене записи (Table1.Next; ) у тебя опять должно сработать событие вычисления поля. Последний раз редактировалось s0Creator, 18.12.2010 в 00:27. |
|
#7
|
|||
|
|||
|
Да просто все.
типа как-то так: Код:
var
Sport : String;
Cnt : Integer;
begin
Table.First;
Sport := '';
Cnt := 0;
While Not Table.EOF Do
Begin
If Table.FieldByName('Sport').AsString <> Sport
Then
Begin
If Cnt > 0 Then
ShowMessage(Sport + ' = ' + IntToStr(Cnt));
Cnt := 1;
Sport := Table.FieldByName('Sport').AsString;
End
Else
Inc(Cnt);
Table.Next;
End; |
|
#8
|
||||
|
||||
|
Цитата:
- проход по всей таблице ( каждый шаг вызовет это же событие ) - столбец Sport в таблице не сортирован. - когда программа захочет вычислить поле, выводить несколько сообщений вподряд. В общем если упростить все добезобразия и получить то что вероятно хочет преподаватель, то: mrtt - добавь еще одну TTable и настрой ее на туже таблицу базы ( но не создавай там вычисляемых полей ) и напиши так Код:
procedure TMainF.Table1CalcFields(DataSet: TDataSet);
var
Sport: string;
Cnt: Integer;
begin
Table2.Open;
Table2.First;
Sport := Table1Sport.AsString;
Cnt := 0;
while not Table2.EOF do
begin
if Table2Sport.AsString = Sport then
Inc(Cnt);
Table2.Next;
end;
Table2.Close;
Table1Quantity.AsInteger := Cnt;
end; |
|
#9
|
|||
|
|||
|
Спасибо lmikle и s0Creator, взял за основу код s0Creator'a и переписал его под себя, всё работает.
![]() Последний раз редактировалось mrtt, 18.12.2010 в 11:09. |