1 (edited by Jbanchic 2020-10-28 14:05:51)

Topic: Одновременное редактирование нескольких записей в таблице

Здравствуйте.
Есть следующая проблема.
Есть таблица с данными. И необходимо выделить несколько записей для изменения одного значения одинакового для всех выбранных записей.

Мультиселект делается по мануалу:

Form1.edGrid.Options := Form1.edGrid.Options + goMultiSelect;  

Далее нажимается кнопка и открывается форма редактирования записи, но редактируется только последняя из выбранных.
Подскажите как можно выполнить задачу редактирования одного параметра в нескольких выбранных записях одновременно?
Спасибо.

Re: Одновременное редактирование нескольких записей в таблице

This works for me, I have it in the button_OnAfterClick event.

У меня это работает, у меня это в событии button_OnAfterClick

procedure Form1.............
var
count, indx : integer;

count := Form1.edGrid.RowCount -1;

for indx := 0 to count do
begin
     if Form1.edGrid.Selected[indx] then
     begin
           your edit code here
      
     end;
end; 
On a clear disk you can seek forever

3 (edited by Jbanchic 2020-10-29 10:33:00)

Re: Одновременное редактирование нескольких записей в таблице

CDB wrote:

This works for me, I have it in the button_OnAfterClick event.

У меня это работает, у меня это в событии button_OnAfterClick

           your edit code here
 

Начальная часть понятна. Не понятно каким образом в нескольких записях базы данных внести одинаковое значение только в одном параметре? К примеру, есть имена 100 людей и некоторых из них нужно добавить в одну группу. Название группы заведено. Типовые инструменты My Visual DataBase позволяют назначить группу только кому-то одному за один раз. Как группу задать одновременно для выбранных людей?

Re: Одновременное редактирование нескольких записей в таблице

procedure Form2_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
i,:integer;
begin
  for i:=0 to Form1.TableGrid1.RowCount-1 do
     if  Form1.TableGrid1.Row[i].Selected then
         SQLExecute('UPDATE q SET qq="'+ Form2.Edit1.Text +'" WHERE id='+IntToStr(Form1.TableGrid1.dbIndexToID(i)));

  UpdateDataBase('q');
  Form1.TableGrid1.dbUpdate;
  Form2.Close;
end;
Post's attachments

Attachment icon test.rar 4.48 kb, 256 downloads since 2020-10-29 

5 (edited by Jbanchic 2020-10-29 13:11:52)

Re: Одновременное редактирование нескольких записей в таблице

sibprogsistem wrote:

...

SQLExecute('UPDATE q SET qq="'+ Form2.Edit1.Text +'" WHERE id='+IntToStr(Form1.TableGrid1.dbIndexToID(i)));

Спасибо. Я так понимаю, что приведенный пример позволяет обновлять значения параметра в таблице напрямую. Подскажите как быть в случае вложенной (связанной) таблицы? На главной таблице есть параметр связи с вложенной. Мне нужно поменять значение параметра в основной таблице на основе данных из вложенной.
И второй вопрос. Как быть если данные берутся не из текста, а из комбика?

6 (edited by sibprogsistem 2020-10-29 18:51:32)

Re: Одновременное редактирование нескольких записей в таблице

Jbanchic wrote:
sibprogsistem wrote:

...

SQLExecute('UPDATE q SET qq="'+ Form2.Edit1.Text +'" WHERE id='+IntToStr(Form1.TableGrid1.dbIndexToID(i)));

Спасибо. Я так понимаю, что приведенный пример позволяет обновлять значения параметра в таблице напрямую. Подскажите как быть в случае вложенной (связанной) таблицы? На главной таблице есть параметр связи с вложенной. Мне нужно поменять значение параметра в основной таблице на основе данных из вложенной.
И второй вопрос. Как быть если данные берутся не из текста, а из комбика?

не понял, что значит вложенная, видимо связанная, тогда нужно указать

SQLExecute('UPDATE связанная_таблица SET имя_поля="'+ Form2.Edit1.Text +'" WHERE id_имя_таблицы_с_которой_связали='+IntToStr(Form1.TableGrid1.dbIndexToID(i)));

можно получить просто текст из комбобокса Form2.ComboBox1.Text

Re: Одновременное редактирование нескольких записей в таблице

sibprogsistem wrote:
Jbanchic wrote:
sibprogsistem wrote:

...

SQLExecute('UPDATE q SET qq="'+ Form2.Edit1.Text +'" WHERE id='+IntToStr(Form1.TableGrid1.dbIndexToID(i)));

Спасибо. Я так понимаю, что приведенный пример позволяет обновлять значения параметра в таблице напрямую. Подскажите как быть в случае вложенной (связанной) таблицы? На главной таблице есть параметр связи с вложенной. Мне нужно поменять значение параметра в основной таблице на основе данных из вложенной.
И второй вопрос. Как быть если данные берутся не из текста, а из комбика?

не понял, что значит вложенная, видимо связанная, тогда нужно указать

SQLExecute('UPDATE связанная_таблица SET имя_поля="'+ Form2.Edit1.Text +'" WHERE id_имя_таблицы_с_которой_связали='+IntToStr(Form1.TableGrid1.dbIndexToID(i)));

можно получить просто текст из комбобокса Form2.ComboBox1.Text

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

SQLExecute('UPDATE person SET id_firms='+ IntToStr(firmAbonent.chFirm.dbItemID) +' WHERE id='+IntToStr(Form1.edGrid.dbIndexToID(i)));

8 (edited by senseyesenseye1983 2022-09-06 04:13:23)

Re: Одновременное редактирование нескольких записей в таблице

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

Вот скрипт:
procedure ChangeValues(value: boolean);
var
i,c: integer;
  s: string;
begin
    if value then s := '1' else s := '0';
    c := Form1.TableGridMasters.RowCount-1;
    for i := 0 to c do
    begin
        if Form1.TableGridMasters.Selected (i) then
        begin
        SQLExecute('UPDATE bsm_off SET Vidali = '+s + ' WHERE id='+IntToStr(Form1.TableGridMasters.dbIndexToID(i)));
        end;
    end;
    Form1.TableGridMasters.dbUpdate;
end;
procedure Form1_bVidali_OnClick (Sender: TObject; var Cancel: boolean);
begin
ChangeValues(True);
end;

Re: Одновременное редактирование нескольких записей в таблице

procedure ChangeValues(value: boolean);
var
i,c: integer;
  s: string;
  Row:integer;
begin
    if value then s := '1' else s := '0';
    c := Form1.TableGridMasters.RowCount-1;
    for i := 0 to c do
    begin
        if Form1.TableGridMasters.Selected (i) then
        begin
        SQLExecute('UPDATE bsm_off SET Vidali = '+s + ' WHERE id='+IntToStr(Form1.TableGridMasters.dbIndexToID(i)));
        end;
    end;
    Row := Form1.TableGridMasters.SelectedRow; // запомнить выбранную строку
    Form1.TableGridMasters.dbUpdate;
    Form1.TableGridMasters.SelectedRow := Row; // восстановить выбранную строку
end;
Визуальное программирование: блог и телеграм-канал.

Re: Одновременное редактирование нескольких записей в таблице

k245 Душевно smile

Re: Одновременное редактирование нескольких записей в таблице

senseyesenseye1983 wrote:

k245 Душевно smile

Вот так сразу и не пойму - то ли работает всё как надо, то ли это сарказм smile

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