Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.12.2010, 21:34
mrtt mrtt вне форума
Прохожий
 
Регистрация: 17.12.2010
Сообщения: 3
Репутация: 10
По умолчанию Вычисляемые поля

Здравствуйте, не получается подсчитать кол-во спортсменов по каждому виду спорта в определённом поле..
Смысл задания таков: создать вычисляемое поле и сделать там подсчёт.
У меня выходит следующая процедура:
Код:
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  
Старый 17.12.2010, 22:21
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Может надо Table1.Fields[i].AsFloat ?
Ответить с цитированием
  #3  
Старый 17.12.2010, 22:33
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

"Все смешалось ... ".
О чем это я?.
Ах да - i проходит циклом по строкам таблицы, а используется для перебора столбцов.
...
Приведите для начала структуру таблицы.
Не думаю, что у вас ... - ( честно говоря даже и не знаю что не думаю ).

Чтобы вычисляемым полем, это надо бы два TADOQuery ( с BDE не работаю принципиально ), но можно и не ADO а TSQLQuery .

Один выводит виды спорта и у него добавляется вычисляемый столбец, который используя второй Query подсчитывает количество.
А можно и одним запросом ели в SQL написать агрегатное поле.
Если только база нормальной структуры, а если каждому виду спорта по столбцу ... .
Тогда по другому и немного похоже на твой код
Ответить с цитированием
  #4  
Старый 17.12.2010, 23:00
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от deltas
Может надо Table1.Fields[i].AsFloat ?
Не поможет - если растолковать ошибку "Could not convert variant of type (String) into type (Double)"
То - один столбец ( поле ) имеет тип String, другое Double.
Например таблица "Велосипеды" {Наименование, Количество}
Правда количество с запятой не пишут - тогда { ткань, метраж }.
Вот и попробуйте сравнить значения в этих столбцах
"If [Наименование] = [Количество] then // ..."
Хотя, с другой стороны, чего только не бывает.
Ответить с цитированием
  #5  
Старый 17.12.2010, 23:06
mrtt mrtt вне форума
Прохожий
 
Регистрация: 17.12.2010
Сообщения: 3
Репутация: 10
По умолчанию

Вот тут структура.
Я хотел просто сравнить в поле данных Спорт первую запись со второй, вторую с третьей и т.д., но реализация, как я понял, хромает.
К сожалению, по заданию нужно это реализовать без SQL-запроса..

Последний раз редактировалось mrtt, 17.12.2010 в 23:15.
Ответить с цитированием
  #6  
Старый 18.12.2010, 00:21
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Все таки BDE.
Извини - если будет время и удастся создать что нибуть работающее и подключаемое к этой таблице, то постараюсь помочь.

Кстати и BDE есть Tquery и там делают выборку из таблицы, а пробежаться по всем записям той же таблицы в событии вычисления поля таблицы нельзя - при смене записи (Table1.Next; ) у тебя опять должно сработать событие вычисления поля.

Последний раз редактировалось s0Creator, 18.12.2010 в 00:27.
Ответить с цитированием
  #7  
Старый 18.12.2010, 06:06
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да просто все.

типа как-то так:
Код:
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  
Старый 18.12.2010, 10:22
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Цитата:
Сообщение от lmikle
Да просто все.

типа как-то так:
И это все в событии Table1CalcFields?
- проход по всей таблице ( каждый шаг вызовет это же событие )
- столбец 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  
Старый 18.12.2010, 11:05
mrtt mrtt вне форума
Прохожий
 
Регистрация: 17.12.2010
Сообщения: 3
Репутация: 10
По умолчанию

Спасибо lmikle и s0Creator, взял за основу код s0Creator'a и переписал его под себя, всё работает.

Последний раз редактировалось mrtt, 18.12.2010 в 11:09.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025