welcome |
Отправлено: 01.06.2004, 09:20 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
Предположим есть две таблицы:
Table1:\ Name1 \ Phone\
Table2:\ Name2 \ Dep \
Table2 выводиться на редактирование в DBGRid
Надо сделать так чтобы в поле Name2 таблицы Table2 можно было бы ввести только те значения которые содержаться в поле Name1 таблицы Table1 ПРИЧЁМ необходимо чтобы допустимые значения можно было выбирать из выпадающего списка. Выпадающий список надо формировать динамически — т.е. в этом списке должен выводиться результат запроса :
SELECT Name1 FROM Table1
ВОПРОС: Как это реализовать? |
|
olegenty |
Отправлено: 01.06.2004, 09:33 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
1. Устнановить EhLib
2. У датасета объявить Lookup поле
3. Создать у DBGridEh постоянные колонки
4. Настроить колонку с Lookup полем на соответствующий датасет
5. Насладиться результатом раюоты
|
|
AVC |
Отправлено: 01.06.2004, 12:03 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Если все таки требуется работать через DBGrid
1. Если выпадающий список одинаков для всех строк — заполнить DBGrid->Colums->Item[??]->PickList заранее.
2.Если список зависит от текущей строки Table2 то выполнить Select и см.1. Момент смены строк хорошо ловится DBGrid->DataSource->OnDataChange.
3.Разработать свою форму для выбора из списка.
Предупреждение: в большинстве систем показывать нужно одно (название), а запоминать в таблице другое (код). В этом случае PickList не спасает. |
|
olegenty |
Отправлено: 01.06.2004, 12:21 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
если требуется работать с DBGrid (уж не представляю, откуда такое ограничение при бесплатности EhLib), то про PickList и думать забудте, Lookup поля и тут решат решат все ваши проблемы, просто для них более скудные возможности.
|
|
welcome |
Отправлено: 02.06.2004, 10:34 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
QUOTE (olegenty @ 01/06/2004, 10:35) | 2. У датасета объявить Lookup поле
3. Создать у DBGridEh постоянные колонки
4. Настроить колонку с Lookup полем на соответствующий датасет
5. Насладиться результатом раюоты |
Что значит "Создать у DBGridEh постоянные колонки"??? Дело в том что у меня в одном и том же Grid в зависимости от выбора пользователя выводяться разные таблицы с разным количеством столбцов. Так что постоянное число колонок мне нне подходит.
Где искать это Lookup поле? и как его объявить???
Прошу прощения за возможно глупые вопросы но я пока новечок в Builder-e |
|
olegenty |
Отправлено: 02.06.2004, 10:42 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
Lookup поле создаётся руками в редакторе полей набора данных (любого наследника TDataSet)
если несколько таблиц отображается в одном гриде, то
1. можно всё так и оставить
2. можно в Runtime производить все настройки, которые можно было сделать руками в Designtime. для этого просто надо почитать help к EhLib.
|
|
welcome |
Отправлено: 02.06.2004, 13:09 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
QUOTE (AVC @ 01/06/2004, 13:05) | Если все таки требуется работать через DBGrid
1. Если выпадающий список одинаков для всех строк — заполнить DBGrid->Colums->Item[??]->PickList заранее.
2.Если список зависит от текущей строки Table2 то выполнить Select и см.1. Момент смены строк хорошо ловится DBGrid->DataSource->OnDataChange.
3.Разработать свою форму для выбора из списка.
Предупреждение: в большинстве систем показывать нужно одно (название), а запоминать в таблице другое (код). В этом случае PickList не спасает. |
А как в PickList записать результат SQL запроса ??? |
|
welcome |
Отправлено: 02.06.2004, 13:18 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
QUOTE (olegenty @ 02/06/2004, 11:44) | Lookup поле создаётся руками в редакторе полей набора данных (любого наследника TDataSet)
если несколько таблиц отображается в одном гриде, то
1. можно всё так и оставить
2. можно в Runtime производить все настройки, которые можно было сделать руками в Designtime. для этого просто надо почитать help к EhLib. |
Отыскал, настроил (статически) — не работает
В редакторе поле установил поля таблицы, всвойствах поле нашёл поле LookupDataSet в нём указал источник данных Query в нём написал запрос результат которого мне нужен в выпадающем списке и...
и не работает.
Как сделать чтобы заработало?? Чтобы в ячейки выводился выподающий список (PickList) содержащий результат запроса???
PickList работает но как туба запихать результат запроса??? или как результат запроса присвоить некой перменной?? |
|
AVC |
Отправлено: 02.06.2004, 13:18 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Руками. PickList это обйчный TStrings — пройти в цикле по всем записям и выполнить Add или накопить строку и заполнить Text.
Советую прислушаться к советам olegenty. Работа с "чистым" TDBGid'ом достаточно сложна.
|
|
olegenty |
Отправлено: 02.06.2004, 13:22 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
руками в цикле по формирующему запросу.
|
|
welcome |
Отправлено: 02.06.2004, 13:38 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
QUOTE (AVC @ 02/06/2004, 14:20) | Руками. PickList это обйчный TStrings — пройти в цикле по всем записям и выполнить Add или накопить строку и заполнить Text.
Советую прислушаться к советам olegenty. Работа с "чистым" TDBGid'ом достаточно сложна. |
Это понятно что руками вопрос в другом — как получить эти самые записи??
т.е. предположим
Query1->SQL->Clear();
Query1->SQL->Add("select FirmName from Firms");
Так вот как из этого Query получить количество строк (для организации цикла) и соответсвенно как эти строки выуживать???
|
|
AVC |
Отправлено: 02.06.2004, 13:48 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Примерно так (читайте Help или учебник).
CODE |
TDataSet *qry = Query1;
TField *fld = qry->FieldByName("???");
// проверки на вашей совести
AnsiString text = "";
bool b = false;
for (qry->First(); !qry->Eof; qry->Next())
{ if (b) text += "\n";
b = true;
text += fld->AsString;
}
...->PickList->Text = text;
|
|
|
Gedeon |
Отправлено: 02.06.2004, 13:52 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (welcome @ 02/06/2004, 14:40) | Так вот как из этого Query получить количество строк (для организации цикла) и соответсвенно как эти строки выуживать??? |
CODE |
Query1->SQL->Count // кол-во строк
Query1->SQL->Strings[3] // четвертая строка |
|
|
AVC |
Отправлено: 02.06.2004, 13:58 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Я првильно понял — имелись в виду строки результирующего запроса? Если нет — смотрите у Gedeon. |
|
welcome |
Отправлено: 02.06.2004, 14:04 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
QUOTE (Gedeon @ 02/06/2004, 14:54) | QUOTE (welcome @ 02/06/2004, 14:40) | Так вот как из этого Query получить количество строк (для организации цикла) и соответсвенно как эти строки выуживать??? |
CODE |
Query1->SQL->Count // кол-во строк
Query1->SQL->Strings[3] // четвертая строка |
|
Имелось введу не количесво строк самого запроса,а количество строк результата этого запроса т.е. в результате запроса
SELECT Name FROM Table1
Будет список имён так вот надо выяснить количество записей в этом списке и выуживать их от туда по одному |
|
Gedeon |
Отправлено: 02.06.2004, 14:14 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Query1->RecordCount;
Хэлп помогает.
Хотя нафига Вам их количество AVC привел Вам пример организации цикла, кстати мне понравилось я обычно через while делал, так красивее.
Отредактировано Gedeon — 02/06/2004, 15:20
|
|
olegenty |
Отправлено: 02.06.2004, 14:15 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
Вот код, но ребят, Lookup поля рульнее во сто крат, ты же сказал, что у тебя в гриде могут разные таблицы отражасться. Но офигеешь контролировать свойства колонок в Runtime? Мне кажется, чтобы это делать, тебе невредно матчасть подучить, и предпочтение PickList Lookup полям должно быть очень осознанным и аргументированным не по детски...
CODE |
QryForPickList->Open();
Grid->Columns->Items[<Номер нужной колонки>]->PickList->Clear();
while (!QryForPickList->Eof)
{
Grid->Columns->Items[<Номер нужной колонки>]->PickList->Add(QryForPickList->FieldByName("<Имя колонки для формирования выпадающего списка>")-AsString);
QryForPickList->Next();
}
|
|
|
** welcome |
Отправлено: 03.06.2004, 09:44 |
|
Не зарегистрирован
|
QUOTE (olegenty @ 02/06/2004, 15:17) | ребят, Lookup поля рульнее во сто крат, ты же сказал, что у тебя в гриде могут разные таблицы отражасться. Но офигеешь контролировать свойства колонок в Runtime? Мне кажется, чтобы это делать, тебе невредно матчасть подучить, и предпочтение PickList Lookup полям должно быть очень осознанным и аргументированным не по детски...
|
Как работает PickList я понял и он выполняет то что мне надо именно поэтому я сейчас этим и воспользовался. Как воспользоваться Lookup мне пока не понятно.
В редакторе поле установил поля таблицы, всвойствах поле нашёл поле LookupDataSet в нём указал источник данных Query в нём написал запрос результат которого мне нужен в выпадающем списке и...
и не работает.
Так что я не против Lookup но как он работает пока не понимаю....
|
|
olegenty |
Отправлено: 03.06.2004, 11:14 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
если вопрос только в этом, то слушай.
1. В редакторе полей Add all fields
2. В редакторе полей New field
3. Заплняешь атрибуты вновь создаваемого поля:
3.1. Name — имя твоего нового поля
3.2. Type — тип, подставляешь тот тип, который будет в выпадающем списке
3.3. Size — если поле предполагает размер, та же строка, то указываешь размер (для строки — в символах)
3.4. Field Type — Lookup
3.5. KeyFields — поля/поле, по которому/которым будет ассоциироваться набор данных, который ты хотел поместить в PickList
3.6. Dataset — тот набор данных, из которого ты хотел поместить данные в PickList
3.7. Lookup keys — набор полей/поле, по которым/которому вяжутся твой набор данных и набор данных, вываливающийся в списке. логически тот же набор, что и в KeyFields, только из набора данных, которым ты хотел заполнить PickList
3.8. Result Field — поле для отображения в выпадающем списке, типа Type, длинной Size
всё. больше ничего делать не надо. Grid сам сделает все необходимые действия, чтобы отобразить выпадающий список...
|
|
welcome |
Отправлено: 03.06.2004, 11:48 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
QUOTE (olegenty @ 03/06/2004, 12:16) | всё. больше ничего делать не надо. Grid сам сделает все необходимые действия, чтобы отобразить выпадающий список... |
Большое спасибо — теперь я понял как это делается — всё работает |
|
olegenty |
Отправлено: 03.06.2004, 15:53 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
Как видишь, вопрос-то был плёвый, на несколько кликов мышью
|
|
** welcome |
Отправлено: 04.06.2004, 13:11 |
|
Не зарегистрирован
|
Хотя кое что не понятно
описанный способ добавляет новое поле к таблице а вот как сделать так чтобы выпадающий список находился не в другом поле а именно в поле Name точно так же как в случае с PickList ?
и вопрос номер два
как разрешить ввод значения в ячейку только из выпадающего списка, т.е. можно выбирать из выпадающего списка, можно самому вводить но только те значения которые есть в выпадающем списке. Так вот как это сделать програмнным путём (без связывания полей на уровне таблиц БД) ? |
|
** welcome |
Отправлено: 04.06.2004, 13:11 |
|
Не зарегистрирован
|
Хотя кое что не понятно
описанный способ добавляет новое поле к таблице а вот как сделать так чтобы выпадающий список находился не в другом поле а именно в поле Name точно так же как в случае с PickList ?
и вопрос номер два
как разрешить ввод значения в ячейку только из выпадающего списка, т.е. можно выбирать из выпадающего списка, можно самому вводить но только те значения которые есть в выпадающем списке. Так вот как это сделать програмнным путём (без связывания полей на уровне таблиц БД) ? |
|
olegenty |
Отправлено: 04.06.2004, 13:20 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
QUOTE |
Хотя кое что не понятно
описанный способ добавляет новое поле к таблице а вот как сделать так чтобы выпадающий список находился не в другом поле а именно в поле Name точно так же как в случае с PickList
|
значение подставляется в поле/поля KeyFields, так что тут проблемы нет, всё работает именно так, как надо. просто, в твоём случае, если у тебя там именно Name, то у тебя и KeyFields и Lookup keys и Result field = Name. при этом оригинал в гриде скрой, а Lookup оставь, и всё будет работать правильно.
и ввести туда что-либо левое, в случае наличия внешнего ключа, ты ничего не сможешь.
|
|
olegenty |
Отправлено: 04.06.2004, 13:26 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
и почитай уже наконец help/теорию а то тычешь пальцем в небо...
|
|