Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1085577284
suharew
2004-05-26 17:14
2004.06.20
Что за файлы _QSQ1, _QSQ2


14-1086272194
ultracrash
2004-06-03 18:16
2004.06.20
кто знает где можно взять программу-качалку на Делфи


4-1084348579
OlegM
2004-05-12 11:56
2004.06.20
Загрузить иконку из ресурса в image как


14-1085996934
Ertong
2004-05-31 13:48
2004.06.20
Памажите!! Internal Error SY576


14-1085977349
Паниковский
2004-05-31 08:22
2004.06.20
Танцы с бубном: мифы и реальность





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский