Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Групповое редактирование выбранных строк в ДБГриде


Страницы:   1 2

lesstab ©   (2011-10-02 16:39:00) 

Надо разом редактировать (программно) выбранные (выделенные)  в ДБГриде строки.
Это не возможно, да?


lesstab   (2011-10-10 10:54:00) [1]


> У тебя в выборке четыре таблицы с одноименным полем,



> тупой программист


Спасибо за урок. Если бы, Вы сразу же сказали, что надо пользоваться псевдонимами, было бы еще лучше.


Медвежонок Пятачок   (2011-10-03 14:08:00) [2]

Над чем мне поразмышлять?

Представь что фильтруешь ты сам (ты стал датасетом).
У тебя в выборке четыре таблицы с одноименным полем, а тупой программист просит тебя отфильтровать выборку по неуникальному имени поля, не уточняя по какому именно.
Ты берешь первое попавшееся и фильтруешь.
Результат - пустая выборка.


lesstab   (2011-10-03 13:58:00) [3]


> Слабо верится. А версия delphi какая?

Delphi 6.

Ega23, Ваш код сработал подобающе, но после того, как убрал LEFT JOIN из SELECT запроса.


Ega23   (2011-10-03 13:51:00) [4]


> Тут, если убирать pointer получаю ошибку:
> Incompatible types: 'String' and 'Pointer'


Слабо верится. А версия delphi какая?


lesstab   (2011-10-03 13:47:00) [5]


> Медвежонок Пятачок ©   (03.10.11 13:26) [20]
>
> что и требовалось доказать.
> здесь есть, а там нету.

Вы правы. Но, что делать, чтобы и там тоже был. Над чем мне поразмышлять?


lesstab   (2011-10-03 13:43:00) [6]

Ega23, вот Ваш код:

procedure TForm19.Button1Click(Sender: TObject);
var
i: Integer;
bm: TBookmark;
begin
ClientDataSet1.DisableControls;
try
  bm := ClientDataSet1.GetBookmark;

  for i := 0 to DBGrid1.SelectedRows.Count - 1 do
  begin
    ClientDataSet1.GotoBookmark(DBGrid1.SelectedRows[i]);
    ClientDataSet1.Edit;
    ClientDataSet1.FieldByName('Field1').AsInteger := ClientDataSet1.FieldByName('Field1').AsInteger + 1000;
    ClientDataSet1.Post;
  end;

  ClientDataSet1.GotoBookmark(bm);
  ClientDataSet1.FreeBookmark(bm);
  DBGrid1.SelectedRows.Clear;

finally
  ClientDataSet1.EnableControls;
end;
end;


Вот мой:

procedure TformFundPage.actSetTeacherExecute(Sender: TObject);
var
  SelectedSubjectCount : integer;
  SP : TBookmark;
begin
    SelectedSubjectCount := dgrdFund.SelectedRows.Count;
    formSetTeacher := TformSetTeacher.Create(Self);
    formSetTeacher.ShowModal;
    if formSetTeacher.ModalResult = mrOK then
    begin
         datamodul.qryFund.DisableControls;
         SP := datamodul.qryFund.GetBookmark;

         for i := 0 to dgrdFund.SelectedRows.Count-1 do
         begin
             datamodul.qryFund.GotoBookmark(pointer(dgrdFund.SelectedRows[i]));
             datamodul.qryFund.Edit;
             datamodul.qryFund.FieldByName('Teacher').AsInteger := formSetTeacher.SelectedTeacher;
             datamodul.qryFund.Post;
        end; // for i := 0 to dgrdFund.SelectedRows.Count-1
        datamodul.qryFund.GotoBookmark(SP);
        datamodul.qryFund.FreeBookmark(SP);
        dgrdFund.SelectedRows.Clear;

        datamodul.qryFund.EnableControls;
    end; // if formSetTeacher.ModalResult = mrOK then
end;

Кажется, разницы нет, если не считать вот это:
datamodul.qryFund.GotoBookmark(pointer(dgrdFund.SelectedRows[i]));
Тут, если убирать pointerполучаю ошибку:
Incompatible types: 'String' and 'Pointer'


Медвежонок Пятачок   (2011-10-03 13:26:00) [7]

что и требовалось доказать.
здесь есть, а там нету.


lesstab   (2011-10-03 13:25:00) [8]


> Их точно нет. "Я гарантирую это".

Чтобы проверить, верно ли критерий фильтра, создал новую ДАТАСЕТ с запросом SELECT * FROM Fund2001без каких-либо JOIN и испытал фильтр на нем. Результат успешный.


lesstab   (2011-10-03 13:20:00) [9]


> Ну и по какому "Kod" идёт фильтр?
>


Вот по этому - Fund2011.Kod


Медвежонок Пятачок   (2011-10-03 13:20:00) [10]

Записи отвечающие на данный критерий в таблице точно есть.

Их точно нет. "Я гарантирую это".


lesstab   (2011-10-03 13:18:00) [11]


> Почему у меня всё показывается сразу?

Может дело в том, что у меня ADOQuery или в запросе SELECT присутствует JOIN, LEFT JOIN?

П.С. Я только начинаю изучать Скуль.)


Ega23   (2011-10-03 12:58:00) [12]

Fund2011.Kod,
Subject.Kod,
Grp.Kod,
Teacher.Kod,


Ну и по какому "Kod" идёт фильтр?


lesstab   (2011-10-03 12:50:00) [13]

Фильтруются набор данных, полученный запросом:

SELECT
   Fund2011.Kod,
   Fund2011.Subject,
   Fund2011.Grp,
   Fund2011.R1,
   Fund2011.R2,
   Fund2011.Teacher,
   Subject.Kod,
   Subject.Nazvaniye,
   Grp.Kod,
   Grp.Name,
   Teacher.Kod,
   Teacher.Name
