Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2015, 19:18   #1
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
Печаль Кодом добавить поля в ADOQuery

Программа выдаёт данные о продукте, и я сделал такую функцию, что пользователь может сам решать, какие поля он хочет видеть, к примеру, он создаёт поля с названиями "Срок годности продукта", и "Наименование продукта", и такие данные в дальнейшем будут выводиться в таблице.
Далее ...
В программе пользователь создаёт поле с названием "Фирма изготовитель", программа в sql server-e создаёт поле с именем - "mmm1"(к примеру)
Далее, у меня есть компонент DBEdit (создаётся динамически), и я хочу связать его с новосозданной таблицей "mmm1"
Код:
      
with TDBEdit.Create(Form1) do
      try
        Parent :=  Form1;
        Name := 'DBEdit'+IntToStr(x);
          DataSource := ds1;
          DataField := 'mmm'+IntToStr(m);
        Text := '';
        left := 14;
        top := 24;
        width := gb.Width-28;
        height := 21;
        anchors := [akLeft,akTop,akRight];
      except
        ShowMessage('Проблемы при создании DBEdit');
      end;
В общем, если поле базы уже "добавлено" в ADOQuery, то всё создаётся нормально, и никаких сообщений не выдаётся. Но если поле из базы "отсутствует" в ADOQuery, вот тогда программа выдаёт сообщение ('Проблемы при создании DBEdit') .....
==================================
Я начал думать, каким образом можно сделать (add fielfs ...)
Но так ничего и не придумал.
Нашёл в интернете код, как можно динамически добавить поле в "список" ADOQuery, но я повторюсь, что это динамический ... т.е. мне грубо говоря придётся где то хранить перечень всех полей которые добавил пользователь, и каждый раз при открытии формы, он должен будет их по новой добавлять в ADOQuery. Это можно перетерпеть, если всего два поля будет, но если этих полей будет штук 50 ? Я думаю, прога основательно подвиснет при открытии.
=================================== =
В общем вопрос:
Можно ли как то скопом добавить все поля в АДОшку, каким нибудь Рефрешем или Апдейтом ...
Помогите выйти из ситуации, пожалуйста
Janger вне форума Ответить с цитированием
Старый 22.07.2015, 19:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если поле из базы "отсутствует" в ADOQuery
А зачем ты тогда создаешь эдит, если поля нет? Создавай его уже когда query открыт, и поле сие появилось в наборе.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.07.2015, 19:29   #3
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Если не объявлять статический поля (не делать addfields) в TDAtaSet (потомком которого есть TADOQuery) , то при открытии таблицы, они автоматически в него добавятся .
---------
К примеру когда я делаю какую то форму с отображением новых таблиц (сцепок таблиц), я сначала добавляю все поля addfileds. Потом настраиваю все контролы в форме, открываю проверяю как работает, а потом удаляю все эти поля с TAdoQuery.
В случае, если мне нужно присобачить обработчики по типу Onvalidate OnGet(Set)Text я делаю это на этапе инициализации формы перед открытием TAdoQuery посредством присвоение обработчика в коде
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 22.07.2015, 19:35   #4
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А зачем ты тогда создаешь эдит, если поля нет? Создавай его уже когда query открыт, и поле сие появилось в наборе.
-
Я немного не понял ....
Вы имеете в виду, что мне нужно перед подключением нового поля к DBEdit перезапустить АДОшку?
Код:
ADOQuery1.Close; ADOQuery1.Open
-
Если так, то ....
Я пробовал данный код:
(В базе было 12 полей, а в ADOQuery я только 10 добавил)
Код:
ShowMessage(IntToStr(ADOQuery1.FieldCount));
ADOQuery1.Close;
ADOQuery1.Open;
ShowMessage(IntToStr(ADOQuery1.FieldCount));
Данный код, вывел следующие сообщения:
-
Message_#1: 10
Message_#2: 10
-
Так что, либо я что то не так понял, либо данное действо не поможет мне ...
Janger вне форума Ответить с цитированием
Старый 22.07.2015, 19:39   #5
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Janger Посмотреть сообщение
-
(В базе было 12 полей, а в ADOQuery я только 10 добавил)
Код:
ShowMessage(IntToStr(ADOQuery1.FieldCount));
ADOQuery1.Close;
ADOQuery1.Open;
ShowMessage(IntToStr(ADOQuery1.FieldCount));
Данный код, вывел следующие сообщения:
-
Message_#1: 10
Message_#2: 10
-
Так что, либо я что то не так понял, либо данное действо не поможет мне ...
Автор, удали все 10 полей которые добавил и попробуй свой код.
Потом, в базе данных в табличку добавть ещё одно поле и опять попробуй код.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 22.07.2015, 19:41   #6
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Если не объявлять статический поля (не делать addfields) в TDAtaSet (потомком которого есть TADOQuery) , то при открытии таблицы, они автоматически в него добавятся
В принципе согласен. Но что мне делать с тем фактом, что если я удалю все поля из ADOQuery, то все компоненты которые стоят по умолчанию на форме, будь то: DBEdit или DBMemo, они пусты? p.s. хотя текст на них появляется в том случае когда я кликаю по компоненту мышкой ... это не очень эстетично

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Автор, удали все 10 полей которые добавил и попробуй свой код.
Потом, в базе данных в табличку добавть ещё одно поле и опять попробуй код.
Уже попробовал, прочтите сообщение. Всё сразу отображается, но проблема с изначальным выводом данных в компоненты

Последний раз редактировалось Stilet; 22.07.2015 в 19:51.
Janger вне форума Ответить с цитированием
Старый 22.07.2015, 19:55   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а в ADOQuery я только 10 добавил
Ну вот убери их из списка полей. Не нужны они там.

Кстати, а зачем тебе понадобилось все это? Чует мое "пэрце", что твою задачу точно можно решить более простым способом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.07.2015, 19:58   #8
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Всё сразу отображается, но проблема с изначальным выводом данных в компоненты
В таком случае я бы сделал по другому, отключал бы и включал бы DataSet к компоненте по клику.
Например

Код:
procedure TForm1.DBEdit1OnCLick(Sender : TObject);
begin
  with TDBEdit(Sender) do
  if Assigned(DataSet) then 
    DataSet:=nil else
    DataSet:=TAdoQuery1; 
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 22.07.2015, 20:03   #9
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
В таком случае я бы сделал по другому, отключал бы и включал бы DataSet к компоненте по клику.
Например

Код:
procedure TForm1.DBEdit1OnCLick(Sender : TObject);
begin
  with TDBEdit(Sender) do
  if Assigned(DataSet) then 
    DataSet:=nil else
    DataSet:=TAdoQuery1; 
end;
Я бы наверное вашу строчку DataSet:=TAdoQuery1 поместил бы на событие onShow, что бы данные сразу показались ... А то при открытии, все DBEdit-ы пустые у меня

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну вот убери их из списка полей. Не нужны они там.

Кстати, а зачем тебе понадобилось все это? Чует мое "пэрце", что твою задачу точно можно решить более простым способом.
1) Если я уберу все поля из АДОшки, то при открытии формы, у меня DBEdit-ы будут пустыми ....
2) Я ничего не смог придумать лучше этого ... Вроде бы всё просто, только вот с этими полями я замучился ...

Последний раз редактировалось Stilet; 23.07.2015 в 10:29.
Janger вне форума Ответить с цитированием
Старый 22.07.2015, 20:06   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Если нужна обратная реакция то тогда на OnShow вешается всё для отображения, а на клике снимается. При этом, связка контрол-поле таблицы остаётся корректным на весь сеанс работы с приложением
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программное управление кодом поля DBEER Microsoft Office Word 1 15.05.2015 16:49
Как удалить динамически созданные поля в ADOQuery? Darlee Помощь студентам 3 28.04.2014 11:57
маска для числового поля adoquery haker270 БД в Delphi 3 18.11.2012 22:36
Как программно добавить поле Lookup в ADOQuery aquatell БД в Delphi 0 04.05.2011 01:15
Как добавить все поля в таблицу с кода tarakan1983 БД в Delphi 5 24.03.2009 18:14