Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 08.06.2017, 14:28   #1
Laymen
Новичок
 
Регистрация: 14.11.2014
Сообщений: 3
Репутация: 10
Восклицание Сравнить значения в 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 в 14:39.
Laymen вне форума   Ответить с цитированием
Старый 08.06.2017, 15:17   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,412
Репутация: 1965
По умолчанию

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

Код:

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 в 15:23.
evg_m вне форума   Ответить с цитированием
Старый 08.06.2017, 19:05   #3
Laymen
Новичок
 
Регистрация: 14.11.2014
Сообщений: 3
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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, 19:37   #4
Laymen
Новичок
 
Регистрация: 14.11.2014
Сообщений: 3
Репутация: 10
По умолчанию

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

видимо изменить вычисление "результата"
Код:

result:= ....AsString='+';

__________________
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума   Ответить с цитированием
Ответ



Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнить по содержимому HEX значения valerij Microsoft Office Excel 23 02.11.2014 18: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




12:18.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru