1 (edited by builov.maikl 2021-10-27 17:39:54)

Topic: Помогите разобраться с окрашиванием строк в TableGrid по условию

Добрый день!
Кодер из меня ещё тот!
Помогите понять что - где не так.
есть TableGrid сформированная SQL-запросом - FrmOne.TG_PayRoll
из TableGrid  данные из определённых ячеек записываем в отдельную таблицу.
кому интересно, выглядит это так:

// Передача в оплату!
procedure FrmOne_TG_PayRoll_OnDoubleClick (Sender: TObject; ACol, ARow: Integer; Value: String; var Accept: Boolean);
 var i: integer;
     Fam, Nam, First, pay, recip, Mo, BIK, RS, app, sql: string;
begin
   Mo := (copy(FrmOne.DTP_PayRoll_Year.sqlDate, 2, 7));
   i := FrmOne.TG_PayRoll.SelectedRow;
   Fam := FrmOne.TG_PayRoll.Cell[1,i].AsString ;
   Nam := FrmOne.TG_PayRoll.Cell[2,i].AsString ;
   First := FrmOne.TG_PayRoll.Cell[3,i].AsString ;
   Pay := FrmOne.TG_PayRoll.Cell[16,i].AsString ;
   recip := FrmOne.TG_PayRoll.Cell[17,i].AsString ;
   BIK := FrmOne.TG_PayRoll.Cell[18,i].AsString ;
   RS := FrmOne.TG_PayRoll.Cell[19,i].AsString ;
   app := FrmOne.TG_PayRoll.Cell[20,i].AsString ;

   if IDYES = MessageBox('Передать в оплату?'+#13#13+(Fam)+(' ')+(Nam)+(' ')+(First)+#13#13+('за')+(' ')+(Mo)+#13#13+('начислено')+(' ')+(pay)+#13#13+('получатель')+(' ')+(recip)+#13#13+('БИК')+(' ')+(BIK)+#13#13+('Счет №')+(' ')+(RS)+#13#13+('Назначение')+(' ')+(app), 'Передача в оплату', MB_YESNO+MB_ICONQUESTION)
    then
     begin SQLExecute('INSERT INTO TblPayRoll (Famaly, LastName, FirstName, Transfer, Mounth, RecipientPay, BIK, RS, appointment) VALUES("'+Fam+'", "'+Nam+'", "'+First+'", "'+Pay+'", "'+Mo+'", "'+recip+'", "'+BIK+'", "'+RS+'", "'+app+'")')
     end
    else if IDNO
     then
      begin
       ShowMessage('Вы отменили действие');
      end
end;

Хотелось бы строки данные из которых были записаны в таблицу выделить цветом, для этого был написан следующий код:

procedure FrmOne_BtSavePay_OnClick (Sender: TObject; var Cancel: boolean);
var  s, i: integer;
      Mo, sql: string;
 begin
 // Присваиваем переменной начальное значение
  // i := 0;
 // переменная для сравнения выбранной даты с db
   Mo:= (copy(FrmOne.DTP_PayRoll_Year.sqlDate, 2, 7));
 // цикл - пройти все строки начиная с первой (0)
    for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
 // если в db PruffPayment = 1 (да/нет = 1/0)
     if SQLExecute('SELECT PruffPayment FROM TblPayRoll WHERE PruffPayment = 1')
 // и совпадает месяц
      and (Mo = SQLExecute('SELECT Mounth FROM TblPayRoll WHERE Mounth = "'+Mo+'"'))
 // и совпадает фамилия
      and (FrmOne.TG_PayRoll.Cell[1,i].AsString = SQLExecute('SELECT Famaly FROM TblPayRoll WHERE Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'"'))
 // и совпадает имя
      and (FrmOne.TG_PayRoll.Cell[2,i].AsString = SQLExecute('SELECT LastName FROM TblPayRoll WHERE LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'"'))
 // и совпадает отчество
      and (FrmOne.TG_PayRoll.Cell[3,i].AsString = SQLExecute('SELECT FirstName FROM TblPayRoll WHERE FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'"'))
 // и совпадает сумма
      and (FrmOne.TG_PayRoll.Cell[16,i].AsString = SQLExecute('SELECT Transfer FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"'))
    then
     begin
    //ShowMessage('Есть совпадение');
    // окрасить всю строку
    for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
     do frmOne.TG_PayRoll.Cell[s,i].Color := $00ff82d7;
     end

Загвоздка в том что при наличии одного совпадения в таблице отвечающему 

SQLExecute('SELECT PruffPayment FROM TblPayRoll WHERE PruffPayment = 1')


в TableGrid окрашиваются и те у которых PruffPayment = 0....
и обратная ситуация при

SQLExecute('SELECT PruffPayment FROM TblPayRoll WHERE PruffPayment = 0')


не окрашивается ни одной строки

2 (edited by sparrow 2021-10-27 14:52:25)

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

Вам нужно переосмыслить ваше условие и ваши запросы.
Начнем сначала.
SQLExecute() - возвращает один результат, какой бы запрос вы не написали.
Этот запрос - SELECT PruffPayment FROM TblPayRoll WHERE PruffPayment = 1
вернет вам то, что вы хотите ), Словами так:

Выбрать результат этого поля, где это поле равно 1. Что мы получаем, правильно 1, если в таблице есть хоть одна запись с 1. Любая.
Для запроса с 0 мы получим 0, если в таблице есть хоть одна запись с 0. Любая.
Все как мы просим в запросе ).

Такие запросы ниочем.
Так и остальные запросы написаны и сравниваются сами с собой.
Конечно без SQLExecute() а с SQLQuery() мы бы получили кучу строк если есть совпадения. Но все с 1 или 0.


Теперь условие IF ... AND ... AND ... THEN
Вы берете Имя, Фамилию и ... из одной строки. Но ищите в своей базе отдельными несвязанными запросами. В таблице наверняка найдется несколько человек, например, с одинаковым именем но разными фамилиями и другие варианты.
Правильно будет сформировать запрос типа
Сколько в таблице записей где имя фамилия и все остальное совпадает с ячейками таблицы программы.

SELECT COUNT(id) 
FROM таблица 
WHERE Transfer = FrmOne.TG_PayRoll.Cell[16,i].AsString 
  AND FirstName = FrmOne.TG_PayRoll.Cell[3,i].AsString
  AND LastName = FrmOne.TG_PayRoll.Cell[2,i].AsString
  ...
  AND PruffPayment = 1;


А потом - IF (ваш запрос) = 1 THEN раскрасить;


COUNT(id) - подсчет количества совпадений.
Если результат 0 то нет записей (не закрашиваем),
1 - одна запись (закрашиваем)
а если больше ? Вы уверены что у вас не будет совпадений больше 1 ?
Возможно в поиске вам нужно задействовать больше условий или какое нибудь уникальное поле.

3 (edited by builov.maikl 2021-10-27 17:38:38)

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

Спасибо, попробую осознать.
Совпадений в гриде будет однозначно более чем 1, а это значит нужно заключить в цикл
в моём случае нужно сравнить строку в гриде с таблицей если совпадают все уловия - ракрасить.... имнеео в таком порядке и не наоборот

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

Какой цикл? При чем тут цикл?

Цикл у вас только чтоб пройти по всем строкам TableGrid.
И еще один если нужно всю строку раскрасить.
Каким должен быть запрос и условие IF я вам показал.
По сути надо только все подставить и соединить, можно еще мануал полистать.

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

Не реагируйте так бурно! ОГРОМНОЕ СПАСИБО за подсказку, натолкнули на правильный ход мысли. Всё  работает!!!!
в итоге получилось следующее:

procedure FrmOne_BtSavePay_OnClick (Sender: TObject; var Cancel: boolean);
var s, i: integer;

begin
 // цикл - пройти все строки начиная с первой (0)
 for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do

     if SQLExecute ('SELECT * FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND PruffPayment = 1')
  // окрасить всю строку
      then
       begin
 // цикл - Окрасить всю строку
        for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $007ff062;
       end

end;

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

Два раза в запросе

AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'"



Проверьте ваше решение для варианта если в таблице TblPayRoll не будет строки где PruffPayment = 1.
Т.е. все значения PruffPayment = 0.

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

Вам нужно использовать это свойство компонента


Cells[x,y]   String   Свойство для доступа к текстовому содержимому ячейки.

http://myvisualdatabase.com/doc_ru/scri … egrid.html

8 (edited by builov.maikl 2021-10-27 18:45:09)

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

sparrow wrote:

Два раза в запросе

AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'"



Проверьте ваше решение для варианта если в таблице TblPayRoll не будет строки где PruffPayment = 1.
Т.е. все значения PruffPayment = 0.

дабы не перегружать восприятие кода читателем не стал изначально писать весь код. в законченном виде он такой:

procedure PruffPayment ();
var s, i: integer;


begin
 // цикл - пройти все строки начиная с первой (0)
 for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do

     if SQLExecute ('SELECT * FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" AND PruffPayment = 1')
  // если чек получен окрасить всю строку в зеленый
      then
       begin
        for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $007ff062;
       end
else if SQLExecute ('SELECT * FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" AND PruffPayment = 0')
  // Если чека нет окрасить всю строку в сиреневый
      then
       begin
        for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $00ff82d7;
       end

PruffPayment принимает значения или 0 или 1 третьего не дано.
строки где PruffPayment = 0 - одного цвета, где  PruffPayment = 1 - другого, а строки у которых нет совпадения по полям отличным от PruffPayment остаются белыми

9 (edited by sparrow 2021-10-27 21:20:05)

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

Ну чтобы меньше читать и писать

procedure PruffPayment ();
var s, i: integer;
t:  string;
begin
...
t := SQLExecute ('SELECT PruffPayment FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" ');
if t = '0' then                    // Если чека нет окрасить всю строку в сиреневый
  begin
      for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $00ff82d7; 
  end;
if t = '1' then                   // Если чек получен окрасить всю строку в зеленый
  begin
     for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $007ff062;
  end;
// если t = '' остается белым Не делаем ничего
...
end;

10 (edited by builov.maikl 2021-10-28 13:10:31)

Re: Помогите разобраться с окрашиванием строк в TableGrid по условию

sparrow wrote:

Ну чтобы меньше читать и писать

procedure PruffPayment ();
var s, i: integer;
t:  string;
begin
...
t := SQLExecute ('SELECT PruffPayment FROM TblPayRoll WHERE Transfer = "'+FrmOne.TG_PayRoll.Cell[16,i].AsString+'"  AND Famaly = "'+FrmOne.TG_PayRoll.Cell[1,i].AsString+'" AND LastName = "'+FrmOne.TG_PayRoll.Cell[2,i].AsString+'" AND FirstName = "'+FrmOne.TG_PayRoll.Cell[3,i].AsString+'" ');
if t = '0' then                    // Если чека нет окрасить всю строку в сиреневый
  begin
      for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $00ff82d7; 
  end;
if t = '1' then                   // Если чек получен окрасить всю строку в зеленый
  begin
     for s := 0 to FrmOne.TG_PayRoll.Columns.Count-1
         do frmOne.TG_PayRoll.Cell[s,i].Color := $007ff062;
  end;
// если t = '' остается белым Не делаем ничего
...
end;

Спасибо ещё раз за подсказку!
как вариант можно использовать и этот более "изящный" вариант