Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна метода перебора выделенных строк грида 
V
    Опции темы
Kbl4AH
Дата 5.12.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



В продолжение темы "Как обновить запись в DataSet без запроса?".
Здравствуйте.
В общем, суть проблемы такова.
У меня есть таблица, из нее я выбираю записи OracleDataSet'ом и помещаю их в cxGrid для редактирования.
В cxGrid должна быть возможность удаления записей (причем возможен выбор и удаление одновременно нескольких строк), но в таблице они должны сохраняться! Поэтому я добавил в таблицу поле а-ля метку. И теперь, если в записи эта метка есть, то OracleDataSet'ом эта запись не выбирается. То есть выбираю я запись в гриде, жму Delete, в поле записи ставится метка, обновляю датасет и запись удаляется из грида:
Код

procedure TFMain.cxGrid1DBTableView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if not OracleDataSet1.Eof then
    if Key = vk_Delete then
      if MessageDlg('Удалить строку?', mtConfirmation, [mbOk,mbCancel], 0) = mrOk then
        begin
          OracleDataSet1.Edit;
          OracleDataSet1.FieldValues['del_flag'] := '-';
          OracleDataSet1.Post;
          OracleDataSet1.Refresh;
        end;
end;

Только это некорректно работает при выделении нескольких записей - удаляется только та, которая была выделена последней, причем она может быть в выделенном списке на любой позиции, также возможны не выделенные строки между выделенными при выделении с использованием Ctrl.
Кажется, что нужно вогнать вышеприведенный кусок кода в цикл, количество выполнений которого равно количеству выделенных строк.
Возникает проблема в том, чтобы поставить курсор на 1-ю выделенную строку, потом на следующую и так до конца.
В общем, самому ни в жизнь не справиться.
Помогите, пожалуйста.
PM MAIL ICQ   Вверх
Vas
Дата 5.12.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Вот типа так
Код

vas
   SavePlace:TBookmark;
...
...
...
    with DBGridNowError.DataSource.DataSet do
      begin
        try
          SavePlace:=GetBookmark;
          for i:=0 to DBGridNowError.SelectedRows.Count-1 do
            begin
              GotoBookmark(pointer(DBGridNowError.SelectedRows.Items[i]));
              if FieldByName('C_SROK').AsFloat>0 then     //проврка на сверхсрока, если >0 то печатаем к номеру телефона '*'
                StrNumber:='*'+FieldByName('Dfnumber').AsString
              else
                StrNumber:=FieldByName('Dfnumber').AsString;              
              CharToOem(PChar(Otstup+'|'+AddCharL(' ',StrNumber,7)+
                       '|'+AddCharR(' ',FieldByName('AB_Fullname').AsString,41)+
                       '|'+AddCharR(' ',FieldByName('Street').AsString,16)+
                       '|'+AddCharR(' ',FieldByName('Dfhouse').AsString,4)+
                       '|'+AddCharR(' ',FieldByName('Dfflat').AsString,3)+
                       '|'+AddCharR(' ',FieldByName('Grom_line').AsString,10)+
                       '|'+AddCharR(' ',FieldByName('Date_error').AsString,17)+
                       '|'+AddCharR(' ',FieldByName('Prim').AsString,5)+
                       '|'+AddCharR(' ',FieldByName('On_err').AsString,5)+
                       '|          |'), StrOem);
              OutStr(StrOem);
            end; //for
          GotoBookmark(SavePlace);
        finally
          FreeBookmark(SavePlace);
        end; //try ... finally
      end; //with
...
...
...


Добавлено через 1 минуту и 36 секунд
P.S. вместо vas в примере естественно var  smile 


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Kbl4AH
Дата 5.12.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Вроде правильно перекопировал:
Код

procedure TFMain.cxGrid1DBTableView1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  I: Integer;
  SelStr: TBookmark;
begin
  if not OracleDataSet1.Eof then
    if Key = vk_Delete then
      if MessageDlg('Удалить строку?', mtConfirmation, [mbOk,mbCancel], 0) = mrOk then
        with OracleDataSet1 do
          begin
            try
              SelStr := GetBookmark;
              for I := 0 to cxGrid1DBTableView1.Controller.SelectedRowCount - 1 do
                begin
                  GotoBookmark(Pointer(cxGrid1DBTableView1.Controller.SelectedRows[I]));
                  Edit;
                  FieldValues['del_flag'] := '-';
                  Post;
                end;
              GotoBookmark(SelStr);
            finally
              FreeBookmark(SelStr);
            end;
            Refresh;
          end;
end;

В выделенной строке выдает ошибку "Bookmark not found" smile 

Это сообщение отредактировал(а) Kbl4AH - 5.12.2008, 14:53
PM MAIL ICQ   Вверх
Vas
Дата 5.12.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Видимо проблема в самом cxGrid, с DBGrid все работает на ура


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Kbl4AH
Дата 5.12.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(Vas @ 5.12.2008,  16:02)
Видимо проблема в самом cxGrid, с DBGrid все работает на ура

Вы правы.
DBGrid1.SelectedRows.Items[i] - типа TBookmarkList,
а cxGrid1DBTableView1.Controller. SelectedRows[I] - TcxGridTableController...
И как быть?
PM MAIL ICQ   Вверх
Vas
Дата 5.12.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Читать документацию на cxGrid

Добавлено через 56 секунд
А у SelectedRows вашего грида нет свойства Items?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Kbl4AH
Дата 5.12.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(Vas @ 5.12.2008,  17:36)
Читать документацию на cxGrid

Добавлено @ 16:37
А у SelectedRows вашего грида нет свойства Items?

Я по-аглицки не понимаю:( А на русском что-нибудь, по-моему, она есть так же как и панацея... То есть ее нет(((
Вроде бы по аналогии есть
DBGridNowError.SelectedRows.Count      -       cxGrid1DBTableView1.Controller.SelectedRowCount
DBGridNowError.SelectedRows.Items[I]   -       cxGrid1DBTableView1.Controller.SelectedRows[I]
По крайней мере они один и тот же результат дают... Вроде бы...
PM MAIL ICQ   Вверх
Akella
Дата 7.12.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Первое - это нужно понять разницу между rows и records, второе - это знать, для чего viewdata, а для чего viewinfo, третье - это для чего controller, а для чего datacontroller. Ну и уметь работать со всем этим гамузом.  smile

Добавлено @ 16:54
Учесть тот факт, что грид может быть отсортирован, сгруппирован и отфильтрован.

Добавлено @ 16:55
Причм независимо от самого набора данных, к которому грид подключен.

Добавлено @ 16:56
Вот несколько примеров:
Код

procedure TfmMain.actAddDateToDatasExecute(Sender: TObject);
Var
 sDatas: string;
 i: integer;
begin
//Добавляем дату к списку дат
  if (not dbgReklama.DataController.DataSet.Active) or (dbgReklama.ViewData.RecordCount <= 0)  then exit;

  fmSelDate := TfmSelDate.Create(self);
  fmSelDate.cxDateEdit1.EditValue := Date;

  try
    if fmSelDate.ShowModal = mrOk then begin
      for i := 0 to dbgReklama.DataController.GetSelectedCount - 1 do begin
        sDatas := dbgReklama.Controller.SelectedRows[i].Values[dbgReklamaDATAS.Index];
        //если такая дата уже присутствует в списке дат, то пропускаем
        if G_PosStr(DateToStr(fmSelDate.cxDateEdit1.EditValue), sDatas) <> 0 then continue;

        DM.SP_ADD_DATE_TO_DATAS.ParamByName('IN_DATE').AsString  := fmSelDate.cxDateEdit1.EditValue;
        DM.SP_ADD_DATE_TO_DATAS.ParamByName('IN_ID').AsInteger := dbgReklama.Controller.SelectedRows[i].Values[dbgReklamaID.Index];
        DM.SP_ADD_DATE_TO_DATAS.ExecProc;
      end;//for

      if DM.SP_ADD_DATE_TO_DATAS.Transaction.InTransaction then
        DM.SP_ADD_DATE_TO_DATAS.Transaction.Commit;

      actUpdateExecute(nil);
    end;//if fmSelDate.ShowModal = mrOk then begin
  finally
    Freel(fmSelDate);
  end;//Try
end;


Код

procedure TfmMain.actSetDeletedExecute(Sender: TObject);
Var
 sId:string;
 i:integer;
begin
//установить метку на удаление
  if (not dbgReklama.DataController.DataSet.Active) or (dbgReklama.DataController.DataSet.RecordCount <= 0)  then exit;

  try
    for i := 0 to dbgReklama.ViewData.RecordCount - 1 do begin
      if dbgReklama.ViewData.Records[i].Selected then begin
        sID := IntToStr(dbgReklama.ViewData.Records[i].Values[dbgReklamaID.Index]);
        DM.dbJDN.Execute('execute procedure SP_SET_DELETED('+ sID + ')');
      end;
    end;
  finally
    actUpdateExecute(nil);
  end;
end;



Добавлено @ 16:56
Код

procedure TfmMain.actRowDeleteExecute(Sender: TObject);
begin
//физическое удаление выделенных записей
  if (not dbgReklama.DataController.DataSet.Active) or (dbgReklama.DataController.DataSet.RecordCount <= 0)  then exit;
  
  if MessageBox(self.Handle, PAnsiChar('Удалить выделенные строки навсегда?'), PAnsiChar('Внимание'), mb_YesNo + MB_ICONINFORMATION) = IDYES then
   cxGrid1.ActiveView.DataController.DeleteFocused;// DeleteSelection;
end;


Это сообщение отредактировал(а) Akella - 7.12.2008, 16:57
PM MAIL   Вверх
Kbl4AH
Дата 8.12.2008, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(Akella @ 7.12.2008,  17:53)
Первое - это нужно понять разницу между rows и records, второе - это знать, для чего viewdata, а для чего viewinfo, третье - это для чего controller, а для чего datacontroller. Ну и уметь работать со всем этим гамузом.  smile

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

Причм независимо от самого набора данных, к которому грид подключен.

Понимать-то, вроде, понимаю: records, datacontroller - это работа с самим набором данных, а rows, controller - работа с отображением набора данных в гриде. Правильно?
Факт сортировки учитываю.
А вот "уметь работать с этим гамузом" smile  получается хуже, тяжело и долго... А что за viewdata и viewinfo?
Спасибо! Примеры ваши посмотрел, немного помогли (только как-то сложно все)...
Остановился на следующем (нужна была оказывается всего одна строка):
Код

procedure TFMain.cxGrid1DBTableView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  I: Integer;
begin
  if not OracleDataSet1.Eof then
    if Key = vk_Delete then
      if MessageDlg('Удалить строку?', mtConfirmation, [mbOk,mbCancel], 0) = mrOk then
        for I := 0 to cxGrid1DBTableView1.Controller.SelectedRowCount - 1 do
          begin
            cxGrid1DBTableView1.Controller.FocusedRecordIndex := cxGrid1DBTableView1.Controller.SelectedRows[I].Index;
            // а еще лучше вместо cxGrid1DBTableView1.Controller.FocusedRecordIndex просто - OracleDataSet1.RecNo
            OracleDataSet1.Edit;
            OracleDataSet1.FieldValues['del_flag'] := '-';
            OracleDataSet1.Post;
          end;
        OracleDataSet1.Refresh;
end;


Это сообщение отредактировал(а) Kbl4AH - 8.12.2008, 09:55
PM MAIL ICQ   Вверх
Akella
Дата 9.12.2008, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Kbl4AH @  8.12.2008,  09:54 Найти цитируемый пост)
 OracleDataSet1.Refresh;

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

Добавлено через 1 минуту и 6 секунд
Код

      if MessageDlg('Удалить строку?', mtConfirmation, [mbOk,mbCancel], 0) = mrOk then begin
        for I := 0 to cxGrid1DBTableView1.Controller.SelectedRowCount - 1 do
          begin
            cxGrid1DBTableView1.Controller.FocusedRecordIndex := cxGrid1DBTableView1.Controller.SelectedRows[I].Index;
            // а еще лучше вместо cxGrid1DBTableView1.Controller.FocusedRecordIndex просто - OracleDataSet1.RecNo
            OracleDataSet1.Edit;
            OracleDataSet1.FieldValues['del_flag'] := '-';
            OracleDataSet1.Post;
          end;
        OracleDataSet1.Refresh;
      end;//if MessageDlg('Удалить строку?', mtConfirmation, [mbOk,mbCancel], 0) = mrOk then begin

PM MAIL   Вверх
Kbl4AH
Дата 9.12.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(Akella @ 9.12.2008,  01:12)
выполняй обновление только если пользователь ответил положительно, а то получается у тебя так, что обновление происходит даже если нажать отмена

Верно подмечено smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.