Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Непослушные ячейки  (Прочитано 3399 раз)

pavel.sheva

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Непослушные ячейки
« : 17 Августа 2022, 14:52:42 »
Всем доброго дня, столкнулся с вот такой вот проблемкой, по закрашиванию строк по условию временного интервала... в первом случай закрашивается только одна строка, в другом только один столбец со временем, как исправить? где затуп?

а и вот что еще, прекрасно понимаю, что можно сделать выборку и через between в SQL , так что sql-решения не предлагать), так как в различных табличках я не буду знать наверняка название столбца со временем, а так идет поиск по всей таблицы после запроса, возможно сделаю после этого вызов SQL запроса на Between, зная в каком столбце находятся ячейки с датой(конечно-же программно), а сам я наверняка знать так и не буду) 
« Изменён: 18 Августа 2022, 11:19:41 от Simple-Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Непослушные ячейки
« Ответ #1 : 18 Августа 2022, 01:55:26 »
     Здравствуйте.

  "Затупы":
1. Граничные значения индексов ячейки - [0..*Count-1];
2. Собственно алгоритм, который может быть таким:
 - поиск индекса столбца с датой по первой строке;
 - внешний цикл - перебор строк, вычисление цвета по значению времени из столбца с датой;
 - внутренний цикл - закраска ячеек в выбранной строке.
Код: (delphi)
var i,j,k:integer;
    sqldate:TDateTime;
    cellcolor:Cardinal;
begin
  with Table1 do begin
    if RowCount < 2 then exit;  // пустая таблица
    k:=-1;
    for j:=0 to ColumnsCount-1 do          // поиск первого столбца с датой
      if SecondsBetween(NOW,strtodateTime(GetCell(j,1).Text)) > 2 then begin
        k:=j;
        break;
      end;
    if k < 0 then exit;

    for i:=1 to RowCount-1 do
      begin
        sqldate:=strtodateTime(GetCell(k,i).Text);    // дата-время в текущей строке
        if (Date1box1.AsDateTime < sqldate) and (sqldate < Date2box1.AsDateTime) then cellcolor:=clGreen  // цвет по условию
        else cellcolor:= clRed;
        for j:=0 to ColumnsCount-1 do GetCell(j,i).Color:=cellcolor;   // расскрас строки
      end;
  end;
end.
На всякий случай - условия проверки "... или равно" определяют вхождение соответствующей границы в заданную область.
Пример во вложении.   

pavel.sheva

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Непослушные ячейки
« Ответ #2 : 18 Августа 2022, 10:42:59 »
Добрый день, скрипт в принципе годный, если бы не одно но, функция StrToDatetime и поиск времени, в общем реализовать задуманное не получиться в силу того что, в каждой ячейке данные хранятся в str типе - и это изначально было обречено на провал, в общем вкратце: при поиске даты, происходит что? Правильно, ячейка с индексом j,1 сразу же становиться данными для sqldate(StrToDatetime ), и так как идет преобразование через  secondbetween,  сама sqldate становиться хранилищем для динозавров 1899 года, ну и понятное дело что закрас пойдет только по else части условия... Не круто. Если только делать проверку, на нормальную разницу в годах через yearsbetween, может быть что-то и выйдет, или сделать проверку на соответствие года, аля *Если в ячейке переведенные данные ДТ < 01.01.2022, то скипнуть ее*(но опять же, это уже не универсально), хотя тоже не плохо...
« Изменён: 18 Августа 2022, 11:17:17 от Simple-Scada »

pavel.sheva

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Непослушные ячейки
« Ответ #3 : 18 Августа 2022, 11:08:43 »
Да все получилось по второму способу, берите эту проверочку на заметочку!) ;) Можно в принципе сделать и ручной ввод данных через field
Код: (delphi)
var i,j,k:integer;
    sqldate:TDateTime;
    cellcolor:Cardinal;
