Topic: Вопрос по обновлению таблицы.

Добрый день!
Снова нужна Ваша помощь. Суть такова:
Есть таблица Заказчики. Когда добавляю в базу новую запись, то по скрипту происходит обновление Грида который показывает все записи таблицы.
Если запустить ехе-файл на 2 компах одновременно, и работать с 1 базой по сети, то при добавлении записи в базу на 1 компе, то обновление на 2 компе не происходит, (что бы Грид обновился нужно совершить какое-либо событие). Так вот суть вопроса, можно ли каким либо образом сделать так что бы запись созданная на 1 компе, сразу показывалась на других компах бех совершения каких либо действий.
На данный момент эту проблему я обошел с помощью таймера (на главной форме есть Едит где автоматически идет время с интервалом в 1 секунду, так вот при изменении этого Едита (событие ОнКлик) обновляются все базы которые используются прогой. Но тут есть проблема, если количество отображаемых записей больше чем высота Грида, то через каждую секунду Грид при обновлении показывает первые записи из таблицы, ползунок автоматом уходит вверх.)
А возможно ли это сделать каким-то образом без таймера.
Есть ещё вариант с с изменением положения курсора мышки, но скорее всего в Гриде все равно будут показываться первые записи из таблицы.

Re: Вопрос по обновлению таблицы.

Допустил ошибку - так вот при изменении этого Едита (событие ОнКлик) - событие ОнЧайндж

Re: Вопрос по обновлению таблицы.

К сожалению тут без таймера не обойтись, попробуйте перед обновлением таблицы, запоминать выделенную строку, а после обновления снова ее выделять,


var
   i: integer;
begin
  i := Form1.TableGrid1.SelectedRow; // запоминаем номер выбранной  строки
  Form1.TableGrid1.dbUpdate; // обновление грида
  Form1.TableGrid1.ScrollToRow(i); // скролим, чтобы было видно выбранную строку
  Form1.TableGrid1.SelectedRow := i; // восстанавливаем выделение выбранной строки

но постоянно обновлять грид конечно не лучшее решение, можно завести глобальную переменную, в которой будем хранить последний добавленный id записи, который можем узнать воспользовавшись функцией:
Last_Insert_id(TableName: string): integer


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

Dmitry.

Re: Вопрос по обновлению таблицы.

Добрый день!
В общем я пошел немного другим путем.
в таймере я сравнил колчество записей в самой базе и количество записей в гриде, если они не равны то выполняется обновление базы.
А вот по тому что в Гриде ползунок (вертикальный) уходит вверх я ошибся, выделенная запись остается так же выделенной и она остается на месте, ползунок (вертикальный) тоже остается на месте, сдвигается в право только ползунок горизонтальный если столбцов больше или они шире чем границы Грида, но это уже думаю не такая уж и большая проблема. Отвлекает но неудобств не вызывает.

Re: Вопрос по обновлению таблицы.

DriveSoft wrote:

К сожалению тут без таймера не обойтись, попробуйте перед обновлением таблицы, запоминать выделенную строку, а после обновления снова ее выделять,


var
   i: integer;
begin
  i := Form1.TableGrid1.SelectedRow; // запоминаем номер выбранной  строки
  Form1.TableGrid1.dbUpdate; // обновление грида
  Form1.TableGrid1.ScrollToRow(i); // скролим, чтобы было видно выбранную строку
  Form1.TableGrid1.SelectedRow := i; // восстанавливаем выделение выбранной строки

но постоянно обновлять грид конечно не лучшее решение, можно завести глобальную переменную, в которой будем хранить последний добавленный id записи, который можем узнать воспользовавшись функцией:
Last_Insert_id(TableName: string): integer


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

Это если в базу только добавляется запись.
Ситуация следующая:
все id в базу у меня заносятся с предварительной проверкой на уникальность, то есть, если одновременно работают 2 сотрудника с разных компов, то определение и присвоение id новой записи в базу идет в момент нажатия на кнопку, что бы не было повторений. В связи с этим, если на 1 компе удаляется запись, то это событие в процедуре описанной Вами уже не выявит разницу между существующей id последней записи и новой якобы введенной, и таблица в гриде у других пользователей не обновится, так как последний введенный id будет равен глобальной переменной. Поэтому я решил сравнивать количество записей в гриде и базе. Но вот что будет если я буду создавать выборку по базе в Гриде пока не испытал.

Re: Вопрос по обновлению таблицы.

К этому:
"Но вот что будет если я буду создавать выборку по базе в Гриде пока не испытал."

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

Спасибо большое за направление хода мыслей. Вроде разобрались и вопросов пока нет.