Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.22;
Скачать: CL | DM;

Вниз

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

 
lesstab ©   (2011-10-02 16:39) [0]

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


 
Ega23 ©   (2011-10-02 19:51) [1]

Возможно.


 
Inovet ©   (2011-10-02 20:53) [2]

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


 
Jeer ©   (2011-10-02 21:13) [3]


> Ega23 ©   (02.10.11 19:51) [1]
>
> Возможно.


Лаконичный ответ претендента на "голубые пиксели".
Достоин.


 
Dennis I. Komarov ©   (2011-10-02 21:34) [4]

Ну что за вкус? ДБГриб - фи...


 
Jeer ©   (2011-10-02 21:45) [5]


> Это не возможно, да?


Дополню лаконичный ответ Ega23  - "Возможно".

Конечно же - возможно. Если  учесть, что под редактированием можно понимать даже "обнуление" ( читай - удаление ).
Чтобы массово редактировать какие-либо данные, видимые в DBGrid ( именно видимые ), необходимо заранее определить условия такого редактирования.

К примеру, операторами были введены ФИО в нижнем регистре, а софт позволял такое делать.

С точки зрения удобства наблюдения - это надо поправить.

Вот это и есть  пример массового редактирования ( автоматического, на основе выбранного критерия редактирования ).

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


 
Jeer ©   (2011-10-02 21:47) [6]

DBGrid - всего лишь инструмент для наблюдения за данными, но с его помощью мы можем определить и отметить множество записей, которые надо массово отредактировать на основе заранее подготовленного критерия.


 
Ega23 ©   (2011-10-02 21:56) [7]


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

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

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


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

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

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


 
lesstab ©   (2011-10-03 07:57) [9]


> 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?


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


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

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

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

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


 
Ega23 ©   (2011-10-03 10:06) [11]


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


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

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


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


 
lesstab ©   (2011-10-03 10:48) [12]


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


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


 
Ega23 ©   (2011-10-03 11:07) [13]


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


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


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 12:50) [14]

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

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 12:58) [15]

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


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


 
lesstab ©   (2011-10-03 13:18) [16]


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

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

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


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

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

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


 
lesstab ©   (2011-10-03 13:20) [18]


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


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


 
lesstab ©   (2011-10-03 13:25) [19]


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

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


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

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


 
lesstab ©   (2011-10-03 13:43) [21]

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"


 
lesstab ©   (2011-10-03 13:47) [22]


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

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


 
Ega23 ©   (2011-10-03 13:51) [23]


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


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


 
lesstab ©   (2011-10-03 13:58) [24]


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

Delphi 6.

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


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

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

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


 
lesstab ©   (2011-10-10 10:54) [26]


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



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


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



Страницы: 1 вся ветка

Текущий архив: 2012.01.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.012 c
15-1317761204
Делфиец
2011-10-05 00:46
2012.01.22
А что за кайф быть мастером делфи?


15-1315275201
Кошкин
2011-09-06 06:13
2012.01.22
Добавление модулей *.pas к проекту.


15-1317227550
Alik
2011-09-28 20:32
2012.01.22
Delphi - Параллельные вычисления в многоядерных машинах


15-1317747213
TComponent
2011-10-04 20:53
2012.01.22
Почему при запуске программа долго проверяется Каспером?


2-1318237920
NBAH1990
2011-10-10 13:12
2012.01.22
Программная настройка подключения по локальной сети