Topik |
Отправлено: 01.06.2004, 13:55 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Пол дня мучаюсь, если кто сталкивался, помогите плз.
Значит есть BDGrid таблица, свойство ReadOnly=false
При событии OnCellClick вызывается форма с полями BDEdit и BDComboBox у них тоже ReadOnly=false, но почемуто ничего не редактируется.
Что это может быть??? |
|
olegenty |
Отправлено: 01.06.2004, 15:35 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
если набор данных получен SELECT'ом, не факт, что его можно редактировать...
|
|
Topik |
Отправлено: 01.06.2004, 17:06 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Да набор получен селектом
Так а каким образом тогда редактировать данные, мне это неоходимо, чтоб потом UPDATE делать? |
|
Admin |
Отправлено: 01.06.2004, 19:40 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Какие компоненты, какая база данных ?
1 В общем случае используйте еще один компонент Query,
его свойство SQL, в него и пишите нужный запрос:
Update myTable ...
2 Также к существующему у Вас компоненту Query c
"Select-ом ..." можете подключить компонент UpdateSQL,
пропишите его в свойство UpdateObject Вашего
компонента Query, заполните его свойства (ModifySQL для изменения),
только прочитайте про ограничения такого использования.
3 В клиент-серверной базе данных можно также
использовать хранимые процедуры, передав им
необходимые параметры.
|
|
_vadim_ |
Отправлено: 02.06.2004, 02:40 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 18
|
Вместо DBEdit и DBComboBox используй просто Edit и ComboBox.
И через Query вставляй в БД. |
|
Gedeon |
Отправлено: 02.06.2004, 08:34 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Ну что если до сих пор не решился вопрос, тогда давайте правда какая база, компоненты и запрос Ваш в студию, будем разбираться.
|
|
olegenty |
Отправлено: 02.06.2004, 09:10 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
разбирайся, не разбирайся, а
1. если запрос не обновляемый (не к одной таблице) и при этом 2
2. используемые компоненты не имеют UpdateObject (BDE) или возможность создания "живых" наборов данных (как TIBDataSet, TpFIBDataSet), то о табличном вводе можно успешно забыть и смело лабать формы для редактирования записей, а так же отдельные Update запросы, которые, в случае запроса к нескольким таблицам будут являть сабой либо скрипт из нескольких INSERT/UPDATE, либо обращение к ХП, в которой будет происходить всё то же самое...
|
|
Topik |
Отправлено: 02.06.2004, 10:03 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Спасибо всем кто ответил, проблему я пока не решил, но прпробывал сделать таким образом:
На форме с гридом находятся компоненты Query1,DataSourse1, и база DataBase1
В хелпе нашел такую фишку для передачи данных из ячейки в форму
CityEdit->Text = Customer->FieldByName("Address.City")->AsString;
по этому примеру сделал у себя
FormEdit->Text = FormShow->Query1->FieldByName("main.city")->AnsiString;
но при запуске проги, выдается ошибка.
Отредактировано Topik — 02/06/2004, 11:07 |
|
AVC |
Отправлено: 02.06.2004, 10:15 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
FormEdit->Text = FormShow->Query1->FieldByName("main.city")->AnsiString;
|
Для начала так:
FormEdit->Text = FormShow->Query1->FieldByName("main.city")->AsString;
Но вопрос не в этом. Даже если вы отредактируете FormEdit->Text, то как вы его запихнете обратно в базу? Или вам это не надо. |
|
Topik |
Отправлено: 02.06.2004, 10:51 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
То очепятка была, у меня As стоит
а обратно в базу уже при помощи UPDATE?
или нельзя ?
Отредактировано Topik — 02/06/2004, 11:57 |
|
olegenty |
Отправлено: 02.06.2004, 10:55 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
при помощи UPDATE всегда можно
|
|
Topik |
Отправлено: 02.06.2004, 11:04 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Ну и хорошо что можно
Но как все таки передать значения в форму?
Если описать с точки зрения пользователя это будет выглядеть так:
После нажатия кнопки ОК на форме поиска, появляется окно с таблице в которой перечислены найденые объекты (это сделано).
Следующий этап, если необходимо изменить информацию об объекте, пользователь кликает на ячейке и появляется форма редактирования, которая содержит текущие данные, юзер их изменяет, кликает ОК и данные в базе обновляются |
|
olegenty |
Отправлено: 02.06.2004, 11:14 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
соответственно, ты пишешь UPDATE, который отрабатывает либо
1. по нажатию на кнопку OK формы редактирования
либо
2. после обработки информации с формы редактирования уже после её закрытия
после чего, в зависимости от того, каким набором компонентов пользуешься, далаешь либо
1. Requery() — тогда курсор сохраняется в позиции
либо
2.0. Отключаешь визуализацию набора данных (DisableControls)
2.1. Сохранение позиции курсора (Bookmark), либо значения ключевого поля/полей в переменную/переменные
2.2. Закрытие запроса
2.3. Открытие запроса
2.4. Позиционирование курсора на нужную запись, либо через GotoBookmark, либо через метод Locate набора данных с подстановкой сохранённых в переменных данных.
2.5. включаешь визуализацию набора данных (EnableControls)
|
|
Topik |
Отправлено: 02.06.2004, 11:21 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Спапсибо, с Update все понятно, но чтоб сделать UPDATE мне необходимо брать данные которые введены в форму, а перед этим в форме уже должны быть отражены текущие данные таблицы, весь вопрос в том, как их туда передать (данные в форму ) |
|
olegenty |
Отправлено: 02.06.2004, 11:49 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
тебе уже писал AVC:
QUOTE |
FormEdit->Text = FormShow->Query1->FieldByName("main.city")->AsString;
|
|
|
Topik |
Отправлено: 02.06.2004, 11:52 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Во-первых это писал я, во-вторых не работет, при запуске проги выпадает в ошибку |
|
AVC |
Отправлено: 02.06.2004, 12:05 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Может поле запроса называется не "main.city"? Если поля с таким именем в запросе нет — получите ошибку времени выполнения. Проверить наличие поля можно методом Query1->FindField. |
|
olegenty |
Отправлено: 02.06.2004, 12:07 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
это писал он, а не ты, ты писал с ошибкой, это раз,
и давай сюда сообщение об ошибке, это 2
|
|
Topik |
Отправлено: 02.06.2004, 12:14 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Project alfa.exe raised exception class EA Access Violation with message 'Access violation at address 0040BE10 in module 'alfa.exe'. Read of address 00002F8'
Process stopped. Use Step or Run to continue. |
|
Topik |
Отправлено: 02.06.2004, 12:19 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
и останавливается именно на
Fl_Red->Edit1->Text=Result1->Query1->FieldByName("fc.city")->AsString;
Fl_Red->Show();
Это реальная строка.
событие OnCellClick. |
|
AVC |
Отправлено: 02.06.2004, 12:33 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Кстати, закрытый Query соответствует отсутствию поля в наборе. |
|
Topik |
Отправлено: 02.06.2004, 12:40 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
AVC
ты был прав, не то имя давал, запрос ведь динамический, вот там того имени и небыло
Всем спасибо |
|
olegenty |
Отправлено: 02.06.2004, 12:58 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
а чтобы легче жилось, пользуйся конструкцией
CODE |
try
{
...
try
{
...
} catch (...)
{
...
}
} __finally
{
...
}
|
|
|
Topik |
Отправлено: 02.06.2004, 13:04 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Спасибо |
|
Topik |
Отправлено: 02.06.2004, 13:19 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
продолжим тему
при помощи findfield нахожу нужное поле,
но вот FieldByName не работает все равно с этим полем ( |
|
AVC |
Отправлено: 02.06.2004, 13:30 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Метод FindField используется вместо FieldByName. Эго отличие состоит в том, что он не вызывает ощибку а возвращает Null. FindField точно возвращает не Null? |
|
Topik |
Отправлено: 02.06.2004, 14:01 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Все нашел ошибку, всем спасибо |
|