Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2013, 13:27   #1
gigar
Пользователь
 
Регистрация: 23.01.2013
Сообщений: 23
По умолчанию Цикл сравнения строк

Всем доброго дня. Очень нужна Ваша помощь.
Есть связка ADOConnection+Adoquery+DataSource (использую базу Access) все выводится в DBgrid.
Таблица вида :
_________
|_А1_|_А2_|
|_2__|____|
|_1__|____|
|_4__|____| и так далее.

Как сделать так, чтобы:
1. Значение из строки 1 столбца А сравнивалось со значение из строки 2 столбца А, значение из строки 2 столбца А со
значением из строки 3 столбца А и так до конца таблицы;
2. Если предыдущая строка столбца А больше текущей, то в столбец А2 записать 1 и так до конца таблицы;
3. В столбце А2 вторая строка=предыдущая строка стобца А2+ вторая строка столбца А1 и так до конца таблицы;

Спасибо за будущую помощь!
gigar вне форума Ответить с цитированием
Старый 23.01.2013, 13:52   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

для п.1 и п.2 как-то так
Код:
var
  fStr : integer; // значение А1 предыдущей строки
begin
  if ADOQuery.RecordCount>1 then
  begin
    ADOQuery.First;
    fStr := ADOQuery.FieldByName('A1').asInteger; 
    ADOQuery.Next;
    while not ADOQuery.Eof do
    begin
      if fStr > ADOQuery.FieldByName('A1').AsInteger then
        ADOQuery.FieldByName('A2').AsInteger := 1;
      fStr := ADOQuery.FieldByName('A1').AsInteger;
      ADOQuery.Next;
    end;
  end
  else
    ShowMessage('В таблице меньше 2х строк');
end;
Цитата:
3. В столбце А2 вторая строка=предыдущая строка стобца А2+ вторая строка столбца А1 и так до конца таблицы;
а вот тут не понял (((
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 23.01.2013 в 15:49.
Yurk@ вне форума Ответить с цитированием
Старый 23.01.2013, 14:13   #3
gigar
Пользователь
 
Регистрация: 23.01.2013
Сообщений: 23
По умолчанию

Огромное спасибо Yurk@.
По поводу 3 пункта, то например

3 строка в стобце А2 будут равна сумме 2 строки столбца А2 + 3 строка А1
gigar вне форума Ответить с цитированием
Старый 23.01.2013, 15:01   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

эммм .... тогда уточни по п2.
Цитата:
2. ... то в столбец А2 записать 1 и так до конца таблицы;
столбец А2 какой строки ? 1й или 2й ?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 23.01.2013, 15:07   #5
gigar
Пользователь
 
Регистрация: 23.01.2013
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
эммм .... тогда уточни по п2. столбец А2 какой строки ? 1й или 2й ?
Если предыдущая строка столбца А1 больше текущей, то в столбец А2 записать 1 в текущую строку и так до конца таблицы;




В смысле записывается цифра 1

Последний раз редактировалось gigar; 23.01.2013 в 15:10.
gigar вне форума Ответить с цитированием
Старый 23.01.2013, 15:57   #6
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

если я верно понял то выходит накладка между п2 и п3 по полю А2 т.к. начиная с 3й строки таблицы они будут перезаписывать значения друг друга
где логика ?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 23.01.2013, 19:50   #7
gigar
Пользователь
 
Регистрация: 23.01.2013
Сообщений: 23
По умолчанию

спасибо за замечание. Я упростил процедуру. Надо следующее:
есть коэффициент к=100
___________________________
|__|_B1_|_B2_|_B3_|_B4_|_B5_|
|A1|210_|__0_|__0_|__0_|_0__|
|A2|370_|_160|_1,6|__1_|_1__|
|A3|490_|_120|_1,2|__1_|_2__|
|A4|560_|__70|_0,7|_-1_|_1__|
|A5|760_|_200|__2_|_2_|_3__|
|A6|870_|_110|_1,1_|_1_|_4__|

В столбце B1 несколько сотен значений.
A2;B2= A2;B1-A1;B1 (370-210=160)
A3;B2=A3;B1-A2B1 (490-370=120) и так далее

столбец В3=B2/100

Столбец В4= только целая часть от В3 и если значение меньше 1 то записывается в ячейку -1

Столбец B5=поочередное сложение строк в B5

Огромное спасибо за помощь!
gigar вне форума Ответить с цитированием
Старый 23.01.2013, 21:06   #8
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Код:
var
  fStr : integer; // значение B1 предыдущей строки
begin
  if ADOQuery.RecordCount > 1 then
  begin
    ADOQuery.First;
    fStr := ADOQuery.FieldByName('B1').asInteger; 
    ADOQuery.Next;
    while not ADOQuery.Eof do
    begin
      ADOQuery.FieldByName('B2').AsInteger := fStr + ADOQuery.FieldByName('B1').AsInteger;
      ADOQuery.FieldByName('B3').AsFloat := ADOQuery.FieldByName('B2').AsInteger / 100;
      if ADOQuery.FieldByName('B3').AsFloat >=1 then 
        ADOQuery.FieldByName('B4').AsInteger := Trunc(ADOQuery.FieldByName('B3').AsFloat)
      else 
        ADOQuery.FieldByName('B4').AsInteger := -1;
      ADOQuery.Next;
    end;
  end
  else
    ShowMessage('В таблице меньше 2х строк');
end;
про B5 не понял
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 24.01.2013, 11:17   #9
gigar
Пользователь
 
Регистрация: 23.01.2013
Сообщений: 23
По умолчанию

По поводу B5

A2;B5=A1;B5+A2;B4
A3;B5=A2;B5+A3;B4 и так далее.

И что делать если в B1 будут данные вида например 0,2345 какой тип переменных присваивать.

Спасибо

Последний раз редактировалось gigar; 24.01.2013 в 11:32.
gigar вне форума Ответить с цитированием
Старый 24.01.2013, 11:41   #10
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Код:
var
  fStr : integer; // значение B1 предыдущей строки
  vStr : integer // значение B5 предыдущей строки
begin
  if ADOQuery.RecordCount > 1 then
  begin
    ADOQuery.First;
    fStr := ADOQuery.FieldByName('B1').asInteger; // запоминаем первое значение В1
    vStr := ADOQuery.FieldByName('B5').asInteger; // запоминаем первое значение В5
    ADOQuery.Next;
    while not ADOQuery.Eof do
    begin
      ADOQuery.FieldByName('B2').AsInteger := fStr + ADOQuery.FieldByName('B1').AsInteger;
      ADOQuery.FieldByName('B3').AsFloat := ADOQuery.FieldByName('B2').AsInteger / 100;
      if ADOQuery.FieldByName('B3').AsFloat >= 1 then 
        ADOQuery.FieldByName('B4').AsInteger := Trunc(ADOQuery.FieldByName('B3').AsFloat)
      else 
        ADOQuery.FieldByName('B4').AsInteger := -1;
      ADOQuery.FieldByName('B5').AsInteger := ADOQuery.FieldByName('B4').AsInteger + vStr;
      fStr := ADOQuery.FieldByName('B5').AsInteger; // запоминаем В1 будущей предыдущей строки
      vStr := ADOQuery.FieldByName('B5').AsInteger; // запоминаем В5 будущей предыдущей строки
      ADOQuery.Next;
    end;
  end
  else
    ShowMessage('В таблице меньше 2х строк');
end;
Цитата:
И что делать если в B1 будут данные вида например 0,2345 какой тип переменных присваивать.
в таком случае лучше везде использовать float
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 24.01.2013 в 11:44.
Yurk@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка сравнения строк, язык c OlegALL Общие вопросы C/C++ 1 05.10.2012 09:39
Цикл сравнения и действие hziben Microsoft Office Excel 8 03.08.2012 15:15
Ускорение сравнения строк Alex Cones Общие вопросы Delphi 2 16.01.2011 15:45
Проблема сравнения строк securus Общие вопросы C/C++ 7 21.12.2010 03:12
программа для сравнения строк ТМемо MixanMM Компоненты Delphi 2 02.07.2009 13:28