Проект довольно объёмный, на Mysql.
При тестировании она работает как надо, но почему-то, как я уже сказал, иногда пользователю1 всплывает оповещение что была добавлена запись ,но ему ничего не добавлялось,а добавлялось другому пользователю2.
Подскажите, возможно нужно к коду :

if slLastAddedID.Count>0 then
             ShowMessage('Добавлено '+IntToStr(slLastAddedID.Count)+' 

Нужно привязать имя пользователя, которому это сообщение должно выводится?

Думаю это можно реализовать только с помощью SQL запроса, в котором будут два SQL запроса с объединением UNION ALL


SELECT Поле1, Поле2, Поле3
FROM
  (
  SELECT Поле1, Поле2, Поле3
  FROM TableName
  WHERE Поле3<>100
  ORDER BY Поле2 ASC, Поле1 ASC, Поле3 DESC
  )

UNION ALL

SELECT Поле1, Поле2, Поле3
FROM  TableName
WHERE Поле3=100

Это крайне проблематично, т.к сейчас результат формируется кнопкой поиск, с множеством таблиц-словарей и в целом большой таблицей.
Повторюсь, поле по которому нужно отфильтровать результат,это словарь с процентами (от 0% до 100%).
Можно ли как то просто добавить фильтр чтобы скрывать/отображать в результате записи,со заначением процента=100% ? К примеру через чекбокс?
Сейчас у меня есть фильтр со значениями в мультикомбобоксе по данному полю, но это очень неудобно выделять там все числа, кроме 100%.

Не могли бы еще раз проверить Ваш приложенный проект (Show last added records (highlight) MySQL.zip)
В целом это работает, но возникают случаи, когда пользователю всплывает оповещение при входе, что были добавлены записи, но по факту ему ничего не добавлялось.

Точнее,в процедуре Form1.onShow, для вывода текстового оповещения я добавил строчку:

if slLastAddedID.Count>0 then
             ShowMessage('Добавлено '+IntToStr(slLastAddedID.Count)+' записи(ей)' );

возможно данное условие некорректно?

4

(1 replies, posted in Russian)

Добрый день,где можно найти описания изменений с версии 3.0 ?

Спасибо.
С сортировкой первых двух пунктов все нормально. Подскажите, как сделать, чтобы строки, где процент =100%, отображались внизу таблицы. Независимо от сортировки.?

второе поле и третье поле - это тестовые поля, словари,как связанная таблица. Значения задаются через Combobox.

Добрый день, столкнулся с проблемой.
Имеются несколько полей в таблице,среди них поля:
1. Срок [поле1] (дата)
2. Приоритет [поле 2] (выскокий, низкий)
3. Процент выполнения [поле3]. (0-100%)
Подскажите, как сделать так, чтобы вверху таблицы отображались записи с высоким приоритетом, наименьшим сроком и с %<100.

Спасибо. 
То, что нужно.

Добрый день, Дмитрий.
Возможно ли сделать групповое редактирование записей таблицы? Точнее нужно выделить сразу нескольких записей таблицы и поменять одно значение у всех.
Есть ли пример реализации этого?

10

(7 replies, posted in Russian)

Только в программе. Причём на одном компьютере только.
На других пробовал все нормально.
Поэтому и решил уточнить, возможно есть возможность установить разрешение самой программы.

11

(7 replies, posted in Russian)

Дмитрий, подскажите что не так в этих двух строчках?

(CASE WHEN '{edsearch}' <> '' THEN skan.prim LIKE '%{edsearch}%'  ELSE 1=1 END) AND
(CASE WHEN '{edsearch}' <> '' THEN skan.klslovo LIKE '%{edsearch}%'  ELSE 1=1 END) AND

Работает поиск работает корректно только по одному полю из двух..

12

(7 replies, posted in Russian)

Сталкивались ли вы с проблемой смазанного отображения шрифта при высоком разрешении монитора (1920х1080) ?
Есть ли пути решения этой проблемы?

13

(7 replies, posted in Russian)

Добрый день.
Необходим поиск по всем полям таблицы - реализовал через SQL запрос. Все работает,если только для поиск используется поле Edit:

skan.prim LIKE '%{edSearch}%' OR
skan.klslovo LIKE '%{edSearch}%' or

Мне нужна еще фильтрация по дате и по комбобоксу. Добавляю строки:

(CASE WHEN {Combobox1}=-1 THEN 1=1 ELSE skan.id_aktive={Combobox1} END) OR
skan.prim LIKE '%{edSearch}%' OR
skan.klslovo LIKE '%{edSearch}%' or
skan.data >= {DateTimePicker1} or skan.data <= {DateTimePicker2}

Результат некорректный. Другими словами нужно иметь поиск по текстовым полям (будут искаться через поле EdSearch),по дате и по комбобоксу одновременно.


UPD: вроде как решилось, поправьте, если не так.

WHERE

(CASE WHEN '{edsearch}' <> '' THEN skan.prim LIKE '%{edsearch}%'  ELSE 1=1 END) AND
(CASE WHEN '{edsearch}' <> '' THEN skan.klslovo LIKE '%{edsearch}%'  ELSE 1=1 END) AND
(CASE WHEN {Combobox1} <> -1 THEN skan.id_aktive = {Combobox1} ELSE 1=1 END) AND
(CASE WHEN {DateTimePicker1} IS NOT NULL THEN date(skan.data) >= date({DateTimePicker1}) ELSE 1=1 END) AND
(CASE WHEN {DateTimePicker2} IS NOT NULL THEN date(skan.data) <= date({DateTimePicker2}) ELSE 1=1 END)

Добрый день, Дмитрий.
А как быть в случае, если пользователь добавил новую запись юзеру, который уже был "онлайн " в это время? Т. е во время активной сессии этого пользователя?

Пример не работает корректно на базе данных Mysql. Поэтому и прислал скрипт, который используется у меня сейчас, с доработками под mysql.

И повторюсь, проблема в том, что подсвечивается только одна запись, как новая. Хотя было добавлено, к примеру 3 записи. Должны светиться все 3 записи.

Ошибка пропала, но теперь подсвечиает только одну запись,как новую. Незаисимо от того,сколько их было добавлено.
Код прилагаю:

var
   sUser: string = '';
   idUser: integer = 0;
   slLastAddedID: TStringList;

procedure Form1_GridEmployees_OnChange (Sender: string);
var
    i,c, k, l: integer;
    sID: string;
begin
    c := Form1.GridEmployees.RowCount-1;
    l := Form1.GridEmployees.Columns.Count-1;

    Form1.GridEmployees.BeginUpdate;
    for i := 0 to c do
    begin
        sID := IntToStr(Form1.GridEmployees.dbIndexToID(i));

        if slLastAddedID.IndexOf(sID) > -1 then
            for k := 0 to l do
               Form1.GridEmployees.Cell[k, i].Color := clRed;

    end;
    Form1.GridEmployees.EndUpdate;

end;

procedure frmEmployee_OnShow (Sender: string; Action: string);
begin
    if Action = 'NewRecord' then frmEmployee.ComboBox1.dbItemID := idUser;
end;

procedure frmEmployee_bOK_OnClick (Sender: string; var Cancel: boolean);
begin
    // save date create of record
    if frmEmployee.dbAction='NewRecord' then
    begin
        frmEmployee.DateTimePicker1.DateTime := now;
        frmEmployee.DateTimePicker2.DateTime := now;
    end;
end;

procedure Form1_OnShow (Sender: string; Action: string);
var
    sDateLogin, sDateLogout: string;
begin
     // Initial check whether there is a database administrator user
     // if not, create an administrator with username admin and password admin
     if SQLExecute('SELECT count(id) FROM users;') = '0' then SQLExecute('INSERT INTO users (login, password) VALUES ("admin", "admin");');

     frmLogin.edPassword.PasswordChar := '*';
     frmLogin.ShowModal; // show windows for login

     // get ID of last added records to slLastAddedID
     if idUser<>0 then
     begin
         sDateLogin := SQLExecute('SELECT DATE_FORMAT(logindate,"%Y-%m-%d %H:%i:%S.%f") FROM users WHERE id='+IntToStr(idUser));
         sDateLogout := SQLExecute('SELECT DATE_FORMAT(logoutdate,"%Y-%m-%d %H:%i:%S.%f") FROM users WHERE id='+IntToStr(idUser));
         if (sDateLogin <> '') and (sDateLogout<>'') then
         begin
             slLastAddedID.Text := SQLExecute('SELECT CONCAT_WS(char(13),`id`) FROM employees WHERE ' + 'DATE_FORMAT(created,"%Y-%m-%d %H:%i:%S.%f") > "'+sDateLogout+'" AND DATE_FORMAT(created,"%Y-%m-%d %H:%i:%S.%f") < "'+sDateLogin+'"');
             Form1.GridEmployees.dbUpdate;
             if slLastAddedID.Count>0 then
             ShowMessage('Добалено '+IntToStr(slLastAddedID.Count)+' записи(ей)' );
         end;
     end;

end;

// save time of logout current user
procedure Form1_OnClose (Sender: string; Action: string);
begin
    SQLExecute('UPDATE users SET logoutdate=DATE_FORMAT(now(),"%Y-%m-%d %H:%i:%S.%f") WHERE id='+IntToStr(idUser));

    slLastAddedID.Free;

end;

procedure frmLogin_bLogin_OnClick (Sender: string; var Cancel: boolean);
var
   s: string;
begin
     // SQL query for check user and password
     s := SQLExecute('SELECT count(id) FROM users WHERE (id = ' + frmLogin.cbLogin.sqlValue + ') AND (password = ' + frmLogin.edPassword.sqlValue + ');');

     // if SQL query found login and password
     if (s <> '0') and (s<>'') then
     begin
          idUser := frmLogin.cbLogin.dbItemID;
          SQLExecute('UPDATE users SET logindate=DATE_FORMAT(now(),"%Y-%m-%d %H:%i:%S.%f") WHERE id='+IntToStr(idUser));

          sUser := frmLogin.cbLogin.Text; // remember username
          Form1.Caption := 'User: ' + sUser;
          frmLogin.Close; // close login form
     end else MessageDlg('password is incorrect', mtError, mbOk, 0); // message if the password is incorrect

end;

// window closing event for login
procedure frmLogin_OnClose (Sender: string; Action: string);
begin
     // if the user has not been defined, and the user closes the login window, then close the main form
     if sUser='' then Form1.Close;
end;

begin
     slLastAddedID := TStringList.Create;
     frmLogin.Button1.Default := True;
end.

Ошибка не пропала,к сожалению..

Спасибо, а не подскажите где здесь проблема? Данное выражение не работает  MySQL:

SQLExecute('SELECT group_concat(id, Char(13)) FROM employees WHERE ' + 'datetime(created) > datetime("'+sDateLogout+'") AND datetime(created) < datetime("'+sDateLogin+'")');

Заменил group_concat на Concat_WS,как я понял нужно еще datetime заменить на другое выражение, не подскажите синтаксис для MySQL.

Также строчку

SQLExecute('UPDATE users SET logindate=datetime(''now'', ''localtime'') WHERE id='+IntToStr(idUser));

Заменил на:

SQLExecute('UPDATE users SET logindate="'+FormatDateTime('yyyy-MM-DD hh:nn:ss.000', now)+'" WHERE id='+IntToStr(idUser));

насколько это правильно?

Добрый день,спасибо за скрипт по расскраске записей. Немного не понял как вывести это добавленное количество записей в ShowMessage, какая переменная отвечает за счетчик записей?

Ну тут именно вопрос как будет правильней и без особых трудозатрат. Подскажите, какой численный предел у значения record_count?

Буду пробовать, спасибо.
А если к примеру, я понимаю, что записей в базе будет не больше чем к примеру 1 миллион. (именно записи, которым автоматически присваивается номер в record_count при добавлении из программы)
И буду импортировать новые записи из CSV со значением record_count начиная со значения 1 000 001 и далее? А дальше вести этот список?

Вот данная тема с примером.
http://myvisualdatabase.com/forum/viewtopic.php?id=2069
Пример, где меняются строки местами и то что реализовано в моем проекте.
Для смены строк местами используется переменная Record_count. Которая назначается автоматически, когда добавляется новая запись из программы, вручную.
Какие значение задавать когда запись добавляется не вручную, а через импорт csv файла? С какого значения начинать этот счетчик, допускаются ли повторы записей с одинаковым значением record_count?

Это понятно, какие значения вписывать в csv?
Когда новая запись добавляется в ручную из программы, программа присваивает этой записи следующий по счету номер в record_count.
Как задавать эти значения при экспорте из csv файла? Повторюсь, пустым оставлять нельзя, т.к нарушается работа скрипта для смены строк местами

Проблема в том, как значения recor_count правильно задавать в таблице CSV.
Если это поле оставлять пустым в этой таблице, то потом, экспортированные записи менять местами уже не получается, чтобы нижняя запись стала нижней, а нижняя верхней.

Можно в таблице CSV по сути начать этот счетчик,к примеру с нескольких тысяч записей, но как правильно?

Добрый день, подскажите, как быть в случае если нужно экспортировать таблицу с данными, где содержится record_count. Каким образом задавать эти значения.
Используется он для случая, когда нужно менять строки местами (пример с форума, где верхняя запись становится нижней и наоборот)