![]() |
|
![]() ![]() ![]() |
|
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
И так, пояснения по программе.
Мне в конечном итоге нужно следующее. Есть таблица 1 с входными данными, несколько полей которой должны содержать списки выбора (хотела сделать лукап-полями). Каждый из списков берёт значения из своей таблицы. В конечном итоге, все эти данные из Таблицы1 нужны для расчётов по формулам. Т.е. есть какая-то величина, которая рассчитывается в зависимости от тех или иных условий. Формул - 10 штук. Затем рассчитанные результаты заносятся в Таблицу2 - итоговую, из которой есть возможность импорта в MS Excel. Объясняю я конечно не очень, но хочется верить, что понятно... |
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Что мне подумалось - может ты не на то ID настраивала лукап?
Т.е. у тебя в главной таблице есть ID самой записи и ID для каждого поля данных на которые будут настроены лукапы. Т.е. в главной таблице у тебя хранятся только ID записей из лукапов. |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Именно так это и было. Если посмотришь её первый исходник, то увидишь, что значение для лукапа, определяет первичный ключ главной таблицы, что есть не правильно. Потому как подмножество значений id лукапа, должно быть подмножеством id второй(подчинённой таблицы). Что бы было правильно, надо ввести дополнительное поле(внешний ключ), значениями которого будут значения id из множества id подчинённой таблицы, и сослаться на это поле, свойством KeyField лукапового поля. Это всё элементарно показано в борландовской дэмке CtrlGrid, на которую я ссылался для изучения |
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
cat512, на самом деле можно даже демки не смотреть - надо просто понимать, что есть лукап и как он работает.
![]() |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Ну дэмки необязательно смотреть тебе, потому как знаешь мат. часть, а начинающему, очень даже полезно! ![]() |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
Может и не на то... Так насколько я понимаю, таблицы связываются по ключевым полям, не так ли? Вы не могли бы объяснить более понятно на примере. Вот мой пример. Есть таблица 1. В ней поля: ID - ключевое Pole1 - Обычное Pole2 - для лукапа Есть таблица2. В ней поля: ID_p - ключевое Poles - обычное, его содержимое отображается в Pole2 И как я уже ранее писала, настраиваю лукап следующим образом: 1) FieldKind -> fkLookup 2) LookupDataset -> Form2.Query1 3) KeyFields -> ID 4) LookupKeyFields -> Id_p 5) lookuoResultField -> Poles Подскажите, что же я делаю не так? И что мне сделать, чтобы оно нормально работало? |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Поля 3 и 4 должны иметь значения одного множества. Вернее так, значения поля 3 должно быть подмножеством значений поля 4 Поскольку поле Id_p - это первичный ключ подчинённой таблицы, а ID в этом случае должен быть внешним ключом Знаешь что такое первичный ключ и внешний ключ? Если не знаешь почитай, это основополагающие понятия БД
Значения внешнего ключа, всегда является подмножеством значений первичного, на который он ссылается. Но в твоей организации ключей, поле ID, также является первичным ключом первой таблицы. При этом возникает противоречие: либо ID не сможет идентифицировать записи главной таблицы, при условии Nгл. > Nподч. (N - количество записей), либо подмножество значений поля ID не будет включаться(принадлежать) в множество занчений Id_p. Правильно будет так 0)Добавляем новое поле FID типа интегер 1) FieldKind -> fkLookup 2) LookupDataset -> Form2.Query1 3) KeyFields -> FID 4) LookupKeyFields -> Id_p 5) lookuoResultField -> Poles Это сообщение отредактировал(а) cat512 - 12.4.2011, 22:28 |
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Pole2 должно содержать значение ID_p а не Poles - грубо говоря. (Все как написал cat512)
Хотя если принципиально надо хранить в Pole2 значения из Poles, то можно попробовать так: 1) FieldKind -> fkLookup 2) LookupDataset -> Form2.Query1 3) KeyFields -> Pole2 4) LookupKeyFields -> Poles 5) lookuoResultField -> Poles Т.е. вообще отказаться от ID_p, но я не уверен, надо проверять. ПС проверил - работает. ![]() Но это все так для проекта на коленке для личного пользования. Иначе надо ID и внешние ключи. Это сообщение отредактировал(а) superVad - 12.4.2011, 23:12 |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Согласен superVad, можно вместо FID использовать Pole2 (незаметил из-за этих непонятных названий).
Мне кажется, что если отказаться от Id_p, механизм lookup-а работать не будет, хотя не уверен. Теперь к решению: По сути её задачка сводится к схеме звезда, с внешними ключами, или Pivot-у(плоской табличке) с внешними ключами и Lookup-ами Добавлено @ 23:28 superVad, а ты заполнял поле Poles второй таблички одинаковыми значениями в одном столбце? Просто интересно сможет в таком случае Lookup выбрать значение Это сообщение отредактировал(а) cat512 - 12.4.2011, 23:31 |
|||
|
||||
Solominka |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
У меня так работает =_= Оно вообще не терпит одинаковых полей, увы...
А это что меняет? Просто полуается ещё одно, которое так же находится в прямой зависимости и теперь при выборе лукапа ID_p отображается в FID =_= Создание этого фиктивного поля конечно подошло, чтобы "обойти" задачу, будь у меня простенькая табличка в 3 столбца. Но у меня, извините 25 полей в таблице и штук 10 из них - должно быть с лукапами, берущимися из других таблиц. Ведь не 10 же фиктивных полей мне создавать... Ох...
О чём и речь... Завтра днём поищу/почитаю про первичный ключ и внешний ключ - впервые о них слышу. Не работала с БД настолько углубленно, к своему великому стыду и сожалению, и знаю только что такое "ключевое поле" =__= В любом случае - отпишусь. superVad, cat512, спасибо, что помогаете и возитесь со мной. |
||||||
|
|||||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Это не "фиктивное поле". В нем хранится ID нужной тебе записи. Так делать правильно. Почитай про внешние ключи. |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
Посмотрела-почитала про ключи... Ничего толком не поняла. Много слов - и ни одного вразумительного простого примера.
Более ли менее понятные определения, которые мне удалось найти:
Как я поняла, в моём примере в обеих таблицах есть только первичные ключи - это ключевые поля ID и ID_p. И мне надо во второй таблице создать первичный ключ и его указать при создании лукап-поля в 1-й таблице. Так? Или нет? Если да, то пожалуйста объясните КАК мне создать этот самый "первичный ключ" - по запросу в гугле "Delphi как создать внешний ключ" мной не было найдено абсолютно ничего вразумительного :( И если можно, то объясните мне всё это пожалуйста на каком-нибудь простом для понимания примере... Можно даже на яблоках с апельсинами, ибо я НЕ ПОНИМАЮ... |
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Solominka
Первичные ключи у тебя в обоих базах уже есть это ID и ID_p. Тебе надо создать внешний ключ - который связывает ID_p во второй табице и поле в первой таблице где будет хранится его значение (это поле и надо создать). Такая связь называется - один ко многим. Смысл всего этого, что данные из второй таблицы физически в первой не хранятся - только значение ID_p. А внешний ключ контролирует эту связь (следит за ссылочной целостностью). Как создать внешний ключ - читай в спецификации своей БД. Внешний ключ не создается в какой то таблице - это отдельный объект (если что ![]() В приведенном определении все очень даже доступно. Почитай вики - ссылка - может чего интересного найдешь. Это сообщение отредактировал(а) superVad - 14.4.2011, 20:07 |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
superVad, хмм, про википедию я как обычно забыла... Большое спасибо, теперь стало хоть немного яснее...
Вы имели ввиду СУБД наверное... Долго уже ищу спецификацию для Paradox 7 своей - что-то безуспешно пока. ![]() И меня терзают смутные сравнения: можно ли в уже созданной через Database Desktop таблице как-то создать (добавить) этот самый "внешний ключ" ? ![]() Это сообщение отредактировал(а) Solominka - 15.4.2011, 14:15 |
|||
|
||||
Vas |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 29.6.2005 Где: Stavropol region Репутация: 23 Всего: 28 |
Не надо его добавлять, просто обрабатывай правильно поля. Как писали
Поле Pole2 должно иметь тип такой же, как поле ID_p и содержать значения из второй таблицы поля ID_p ну и допускается еще null. Остальные значения Pole2 содержать не должно. Соответственным образом обрабатывая его в программе и получим внешний ключ. Это сообщение отредактировал(а) Vas - 15.4.2011, 14:59 -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |