:: Visual Foxpro, Foxpro for DOS
Автор и его произведения
lemenev

Сообщений: 113
Дата регистрации: 23.06.2022
Приветствую всех!
Захотелось мне вести учёт прочитанных мною произведений некоторых авторов. Таких, как Рубина или Улицкая. Которые много пишут и часто тасуют старые рассказы в новые сборники. Так что не упомнишь – читал или нет.
Структура данных выстраивается простая: таблица с названиями книг и таблица с названиями рассказов, если в книге несколько произведений.
В начале программы я запрашиваю автора, и если такого нет, то создаю нужные таблицы.
Выглядит это так:
*** Выбор / Создание нового автора
cAutor=GETFILE('DBF', 'Автор:', 'Выбрать', 0, 'Укажите автора')
* Проверка, есть ли новый автор
isNewAutor = FILE(cAutor)
IF !isNewAutor && нет
* Создаём файлы
SET COLLATE TO "MACHINE"
CREATE TABLE (cAutor) codepage=1251 ;
(Kod I (4) AUTOINC, Name C (60), God I (4) )
INDEX ON Name TAG Name
CREATE TABLE (cAutor2) codepage=1251 ;
(CKod C (4), Name C (60), God I (4) )
INDEX ON CKod+Name TAG CKodName
ENDIF
* Открываем файлы
CLOSE DATABASES ALL
USE (cAutor) ORDER Kod IN 1 SHARED ALIAS Kniga
USE (cAutor2) ORDER CKodName IN 2 SHARED ALIAS Rasskaz
SELECT Kniga
SET RELATION TO STR(Kod,4) INTO Rasskaz
SET SKIP TO Rasskaz
В дальнейшем я оперирую с таблицами Kniga и Rasskaz.
От идеи двух Grid на форме (список книг и список рассказов, относящихся к текущей книге) я отказался, так как хотелось одномоментно видеть как можно больше названий. Поэтому я совместил две таблицы в одном Grid’е.

И вот тут случилось странное.
Я выбираю совершенно нового автора. Ввожу первую книгу. Ввожу вторую книгу. Ко второй книге я ввожу несколько рассказов. Так вот эти рассказы отображаются и у второй, и у первой книги.
[attachment 36564 A1.jpg]

Если я опять выбираю того же автора, То всё отображается правильно.
[attachment 36565 A2.jpg]

Значит с данными всё в порядке и дело в Grid.
Помогите, пожалуйста, разобраться.
Ratings: 0 negative/0 positive
Re: Автор и его произведения
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
То, как отображаются связанные через Relation таблицы принципиально зависит от того, какая рабочая область в данный момент текущая.

Т.е. у тебя будет отображаться все "как надо" пока ты находишься в рабочей области Kniga. Как только ты перешел в рабочую область Rasskaz (для ввода новых рассказов), то Relation просто перестал действовать.

Другими словами, одновременно просматривать и создавать новые записи в такой системе корректно не получится. Тут придется вводить посредника в виде промежуточного представления (курсора, View, CursorAdapter) и потом мучительно строить обратное обновление из этого представления в итоговые таблицы

Ну, или придумать другую систему отображения. Например, не 2 списка, а 3

1. Книга
2. Рассказы из этой книги
3. Книги, в которых есть выбранный рассказ (только на просмотр)
Ratings: 0 negative/0 positive
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]
Если нажать «Пропустить», то дальше всё работает.
В чём может быть дело?
Ratings: 0 negative/0 positive
Re: Автор и его произведения
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
lemenev
В чём может быть дело?
Ваш рассказ, это, конечно, хорошо.
Но, как говорится, лучше один раз увидеть код, чем сто раз услышать, что он делает, а точнее даже - что он, по-вашему, должен делать.

А у меня тоже есть вопросы, можно?
1) Почему для каждого автора нужно создавать свои таблицы книг и рассказов?
Чем напрашивающаяся схема из трех таблиц Автор -> Книга -> Рассказ не подошла?

