Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/49: Рейтинг темы: голосов - 49, средняя оценка - 4.53
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89

добавление из DBGrid в PickList

30.05.2011, 17:37. Показов 9676. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, появилась проблема, нуждаюсь в вашей помощи!!!
Необходимо при добавлении записи в колонку, чтобы это запись добавлялась в пиклист не только этой таблицы, но и в другие, например есть таблица Поставщики в ней есть колонка Поставщик, добавляю туда нового поставщика, и этот поставщик должен добавиться в пиклист таблицы МатеринскиеПлаты в колонку поставщик (в выподающий список)... Может сильно замудрил, задавайте вопросы...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure PopulatePickList(Column:TColumn;ADOTable:TADOTable;FieldName:string);
var
   QryTemp: TQuery;
   i: integer;
begin
   Column.PickList.Clear;
   QryTemp := TQuery.Create(nil);
   with QryTemp do
   begin
     SQL.Clear;
     SQL.Add('SELECT DISTINCT '+FieldName+' from '+ADOTable.TableName);
   end;
 
   with QryTemp do
   begin
     ADOTable.Active := True;
     ADOTable.First;
     for i := 0 to QryTemp.RecordCount - 1 do
     begin
       if FieldByName(FieldName).AsString <> '' then
          Column.PickList.Add(FieldByName(FieldName).AsString);
       ADOTable.Next;
     end;
     ADOTable.Active := False;
   end;
   QryTemp.Free;
end;
 
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
PopulatePickList(DBGrid1.Columns[1],ADOTable2,'МатеринскиеПлаты');
end;
Программа!
1.RAR
ОРИГИНАЛЬНЫЙ КОД!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure PopulatePickList(Column:TColumn;Table:TTable;FieldName:string); 
var 
   QryTemp: TQuery; 
   i: integer; 
begin 
   Column.PickList.Clear; 
   QryTemp := TQuery.Create(nil); 
   with QryTemp do 
   begin 
     DatabaseName := Table.DatabaseName; 
     SQL.Clear; 
     SQL.Add('SELECT DISTINCT '+FieldName+' from '+Table.TableName); 
   end; 
 
   with QryTemp do 
   begin 
     Active := True; 
     First; 
     for i := 0 to QryTemp.RecordCount - 1 do 
     begin 
       if FieldByName(FieldName).AsString <> '' then 
         Column.PickList.Add(FieldByName(FieldName).AsString); 
       Next; 
     end; 
     Active := False; 
   end; 
   QryTemp.Free; 
end; 
 
procedure TForm1.DataSourceDataChange(Sender: TObject; Field: TField); 
begin 
PopulatePickList(DBGrid.Columns[2],Table,'Field'); 
//замените таблицу Вашим tableName сетки 
//DBGrid.Columns[2] с Вашим DBGrid Column, который Вы хотите PickList для 
//Field с полем для PickList 
end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2011, 17:37
Ответы с готовыми решениями:

DBGrid PickList
Ребят, нужно что бы PickList заполнялся автоматически из заранее созданной базы. У меня получается добавить только 1 значение, которое...

Использование PickList в DBGrid
Привет! Читала долго и упорно, но так и не поняла (а может не правильно делаю): как сделать так, чтобы в одной из колонок компонента...

DBGrid и PickList. Подстановка данных
Итак, имеется таблица базы данных с двумя столбцами. В первом - ID, во втором - строка. В гриде отображается ид(мнго непонятных цифр),...

11
Тимуровец
 Аватар для Страдалецъ
445 / 285 / 50
Регистрация: 10.09.2009
Сообщений: 963
30.05.2011, 17:48
Так просто обновляйте наборы данных для пиклистов. Можно сделать единое событие для них всех, что-бы не перегружать кодом.
0
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
30.05.2011, 18:01  [ТС]
Имеете ввиду постоянно новые данные вписывать? если да, то так не пойдёт! Надо чтобы в пиклисты автоматически добавлялось при вводе данных в ячейку!
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
30.05.2011, 18:18
Содержимое пиклистов (выпдающих списков) определяется запросом для каждой сетки.
При изменении списка (добавления в справочник) просто повторяйте эту процедуру (заполнения пиклиста) для КАЖДОГО грида. Этот код, чтобы он выполнялся автоматически, заключите в процедуру, которая перебирает все нужные сетки и для каждой делает перегрузку.
Процедуру вызывайте после каждого изменения справочника.
1
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
30.05.2011, 18:23  [ТС]
MsGuns, смысл понял, но реализовать врятли смогу, вот поэтому сюда и пишу, чтобы кто-то помог сделать (доделать), я скинул свою программу, может посмотрите в чём проблема??? Спасибо!
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
30.05.2011, 21:01
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure PopulatePickList(Grid:TDBGrid; FldName:string); 
var 
   QryTemp: TQuery; 
   ACol: TColumn;
   i: integer; 
