C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Не редактируются поля BDEdit и BDComboBox, Памажите кто-нить...
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 стоит smile.gif
а обратно в базу уже при помощи UPDATE?
или нельзя ?

Отредактировано Topik — 02/06/2004, 11:57
olegenty
Отправлено: 02.06.2004, 10:55


Ветеран

Группа: Модератор
Сообщений: 2412



при помощи UPDATE всегда можно smile.gif
Topik
Отправлено: 02.06.2004, 11:04


Дежурный стрелочник

Группа: Участник
Сообщений: 45



Ну и хорошо что можно smile.gif
Но как все таки передать значения в форму?
Если описать с точки зрения пользователя это будет выглядеть так:
После нажатия кнопки ОК на форме поиска, появляется окно с таблице в которой перечислены найденые объекты (это сделано).
Следующий этап, если необходимо изменить информацию об объекте, пользователь кликает на ячейке и появляется форма редактирования, которая содержит текущие данные, юзер их изменяет, кликает ОК и данные в базе обновляются
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
ты был прав, не то имя давал, запрос ведь динамический, вот там того имени и небыло smile.gif
Всем спасибо
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



продолжим тему sad.gif
при помощи findfield нахожу нужное поле,
но вот FieldByName не работает все равно с этим полем sad.gif(
AVC
Отправлено: 02.06.2004, 13:30


Ветеран

Группа: Модератор
Сообщений: 1583



Метод FindField используется вместо FieldByName. Эго отличие состоит в том, что он не вызывает ощибку а возвращает Null. FindField точно возвращает не Null?
Topik
Отправлено: 02.06.2004, 14:01


Дежурный стрелочник

Группа: Участник
Сообщений: 45



Все нашел ошибку, всем спасибо

Вернуться в Работа с базами данных в C++Builder