2) Почему код книги в таблице Книги имеет тип Integer, а в таблице Рассказ Character?
Ratings: 0 negative/0 positive
Re: Автор и его произведения
lemenev

Сообщений: 113
Дата регистрации: 23.06.2022
akvvohinc
лучше один раз увидеть код
Весь код приведён в приложении к моему первому посту. Но выкладываю в приложении последнюю версию.

Теперь ответы на вопросы.
1) Пока предполагается вести учёт 2-3 авторов. Не хотелось на этом этапе усложнять программу.
2) Код книги в таблице Книги имеет тип Integer, чтобы срабатывал параметр AUTOINC. Код книги в таблице Рассказ имеет тип Character, чтобы можно было построить индексное выражение CKod+Name. Мне показалось лучше поместить преобразование Integer в Character в SET RELATION, а не в индексное выражение. Но вот последнее – это дело вкуса.



Исправлено 1 раз(а). Последнее : lemenev, 07.05.23 17:01
Ratings: 0 negative/0 positive
Re: Автор и его произведения
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
lemenev
Есть ещё одна проблема.
Когда я только проектировал форму, я сначала создал таблицы с именами Kniga и Rasskaz, а затем на их основе создал Grid на форме. В Grid в RecordSource и в ControlSource прописаны Kniga и Rasskaz. В форме в методе Load, т.е. до появления контролов, я выбираю автора и открываю нужные файлы с синонимами Kniga и Rasskaz. Т.е. к моменту формирования Grid Kniga и Rasskaz уже определены. Однако если я удаляю из папки запуска программы таблицы Kniga и Rasskaz, то при запуске программы появляются 2 сообщения типа:
[attachment 36567 A1.jpg]
Если нажать «Пропустить», то дальше всё работает.
В чём может быть дело?

Если исходные таблицы остались в DataEnvironment формы, то установите для самого объекта DataEnvironment свойство AutoOpenTable = .F.

Просто формы пытается открыть таблицы, указанные в DataEnvironment и не находит их. Вот и предлагает указать, где же они находятся
Ratings: 0 negative/0 positive
Re: Автор и его произведения
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
lemenev
2) Код книги в таблице Книги имеет тип Integer, чтобы срабатывал параметр AUTOINC. Код книги в таблице Рассказ имеет тип Character, чтобы можно было построить индексное выражение CKod+Name. Мне показалось лучше поместить преобразование Integer в Character в SET RELATION, а не в индексное выражение. Но вот последнее – это дело вкуса.

По моему опыту могу сказать, что формирование любых выражений "на лету" - это плохая практика в том смысле, что такие системы сложно как отлаживать, так и модифицировать. Ну, например, заставить отобразиться подчиненный список в определенном порядке (не по значению поля Name)

Поэтому я бы предложил сделать дополнительное поле именно для организации Realtion. Т.е. ссылку на код книги оставить как Integer, но сделать дополнительное поле с именем вроде "ForRelation", где и записывать уже сформированную строку для связи

Тогда в случае, если например, потребуется изменить порядок следования записей, не надо будет менять код. Можно будет внести изменения в само поле. Например, если речь идет о порядке следования, то можно добавить в поле порядковый номер, а не название
Ratings: 0 negative/0 positive
Re: Автор и его произведения
lemenev

Сообщений: 113
Дата регистрации: 23.06.2022
Владимир Максимов
Если исходные таблицы остались в DataEnvironment формы, то установите для самого объекта DataEnvironment свойство AutoOpenTable = .F.
Да, именно так всё и оказалось. Сделал так, как вы советовали, и "лишние" сообщения пропали. Спасибо!
Ratings: 0 negative/0 positive
Re: Автор и его произведения
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
lemenev
Весь код приведён в приложении к моему первому посту.
У меня он не работает - при выборе Kniga пишет, что нет Kniga2.

lemenev
1) Пока предполагается вести учёт 2-3 авторов. Не хотелось на этом этапе усложнять программу.
Сколько бы авторов у вас ни было, но вы выбрали тот путь, который усложняет программирование (или ограничивает функционал).
Сейчас вы работаете лишь с книгами одного автора одновременно.
Подумайте, что вам придется сделать, когда вы захотите получить список всех авторов или список всех книг.

Цитата:
Мне показалось лучше поместить преобразование Integer в Character в SET RELATION, а не в индексное выражение. Но вот последнее – это дело вкуса.
Ну, это вряд ли - это ваше личное ноу-хау.
Не думаю, что кто-то ещё скажет, что преобразует данные в поле к неестественному виду ради того, чтобы в индексном выражении не использовать функцию.
--------

Появился еще вопрос:
А зачем такие вещи как Codepage и Collate вносить в программу?
Вы планируете их менять туда-сюда в рамках одного приложения?
Ratings: 0 negative/0 positive
Re: Автор и его произведения
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> поместить преобразование Integer в Character в SET RELATION, а не в индексное выражение. Но вот последнее – это дело вкуса.
Действительно, дело вкуса... Главное, чтобы связалось (в RELATION)
> часто индексирую табличку при открытии, во временный индекс, например:
SET INDEX TO выражение TO C:\TMP\xxx
где 'выражение' есть что угодно, для дальнейшего применения из другой таблицы в RELATION к ней
например - SET INDEX TO STR(ID) TO C:\TMP\xxx
и, далее
SELECT наблюдаемая_таблица
SET RETATION TO STR(xID) INTO та_таблица_с_STR(ID)

RELATION - очень удобный механизм. Да, SELECT-ами с JOIN-ами тоже можно, но в фоксе можно вывести на экран две (и более), связанные RELATION таблички, и наблюдать их связь визуально.

Доб.
> А зачем такие вещи как Codepage и Collate вносить в программу?
> Вы планируете их менять туда-сюда в рамках одного приложения?

() Глобальные настройки (особенно Collate). Их выбирают заранее и навсегда, как жену... По "незнанию" ими крутят как хотят... )
При невеликих знаниях и ОПЫТЕ (САМОСТОЯТЕЛЬНОМ) можно манипулировать этими настройками, но с проблами.
Но Серегины сомнения понятны - зачем ими крутить, этими большими настройками. По незнанию, конечно... Не думайте, что это супернепостижимые настройки, они банальны, но сильно ухудшат отношение к фоксу при их бездумном использовании..

Не забывайте о хорошем стиле программирования глобальных настроек (неизмененение настроек до и после процедуры):
m.x = SET("Collation")
SET COLLATION TO Machine
* что-то делаем в машинном коллейте
SET COLLATION TO &x

Доб2. Все SET команды опасны для просто использования в коде...
Исключения -
SET STEP ON
SET RELATION
SET FILTER
и пр.
Легко запутаться, что можно менять в коде, а что "нельзя"... жизнь подскажет )



Исправлено 3 раз(а). Последнее : of63, 07.05.23 22:19
Ratings: 0 negative/0 positive
Re: Автор и его произведения
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
of63
RELATION - очень удобный механизм.
Речь шла вовсе не о пользе/вреде RELATION.

Лучше скажи, если у тебя код договора в таблице Договор имеет тип Integer, то как часто ты поле-ссылку на Договор в других таблицах делаешь символьными?

Цитата:
of63
часто индексирую табличку при открытии, во временный индекс, например:
SET INDEX TO выражение TO C:\TMP\xxx
Вряд ли такой командой можно что-либо проиндексировать.

Цитата:
Исключения -
SET STEP ON
SET RELATION
SET FILTER
и пр.
Это не исключения - эти команды просто начинаются на SET (как и SET INDEX), но я бы не назвал их настройками, аналогичными COLLATE или тем более Codepage, который вообще нельзя поменять внутри программы.



Исправлено 1 раз(а). Последнее : akvvohinc, 08.05.23 00:53
Ratings: 0 negative/0 positive
Re: Автор и его произведения
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Ты задал хорошую антитему, - есть ли безобидные команды SET ?

Конечно, в программах, мы этим не пользуемся, точнее, пользуемся, типа SET COLLATE TO Russian (это жизненно моя необходимая команда. настройка...
Хочется вас послать, вместо того, чтобы обьяснять... Посла )

()() Серега, не хочу не обратить твое внимание на "SET COLLATION TO Russian", это послание от русского фокса, из 90-х



Исправлено 2 раз(а). Последнее : of63, 08.05.23 01:03
Ratings: 0 negative/0 positive
Re: Автор и его произведения
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Конечно, в программах, мы этим не пользуемся, точнее, пользуемся, типа SET COLLATE TO Russian (это жизненно моя необходимая команда. настройка
Но ты её устанавливаешь один раз в начале или крутишь туда/сюда?
Ratings: 0 negative/0 positive
Re: Автор и его произведения
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
нет, я с ней родился в 93-м примерно ... +-
я приводил вам примеры для изучения фокса (про collate), типа:
? "А" = "а"
? "П" = "п"

до и после этих СЕТов, вы не проняли, ну и хсвм
\
ребята, разрабы, за васепались... за русификацию фокса, а вы никуя не знаете... (для себя)



Исправлено 2 раз(а). Последнее : of63, 08.05.23 01:28
Ratings: 0 negative/0 positive
Re: Автор и его произведения
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
COLLATE в фоксе - это попытка быть мультиязычными (этр было до УТФ-8)
Ratings: 0 negative/0 positive
Re: Автор и его произведения
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
И эта попытка была удачная с фокс 2.5 (ну, с 2.0 таб уже было русскоязычное/)

Философские вопросы - зачем папуасам нужен ЯП...



Исправлено 1 раз(а). Последнее : of63, 08.05.23 01:37
Ratings: 0 negative/0 positive
Re: Автор и его произведения
lemenev

Сообщений: 113
Дата регистрации: 23.06.2022
akvvohinc
lemenev
Весь код приведён в приложении к моему первому посту.
У меня он не работает - при выборе Kniga пишет, что нет Kniga2.
Не нужно выбирать таблицы Kniga и Rasskaz. Они служебные. Задайте новое имя, например "Пелевин" и посмотрите, что получится.

akvvohinc
это ваше личное ноу-хау.
Пользуйтесь ...

akvvohinc
Появился еще вопрос:
А зачем такие вещи как Codepage и Collate вносить в программу?
Вы планируете их менять туда-сюда в рамках одного приложения?
Нет, менять не планирую. Поставил по месту применения в программе, чтобы не зависеть от config.fpw.
Ratings: 0 negative/0 positive
Re: Автор и его произведения
lemenev

Сообщений: 113
Дата регистрации: 23.06.2022
akvvohinc
Чем напрашивающаяся схема из трех таблиц Автор -> Книга -> Рассказ не подошла?
Пожалуй, я переделаю программу под эту схему.
Ratings: 0 negative/0 positive
Re: Автор и его произведения
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
lemenev
В форме в методе Load, т.е. до появления контролов, я выбираю автора и открываю нужные файлы с синонимами Kniga и Rasskaz. Т.е. к моменту формирования Grid Kniga и Rasskaz уже определены.
У вас в Dataenvironment формы описаны два курсора Kniga и Rasskaz. Видимо, вы когда-то их туда закинули, и забыли.
Вот на их отсутствие вы и получаете озвученное сообщение (оно появляется ещё до выполнения Load).
Более того, оно появится, даже если вы попытаетесь просто открыть форму при отсутствии Kniga и Rasskaz командой MODIFY FORM Kniga.

Уберите их из Dataenvironment, и программа будет себя вести так, как вы ожидаете.
(если вы откроете форму - MODIFY FORM Kniga, проигнорировав эти сообщения, а потом откроете её Dataenvironment , то этих курсоров там уже не будет - вам достаточно просто выйти из формы с сохранением)



Исправлено 1 раз(а). Последнее : akvvohinc, 09.05.23 05:18
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 33 (Гостей: 33)

© 2000-2024 Fox Club 
Яндекс.Метрика