Автор и его произведения | |
---|---|
lemenev Автор Сообщений: 113 Дата регистрации: 23.06.2022 |
Приветствую всех!
Захотелось мне вести учёт прочитанных мною произведений некоторых авторов. Таких, как Рубина или Улицкая. Которые много пишут и часто тасуют старые рассказы в новые сборники. Так что не упомнишь – читал или нет. Структура данных выстраивается простая: таблица с названиями книг и таблица с названиями рассказов, если в книге несколько произведений. В начале программы я запрашиваю автора, и если такого нет, то создаю нужные таблицы. Выглядит это так:
От идеи двух Grid на форме (список книг и список рассказов, относящихся к текущей книге) я отказался, так как хотелось одномоментно видеть как можно больше названий. Поэтому я совместил две таблицы в одном Grid’е. И вот тут случилось странное. Я выбираю совершенно нового автора. Ввожу первую книгу. Ввожу вторую книгу. Ко второй книге я ввожу несколько рассказов. Так вот эти рассказы отображаются и у второй, и у первой книги. [attachment 36564 A1.jpg] Если я опять выбираю того же автора, То всё отображается правильно. [attachment 36565 A2.jpg] Значит с данными всё в порядке и дело в Grid. Помогите, пожалуйста, разобраться. |
Re: Автор и его произведения | |
---|---|
Владимир Максимов Сообщений: 14098 Откуда: Москва Дата регистрации: 02.09.2000 |
То, как отображаются связанные через Relation таблицы принципиально зависит от того, какая рабочая область в данный момент текущая.
Т.е. у тебя будет отображаться все "как надо" пока ты находишься в рабочей области Kniga. Как только ты перешел в рабочую область Rasskaz (для ввода новых рассказов), то Relation просто перестал действовать. Другими словами, одновременно просматривать и создавать новые записи в такой системе корректно не получится. Тут придется вводить посредника в виде промежуточного представления (курсора, View, CursorAdapter) и потом мучительно строить обратное обновление из этого представления в итоговые таблицы Ну, или придумать другую систему отображения. Например, не 2 списка, а 3 1. Книга 2. Рассказы из этой книги 3. Книги, в которых есть выбранный рассказ (только на просмотр) |
Re: Автор и его произведения | |
---|---|
lemenev Автор Сообщений: 113 Дата регистрации: 23.06.2022 |
Владимир, спасибо за разъяснение. Пожалуй, с этим я смирюсь. Новые данные вводятся не часто (я не так много и быстро читаю), в основном программа будет использоваться для просмотра.
Есть ещё одна проблема. Когда я только проектировал форму, я сначала создал таблицы с именами Kniga и Rasskaz, а затем на их основе создал Grid на форме. В Grid в RecordSource и в ControlSource прописаны Kniga и Rasskaz. В форме в методе Load, т.е. до появления контролов, я выбираю автора и открываю нужные файлы с синонимами Kniga и Rasskaz. Т.е. к моменту формирования Grid Kniga и Rasskaz уже определены. Однако если я удаляю из папки запуска программы таблицы Kniga и Rasskaz, то при запуске программы появляются 2 сообщения типа: [attachment 36567 A1.jpg] Если нажать «Пропустить», то дальше всё работает. В чём может быть дело? |
Re: Автор и его произведения | |
---|---|
akvvohinc Сообщений: 4219 Откуда: Москва Дата регистрации: 11.11.2008 |
Ваш рассказ, это, конечно, хорошо. Но, как говорится, лучше один раз увидеть код, чем сто раз услышать, что он делает, а точнее даже - что он, по-вашему, должен делать. А у меня тоже есть вопросы, можно? 1) Почему для каждого автора нужно создавать свои таблицы книг и рассказов? Чем напрашивающаяся схема из трех таблиц Автор -> Книга -> Рассказ не подошла? 2) Почему код книги в таблице Книги имеет тип Integer, а в таблице Рассказ Character? |
Re: Автор и его произведения | |
---|---|
lemenev Автор Сообщений: 113 Дата регистрации: 23.06.2022 |
Весь код приведён в приложении к моему первому посту. Но выкладываю в приложении последнюю версию. Теперь ответы на вопросы. 1) Пока предполагается вести учёт 2-3 авторов. Не хотелось на этом этапе усложнять программу. 2) Код книги в таблице Книги имеет тип Integer, чтобы срабатывал параметр AUTOINC. Код книги в таблице Рассказ имеет тип Character, чтобы можно было построить индексное выражение CKod+Name. Мне показалось лучше поместить преобразование Integer в Character в SET RELATION, а не в индексное выражение. Но вот последнее – это дело вкуса. Исправлено 1 раз(а). Последнее : lemenev, 07.05.23 17:01 |
Re: Автор и его произведения | |
---|---|
Владимир Максимов Сообщений: 14098 Откуда: Москва Дата регистрации: 02.09.2000 |
Если исходные таблицы остались в DataEnvironment формы, то установите для самого объекта DataEnvironment свойство AutoOpenTable = .F. Просто формы пытается открыть таблицы, указанные в DataEnvironment и не находит их. Вот и предлагает указать, где же они находятся |
Re: Автор и его произведения | |
---|---|
Владимир Максимов Сообщений: 14098 Откуда: Москва Дата регистрации: 02.09.2000 |
По моему опыту могу сказать, что формирование любых выражений "на лету" - это плохая практика в том смысле, что такие системы сложно как отлаживать, так и модифицировать. Ну, например, заставить отобразиться подчиненный список в определенном порядке (не по значению поля Name) Поэтому я бы предложил сделать дополнительное поле именно для организации Realtion. Т.е. ссылку на код книги оставить как Integer, но сделать дополнительное поле с именем вроде "ForRelation", где и записывать уже сформированную строку для связи Тогда в случае, если например, потребуется изменить порядок следования записей, не надо будет менять код. Можно будет внести изменения в само поле. Например, если речь идет о порядке следования, то можно добавить в поле порядковый номер, а не название |
Re: Автор и его произведения | |
---|---|
lemenev Автор Сообщений: 113 Дата регистрации: 23.06.2022 |
Да, именно так всё и оказалось. Сделал так, как вы советовали, и "лишние" сообщения пропали. Спасибо! |
Re: Автор и его произведения | |
---|---|
akvvohinc Сообщений: 4219 Откуда: Москва Дата регистрации: 11.11.2008 |
У меня он не работает - при выборе Kniga пишет, что нет Kniga2. Сколько бы авторов у вас ни было, но вы выбрали тот путь, который усложняет программирование (или ограничивает функционал). Сейчас вы работаете лишь с книгами одного автора одновременно. Подумайте, что вам придется сделать, когда вы захотите получить список всех авторов или список всех книг. Цитата:Ну, это вряд ли - это ваше личное ноу-хау. Не думаю, что кто-то ещё скажет, что преобразует данные в поле к неестественному виду ради того, чтобы в индексном выражении не использовать функцию. -------- Появился еще вопрос: А зачем такие вещи как Codepage и Collate вносить в программу? Вы планируете их менять туда-сюда в рамках одного приложения? |
Re: Автор и его произведения | |
---|---|
of63 Сообщений: 25254 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> поместить преобразование Integer в Character в SET RELATION, а не в индексное выражение. Но вот последнее – это дело вкуса.
Действительно, дело вкуса... Главное, чтобы связалось (в RELATION) > часто индексирую табличку при открытии, во временный индекс, например:
например - SET INDEX TO STR(ID) TO C:\TMP\xxx и, далее
RELATION - очень удобный механизм. Да, SELECT-ами с JOIN-ами тоже можно, но в фоксе можно вывести на экран две (и более), связанные RELATION таблички, и наблюдать их связь визуально. Доб. > А зачем такие вещи как Codepage и Collate вносить в программу? > Вы планируете их менять туда-сюда в рамках одного приложения? () Глобальные настройки (особенно Collate). Их выбирают заранее и навсегда, как жену... По "незнанию" ими крутят как хотят... ) При невеликих знаниях и ОПЫТЕ (САМОСТОЯТЕЛЬНОМ) можно манипулировать этими настройками, но с проблами. Но Серегины сомнения понятны - зачем ими крутить, этими большими настройками. По незнанию, конечно... Не думайте, что это супернепостижимые настройки, они банальны, но сильно ухудшат отношение к фоксу при их бездумном использовании.. Не забывайте о хорошем стиле программирования глобальных настроек (неизмененение настроек до и после процедуры):
Доб2. Все SET команды опасны для просто использования в коде... Исключения - SET STEP ON SET RELATION SET FILTER и пр. Легко запутаться, что можно менять в коде, а что "нельзя"... жизнь подскажет ) Исправлено 3 раз(а). Последнее : of63, 07.05.23 22:19 |
Re: Автор и его произведения | |
---|---|
akvvohinc Сообщений: 4219 Откуда: Москва Дата регистрации: 11.11.2008 |
Речь шла вовсе не о пользе/вреде RELATION. Лучше скажи, если у тебя код договора в таблице Договор имеет тип Integer, то как часто ты поле-ссылку на Договор в других таблицах делаешь символьными? Цитата:Вряд ли такой командой можно что-либо проиндексировать. Цитата:Это не исключения - эти команды просто начинаются на SET (как и SET INDEX), но я бы не назвал их настройками, аналогичными COLLATE или тем более Codepage, который вообще нельзя поменять внутри программы. Исправлено 1 раз(а). Последнее : akvvohinc, 08.05.23 00:53 |
Re: Автор и его произведения | |
---|---|
of63 Сообщений: 25254 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Ты задал хорошую антитему, - есть ли безобидные команды SET ?
Конечно, в программах, мы этим не пользуемся, точнее, пользуемся, типа SET COLLATE TO Russian (это жизненно моя необходимая команда. настройка... Хочется вас послать, вместо того, чтобы обьяснять... Посла ) ()() Серега, не хочу не обратить твое внимание на "SET COLLATION TO Russian", это послание от русского фокса, из 90-х Исправлено 2 раз(а). Последнее : of63, 08.05.23 01:03 |
Re: Автор и его произведения | |
---|---|
akvvohinc Сообщений: 4219 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Но ты её устанавливаешь один раз в начале или крутишь туда/сюда? |
Re: Автор и его произведения | |
---|---|
of63 Сообщений: 25254 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
нет, я с ней родился в 93-м примерно ... +-
я приводил вам примеры для изучения фокса (про collate), типа: ? "А" = "а" ? "П" = "п" до и после этих СЕТов, вы не проняли, ну и хсвм \ ребята, разрабы, за васепались... за русификацию фокса, а вы никуя не знаете... (для себя) Исправлено 2 раз(а). Последнее : of63, 08.05.23 01:28 |
Re: Автор и его произведения | |
---|---|
of63 Сообщений: 25254 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
COLLATE в фоксе - это попытка быть мультиязычными (этр было до УТФ-8)
|
Re: Автор и его произведения | |
---|---|
of63 Сообщений: 25254 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
И эта попытка была удачная с фокс 2.5 (ну, с 2.0 таб уже было русскоязычное/)
Философские вопросы - зачем папуасам нужен ЯП... Исправлено 1 раз(а). Последнее : of63, 08.05.23 01:37 |
Re: Автор и его произведения | |
---|---|
lemenev Автор Сообщений: 113 Дата регистрации: 23.06.2022 |
Не нужно выбирать таблицы Kniga и Rasskaz. Они служебные. Задайте новое имя, например "Пелевин" и посмотрите, что получится. Пользуйтесь ... Нет, менять не планирую. Поставил по месту применения в программе, чтобы не зависеть от config.fpw. |
Re: Автор и его произведения | |
---|---|
lemenev Автор Сообщений: 113 Дата регистрации: 23.06.2022 |
Пожалуй, я переделаю программу под эту схему. |
Re: Автор и его произведения | |
---|---|
akvvohinc Сообщений: 4219 Откуда: Москва Дата регистрации: 11.11.2008 |
У вас в Dataenvironment формы описаны два курсора Kniga и Rasskaz. Видимо, вы когда-то их туда закинули, и забыли. Вот на их отсутствие вы и получаете озвученное сообщение (оно появляется ещё до выполнения Load). Более того, оно появится, даже если вы попытаетесь просто открыть форму при отсутствии Kniga и Rasskaz командой MODIFY FORM Kniga. Уберите их из Dataenvironment, и программа будет себя вести так, как вы ожидаете. (если вы откроете форму - MODIFY FORM Kniga, проигнорировав эти сообщения, а потом откроете её Dataenvironment , то этих курсоров там уже не будет - вам достаточно просто выйти из формы с сохранением) Исправлено 1 раз(а). Последнее : akvvohinc, 09.05.23 05:18 |
© 2000-2024 Fox Club  |