begin 
   // Найти колонку соотв-ю полю
   ACol  := nil;
   for i := 0 to TDBGrid.Columns.Count-1 do
      if (ACol=nil) and (Grid.Columns[i].FieldName=FldName) then
          ACol := Grid.Columns[i];
   if (ACol=nil) or (ACol.PickList=nil) then exit; // Колнки с указ.поле нет в сетке или она не эллипс-типа
   ACol.PickList.Clear;
   Screen.Cursor := crSQLWait;
   with TADOQuery.Create(nil) do
     try
       Connection := TADOTable(Grid.DataSource.DataSet).Connection;
       SQL.Text := 'SELECT DISTINCT '+FldName+' from '+TADOTable(Grid.DataSource.DataSet).TableName); 
       Open;
       while not Eof do
          begin
           if FieldByName(FldName).AsString <> '' then 
              ACol.PickList.Add(FieldByName(FldName).AsString); 
           Next; 
          end;
        Close;
     finally
        Free;
     end; 
end; 
 
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
// Этот универсальный обработчик назначить тем полям, по которым надо пикап-списки
begin
   PopulatePickList(DBGrid1,Field);
end;
Добавлено через 1 минуту
Из Var убрать QryTemp как ненужный. Просмотрел
К сожалению, нет дома дельфи (ычкра обновил комп и поставить не успел), так что не гарантирую 100% компиллинг. Но идею, думая, Вы уловили
1
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
30.05.2011, 21:34  [ТС]
Спасибо, буду пробовать, позже отпишусь.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
31.05.2011, 10:23
В моем коде есть один недостаток (ИМХО довольно существенный) - при нескольких лукап-полях выборка и заполнение списка выполняется отдельно для каждого поля (колонки грида).
Можно и нужно все выбирать за раз. Правда придется написать код динамического составления запроса, а потом при сканировании его записывать в каждый пиклист с проверкой на дубликаты.
Но программа будет работать значительно быстрее (чем больше объемы, тем заметнее будет выигрыш в скорости)
0
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
01.06.2011, 14:09  [ТС]
MsGuns, мне хоть как-нибудь сделать надо...
Попробовал твой код, выбивает ошибки, не знаю что делать, может попробуешь сам написать в мой исходник? Был бы очень благодарен!
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
01.06.2011, 16:18
И какие же ошибки "выбивает" ?

Добавлено через 2 минуты
И я сделал приписку в конце поста с кодом, Вы обратили внимание ?
Код за Вас готовый писать я не буду, это уже перебор. Вам вполне достаточно было сказано и показано - требуется приложить немного мозга и рук.
0
8 / 8 / 0
Регистрация: 02.11.2009
Сообщений: 89
05.06.2011, 14:38  [ТС]
Пошёл по другому пути!
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.DataSource2DataChange(Sender: TObject; Field: TField);
begin
Form5.ADOQuery1.FindFirst;
 if not Form5.AdoQuery1.IsEmpty then
 repeat
 Form5.DBGrid1.Columns[3].PickList.add(Form1.ADOQuery1.Fields[3].asString);
 Application.ProcessMessages;
 until not Form5.ADOQuery1.FindNext;
 end;
Но выдаёт ошибку!!! Что делать?

Debugger Exception Notification
---------------------------
Project Empirei.exe raised exception class EAccessViolation with message 'Access violation at address 004F590B in module 'Empirei.exe'. Read of address 00000304'. Process stopped. Use Step or Run to continue.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
06.06.2011, 12:20
Вы, батенька, дурь написали полную - даже комментировать не буду !
Марш учить методы и свойства TDataSet !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.06.2011, 12:20
Помогаю со студенческими работами здесь

Как разрешить ввод данных в DBGrid только из списка PickList ?
Всем привет. Подскажите, плиз, как разрешить ввод данных в DBGrid только из списка PickList ? Т.е. вводится другое значение – оно...

DBGRID Picklist
Здравствуйте! Сколько не ищу, не могу найти ответ на вопрос. У меня есть dbgrid с одной лишь таблицей, в которой несколько полей. В одном...

Загрузить список PickList в DBGrid-е из файла
В DBGrid-е можно задать свойство столбца ButtonStyle=cbsAuto. Если это сделать то дополнительно можно установить свойство столбца ...

Добавление записи в PickList
скажите, пожалуйста, возможно ли (в Делфи) по нажатии кнопки добавить новую запись в PickList (DBGrid)??

Сделать выборку из picklist dbgrid для отбора в другой таблице на основе этой выборки
И снова я в запаре.. дым с ушей идет :help: короче задача такая нужно сделать фильтрацию через комбобоксы дбгрида, например есть дбгрид где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru