Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.01.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.005 c
3-1269545592
ruslan_as
2010-03-25 22:33
2012.01.22
Как скопировать таблицу Oracle в другую базу Oracle


6-1250005013
NeonSimfi
2009-08-11 19:36
2012.01.22
Получить найстройки прокси изпользуя WinHttpGetProxyForUrl


15-1317710577
TUser
2011-10-04 10:42
2012.01.22
Фестиваль науки


2-1318319704
санек
2011-10-11 11:55
2012.01.22
Номер строки DBGrid


15-1317627402
OW
2011-10-03 11:36
2012.01.22
Задумка. Игра Пираты. Интересно ли будет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский