![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с гридом. [D6, IB6.x]
korvin © (2004-05-23 12:02:00)Имеется две таблицы. Ну скажем в одной Страны, в другой города и структура их пусть будет такой:
- Таблица стран:
ID_Strana floaf
Strana_Name varchar(30)
- Таблица городов
ID_Gorod float
id_Strana float
Gorod_Name varchar(30)
Делаю запрос типа:
Select * from Strana, Gorod
where Gorod.Id_Strana=Strana.Id_Strana
Всё это хозяйство отображаю в гриде (точнее в dxDBGrid, хотя разницы наверное нет). И вот при выполнении Post для таблицы БД очищается видимое в Гриде поле Названия страны (хотя в базе с ним ничего не случается). Пробовал обойти заполнением этого поля при AfterScroll для БД - не помогает. Только переоткрытие и Локэйтом искать ту запись опять, но это геморой. Есть ли ещё способы?
korvin (2004-05-23 19:28:00) [21]Ребята, ID действительно взят в Флоат из-за предполагаемо большого количества записей и ничего кроме иногда Локэйта да связи между таблицами с ним не делается.
Для предложения по Квэри - у меня Интербэйсовская база.
Дело вобщем то не в ID, а в том, что поле названия из связанной по нему таблицы очищается (только на экране, в гриде) в момент выполнения Post. Само же поле если запросить в этот момент, то значение получим правильное. Вопрос, как не потерять этой информации в таком случае с экрана?
Vlad (2004-05-23 17:41:00) [22]> jack128 © (23.05.04 17:10) [6]
> Domkrat © (23.05.04 17:16) [8]
Я привел лишь один из "дешевых" (в смысле затрат на разработку) вариантов решения данной задачи.
> множество 0..MaxInt делят на диапазоны для каждого подразделения
Это недальновидное решение, потому как диапазона integer может не хватить, если таблица большая, к примеру бухгалтерские, банковские проводки.
> Вообще использую float можно нарваться на погрешности округления
>
Ну, вобще-то с ID-шниками обычно не производят никаких мат. операций, он служит лишь для поддержки ссылочной целостности.
В моем варианте, дробная часть ID представляет собой строго (к примеру) 4-х значный код подразделения
То есть процедура формирования ID возвращает нечто вроде такого: 23545677.0044 Конечно, если начать выполнять математические действия, с этим числом, можем нарваться на погрешность, но оно как правило не надо.
Хотя, еще раз повторю, это лишь один из способов простой и дешевой реализации такой задачи.
Domkrat (2004-05-23 17:16:00) [23]>а дробная часть - код подразделения в этом регионе
IMHO это отдельная таблица, или хотябы разряды integer, bigint
jack128 (2004-05-23 17:11:00) [24]
> а-ля 1/3 * 3 = 1- может вернуть False
jack128 (2004-05-23 17:10:00) [25]
> ] Vlad © (23.05.04 17:05)
гм. Насколько я знаю(самому такое делать не доводилось) обычно в таких случаях просто множество 0..MaxInt делят на диапазоны для каждого подразделения. Вообще использую float можно нарваться на погрешности округления (а-ля 1/3 * 3 = 3 - может вернуть False) вот и получиться, что делаешь запрос where ID = 1 и нечего неполучешь, потому что у тя ID = 1.00000000000000000001 ...
Vlad (2004-05-23 17:05:00) [26]
> Domkrat ©
> jack128 ©
Применение дробных идентификаторов мне известно в следующих случаях:
Когда есть центральный сервер, и есть множество локальных БД, к примеру в разных регионах. В конце дня регионы присылают копии своих локальных баз, и все их необходимо слить в этот центральный сервер. В этом случае целая часть - это уникальный ID в рамках одного региона, а дробная часть - код подразделения в этом регионе. В целом получается строгая уникальность.
Domkrat (2004-05-23 16:55:00) [27]ID - обычно integer
jack128 (2004-05-23 16:55:00) [28]
> ID_Gorod float
> id_Strana float
оригинальное решение
приведи запросы на InsertSQL
Domkrat (2004-05-23 16:54:00) [29]Сделать поле страна лукапным, селект Select * from GOROD
KADAN (2004-05-23 16:03:00) [30]Плохо понял, что именно требуется... возможно нужны методы
Query.Requery и Query.GotoBookmark