Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как раскрасить DBGrid по условию ?  [new]
Sensor230
Member

Откуда:
Сообщений: 12
На форме DBGrid, отображение четез DataSource1-ADOQuery1, в таблице есть два поля с датами (1-Дата создания заявки, 2- дата до которой заявка должна быть выполнена). Как мне раскрасить автоматически DBGrid по условию: ЕСЛИ (ДАТА2 -(Data(сейчас))<2 ТО СТРОЧКА ЖЕЛТАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))>5 ТО СТРОЧКА ЗЕЛЕНАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))<0 ТО СТРОЧКА КРАСНАЯ.
Что то типа напоминалки, только в DBGride и по цветам. Если до ококнчания срока выполнения заявки больше 5 дней заявка -зеленая, если меньше двух дней -заявка желтая, прозевал срок -заявка красная.
Спасибо! Вы крутые!!! )))
10 сен 18, 22:02    [21670327]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Все примеры есть тут:
http://www.sql.ru/forum/158789/kak-mozhno-raskrasit-stroki-dbgrid-po-usloviu
10 сен 18, 22:06    [21670329]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Спасибо! Я это видел и оно не совсем подходит. Разукрасить строчки в зависимости от того, что написано в ячейке вопросов не вызывает. Мозги кипят, а вот как разрисовать не по данным в записи, а по результатам манипуляций этими данными - не складывается.
10 сен 18, 22:18    [21670335]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Sensor230,

Так же, как и написано в условии:
d1, d2: TDate;

d1 := dataset.FieldValues['date1'];
d2 := dataset.FieldValues['date2'];

if (d2 - d1 > 5) then
begin
...
end
10 сен 18, 22:34    [21670347]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
JaDi, что не так? пару раз коряво, но запустилось, а теперь вылетает при присвоении значения переменной d2.

procedure TForm2.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var d1, d2: TDateTime;
begin
if (ADOQuery1.FieldByName('Статус').AsString ='В работе') then begin
 DBGrid1.Canvas.Brush.Color:=clLime;
  DBGrid1.Canvas.FillRect(rect);
  DBGrid1.Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.AsString);
end;
if (ADOQuery1.FieldByName('Статус').AsString ='В очередь') then begin
  DBGrid1.Canvas.Brush.Color:=clSilver;
  DBGrid1.Canvas.FillRect(rect);
  DBGrid1.Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.AsString);
end;
Label39.Caption := IntToStr(ADOQuery1.RecordCount);
d1 := Date();
d2:=ADOQuery1.FieldValues ['Дата'];
if ((d2 - d1) > 5) then begin
DBGrid1.Canvas.Brush.Color:=clRed;
DBGrid1.Canvas.FillRect(rect);
10 сен 18, 23:42    [21670382]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Sensor230,

ошибку надо сюда копипастить... Возможно, речь о том, что в поле с датой не везде заполнено, тогда перед присвоением надо проверять значение на Null.
11 сен 18, 00:05    [21670385]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Gator
Member

Откуда: Москва
Сообщений: 13866
Из старья 12391453
Gator
НеОбычный TDBGrid
Grid с человеческим лицом
Разноцветный D B G R I D
По следам «полосатого DBGrid»
и до кучи DrawText
11 сен 18, 01:31    [21670401]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
JaDi, Точно!!! Поле с датой выполнения добавлено позже к рабочей БД и на ранних заявлениях поля пустые , ща буду пробывать. JaDi, спасибо!!! Не знаю кто ты, но ты крут!!! ))))
11 сен 18, 20:34    [21671463]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Gator, Большое спасибо, есть много чего вытащить из не ломая голову и экономя время.
11 сен 18, 20:35    [21671466]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
JaDi,
Что то не клеиться скриншот с ошибкой

К сообщению приложен файл. Размер - 44Kb
11 сен 18, 20:44    [21671478]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Sensor230,

ошибка в том, что в поле пустое значение (null -- незаполнено). Прежде, чем получать его значение, надо проверь на <> Null -- как писал выше.
11 сен 18, 20:59    [21671495]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
DimaBr
Member

Откуда:
Сообщений: 10651
procedure TForm2.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var d1, d2: Variant;
    S: string;
begin
  S := ADOQuery1['Статус'];
  if S = 'В работе' then DBGrid1.Canvas.Brush.Color:=clLime else
  if S = 'В очередь' then DBGrid1.Canvas.Brush.Color:=clSilver;
  DBGrid1.Canvas.FillRect(Rect);
  DBGrid1.Canvas.TextOut(Rect.Left,Rect.Top,Column.Field.AsString);
  d1 := Date();
  d2 := ADOQuery1['Дата'];
  if VarIsNull(d2) then Exit;
  if (d2 - d1) > 5 then DBGrid1.Canvas.Brush.Color:=clGreen else
    if (d2 - d1) < 2 then DBGrid1.Canvas.Brush.Color:=clYellow else
    if (d2 - d1) < 0 then DBGrid1.Canvas.Brush.Color:=clRed;
  DBGrid1.Canvas.FillRect(rect);
end;
11 сен 18, 21:30    [21671524]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
Новые записи автоматически заполняют это поле, а к старым или вручную допишу или удалю их совсем -это что касаемо ошибки. Попробовал так: Очистил всю БД и создал 2 заявки с разными сроками, ошибка как ты и сказал исчезла, но получается что то не то от слова совсем... Красит или весь DBGrid или ни чего, при чем граница разделения по "0".
и еще если вывести результат в d2-d1 в лейбл или DateTimePicker для кoнтроля= хрень какая то получается... Пробывал
11 сен 18, 21:42    [21671537]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
Sensor230
Member

Откуда:
Сообщений: 12
DimaBr, Спасибо за готовый код, вот посидишь тут, а потом ложишься спать и пол ночи уснуть не можешь потому, что чуствуешь себя полным лошарой среди профи ))))). Твой код красит весь грид в желтый цвет в не зависимости от разницы дат то ли 1 день, то ли 100 то ли просрочено.
11 сен 18, 21:55    [21671547]     Ответить | Цитировать Сообщить модератору
 Re: условие- разница дат в DBGrid  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53452
Блог
JaDi
Прежде, чем получать его значение, надо проверь на <> Null -- как писал выше.

На <> Null не стоит проверять ничто и никогда

DimaBr
  if (d2 - d1) > 5 then DBGrid1.Canvas.Brush.Color:=clGreen else
    if (d2 - d1) < 2 then DBGrid1.Canvas.Brush.Color:=clYellow else
    if (d2 - d1) < 0 then DBGrid1.Canvas.Brush.Color:=clRed;

Из всего написанного мне наиболее интересно, как Вы сконструируете тестовый пример, в котором будет задействован clRed.
12 сен 18, 00:30    [21671628]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59003
softwarer> как Вы сконструируете тестовый пример, в котором будет задействован clRed.

Да, смешной косяк. :) Хотя на самом деле достаточно поменять местами два последних if-a.

Posted via ActualForum NNTP Server 1.5

12 сен 18, 09:06    [21671737]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53452
Блог
Гаджимурадов Рустам
Хотя на самом деле достаточно поменять местами два последних if-a.

Это не уберёт вопроса "что будет при d2 = 5, d1 = 2" и ряда других к этому коду. Я бы сказал, что это пример спагетти, только не в коде, а в мыслях в тот момент, когда рождался этот код.
12 сен 18, 11:38    [21671894]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
DimaBr
Member

Откуда:
Сообщений: 10651
Всё согласно тех заданию
автор
ЕСЛИ (ДАТА2 -(Data(сейчас))<2 ТО СТРОЧКА ЖЕЛТАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))>5 ТО СТРОЧКА ЗЕЛЕНАЯ, ЕСЛИ (ДАТА2 -(Data(сейчас))<0 ТО СТРОЧКА КРАСНАЯ.
12 сен 18, 12:40    [21671990]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 59003
softwarer> Это не уберёт вопроса "что будет при d2 = 5, d1 = 2" и ряда других к этому коду.

На этот счёт в ПЗ/ТЗ ничего не сказано. :) Так что вопросы
(уточнения) должны быть не к коду, а ещё до его появления.

Posted via ActualForum NNTP Server 1.5

12 сен 18, 13:28    [21672081]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 53452
Блог
Гаджимурадов Рустам
На этот счёт в ПЗ/ТЗ ничего не сказано. :) Так что вопросы (уточнения) должны быть не к коду, а ещё до его появления.

Безусловно. Тот, кто кодирует, должен был бы остановиться и задать эти вопросы постановщику. Чего мы не увидели.

Вы, конечно, можете спросить, почему я прицепился именно к коду, а не к исходной реплике. Отвечу: потому что спрашивающий имеет моральное право не знать/не уметь, а вот к отвечающему требования, имхо, выше. Дать плохой ответ - хуже, чем не дать никакого. Поэтому я счёл целесообразным привлечь внимание к вопросу именно таким образом.
12 сен 18, 13:35    [21672094]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
DimaBr
Member

Откуда:
Сообщений: 10651
Sensor230
А мне видимо так и придется ходить с нераскрашеным гридом (вернее раскрашенным по статике ячеек, а не как хотелось).

Кто мешает раскрасить как хотелось ?
12 сен 18, 14:54    [21672272]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Sensor230
Member

Откуда:
Сообщений: 12
DimaBr,
Отсутствие опыта... Да, точно нашел нужное оправдание )))), надо теперь в диаппазоны лезть, а то так получается что например 1 и меньше 5 и меньше 2, и еще результат вычитания дат представляется числовым эквивалентом почемуто,.. Но я над этим работаю ))))
12 сен 18, 16:13    [21672417]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Gator
Member

Откуда: Москва
Сообщений: 13866
Sensor230, перпиши ИФы на КЕЙС - нагляднее будет
case (D2-D1) of
  > 5: curColor := clGreen;
  < 0: curColor := clRed;
  < 2: curColor := clYellow // just one & zero;
  else curColor := clCyan;
end;
DBGrid1.Canvas.Brush.Color := curColor; 
13 сен 18, 03:29    [21672981]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
zinpub
Member

Откуда:
Сообщений: 214
Gator
Sensor230, перпиши ИФы на КЕЙС - нагляднее будет
case (D2-D1) of
  > 5: curColor := clGreen;
  < 0: curColor := clRed;
  < 2: curColor := clYellow // just one & zero;
  else curColor := clCyan;
end;
DBGrid1.Canvas.Brush.Color := curColor; 


В case нельзя задавать условия, тем более пересекающиеся...
13 сен 18, 08:26    [21673046]     Ответить | Цитировать Сообщить модератору
 Re: Как раскрасить DBGrid по условию ?  [new]
Gator
Member

Откуда: Москва
Сообщений: 13866
zinpub,
напиши диапазоны, делов-то...
13 сен 18, 14:59    [21673680]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить