Форум: "Начинающим";
Текущий архив: 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.004 c