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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2017, 13:28   #1
Laymen
 
Регистрация: 14.11.2014
Сообщений: 3
Восклицание Сравнить значения в TRxDBGrid

У меня есть таблица связанная с базой и графически представлена в DBGrid`е, и мне нужно сделать кнопку nодчеркивания строки и при этом чтоб было условие проверки с предыдущей строкой, по определенному полю.
В данном случае у меня поле по которому надо сделать проверку 'VREMJA' - дата представленая в виде AsDateTime.


Не знаю как написать условие проверки текущей выбраной строки с предыдущей и значение nоля VREMJA выбраной строки должно быть больше чем предыдущей.

Это наверняка очень просто, если кому не сложно напишите условия или операторы которыми пользоваться ;(

Вот собственно сама процедура без условия:
Код:
procedure TfmMain.N63Click(Sender: TObject);
begin
  if dmMain.ibdsRaspMrt.RecordCount>0 then
   begin
   if (grRaspMrt.SelectedField.FieldName='VREMJA') and ( само условие)  then
    begin
    SetLength(Par, 1);
    Par[0]:=dmMain.ibdsRaspMrtID.AsInteger;
    dmMain.SQLUpdate('UPDATE RASPMRT SET FIELD_CONC=''+'' WHERE ID=:ID', Par);
    dmMain.ibdsRaspMrt.Active:=false;
    dmMain.ibdsRaspMrt.Active:=true;
    dmMain.ibdsRaspMrt.Locate('ID',Par[0],[]);

  end
  end else Application.MessageBox('Отсутствует строка для редактирования','Ошибка',MB_ICONERROR);
end;

Последний раз редактировалось Laymen; 08.06.2017 в 13:39.
Laymen вне форума Ответить с цитированием
Старый 08.06.2017, 14:17   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

несложно-то несложно, НО ...
это практически нереально написать в виде "прямого" условия(разве что данное условие оформить в виде функции)

Код:
function IsNextTime(f: TField): boolean;
var
  d: TDatetime;
begin
  if f.DataSet.IsEmpty then // проверямый НД(DataSet) может быть пустым 
     Abort
  else if f.DataSet.BOF then // текущая запись может быть первой (у нее НЕТ предыдущей ) 
     Abort
  else begin
    f.DataSet.Prev; // "прыгнули" назад
    d:=f.asDateTime; //запомнили время предыдущей записи
    f.DataSet.Next; // и "отпрыгнули" вперед
    result:= // СРАВНИВАЕМ 
             f.AsDateTime // время текущей записи
                         > d; // ЗАПОМНЕННОЕ время предыдущей записи
  end; 
end;

Код:
  if (grRaspMrt.SelectedField.FieldName='VREMJA') and (само условие) IsNextTime(grRaspMrt.SelectedField)   then
А разумнее такое делать на SQL.
1. научиться работе c join и написать запрос в котором в КАЖДОЙ записи будет ДВА времени (текущее, то которое уже есть) и "предыдущее" (то с которым будем сверять текущее)
теперь условие будет выглядеть очень просто
Код:
  ( ds.FieldByname('towner').AsDateTime > ds.FieldByname('tprev').AsDateTime )
2. использовать вложенные запросы и дополнить запрос ФИЛЬТРОМ(where) чтобы остались исключительно нужные записи (towner>tprev)
а теперь даже и проверять не надо, все уже "проверено".
3. СДЕЛАТЬ обновление (update) ВСЕХ найденных записей одним махом. (надеюсь такова изначальная задача).
а теперь и нажимать-то кнопочку придется всего лишь раз.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.06.2017 в 14:23.
evg_m на форуме Ответить с цитированием
Старый 08.06.2017, 18:05   #3
Laymen
 
Регистрация: 14.11.2014
Сообщений: 3
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
несложно-то несложно, НО ...
это практически нереально написать в виде "прямого" условия(разве что данное условие оформить в виде функции)

Код:
function IsNextTime(f: TField): boolean;
var
  d: TDatetime;
begin
  if f.DataSet.IsEmpty then // проверямый НД(DataSet) может быть пустым 
     Abort
  else if f.DataSet.BOF then // текущая запись может быть первой (у нее НЕТ предыдущей ) 
     Abort
  else begin
    f.DataSet.Prev; // "прыгнули" назад
    d:=f.asDateTime; //запомнили время предыдущей записи
    f.DataSet.Next; // и "отпрыгнули" вперед
    result:= // СРАВНИВАЕМ 
             f.AsDateTime // время текущей записи
                         > d; // ЗАПОМНЕННОЕ время предыдущей записи
  end; 
end;

Код:
  if (grRaspMrt.SelectedField.FieldName='VREMJA') and (само условие) IsNextTime(grRaspMrt.SelectedField)   then
А разумнее такое делать на SQL.
1. научиться работе c join и написать запрос в котором в КАЖДОЙ записи будет ДВА времени (текущее, то которое уже есть) и "предыдущее" (то с которым будем сверять текущее)
теперь условие будет выглядеть очень просто
Код:
  ( ds.FieldByname('towner').AsDateTime > ds.FieldByname('tprev').AsDateTime )
2. использовать вложенные запросы и дополнить запрос ФИЛЬТРОМ(where) чтобы остались исключительно нужные записи (towner>tprev)
а теперь даже и проверять не надо, все уже "проверено".
3. СДЕЛАТЬ обновление (update) ВСЕХ найденных записей одним махом. (надеюсь такова изначальная задача).
а теперь и нажимать-то кнопочку придется всего лишь раз.
А если нужно будет nроверить не время а nодчеркнута ли nредыдущая строка, как изменить функцию ?
Laymen вне форума Ответить с цитированием
Старый 08.06.2017, 18:37   #4
Laymen
 
Регистрация: 14.11.2014
Сообщений: 3
По умолчанию

у меня есть в базе nоле отвечающие за nодчеркивание :
Column.Field.Dataset.FieldbyName('F IELD_CONC').AsString='+' // + nодчеркнуто
Laymen вне форума Ответить с цитированием
Старый 08.06.2017, 19:54   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

видимо изменить вычисление "результата"
Код:
result:= ....AsString='+';
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнить по содержимому HEX значения valerij Microsoft Office Excel 23 02.11.2014 17:00
Сравнить два ассоциативных массива и вывести одинаковые значения. livesport PHP 1 20.10.2012 15:10
Выдать кол-во суммируемых элементов,сравнить значения(Pascal) reprain Помощь студентам 0 07.10.2012 21:51
Выдать кол-во суммируемых элементов,сравнить значения(Pascal) reprain Помощь студентам 14 07.10.2012 20:59
ADoQuery inputbox сравнить значения detalik Помощь студентам 2 18.05.2011 08:31