FROM Fund2011
JOIN Subject ON Fund2011.Subject = Subject.Kod
JOIN Grp ON Fund2011.Grp=Grp.Kod
LEFT JOIN Teacher ON Fund2011.Teacher = Teacher.Kod

После фильтрации получается пустой набор. Вот фильтр:

datamodul.qryFund.Filter := '(Kod = 870) OR (Kod = 885) OR (Kod = 900) OR (Kod = 915)';

Записи отвечающие на данный критерий в таблице точно есть.
В чем причина непонимания.

П.С. В таблице Fund2011 имеется много записей, где Fund2011.Teacher Is Null.


Ega23   (2011-10-03 11:07:00) [14]


> Получилось, но внесенные изменения отображаются только после
> повторного открытия НД. А, здесь нужно чтобы текущее состояние
> (упорядочение, текущий запись) Грида сохранилось.


Почему у меня всё показывается сразу?


unit Unit19;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, CheckLst, SI5.FTS.Common, DB, DBClient, Grids, DBGrids;

type
 TForm19 = class(TForm)
   DBGrid1: TDBGrid;
   DataSource1: TDataSource;
   ClientDataSet1: TClientDataSet;
   Button1: TButton;
   ClientDataSet1Field1: TIntegerField;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 public

 end;

var
 Form19: TForm19;

implementation

{$R *.dfm}

//*****************************************************************************

procedure TForm19.Button1Click(Sender: TObject);
var
 i: Integer;
 bm: TBookmark;
begin
 ClientDataSet1.DisableControls;
 try
   bm := ClientDataSet1.GetBookmark;

   for i := 0 to DBGrid1.SelectedRows.Count - 1 do
   begin
     ClientDataSet1.GotoBookmark(DBGrid1.SelectedRows[i]);
     ClientDataSet1.Edit;
     ClientDataSet1.FieldByName('Field1').AsInteger := ClientDataSet1.FieldByName('Field1').AsInteger + 1000;
     ClientDataSet1.Post;
   end;

   ClientDataSet1.GotoBookmark(bm);
   ClientDataSet1.FreeBookmark(bm);
   DBGrid1.SelectedRows.Clear;

 finally
   ClientDataSet1.EnableControls;
 end;
end;

procedure TForm19.FormCreate(Sender: TObject);
var
 i: Integer;
begin
 ClientDataSet1.CreateDataSet;
 for i := 1 to 10 do
 begin
  ClientDataSet1.Append;
   ClientDataSet1.FieldByName('Field1').AsInteger := i;
   ClientDataSet1.Post;
 end;

end;

end.


lesstab   (2011-10-03 10:48:00) [15]


> Далее, сколько Edit, столько и Post. У тебя не так.


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


Ega23   (2011-10-03 10:06:00) [16]


> Как я понял, во время редактирования Букмарки удаляются.


Букмарки становятся инвалидными посл переоткрытия НД. Точнее - никто не гарантирует валидность букмарков после переоткрытия НД.
А у тебя именно это и происходит.

datamodul.qryFund.Close;
datamodul.qryFund.Open;


Далее, сколько Edit, столько и Post. У тебя не так.


OW   (2011-10-03 09:33:00) [17]


> 1. Создали букмарк на текущую запись
> 2. DataSet.DisableCotrols
> 3. Пошли в цикле по выделенным записям, сделали что надо
> 4. Перешли по букмарку обратно
> 5. DataSet.EnableCotrols
> 6. Удалили букмарк

Не получается. Код:

тоже самое, только сначала prior, если неудачно, то next, если неудачно, то  
букмарк не ставим

или valid букмарка проверим


lesstab   (2011-10-03 07:57:00) [18]


> 1. Создали букмарк на текущую запись
> 2. DataSet.DisableCotrols
> 3. Пошли в цикле по выделенным записям, сделали что надо
> 4. Перешли по букмарку обратно
> 5. DataSet.EnableCotrols
> 6. Удалили букмарк
>

Не получается. Код:
         
datamodul.qryFund.DisableControls;
for i := 0 to dgrdFund.SelectedRows.Count-1 do
begin
                datamodul.qryFund.GotoBookmark(pointer(dgrdFund.SelectedRows.Items[i]));
              datamodul.qryFund.Edit;
              datamodul.qryFund.FieldByName('Teacher').AsInteger := formSetTeacher.SelectedTeacher;
         end; // for i := 0 to dgrdFund.SelectedRows.Count-1
         datamodul.qryFund.Post;
         datamodul.qryFund.Close;
         datamodul.qryFund.Open;
         datamodul.qryFund.EnableControls;


Результат:
http://img26.imageshack.us/img26/826/errorcu.png
Как я понял, во время редактирования Букмарки удаляются. Может создать Array of Bookmark на уровне DataSet?


Inovet   (2011-10-02 22:19:00) [19]

> [7] Ega23 ©   (02.10.11 21:56)

Ну я вообще-то у автора просил подробности. А так да. Ещё и Ctrl+Del там должен работать.


Ega23   (2011-10-02 21:56:00) [20]


> Подробнее расскажи, что надо.

У меня под рукой Delphi нет, я не помню, как выбранные строки в DBGrid перебирать. Но точно можно, я так делал.
Алгоритм такой:
1. Создали букмарк на текущую запись
2. DataSet.DisableCotrols
3. Пошли в цикле по выделенным записям, сделали что надо
4. Перешли по букмарку обратно
5. DataSet.EnableCotrols
6. Удалили букмарк

То же самое и параллельного вопроса с "другим гридом" касается.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо