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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2012, 06:19   #1
samouelson
Пользователь
 
Регистрация: 07.12.2009
Сообщений: 46
По умолчанию Заполнить данными столбец DBGrid

Доброго времени суток всем! Жестко туплю над следующей задачкой. В DBGrid создал дополнительный столбец. Этот столбец необходимо заполнить данными. Не понимаю как присвоить значение конкретной ячейке моего столбца в DBGrid? Для работы с БД юзаю ADOConnection, DataSource1, ADOQuery1 (инфа на всякий случай). Буду очень благодарен!
samouelson вне форума Ответить с цитированием
Старый 16.11.2012, 07:05   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Связать столбец с соответствующим полем таблицы/запроса, которую отображает DBGrid
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 16.11.2012, 07:59   #3
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

Если столбца нет физически в базе то можно его создать в запросе... вы покажите запрос и что нужно отобразить в доп столбце.
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 16.11.2012, 09:26   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

BARNEY, +1

samouelson, если столбец в БД (в таблице есть), то его нужно добавить в ADOQuery (в набор полей в select) и, если в DBGrid поля добавлены, тогда добавить ещё один столбец, который связать по имени с полем из таблицы.

Если такого столбца в таблице данных нет, то нужно, либо добавить это поле в запрос (предпочтительный вариант), либо добавлять поле в непосредственно в ADOQuery в коде, после открытия датасета, назначать этому полю тип "Вычисляемое" (fkCalculated) и заполнять на событии OnCalcFields (воспользуйтесь поиском, примеров в букварях и на форумах более чем достаточно).

Короче, задаёте конкретные вопросы, получаете конкретные ответы, иначе - ответы получаются обще-универсального плана.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.11.2012, 12:38   #5
samouelson
Пользователь
 
Регистрация: 07.12.2009
Сообщений: 46
По умолчанию

Физически столбца в БД нет. В DBgrid я отображаю все поля из базы данных + мой дополнительный столбец (MyField), который необходимо заполнить значениями из определенного массива.

Если быть точнее, мне необходимо дополнительное поле для удобного представления информации. Столбец "Операция" содержит значения от 0 до 17 (пользователь не знает номера операций, их расшифровки, и это неудобно), мне необходимо показать пользователю название это операции из стандартного набора. Вот он:

Код:
TLogOperations = (
    lopEdit,
    lopDelete,
    lopExport,
    lopImport,
    lopBOChange,
    lopGrOpenAcc,
    lopGrCloseAcc,
    lopChangeOwner,
    lopAdminON,
    lopAdminOFF,
    lopCreateUser,
    lopDeleteUser,
    lopAddUsGroup,
    lopDelUsGroup,
    lopAddUsRole,
    lopDelUsRole,
    lopEditRole,
    lopClearLog,
    lopChangeLOp,
    lopBakUpAdm,
    lopRestoreAdm,
    lopAddSlGroup,
    lopDelSlGroup
  );

const
  strLogOperations : array [TLogOperations] of string = (
    ' 1 Редактирование сметных/системных данных',
    ' 2 Удаление сметных/системных данных',
    ' 3 Экспорт (выгрузка) сметных данных',
    ' 4 Импорт (загрузка) сметных данных',
    ' 5 Переключение бизнес-этапа для сметных данных',
    ' 6 Предоставление группе доступа к сметному объекту',
    ' 7 Запрет доступа к сметному объекту для группы',
    ' 8 Изменение собственника сметного объекта',
    ' 9 Включение разделения доступа',
    '10 Выключение разделения доступа',
    '11 Создание пользователя',
    '12 Удаление пользователя',
    '13 Привязка пользователя к группе',
    '14 Исключение пользователя из группы',
    '15 Назначение роли пользователю',
    '16 Снятие роли с пользователя',
    '17 Редактирование роли',
    '18 Очистка протокола (вручную)',
    '19 Изменение списка протоколируемых операций',
    '20 Выгрузка данных административного доступа',
    '21 Загрузка данных административного доступа',
    '22 Добавление подчиненной группы',
    '23 Удаление подчиненной группы'
  );

Последний раз редактировалось Stilet; 16.11.2012 в 15:52.
samouelson вне форума Ответить с цитированием
Старый 16.11.2012, 14:02   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Serge_Bliznykov уже написал - делайте в AdoQuery вычисляемое поле, присваивайте ему значение в OnCalcFields - больше ничего не нужно.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.11.2012, 14:29   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

о. а ещё лучше - добавить таблицу OperationName
в ней два поля LogId, LogOperation,
дальше уже всё просто. в запросе через JOIN связываешь вашу таблицу с таблицей OperationName и, вуаля, задача решена быстро, качественно, эффективно и просто.

если же добавление новой таблицы невозможно, тогда либо использовать вычисляемое поле...

либо ещё можно заполнить поле ручками в Dataset'е после его открытия.
для этого можно сделать примерно так:
1. добавить текстовое поле в SQL запрос.
Код:
select .........<ваши поля>, '                         ' as LogDesc from <ВашаТаблица>
2. после открытия AdoQuery написать в коде программы:
Код:
   AdoQuery1.Open;
   while not AdoQuery1.EOF do begin
       AdoQuery1.Edit;
       AdoQuery1.FieldByName('LogDesc').Value :=  
               strLogOperations[ AdoQuery1.FieldByName('IdLog').Value ];
       AdoQuery1.Post; 
       AdoQuery1.Next;
   end;
   AdoQuery1.First;
3. профит
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.11.2012, 14:38   #8
samouelson
Пользователь
 
Регистрация: 07.12.2009
Сообщений: 46
По умолчанию

Сделал в AdoQuery, заюзал OnCalcFields и voila! Как сложно и как просто все! Спасибо большое всем, кто принял участие в устранении моего тупизма! Всем поставил +1.

Последний раз редактировалось samouelson; 16.11.2012 в 15:33.
samouelson вне форума Ответить с цитированием
Старый 16.11.2012, 15:40   #9
samouelson
Пользователь
 
Регистрация: 07.12.2009
Сообщений: 46
По умолчанию

Каким образом можно отсортировать данную таблицу по полю MyField (fkCalculated), если его нет в бд? У меня вылетает Invalid column name на этот код:

Код:
ADOQuery1.Close; // закрываем базу данных
    ADOQuery1.SQL.Clear; // подготавливаем запрос
    ADOQuery1.SQL.add('SELECT * FROM A0Protocol ORDER BY ' + Column.FieldName +
      ' ASC'); // SQL запрос
    ADOQuery1.Open; // выполняем запрос
    Column.Title.Caption := StringReplace(Column.Title.Caption, '\/ ', '/\ ', []
      ); // показываем значок сортировки \/ (по возрастанию)
Ответ найден здесь http://delphiworld.narod.ru/base/dbg...lick_sort.html

Последний раз редактировалось samouelson; 16.11.2012 в 15:48. Причина: Ответ найден на форуме
samouelson вне форума Ответить с цитированием
Старый 16.11.2012, 16:00   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

и правильно. так нельзя. если поля нет, то почём СУБД будет сортировать то?!

а вот если бы послушались моего совета и добавили ещё одну таблицу в БД, тогда можно было легко в запросе использовать!

p.s. попробуйте через IndexName.... хотя не уверен, что поможет..
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как ComboBox на UserForm заполнить данными с другого листа ? Snekich Microsoft Office Excel 2 08.12.2011 18:37
Добавить столбец с данными, из запроса в существующую таблицу. Tolius Microsoft Office Access 0 04.05.2011 16:43
заполнить таблицу данными из доверенностей LazyFox Microsoft Office Excel 5 10.10.2009 16:41
Рандомно заполнить столбец( gred БД в Delphi 1 15.06.2009 10:00