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

Вниз

Строки в DBGrid и не только   Найти похожие ветки 

 
eclipse ©   (2006-05-05 05:47) [0]

Приветствую =)

У меня к Вам такой вопрос... или даже несколько небольших вопросов... сразу прошу прощения если они слишком просты но всё же...

На форме есть DBGrid и кнопка внести изменения... по выделению какого либо поля, то есть скорее всего с помощью SelectedField в другую форму должна передаваться вся строка... не выделенное поле а вся строка (Number|Name|OEM etc Number - ключевое)... и в переданной форме некоторые поля например количество будет изменяться с помощью updown и при нажатии на кнопку изменения отражатся в форме где сам DBGrid и занесутся в другую таблицу изменений вместе с датой изменения....
А также интересно узнать как можно по имеющемуся полю цены в уях автоматически заполнить соседнее поле умножив уи на курс...

заранее огромное спасибо


 
Хозяин   (2006-05-05 06:23) [1]

Один из вопросов я прочитал пока так:

должна передаваться вся строка... не выделенное поле а вся строка (Number|Name...

т.е. не SelectedField а вся строка, а Вы пишите:
скорее всего с помощью SelectedField

Раз вся строка, то зачем Вам "выделенное поле"?

Ели поняли о чем я.
;)


 
Хозяин   (2006-05-05 06:25) [2]

А также интересно узнать как можно по имеющемуся полю цены в уях автоматически заполнить соседнее поле умножив уи на курс...

Вычисляемое поле?


 
Хозяин   (2006-05-05 06:28) [3]

И забудьте про "Строки в DBGrid", есть записи в рекордсете.
/*уф, дебют состоялся :)*/


 
Sergey13 ©   (2006-05-05 09:00) [4]

2 eclipse ©   (05.05.06 05:47)
Уясни себе раз и навсегда, что В ГРИДЕ НЕТ ДАННЫХ. Данные есть в ДатаСете. Ткнув в гриде на любое поле записи ты спозиционировал ДатаСет на конкретную ЗАПИСЬ, и можешь обращаться к полям этой записи откуда и как угодно, т.е. читать и писать из/в них.


 
eclipse ©   (2006-05-05 10:41) [5]

всё =) понятна =) уяснил.... грид тока для отображения... сет для манипуляций... =)

пасиба огромное... сейчас буду пытаться пробовать сделать то что нада... если не получится то снова приду за советами =)


 
eclipse ©   (2006-05-05 11:30) [6]

а всё таки не могли бы вы привести небольшие примерчики как работать с сетами... и немного рассказать про вычисляемое поле... мне так будет просто и быстро всё освою... просто именно на делфи с базами данных стал работать несколько дней назад... раньше кодил только на пхп и там как то всё проще было =) а на делфи прочими вещами занимался...

заранее очень признателен =)


 
Sergey13 ©   (2006-05-05 11:43) [7]

2 [6] eclipse ©   (05.05.06 11:30)
Хм. Тут на книгу хватит писанины.

ДатаСет - образ набора данных из БД на клиенте. Основные методы работы Insert, Edit, Delete и Post. Первые три собственно меняют инфу, а последний фиксирует изменения образа в самой БД (с последним не все однозначно и зависит от многих факторов, но в общем случае примерно так).

Вычисляемые (бывают на клиенте и на сервере) поля - это поля которых физически нет в БД и которые получаются с помощью действий над имеющимися. Пример: есть количество и цена получаем стоимость.


 
eclipse ©   (2006-05-06 08:11) [8]

так... значит чтобы автоматически обновить курсы нужно удалить поле с ценой в уях и его получается создавать динамически... ну и производить вычисления с имеющимся полем цены в уях... верно????

и всё таки не могу представить как сделать выделение всей записи.... здесь должно быть всё просто скорее всего... но не знаю как... поэтому оч хотелось бы посмотреть на пример если не затруднит....


 
evvcom ©   (2006-05-06 08:58) [9]


> Основные методы работы Insert, Edit, Delete и Post.

Я бы сюда все ж добавил еще методы навигации: чаще Next, First, Last, реже Prev и MoveBy, проверку на границы Eof и Bof, и доступ к полям FieldByName и иногда Fields[Index] (тогда и FieldCount). Остальное в справке смотри по TDataSet.

> и всё таки не могу представить как сделать выделение всей
> записи....

Что есть "выделение"? За визуализацию отвечает в твоем случае грид, а если ты хочешь куда-то передать "всю строку", то передавай просто DataSet, а там добирайся до любого свойства, поля и пр. Если передать хочешь выделенную в гриде ячейку, то ищи поле (TField) ей соответствующее, его и передавай.


 
eclipse ©   (2006-05-06 09:12) [10]

to evvcom
=) мне нужно передать всю запись... не важно как в гриде это будет визуально или нет... просто при нажатии на поле записи и потом нажав на кнопку в другой форме будет передана вся запись... именно это мне и нужно =)

и сразу интересно было бы узнать выше мнение по компонентам EhLib....


 
Sergey13 ©   (2006-05-06 09:17) [11]

2 [10] eclipse ©   (06.05.06 09:12)
Все таки ты в [5] eclipse ©   (05.05.06 10:41) поторопился сказать, что все понял. Перечитай [4] Sergey13 ©   (05.05.06 09:00) еще раз. 8-)

> мнение по компонентам EhLib....
У меня - самое полжительное.


 
evvcom ©   (2006-05-06 09:47) [12]


> ты в [5] eclipse ©   (05.05.06 10:41) поторопился сказать

явно поторопился!


 
eclipse ©   (2006-05-06 11:26) [13]

