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