![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Групповое редактирование выбранных строк в ДБГриде
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. Удалили букмарк
То же самое и параллельного вопроса с "другим гридом" касается.