верна... поторопился =)

теперь получилось получить эти данные в форму изменений... все данные записываются в
DBEditEh1.Text
DBEditEh2.Text
DBEditEh3.Text
DBEditEh4.Text

и помимо этого одна переменная получает номер записи чтобы потом изменения занести в нужную запись....

а теперь встал вопрос как эти изменённые эдиты вставить в тэйбл и в нужную запись...


 
MsGuns ©   (2006-05-06 11:30) [14]

>Sergey13 ©   (05.05.06 11:43) [7]
>ДатаСет - образ набора данных из БД на клиенте.

Нет. Датасет может не иметь ничего общего ни с одной из таблиц БД.

>Основные методы работы Insert, Edit, Delete и Post.

Прямо-таки основные ? Вот, блин, а я, дурак, их вообще не использую ;)

>а последний фиксирует изменения образа в самой БД (с последним не все однозначно и зависит от многих факторов, но в общем случае примерно так).

Даже примерно не так. Такие советы исключительно вредны для начинающих, т.к. отучают их думать. Например о том, что есть транзакции и как они функционируют

;)


 
Sergey13 ©   (2006-05-06 12:06) [15]

2[13] eclipse ©   (06.05.06 11:26)
>а теперь встал вопрос как эти изменённые эдиты вставить в тэйбл и в нужную запись...

Они ссылаются на текущую запись и показывают ее содержимое. Изменение коснется ее же.

2[14] MsGuns ©   (06.05.06 11:30)
Критикан, блин. К тому же не конструктивный. 8-)

>Вот, блин, а я, дурак, их вообще не использую ;)
Это проблемы твои, а не датасета. 8-)

>Например о том, что есть транзакции и как они функционируют
Ага, особенно в Парадоксе. 8-)


 
eclipse ©   (2006-05-06 12:33) [16]

если у сета основные методы insert edit и post то получается в обработчике кнопки нада писать что то вроде этого

Form_table.DataSource1.DataSet.Edit;
Form_table.DataSource1.DataSet.Post;
Form_table.DataSource1.DataSet.Refresh;

???

или всё не так???


 
Sergey13 ©   (2006-05-06 12:43) [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; -обновление (перечитывание) записи(ей) - работает не везде.


 
MsGuns ©   (2006-05-06 12:50) [18]

Закат солнца вручную или освоение работы с БД в единственной ветке форума без книг, статей, справок и т.д.


 
eclipse ©   (2006-05-06 13:01) [19]

но например изменив поле Количество и нажав на кнопку Сохранить изменения где в обработчие описаны все эти методы... изменения либо не происходят... либо выдаётся ошибка access violated


 
Sergey13 ©   (2006-05-06 13:11) [20]

2 [19] eclipse ©   (06.05.06 13:01)
Вообще Ганз прав - тебе бы книжек почитать очень не помешало.

>где в обработчие описаны все эти методы
Прям все? Уже интересно. Давай код смотреть.


 
eclipse ©   (2006-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;


 
Sergey13 ©   (2006-05-06 13:37) [22]

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:46) [23]

... я пробовал писать в обработчике просто =)

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:54) [24]

2[23] eclipse ©   (06.05.06 13:46)
Если по русски написать твою процедуру, то получится
1.Разрешить изменения
2.Зафиксировать изменения
И между ними НИЧЕГО не происходит. Edit вызывается автоматом, когда ты правишь в DBEdit.


 
MsGuns ©   (2006-05-06 14:05) [25]

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


 
eclipse ©   (2006-05-06 14:38) [26]

... попробовал несколько вариантов обработчика и всё равно access violated...


 
Sergey13 ©   (2006-05-06 14:41) [27]

2 [26] eclipse ©   (06.05.06 14:38)
>... попробовал несколько вариантов обработчика и всё равно access violated...

Мы их все видели и потому сочувствуем. 8-)


 
evvcom ©   (2006-05-06 15:00) [28]


> Form_table.Table1.DataSource.DataSet

Очень интересная конструкция! Особенно для новичка. Что такое Table1? Самое простое, что приходит в голову, что есть форма Form_table, на ней лежат TDataSource и какой-то DataSet, судя по всему TTable (назовем его MyTable). Тогда доступ становится гораздо проще:
Form_table.MyTable
Чего мудрить?


 
Хозяин   (2006-05-06 16:31) [29]

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;

?


 
Хозяин   (2006-05-06 16:35) [30]

Ошибочка
if Form_table.Table1.DataSource.State ...

И в обработчике закрытия окна сделай

if DataSet.State in [dsInsert,dsEdit] then
 Form_table.Table1.DataSource.DataSet.Cancel;


 
Хозяин   (2006-05-06 16:38) [31]

Опять косяк, запутался с такой конструкцией 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:43) [32]

Вот это вообще понять, что-to не могу:

Table1.DataSource.DataSet


 
eclipse ©   (2006-05-08 08:09) [33]

to Хозяин
а я уже разобрался =) спасибо огромное за примеры...

и про Table1.DataSource.DataSet конечно верно... всё не так должно было быть записано...



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

Форум: "Начинающим";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.01 c
8-1135585258
Chaser
2005-12-26 11:20
2006.05.28
Как сделать снимок с экрана с курсором мыши?


4-1141569418
4ho
2006-03-05 17:36
2006.05.28
Передача параметров потоку.


15-1146561750
ANB
2006-05-02 13:22
2006.05.28
Телефон Вилючинского городского суда


2-1147166724
seleman
2006-05-09 13:25
2006.05.28
xpmanifest


15-1146487535
dyd
2006-05-01 16:45
2006.05.28
ICQ





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский