![]() |
|
![]() ![]() ![]() |
|
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 -------------------- И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин) |
||||
|
|||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
Vas, спасибо, понятно.
Так вот КАК обработать и где? Меня в данный момент мучает этот вопрос очень. А то он мне пока что в Pole2 цифры ID_p и выводит а не значения Poles =___= |
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Значение Poles выводится в лукап поле созданном в программе, в таблице его физически не будет. В таблице будет хранится значение ID_p по которому лукап поле будет находить и отображать Poles. Если СУБД ![]() Это сообщение отредактировал(а) superVad - 15.4.2011, 17:25 |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
Собственно, я выяснила, как создавать внешние ключи...
Только вот где это внешний ключ хранится - не поняла. Но не суть. Я связала Pole2 из 1 таблицы с Id_p из второй.
Только вот в настройках лукап-поля я указываю значение ID_p и как ключевое поле и как поле, из которого берутся результаты. И у меня вместо содержимого Poles отображается содержимое ID_p, что в принципе и логично. В общем как сделать теперь, чтобы было как надо? ![]() |
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
Вместо FID использовать Pole2 - только надо, что бы тип Pole2 был такой же как Id_p. Возможно имеет смысл поменять название для Pole2 ![]() |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
Делаю так:
Тип Pole2 был такой же как Id_p, а списка нет вообще =_= Никакого. Но и ошибок тоже не выдаёт. ![]() |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Solominka, дык заполнять Pole2 кто будет? Дядя фёдор? Заполни это поле одним из значений Id_p, и лукап тебе отобразит значение поля Poles, второй таблицы, идентифицируемого с помощью первичного ключа Id_p.
Что - то тебе объясняют на двух страницах одно и тоже, а ты всё равно понять не можешь. PS Вообще, на своём опыте, редко встречал приложения с лукапами, как правило это очень древние приложения. В основном все пользуются класической схемой - первичные/вторичные ключи + SQL |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
Ну извините, что я такой тормоз тугодоходящий. Я бы и рада уже всё понять и сделать, да вот что-то не получается. ![]() Уже больше 2-х недель вожусь со всем этим добром. Ну мне вот нужны лукапы... что поделать. Я бы и рада без них обойтись, но врят ли выйдет. Попыталась заполнить Pole2 через DatabaseDesktop. Ввелась только единичка. Может там ещё что-то не так - не знаю уже. Для пущей ясности пркрепляю исходник. Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Не уверен на счёт этих тезисов, но как говорится "хозяин - барин" |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Большая просьба - ничего не ломать в показанном примере, пока не разберёшься с механизмом работы
Присоединённый файл ( Кол-во скачиваний: 2 ) ![]() |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Надеюсь с путями к БД разберёшься. Только подключай не свои файлы БД, а те которые лежат в архиве
Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
cat512, спасибо конечно, но так и у меня работало... мне нужно чтобы поля FID НЕ БЫЛО вообще. и чтобы при этом при выборе варианта списка НЕ МЕНЯЛОСЬ ID.
Или так не возможно сделать? |
|||
|
||||
cat512 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Именно так, работать у тебя не могло! Потому как не было кое-какого кода. Если ты поиграешься повнимательней, то ты увидишь, что достаточно поменять значение поля Fid, что бы подставилось значение лукапа
Я смотрю ты мастер пудрить мозги, причём не только себе. Ну ка, объясни русским языком - это как? Без проблем, FID мы выбрасываем. Дальше, объясни каким образом ты будешь идентифицировать тот самый "ВАРИАНТ" ![]() Это сообщение отредактировал(а) cat512 - 16.4.2011, 20:28 |
||||
|
|||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
Уфф... Ну в общем объясняю. Мне надо чтобы было лукап-поле. И чтбы при выборе какого-либо варианта из него, в других полях таблицы ничего не менялось... НИЧЕГО. В том числе и в ключевом поле тоже. Просто выпадающий список, берущийся из 2-й таблицы. Без всяких дополнительных полей ненужных. Мне это и интересно: неужели так сделать нельзя, чтобы вариант в писке спокойно выбирался, но при этом содержимое остальных полей таблицы не коим образом не зависело от этого лукапа.... Это невозможно? |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Д-я-я-д-я-я-я-я Фёдор!
![]() " Мне нужно встроить в ячейки поля(Pole2), таблицы просмотра данных (DBGRID), DB-AWARE Control (контрол доступа к данным), типа DBLookupCombobox" Конечно такое можно сделать, но для тебя будет сложным заданием, да и такой интерфейс не приветствуется. |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
Ну и что мне теперь делать? ! Мне же надо как-то диплом написать =_= Я ж откуда знала как оно всё называется... Я просто описала как мне надо, чтобы оно выглядело и работало. Вот и просила помощи - чтобы подсказали, как сделать лучше, чтобы было так как мне надо. Это сообщение отредактировал(а) Solominka - 16.4.2011, 21:02 |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
"Сухари сушить"
![]() Используй грид из библиотеки EhLib или QuantumGrid от DevExpress |
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
cat512, спасибо, ты добрый :(
Знать бы ещё что это такое и где его взять =__= Это сообщение отредактировал(а) Solominka - 16.4.2011, 21:15 |
|||
|
||||
cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: 1 Всего: 15 |
Поищи поиском по нашему форуму, тут ребята кучу ссылок давали на подобные вопросы. Особенно активен в этих вопросах Akella, он постоянно учавствует в темах о разных компонентах и новых возможностях последних и пр. По его профилю можешь найти темы с нужными ссылками
|
|||
|
||||
Solominka |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 18.12.2009 Репутация: нет Всего: нет |
cat512, хорошо, спасибо, я поищу.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |