Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi: таблица с возможностью выбора условий 
V
    Опции темы
Solominka
Дата 11.4.2011, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 18.12.2009

Репутация: нет
Всего: нет



И так, пояснения по программе.
Мне в конечном итоге нужно следующее.
Есть таблица 1 с входными данными, несколько полей которой должны содержать списки выбора (хотела сделать лукап-полями). Каждый из списков берёт значения из своей таблицы.
В конечном итоге, все эти данные из Таблицы1 нужны для расчётов по формулам. Т.е. есть какая-то величина, которая рассчитывается в зависимости от тех или иных условий. Формул - 10 штук.
Затем рассчитанные результаты заносятся в Таблицу2 - итоговую, из которой есть возможность импорта в MS Excel.

Объясняю я конечно не очень, но хочется верить, что понятно...
PM MAIL   Вверх
superVad
Дата 12.4.2011, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Что мне подумалось - может ты не на то ID настраивала лукап?
Т.е. у тебя в главной таблице есть ID самой записи и ID для каждого поля данных на которые будут настроены лукапы.
Т.е. в главной таблице у тебя хранятся только ID записей из лукапов.
PM MAIL   Вверх
cat512
Дата 12.4.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 1
Всего: 15



Цитата(superVad @ 12.4.2011,  19:55)
Что мне подумалось - может ты не на то ID настраивала лукап?
Т.е. у тебя в главной таблице есть ID самой записи и ID для каждого поля данных на которые будут настроены лукапы.
Т.е. в главной таблице у тебя хранятся только ID записей из лукапов.

Именно так это и было. Если посмотришь её первый исходник, то увидишь, что значение для лукапа, определяет первичный ключ главной таблицы, что есть не правильно. Потому как подмножество значений id лукапа, должно быть подмножеством id второй(подчинённой таблицы). Что бы было правильно, надо ввести дополнительное поле(внешний ключ), значениями которого будут значения id из множества id подчинённой таблицы, и сослаться на это поле, свойством KeyField лукапового поля.
Это всё элементарно показано в борландовской дэмке CtrlGrid, на которую я ссылался для изучения
PM MAIL   Вверх
superVad
Дата 12.4.2011, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



cat512, на самом деле можно даже демки не смотреть - надо просто понимать, что есть лукап и как он работает.  smile 
PM MAIL   Вверх
cat512
Дата 12.4.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 438
Регистрация: 20.3.2007

Репутация: 1
Всего: 15



Цитата(superVad @ 12.4.2011,  20:34)
cat512, на самом деле можно даже демки не смотреть - надо просто понимать, что есть лукап и как он работает.  smile

Ну дэмки необязательно смотреть тебе, потому как знаешь мат. часть, а начинающему, очень даже полезно! smile 
PM MAIL   Вверх
Solominka
Дата 12.4.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 18.12.2009

Репутация: нет
Всего: нет



Цитата

Что мне подумалось - может ты не на то ID настраивала лукап?


Может и не на то... Так насколько я понимаю, таблицы связываются по ключевым полям, не так ли?

Вы не могли бы объяснить более понятно на примере.

Вот мой пример.
Есть таблица 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

Подскажите, что же я делаю не так? И что мне сделать, чтобы оно нормально работало?
PM MAIL   Вверх
cat512
Дата 12.4.2011, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
superVad
Дата 12.4.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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, но я не уверен, надо проверять.
ПС проверил - работает.  smile
Но это все так для проекта на коленке для личного пользования. Иначе надо ID и внешние ключи.

Это сообщение отредактировал(а) superVad - 12.4.2011, 23:12
PM MAIL   Вверх
cat512
Дата 12.4.2011, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Solominka
Дата 13.4.2011, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 18.12.2009

Репутация: нет
Всего: нет



Цитата

1) FieldKind -> fkLookup
2) LookupDataset -> Form2.Query1
3) KeyFields -> Pole2
4) LookupKeyFields -> Poles
5) lookuoResultField -> Poles


У меня так работает =_=
Оно вообще не терпит одинаковых полей, увы...

Цитата

Правильно будет так
0)Добавляем новое поле FID типа интегер
1) FieldKind -> fkLookup
2) LookupDataset -> Form2.Query1
3) KeyFields -> FID
4) LookupKeyFields -> Id_p
5) lookuoResultField -> Poles


А это что меняет? Просто полуается ещё одно, которое так же находится в прямой зависимости и теперь при выборе лукапа ID_p отображается в FID =_=  Создание этого фиктивного поля конечно подошло, чтобы "обойти" задачу, будь у меня простенькая табличка в 3 столбца. Но у меня, извините 25 полей в таблице и штук 10 из них - должно быть с лукапами, берущимися из других таблиц. Ведь не 10 же фиктивных полей мне создавать... Ох...
Цитата


Но это все так для проекта на коленке для личного пользования. Иначе надо ID и внешние ключи.


О чём и речь... Завтра днём поищу/почитаю про первичный ключ и внешний ключ - впервые о них слышу. Не работала с БД настолько углубленно, к своему великому стыду и сожалению, и знаю только что такое "ключевое поле" =__=

В любом случае - отпишусь.

superVadcat512, спасибо, что помогаете и возитесь со мной.
PM MAIL   Вверх
superVad
Дата 13.4.2011, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Цитата(Solominka @  12.4.2011,  23:33 Найти цитируемый пост)
А это что меняет? Просто полуается ещё одно, которое так же находится в прямой зависимости и теперь при выборе лукапа ID_p отображается в FID =_=  Создание этого фиктивного поля конечно подошло, чтобы "обойти" задачу, будь у меня простенькая табличка в 3 столбца. Но у меня, извините 25 полей в таблице и штук 10 из них - должно быть с лукапами, берущимися из других таблиц. Ведь не 10 же фиктивных полей мне создавать... Ох...

Это не "фиктивное поле". В нем хранится ID нужной тебе записи. Так делать правильно.
Почитай про внешние ключи.
PM MAIL   Вверх
Solominka
Дата 14.4.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 18.12.2009

Репутация: нет
Всего: нет



Посмотрела-почитала про ключи... Ничего толком не поняла. Много слов - и ни одного вразумительного простого примера.
Более ли менее понятные определения, которые мне удалось найти:

Цитата

Первичный ключ (ПК) — поле или набор полей, содержимое которых однозначно определяет запись в таблице и отличает ее от других. Служит для однозначной идентификации записей и в таблице может быть только один.
Обычно, при определении первичного ключа, по нему автоматически создается уникальный индекс. 

Внешний ключ (FK — Foreign Key) используется для создания жесткой связи (многие к одному) между двумя таблицами.
Внешний ключ задается только в том случае, если в первой таблице есть поле, содержащее значение первичного ключа из второй таблицы.
При изменении значения первичного ключа во второй таблице, могут быть изменены все соответствующие значения связанного поля в первой таблице.
При удалении записи с определенным первичным ключом из второй таблице, могут быть удалены все записи с соответствующим значением связанного поля в первой таблице.
Обычно, при определении внешнего ключа, по нему автоматически создается индекс, который используется в запросах при объединении этих двух таблиц. 



Как я поняла, в моём примере в обеих таблицах есть только первичные ключи - это ключевые поля ID и ID_p. И мне надо во второй таблице создать первичный ключ и его указать при создании лукап-поля в 1-й таблице. Так? Или нет?
Если да, то пожалуйста объясните КАК мне создать этот самый "первичный ключ"  - по запросу в гугле "Delphi как создать внешний ключ" мной не было найдено абсолютно ничего вразумительного :(

И если можно, то объясните мне всё это пожалуйста на каком-нибудь простом для понимания примере... Можно даже на яблоках с апельсинами, ибо я НЕ ПОНИМАЮ...

PM MAIL   Вверх
superVad
Дата 14.4.2011, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Solominka
Первичные ключи у тебя в обоих базах уже есть это ID и ID_p.
Тебе надо создать внешний ключ - который связывает ID_p во второй табице и поле в первой таблице где будет хранится его значение (это поле и надо создать). Такая связь называется - один ко многим. Смысл всего этого, что данные из второй таблицы физически в первой не хранятся - только значение ID_p. А внешний ключ контролирует эту связь (следит за ссылочной целостностью).
Как создать внешний ключ - читай в спецификации своей БД.
Внешний ключ не создается в какой то таблице - это отдельный объект (если что  smile ).
 
В приведенном определении все очень даже доступно.

Почитай вики - ссылка - может чего интересного найдешь.

Это сообщение отредактировал(а) superVad - 14.4.2011, 20:07
PM MAIL   Вверх
Solominka
Дата 15.4.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 18.12.2009

Репутация: нет
Всего: нет



superVad, хмм, про википедию я как обычно забыла... Большое спасибо, теперь стало хоть немного яснее...

Цитата

Как создать внешний ключ - читай в спецификации своей БД.


Вы имели ввиду СУБД наверное... Долго уже ищу спецификацию для Paradox 7 своей - что-то безуспешно пока.  smile  ну почему мне так не везёт

И меня терзают смутные сравнения: можно ли в уже созданной через Database Desktop таблице как-то создать (добавить) этот самый "внешний ключ" ?  smile 

Это сообщение отредактировал(а) Solominka - 15.4.2011, 14:15
PM MAIL   Вверх
Vas
Дата 15.4.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Solominka @  15.4.2011,  14:15 Найти цитируемый пост)
И меня терзают смутные сравнения: можно ли в уже созданной через Database Desktop таблице как-то создать (добавить) этот самый "внешний ключ" ?

Не надо его добавлять, просто обрабатывай  правильно поля. Как писали

Цитата(superVad @  12.4.2011,  23:04 Найти цитируемый пост)
Pole2 должно содержать значение ID_p а не Poles - грубо говоря. (Все как написал cat512)

Поле Pole2 должно иметь тип такой же, как поле  ID_p и содержать значения из второй таблицы поля ID_p ну и допускается еще null. Остальные значения Pole2 содержать не должно. Соответственным образом обрабатывая его в программе и получим внешний ключ.


Это сообщение отредактировал(а) Vas - 15.4.2011, 14:59


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1177 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.