Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Вниз
Помогите с гридом. Найти похожие ветки
← →
korvin (2004-05-23 12:02) [0]Имеется две таблицы. Ну скажем в одной Страны, в другой города и структура их пусть будет такой:
- Таблица стран:
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 для БД - не помогает. Только переоткрытие и Локэйтом искать ту запись опять, но это геморой. Есть ли ещё способы?
← →
KADAN © (2004-05-23 16:03) [1]Плохо понял, что именно требуется... возможно нужны методы
Query.Requery и Query.GotoBookmark
← →
Domkrat © (2004-05-23 16:54) [2]Сделать поле страна лукапным, селект Select * from GOROD
← →
jack128 © (2004-05-23 16:55) [3]
> ID_Gorod float
> id_Strana float
оригинальное решение
приведи запросы на InsertSQL
← →
Domkrat © (2004-05-23 16:55) [4]ID - обычно integer
← →
Vlad © (2004-05-23 17:05) [5]
> Domkrat ©
> jack128 ©
Применение дробных идентификаторов мне известно в следующих случаях:
Когда есть центральный сервер, и есть множество локальных БД, к примеру в разных регионах. В конце дня регионы присылают копии своих локальных баз, и все их необходимо слить в этот центральный сервер. В этом случае целая часть - это уникальный ID в рамках одного региона, а дробная часть - код подразделения в этом регионе. В целом получается строгая уникальность.
← →
jack128 © (2004-05-23 17:10) [6]
> ] Vlad © (23.05.04 17:05)
гм. Насколько я знаю(самому такое делать не доводилось) обычно в таких случаях просто множество 0..MaxInt делят на диапазоны для каждого подразделения. Вообще использую float можно нарваться на погрешности округления (а-ля 1/3 * 3 = 3 - может вернуть False) вот и получиться, что делаешь запрос where ID = 1 и нечего неполучешь, потому что у тя ID = 1.00000000000000000001 ...
← →
jack128 © (2004-05-23 17:11) [7]
> а-ля 1/3 * 3 = 1 - может вернуть False
← →
Domkrat © (2004-05-23 17:16) [8]>а дробная часть - код подразделения в этом регионе
IMHO это отдельная таблица, или хотябы разряды integer, bigint
← →
Vlad © (2004-05-23 17:41) [9]> jack128 © (23.05.04 17:10) [6]
> Domkrat © (23.05.04 17:16) [8]
Я привел лишь один из "дешевых" (в смысле затрат на разработку) вариантов решения данной задачи.
> множество 0..MaxInt делят на диапазоны для каждого подразделения
Это недальновидное решение, потому как диапазона integer может не хватить, если таблица большая, к примеру бухгалтерские, банковские проводки.
> Вообще использую float можно нарваться на погрешности округления
>
Ну, вобще-то с ID-шниками обычно не производят никаких мат. операций, он служит лишь для поддержки ссылочной целостности.
В моем варианте, дробная часть ID представляет собой строго (к примеру) 4-х значный код подразделения
То есть процедура формирования ID возвращает нечто вроде такого: 23545677.0044 Конечно, если начать выполнять математические действия, с этим числом, можем нарваться на погрешность, но оно как правило не надо.
Хотя, еще раз повторю, это лишь один из способов простой и дешевой реализации такой задачи.
← →
korvin (2004-05-23 19:28) [10]Ребята, ID действительно взят в Флоат из-за предполагаемо большого количества записей и ничего кроме иногда Локэйта да связи между таблицами с ним не делается.
Для предложения по Квэри - у меня Интербэйсовская база.
Дело вобщем то не в ID, а в том, что поле названия из связанной по нему таблицы очищается (только на экране, в гриде) в момент выполнения Post. Само же поле если запросить в этот момент, то значение получим правильное. Вопрос, как не потерять этой информации в таком случае с экрана?
← →
Vlad © (2004-05-23 19:45) [11]
> korvin (23.05.04 19:28) [10]
что делаешь перед тем как происходит Post ?
Есть ли какие-то обработчики, т.е. Before/AfterPost или что-то подобное ?
Вобще, ситуация ненормальная конечно.
← →
jack128 © (2004-05-23 19:50) [12]
> Select * from Strana, Gorod
> where Gorod.Id_Strana=Strana.Id_Strana
блин, народ, объясните мне, недалекому, какой InsertSQL может быть повешен на такой запрос??? В какую таблицу инсерт то делается?
И еще какой у тя RefreshSQL ?
← →
Vlad © (2004-05-23 19:56) [13]
> jack128 © (23.05.04 19:50) [12]
а что тут странного ?
При таких конструкциях обычно делают insert в детайл-таблицу, т.е. в справочник городов.
Однако, все-же неясно, почему после post обнуляется поле с наименованием, ведь если бы была связка мастер-детайл на клиенте, то можно было бы предположить нарушение ссылочной целостности, а так.... непонятно.
← →
Наталия © (2004-05-24 06:35) [14]Vlad © (23.05.04 19:45) [11]
После Insert сделай Refresh.
Или измени интерфейс для работы со странами-городами на Master-Details.
← →
Johnmen © (2004-05-24 09:19) [15]>korvin
1. Делать нецелочисленный суррогатный ключ - верный способ нажить большие неприятности.
2. Чтобы не пропадало - вкл.кеширование лукап поля.
← →
Vlad © (2004-05-24 11:45) [16]
> Наталия © (24.05.04 06:35) [14]
> Vlad © (23.05.04 19:45) [11]
> После Insert сделай Refresh.
Спасибо, обязательно последую Вашему совету
:-)
← →
jack128 © (2004-05-24 18:06) [17]
> [14] Наталия © (24.05.04 06:35)
> Vlad © (23.05.04 19:45) [11]
> После Insert сделай Refresh.
он и так делается. Если, конечно InsertSQL прописан.
> Или измени интерфейс для работы со странами-городами на
> Master-Details.
это да. Я себе слабо представляю, кому могут понадобиться рзультаты такого запроса. Хотя как знать, конечно...
← →
korvin (2004-05-25 08:54) [18]jack128 © (23.05.04 19:50) [12]
Уточню - таблица стран в качестве справочной, а главная - города. Инсерт и Рефреш относятся только к её полям:
Рефреш:
Select
ID_Gorod,
ID_Strana,
Gorod_Name
from Gorod
where
ID_Gorod = :ID_Gorod
Инсерт:
insert into Gorod
(ID_Gorod, ID_Strana, Gorod_Name)
values
(:ID_Gorod,:ID_Strana, :Gorod_Name, :Gorod_Name)
Полное закоментирование всех процессов в Бэфор и Афтер Пост проблемы не решает как и выполнение Рефреша принудительно.
Повторюсь: чисто при выполнении POST для этого запроса очищается видимое значение поля названия страны ...
К обсуждению применённого формата float - специально заменял на integer (для чистоты эксперимента везде) и ничего это не меняет.
← →
korvin (2004-05-25 08:56) [19]jack128 © (24.05.04 18:06) [17]
Прошу прощения, но вообще-то мой проект более огромный, чем справочник городов и работает он уже 2 года в интенсивном режиме. Города и страны вообще к нему отношения не имеют и были выбраны мной просто как показательный пример проблемы.
← →
Sergey13 © (2004-05-25 09:24) [20]2korvin (25.05.04 08:54) [18]
А как заполняется поле GOROD.ID_GOROD? Что делается перед POST? Как вообще происходит вставка - в гриде или с отдельной формы?
← →
Sergey13 © (2004-05-25 09:52) [21]2korvin (25.05.04 08:54) [18]
А если в Рефреш написать
Select * from Strana, Gorod
where Gorod.Id_Strana=Strana.Id_Strana
and ID_Gorod = :ID_Gorod
или, что правильнее, с указанием полей вместо *
← →
korvin (2004-05-25 14:22) [22]Sergey13 © (25.05.04 09:24) [20]
Заолняется на форме в верхней части экрана, а нижняя часть того же окна - это табличное отображение записей. Вот в таблице то и исчезает значение этого поля.
Sergey13 © (25.05.04 09:52) [21]
Пробовал наспех и такое, но ошибок кучу выдавало особенно при открытии почему-то ... Но буду ещё разок ковырять в том же направлении (что-то в этом есть, но вот "вымучить" такую связь придётся долго и нудно).
← →
korvin (2004-05-27 11:42) [23]Уважаемые мастера, зашёл в тупик с решением данной проблемы.
Посему создал работающий, упрощённый пример и выложил его по адресу http://www.magnus.kiev.ua/~korvin/Goroda.zip
Весит всего 42Kb (в архиве исходники, база на IB, и файлик с пояснениями).
Очень прошу оказать помощь.
← →
Sergey13 © (2004-05-28 09:00) [24]2korvin (27.05.04 11:42) [23]
У меня нормально открылся только датамодуль (я работаю на Д5+ФБ1.5 из-за этого). Поэтому смотрел только его. Нашел неоднозначность полей в твоем основном и рефреш запросе к городам (у меня он вообще в дизайне не открывался с указанием именно ошибки неоднозначности). Т.е. и город и страна имеют поле ИД_СТРАНА, в запросах ты пишешь * вместо полей, а в наборе полей датасета всего 1 ИД_СТРАНА (а должны по идее быть 2 - из каждой таблицы). При обновленнии записи программа может просто не понимать каким ИД_СТРАНА надо пользоваться. Перепиши запросы с конкретными с полями. Т.е. укажи одинИД_СТРАНА из таблицы город.
← →
korvin (2004-05-28 16:32) [25]О корректности запроса сказать нечего, кроме того, что он работает нормально, а одно из одинаковых полей (по названию) автоматически переименовывается с добавлением к имени единицы...
Ну да ни это главное. Всё по тому же адресу выложил обновлённую версию програмки с внесёнными изменениями (как советовал Sergey13) + экзешник, чтоб без компиляции увидеть глюк.
http://www.magnus.kiev.ua/~korvin/Goroda.zip
http://www.magnus.kiev.ua/~korvin/Goroda_exe.zip
← →
Sergey13 © (2004-05-28 17:07) [26]2korvin (28.05.04 16:32) [25]
Опять смог открыть только датамодуль из-за д5. Вроде исправил. Но как то странно ведет себя программа при добавлении. Описываю что происходит у меня. При нажатии на "добавить" меняется текущее название города (?), исчезает название страны, и (!!!) появляется новая строка, как при вводе данных вручную в гриде (в режиме редактирования). При "Подтвердить" новая строка перходит в нормальный режим и остается пустой. При "переоткрытии" пустая новая строка исчезает. Вот такая бодяга. Где то ты чего то напутал, но формы у меня не открываются, поэтому посмотрел только код. Для добавления непустой записи просто DM.DSGorod.Append маловато вроде. Надо бы и значения присваивать полям то. Хотя может я чего, не видя, не разобрал.
← →
jack128 © (2004-05-28 20:11) [27]
> Прошу прощения, но вообще-то мой проект более огромный,
> чем справочник городов и работает он уже 2 года в интенсивном
> режиме.
Да ладно, это не наезд был, я ж сказал, что возможно кому то нужно именно такое представление.
А с добавлением записи у тебя проблем нет? После перевода исходников под пятёрку и компиляции исходников вот какая бага выходит. В режиме Append грид просто игнорирует введенные символы.
И еще (частично связанное с первым глюком)
У тя в грид выводится поля GOROD_NAME и STRANA_NAME, а в InsertSQL написано insert into GOROD
(ID_GOROD, STRANA, GOROD_NAME)
values
(:ID_GOROD, :STRANA, :GOROD_NAME) совсем другое поле..Поле STRANA у тя негде не задается..(по крайней мере я не увидел...)
← →
jack128 © (2004-05-28 21:26) [28]
> korvin
я тут те письмецо отправил, мыло проверь..
← →
korvin (2004-05-28 21:36) [29]Sergey13 © (28.05.04 17:07) [26]
Честно говоря не знаю, как ведёт себя данный код под 5-м, но под 6-м у меня не выдаёт ни одной ошибочки. Добавдение строки я не отрабатывал в этом тренировочном проекте, но в процессе подготовки обнаружил, что название страны исчезает даже при простом обновлении Refresh.
Для этого на форме городов создал кнопки Рефреша и переоткрытия таблицы.
Если несложно, посмотрите на экзешник - как это работает у меня.
← →
korvin (2004-05-28 23:14) [30]jack128 © (28.05.04 21:26) [28]
Попробовал твой пример доработать своими функциями и действительно работает ... Побежал разбирать подробнее.
Благодарствую.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.101 c