begin
  with Table1 do begin
    if RowCount < 2 then
    exit;  // пустая таблица
    k:=-1;
    for j:=0 to ColumnsCount-1 do          // поиск первой строки с датой
      if (strtodateTime(GetCell(j,1).Text) > strTODateTime('01.01.2022 00:00:00')) then
      begin
        k:=j;
        break;
      end;
    if k < 0 then
    begin
      exit;
      end;
    for i:=1 to RowCount-1 do
      begin
        sqldate:=strtodateTime(GetCell(k,i).Text);    // дата-время в текущей строке
          if (Date1box1.AsDateTime < sqldate) and (sqldate < Date2box1.AsDateTime)
            then
              cellcolor:=clGreen  // цвет по условию
            else
              cellcolor:= clRed;
            for j:=0 to ColumnsCount-1 do
              GetCell(j,i).Color:=cellcolor;   // расскрас строки
      end;
  end;
    //ShowMessageClient(getclientname(),'asf',DateTimeToStr(sqldate));
end.
   
« Изменён: 18 Августа 2022, 13:02:59 от pavel.sheva »

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Непослушные ячейки
« Ответ #4 : 19 Августа 2022, 05:59:47 »
   Здравствуйте.

При ближайшем рассмотрении функции StrToDateTime оказалось, что всегда можно подобрать её аргумент так, что результат  будет очень похож на настоящий:

5    -> 30.12.1899 05:00:00
5.3 -> 05.03.2022 00:00:00      привет условие strtodateTime(GetCell(j,1).Text) > strTODateTime('01.01.2022 00:00:00')  :-\

так что нужно дополнительное условие или условия.

Либо ограничить круг возможных структур таблиц и выбрать алгоритм поиска индекса столбца сравнения, как-то:
  Прямые алгоритмы - информация из таблицы БД:
1. фиксированный, например 0, что для разных таблиц может быть скорректировано видом SQL-запроса.
2. по информации о структуре таблицы, включающей имена и типы столбцов, например стандартное имя столбца.
3. информация о столбце, размещаемая в комментарии к таблице. 
  Косвенные алгоритмы - анализ данных из таблицы Simple-Scada (борьба со следствием):
4. Поиск подходящей по формату время-дата ячейки в первой строке таблицы с дополнительными условиями, причем эти действия могут выполняться однократно после загрузки таблицы из БД.


« Изменён: 19 Августа 2022, 06:27:11 от pan2000 »

pavel.sheva

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Непослушные ячейки
« Ответ #5 : 19 Августа 2022, 11:28:02 »
Добрый день, может я что-то не так понял, но по-моему:
-датасет формируется двумя полями данных и названий, и проблема в том, что уже на этом этапе, тип данных - str, SQL запрос это класс конечно, но бывают такие ситуации когда человеку из набора данных таблицы нужно увидеть их, а уже потом только отфильтровать(например та же закраска), а потом еще и преобразовать это дело...Что бы вместо условных 10000 строк было по меньше на условиях фильтрации...(Я уже это реализовал, могу поделиться)

По именам столбцов... Вариант, но если ты работаешь с новой табличкой в бд, с которой ты не особо знаком, то только методом тыка узнать какой столбец DT(т.к его могут обозвать и t, dt, job_time, etc.) поэтому это не рациональный поиск,

По поводу комментариев, не все разработчики мнемосхем добросовестные, хотя и составляется документ, по управление всей громадной красотой... Даже все-равно в процессе работы предприятие, захочет расширить свой де-скать производящий потенциал, и при создании новой таблицы, если это делаешь не ты - то может получиться и так, что ты знать о ней будешь ничего кроме названия... хоть это и мелочи, и можно все самому быренько посмотреть, если знать где искать, но все же это лишнее время)))

Косвенный Алгоритм, наверное все же оптимальный, данные в табличку пришли, кнопочку нажал, вот у тебя и обработано все, единственное, что плохо - это время выполнения такой процедуры... Но кстати говоря по-моему у таблиц SS есть ограничения на строки, правда я их не считал... но прекращение отображения данных после 17 числа, подтверждают это... 
« Изменён: 19 Августа 2022, 12:22:09 от Simple_Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 226
    • Просмотр профиля
Re: Непослушные ячейки
« Ответ #6 : 19 Августа 2022, 14:58:34 »
   Здравствуйте.

 Т.е. задача формулируется примерно так: "Просмотр и анализ архивных таблиц произвольного состава, упорядоченных по времени". С конечным результатом - универсальный просматриватель таблиц.

Получить информацию о столбцах стандартной таблицы (возможно уже устарела):
mysql> DESC messages;
+-------+------------------+------+-----+---------+-------+
| Field   | Type                | Null   | Key | Default | Extra |
+-------+------------------+-------+-----+---------+-------+
| t        | timestamp(3)     | NO   | PRI | NULL    |       |
| gid     | int(10)              | NO   | PRI | 0       |       |
| mid    | int(10) unsigned | NO   | PRI | 0       |       |
| k       | tinyint(4)           | NO    |     | 0       |       |
| v       | varchar(255)      | YES  |     | NULL    |       |
| r       | timestamp(3)      | YES  |     | NULL    |       |
| c       | timestamp(3)      | YES  |     | NULL    |       |
| uid    | int(10)                | YES  |     | NULL    |       |
+------+------------------+------+-----+---------+-------+
8 rows in set (0.01 sec)
Столбец сравнения (в данном случае - t) определяется полями Type=timestamp и Key=PRI.
Запрос SELECT t,gid,mid,k,v,r,c,uid FROM messages;  выдаст столбец сравнения первым, даже если в таблице он не был первым.

Собственно об отображении таблицы. Подготовить объект таблица с большим количеством столбцов, например 16. Тогда к условию задачи добавится ограничение " с количеством столбцов 16 включительно".
Для таблицы можно ввести невидимость пустых (правых) столбцов и/или горизонтальный скроол.
Содержимое отдельной ячейки, особенно если весь текст не вошел в поле ячейки, можно просматривать в отдельной строке.
Возможна селекция и изменение порядка просмотра столбцов, в том числе и для таблиц с большим количеством столбцов.

Полный простор фантазии, скажем отдельная БД для классификация таблиц, хранения последнего режима просмотра и т.д.
« Изменён: 19 Августа 2022, 17:29:52 от Simple-Scada »

pavel.sheva

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Непослушные ячейки
« Ответ #7 : 19 Августа 2022, 15:17:04 »
Ну скажем-с это написать сможете вы или я, или еще кто-нибудь, кто хотя бы сталкивался с этим, вы не забывайте, что у монитора SCADA сидит рядовой юзер предприятия, и мб он не особо разбирается в SQL, + ко всему, вы так или иначе, проводите относительно хлопотные действия, а в моем случае, если автоматизация - то по MAX! (Вообще по уму, можно просто на кнопочки натыкать SQL запросы, кнопочки для фильтрации ясен пень, и на преобразование таблицы), но кол-во элементов мб большим, по этому проще оставить подсказку о работе с MySQL, куда тыкнуть и всо...  В любом случае должен быть авто поиск по ячейкам хоть и долгий, чем каждый раз прописывать:
Цитировать
Запрос SELECT t,gid,mid,k,v,r,c,uid FROM messages;  выдаст столбец сравнения первым, даже если в таблице он не был первым.

Говорю ж не всегда может быть известна структура таблицы, а найти нужный столбец надо быренько, а и мб вы меня не много правильно поняли, юзер работает c SS и у меня там есть как таковая возможность работы с SQL :) с ограниченным функционалом :D
« Изменён: 19 Августа 2022, 15:23:40 от Simple_Scada »

pavel.sheva

  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Re: Непослушные ячейки
« Ответ #8 : 19 Августа 2022, 15:18:37 »
Но за помощь со скриптом для раскраски таблички вам большое спасибо! Держите мб вам там что-нибудь покажется интересным!
« Изменён: 19 Августа 2022, 15:24:52 от pavel.sheva »