![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Строки в DBGrid и не только [D6, Paradox]
eclipse © (2006-05-05 05:47:00)Приветствую =)
У меня к Вам такой вопрос... или даже несколько небольших вопросов... сразу прошу прощения если они слишком просты но всё же...
На форме есть DBGrid и кнопка внести изменения... по выделению какого либо поля, то есть скорее всего с помощью SelectedField в другую форму должна передаваться вся строка... не выделенное поле а вся строка (Number|Name|OEM etc Number - ключевое)... и в переданной форме некоторые поля например количество будет изменяться с помощью updown и при нажатии на кнопку изменения отражатся в форме где сам DBGrid и занесутся в другую таблицу изменений вместе с датой изменения....
А также интересно узнать как можно по имеющемуся полю цены в уях автоматически заполнить соседнее поле умножив уи на курс...
заранее огромное спасибо
eclipse (2006-05-08 08:09:00) [1]to Хозяин
а я уже разобрался =) спасибо огромное за примеры...
и про Table1.DataSource.DataSet конечно верно... всё не так должно было быть записано...
Хозяин (2006-05-06 16:43:00) [2]Вот это вообще понять, что-to не могу:
Table1.DataSource.DataSet
Хозяин (2006-05-06 16:38:00) [3]Опять косяк, запутался с такой конструкцией Form_table.Table1.DataSource.DataSet
вот:
procedure TForm_changes.Button1Click(Sender: TObject);
begin
if Form_table.Table1.DataSource.State in [dsInsert,dsEdit] then
Form_table.Table1.DataSource.DataSet.Post;
close;
end;
И в обработчике закрытия окна сделай
if Form_table.Table1.DataSource.State in [dsInsert,dsEdit] then
Form_table.Table1.DataSource.DataSet.Cancel;
Хозяин (2006-05-06 16:35:00) [4]Ошибочка
if Form_table.Table1.DataSource.State ...
И в обработчике закрытия окна сделай
if DataSet.State in [dsInsert,dsEdit] then
Form_table.Table1.DataSource.DataSet.Cancel;
Хозяин (2006-05-06 16:31:00) [5]eclipse © (06.05.06 13:26) [21] [Новое сообщение]
procedure TForm_changes.Button1Click(Sender: TObject);
begin
Form_table.Table1.DataSource.DataSet.Edit;
Form_table.Table1.DataSource.DataSet.Fields[1].AsString := DBEditEh1.Text;
Form_table.Table1.DataSource.DataSet.Fields[2].AsString := DBEditEh2.Text;
Form_table.Table1.DataSource.DataSet.Fields[3].AsString := DBEditEh3.Text;
Form_table.Table1.DataSource.DataSet.Fields[4].AsString := DBEditEh4.Text;
Form_table.Table1.DataSource.DataSet.Post;
end;
eclipse © (06.05.06 13:46) [23]
... я пробовал писать в обработчике просто =)
procedure TForm_changes.Button1Click(Sender: TObject);
begin
Form_table.Table1.DataSource.DataSet.Edit;
Form_table.Table1.DataSource.DataSet.Post;
end;
но ошибка так и остаётся после нажатия на кнопку...
procedure TForm_changes.Button1Click(Sender: TObject);
begin
if DataSet.State in [dsInsert,dsEdit] then
Form_table.Table1.DataSource.DataSet.Post;
end;
?
evvcom (2006-05-06 15:00:00) [6]
> Form_table.Table1.DataSource.DataSet
Очень интересная конструкция! Особенно для новичка. Что такое Table1? Самое простое, что приходит в голову, что есть форма Form_table, на ней лежат TDataSource и какой-то DataSet, судя по всему TTable (назовем его MyTable). Тогда доступ становится гораздо проще:
Form_table.MyTable
Чего мудрить?
Sergey13 (2006-05-06 14:41:00) [7]2 [26] eclipse © (06.05.06 14:38)
>... попробовал несколько вариантов обработчика и всё равно access violated...
Мы их все видели и потому сочувствуем. 8-)
eclipse (2006-05-06 14:38:00) [8]... попробовал несколько вариантов обработчика и всё равно access violated...
MsGuns (2006-05-06 14:05:00) [9]>eclipse © (06.05.06 13:26) [21]
>Form_table.Table1.DataSource.DataSet.Fields[1].AsString := DBEditEh1.Text;
Такой формат вообще-то порочен. Во-первых потому, что из кода совершенно неясен типполя, во-вторых нет никакого контроля правильности введенного пользователем в Эдит значения, в третьих - [22] последний абзац.
И еще замечания по коду общего плана:
1. Категорически не рекоментую обзывать адресуемые в кодеобъекты "как делфа назвала". Из наименования объекта должно быть извлечено максимум информации даже "посторонним" программистом.
Например, имя объекта TTable - tbPhoneDir
Советую почитать на эту тему соответствующую литературу. Например, того же Тексейру.
2. Использование TxxTable методологически порочно, т.к. создает у неопытного программиста иллюзию, что "он хозяин в доме" (таблице). Что в корне неверно при разработке многопользовательских приложений. Особенно в клиент-серверных технологиях. Если есть стремление научиться писать что-то посложнее телефонного справочника, то сразу надо ориентироваться на доступ к базам запросами.
3. Нельзя в коде обращаться к экземплярам объектов, т.к. нет гарантии, что этот объект в ран-тайме в единственном числе (как пример - динамически создаваемые дочки-"близнецы" в MDI-приложениях.
4. Всю логику обмена данными с БД рекомендуется выносить из форм-"клиентов" в датамодули. По принципу один датамодуль на одно соединение (базу данных). В нем же располагать код извлечения, посылки изменений и т.д данных "сервера". В ссылки на конкретные датасеты передавать одним из вх.параметров.
5. Конструкции, подобные [21] не только "тяжелы" для глаз и порою делают код просто зубодробительным, но еще и чрезвычайно "глюкоопасны", т.к. при малейших изменениях требуют повышенное внимание и кучу времени и нервом. Грамотнее писать так:
with Form_table.Table1.DataSource.DataSet do
begin
Edit;
Fields[1].AsString := DBEditEh1.Text;
Fields[2].AsString := DBEditEh2.Text;
Fields[3].AsString := DBEditEh3.Text;
Fields[4].AsString := DBEditEh4.Text;
Post;
end;
Sergey13 (2006-05-06 13:54:00) [10]2[23] eclipse © (06.05.06 13:46)
Если по русски написать твою процедуру, то получится
1.Разрешить изменения
2.Зафиксировать изменения
И между ними НИЧЕГОне происходит. Edit вызывается автоматом, когда ты правишь в DBEdit.
eclipse (2006-05-06 13:46:00) [11]... я пробовал писать в обработчике просто =)
procedure TForm_changes.Button1Click(Sender: TObject);
begin
Form_table.Table1.DataSource.DataSet.Edit;
Form_table.Table1.DataSource.DataSet.Post;
end;
но ошибка так и остаётся после нажатия на кнопку...
FieldByname... и в правду проще и нагляднее =) его и буду юзать... =)
Sergey13 (2006-05-06 13:37:00) [12]2[21] eclipse © (06.05.06 13:26)
>Form_table.Table1.DataSource.DataSet.Fields[1].AsString := DBEditEh1.Text;
Такая запись была бы нормальной, если вместо ДБЕдит ты использовал просто Едит. А так ты полю присваиваешь его же отображение. Если ты менял что-то в ДБедитах, то тут достаточно
Form_table.Table1.DataSource.DataSet.Post;
>Fields[4]
Я бы предложил юзать FieldByName - просто и более наглядно и не зависит от положения поля в датасете.
eclipse (2006-05-06 13:26:00) [13]procedure TForm_changes.Button1Click(Sender: TObject);
begin
Form_table.Table1.DataSource.DataSet.Edit;
Form_table.Table1.DataSource.DataSet.Fields[1].AsString := DBEditEh1.Text;
Form_table.Table1.DataSource.DataSet.Fields[2].AsString := DBEditEh2.Text;
Form_table.Table1.DataSource.DataSet.Fields[3].AsString := DBEditEh3.Text;
Form_table.Table1.DataSource.DataSet.Fields[4].AsString := DBEditEh4.Text;
Form_table.Table1.DataSource.DataSet.Post;
end;
Sergey13 (2006-05-06 13:11:00) [14]2 [19] eclipse © (06.05.06 13:01)
Вообще Ганз прав - тебе бы книжек почитать очень не помешало.
>где в обработчие описаны все эти методы
Прям все? Уже интересно. Давай код смотреть.
eclipse (2006-05-06 13:01:00) [15]но например изменив поле Количество и нажав на кнопку Сохранить изменения где в обработчие описаны все эти методы... изменения либо не происходят... либо выдаётся ошибка access violated
MsGuns (2006-05-06 12:50:00) [16]Закат солнца вручную или освоение работы с БД в единственной ветке форума без книг, статей, справок и т.д.
Sergey13 (2006-05-06 12:43:00) [17]2[16] eclipse © (06.05.06 12:33)
>или всё не так???
Все так. Если помнить, что это не единственные методы (как тут не раз уже меня справедливо поправляли).
Form_table.DataSource1.DataSet.Edit; - перевод текущей записи в режим редактирования
Form_table.DataSource1.DataSet.Insert;
или Form_table.DataSource1.DataSet.Append;
- вставка новой записи и перевод указателя текущей записи на нее и перевод ее (записи) в режим редактирования.
Form_table.DataSource1.DataSet.Post; - фиксирование изменений в текущей записи
Form_table.DataSource1.DataSet.Refresh; -обновление (перечитывание) записи(ей) - работает не везде.
eclipse (2006-05-06 12:33:00) [18]если у сета основные методы insert edit и post то получается в обработчике кнопки нада писать что то вроде этого
Form_table.DataSource1.DataSet.Edit;
Form_table.DataSource1.DataSet.Post;
Form_table.DataSource1.DataSet.Refresh;
???
или всё не так???
Sergey13 (2006-05-06 12:06:00) [19]2[13] eclipse © (06.05.06 11:26)
>а теперь встал вопрос как эти изменённые эдиты вставить в тэйбл и в нужную запись...
Они ссылаются на текущую записьи показывают ее содержимое. Изменение коснется ее же.
2[14] MsGuns © (06.05.06 11:30)
Критикан, блин. К тому же не конструктивный. 8-)
>Вот, блин, а я, дурак, их вообще не использую ;)
Это проблемы твои, а не датасета. 8-)
>Например о том, что есть транзакции и как они функционируют
Ага, особенно в Парадоксе. 8-)
MsGuns (2006-05-06 11:30:00) [20]>Sergey13 © (05.05.06 11:43) [7]
>ДатаСет - образ набора данных из БД на клиенте.
Нет. Датасет может не иметь ничего общего ни с одной из таблиц БД.
>Основные методы работы Insert, Edit, Delete и Post.
Прямо-таки основные ? Вот, блин, а я, дурак, их вообще не использую ;)
>а последний фиксирует изменения образа в самой БД (с последним не все однозначно и зависит от многих факторов, но в общем случае примерно так).
Даже примерно не так. Такие советы исключительно вредны для начинающих, т.к. отучают их думать. Например о том, что есть транзакции и как они функционируют
;)