Topic: обработка всех записей db

Добрый день.

нужно подсветить ячейку в гриде по условию


procedure FrmOne_Button23_OnClick (Sender: TObject; var Cancel: boolean);
var s, i: integer;
begin
// проходим по всем строкам таблицы
for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
// если есть совпадение (данное сравнение возвращает истину или ложь)
           if ((FrmOne.TG_PayRoll.Cell[17,i].AsString) = SQLExecute('SELECT RecipientPay FROM TemPay Where Transf > 240000'))= True then
           begin
            ShowMessage (FrmOne.TG_PayRoll.Cell[17,i].AsString + 'в списке');
            // присваиваем переменную
            s := (i);
            // раскрашиваем ячейку
            frmOne.TG_PayRoll.Cell[17,s].Color := $FF00E2;
           end;
end.

проблема в том что обрабатывается только первая запись db TemPay.RecipientPay
как добиться проверки по всем записям db?

Re: обработка всех записей db

попробуйте так

procedure FrmOne_Button23_OnClick (Sender: TObject; var Cancel: boolean);
var 
i: integer;
begin
for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
  if (FrmOne.TG_PayRoll.Cells[17,i] = SQLExecute('SELECT RecipientPay FROM TemPay Where Transf > 240000')) then
     frmOne.TG_PayRoll.Cell[17,i].Color := $FF00E2;
end.

Re: обработка всех записей db

не выходит цветочек аленький.
проблема в том что (SELECT RecipientPay FROM TemPay Where Transf > 240000)  возвращает более одного совпадения
грид пробегает полностью с первой записью запроса (т.е. если в гриде 2 и более совпадений окрашивает все) а остальные отбрасывает.
Нужен цикл -
либо весь грид пробегать столько раз сколько записей возвращает запрос
либо каждую ячейку проверять столько раз сколько возвращает запрос и переходить к след. ячейке

Re: обработка всех записей db

проблема в том, что SQLExecute не может вернуть более одной записи.

5 (edited by builov-maikl 2024-01-18 13:19:15)

Re: обработка всех записей db

sparrow wrote:

проблема в том, что SQLExecute не может вернуть более одной записи.

Хорошо, цикл задан, for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
теперь нужно получить 1 содержимое ячейки в нашем случае FrmOne.TG_PayRoll.Cell[17,i].AsString
                                        2 найти её в db что то типа   SQLExecute('SELECT RecipientPay FROM TemPay Where RecipientPay = "'+FrmOne.TG_PayRoll.Cell[17,i].AsString+'"')); но это не точно
                                        3. если True найти № строки таблицы (i)
                                        4 раскрасить - frmOne.TG_PayRoll.Cell[17,i].Color := $FF00E2;

логика должна быть примерно такая...

Re: обработка всех записей db

тогда попробуйте так, просто без проекта не понятно вообще, как слепой

procedure FrmOne_Button23_OnClick (Sender: TObject; var Cancel: boolean);
var 
i: integer;
begin
for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
  if (FrmOne.TG_PayRoll.Cells[17,i] = SQLExecute('SELECT RecipientPay FROM TemPay Where Transf > 240000 AND id=' +FrmOne.TG_PayRoll.dbIndexToID(i) )) then
     frmOne.TG_PayRoll.Cell[17,i].Color := $FF00E2;
end.

7 (edited by builov-maikl 2024-01-18 18:02:15)

Re: обработка всех записей db

Спасибо огромное, ругался на синтаксис, после доработки Работает.

+ решено было использовать временную таблицу. в итоге получилось следующее:

   procedure FrmOne_Button23_OnClick (Sender: TObject; var Cancel: boolean);
var i  : integer;
    s  : string;

begin
    // Задаём переменную (год из календаря)
       s  := (copy(FrmOne.DTP_PayRoll_Year.sqlDate, 2, 4));
    // Удалить временную таблицу
       SQLExecute('DROP TABLE IF EXISTS TemPay');
    // Создать временную таблицу со столбцами....
       SQLExecute('CREATE TEMPORARY TABLE TemPay (id INTEGER NOT null PRIMARY KEY ASC AUTOINCREMENT, RecipientPay TEXT, Transf REAL)');
    // Заполнить временную таблицу. при привышении лимита
       SQLExecute ('insert into TemPay (RecipientPay, Transf) SELECT RecipientPay, IfNull(Sum(TblPayRoll.Transfer), 0) FROM TblPayRoll WHERE Mounth LIKE "'+s+'-%" GROUP BY RecipientPay HAVING IfNull(Sum(TblPayRoll.Transfer), 0) > 240000 ');
    // Если во временной таблице есть хоть одна запись
       if  SQLExecute('Select COUNT(id) FROM TemPay') > 0  then
        begin
         ShowMessage ('Есть получатели с превышением максимального порога');
    // задаём цикл
          for i := 0 to FrmOne.TG_PayRoll.RowCount-1 do
    // ищем совпадения по TG и TT
          If (FrmOne.TG_PayRoll.Cells[17,i] = SQLExecute('SELECT RecipientPay FROM TemPay Where RecipientPay = "'+FrmOne.TG_PayRoll.Cell[17,i].AsString+'" '))then
   // Раскрашиваем
          frmOne.TG_PayRoll.Cell[17,i].Color := $FF00E2;

          end

end;

Re: обработка всех записей db

Наверное, это работает... Для 10 строк в таблице. И даже для 30. Но если их больше ста, то бедная база.... попробуйте убрать SQL-запрос из цикла: включите его в основной запрос для выборки данных, а результат разместите в невидимой колонке.

Визуальное программирование: блог и телеграм-канал.