Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Не могу установить алфавитный порядок  [new]
Лисонька
Member

Откуда:
Сообщений: 294
Леди и джентельмены!
Помогите, пожалуйста, разобраться. Пример:
Таблица Person: nIdPers, cFam, cFName, cSName, nBorn, nIdPunkt. Один из тэгов, требующихся для просмотра этой таблицы гриде: STR(nIdPunkt)+RTRIM(cFam)+' '+RTRIM(cFName)+' '+RTRIM(cSName) (требуется в гриде)
Таблица Punkt: nIdPunkt,cPunkt,cTypePunkt.
Связь: SET RELATION TO Person.nIdPunkt INTO Punkt
В гриде с ордером, указанном выше, прописала в один из столбцов источником cPunkt.
Теперь получается такая картина в гриде: "ЯКОВКА Д" с nIdPunkt=25 стоит раньше, чем "ДМИТРИЕВКА С" с nIdPunkt=97 (все правильно: 97>25). А нужном бы, чтобы все же в алфавитном порядке населенные пункты были.
Как поступить?
Благодарю
15 сен 05, 12:31    [1880155]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Burn
Member

Откуда: Днепропетровск, Украина
Сообщений: 1167
>Как поступить?
Добавит еще один индекс по наименованию
15 сен 05, 13:02    [1880319]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Crispy
Member

Откуда:
Сообщений: 523
Можно проиндексировать - если надо - по нужному полю связанной таблицы.
Кстати, маленькое замечание - в индексах, используя STR() - лучше указывать, сколько знаков, тогда индекс получается короче и работает быстрее, например STR(nIdPunkt,5), иначе считается, что используется 12 знаков (вроде столько, точно не помню).
15 сен 05, 13:07    [1880340]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Лисонька
Member

Откуда:
Сообщений: 294
Crispy
Можно проиндексировать - если надо - по нужному полю связанной таблицы.

Т.е. индекс дожен выглядеть так: RTRIM(Punkt.cPunkt)+RTRIM(cFam)+' '+RTRIM(cFName)+' '+RTRIM(cSName) (требуется в гриде) ?!
Если нет, то пусть умные господа фоксисты опять изголяются по поводу моего умственного развития и моей профнепригодности, мне уже все равно. Я просто не понимаю, что вы имеете под "проиндексировать по нужному полю связанной таблицы". Извините.
Crispy
Кстати, маленькое замечание - в STR()...

Про STR() я знаю. Выражение, число символов до 10, десятичные знаки. В топике написала просто кратко.
15 сен 05, 13:30    [1880481]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
AleksMed
Member

Откуда: Россия, Серпухов-Москва
Сообщений: 1546
Вот RTRIM() в ордере это лишнее.
15 сен 05, 13:33    [1880499]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Владимир СА
Member

Откуда:
Сообщений: 7882
Лисонька
...Как поступить?...

1. RTRIM() я бы неиспользавал в индексе.
2. Как указал Crispy STR() использовать с конкретным количеством знаков.
3. И вообще перейти от прямых таблиц к Local View или запросам. И использовать SELECTы типа:
SELECT Punkt.cPunkt, Person.cFam, Person.cFName, Person.cSName ;
  FROM Person INNER JOIN Punkt ;
    ON Person.nIdPunkt = Punkt.nIdPunkt ;
    ORDER BY Punkt.cPunkt, Person.cFam, Person.cFName, Person.cSName ...
15 сен 05, 13:42    [1880538]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
С самого начала:

В Grid отображаются поля из 2 связанных таблиц: Person и Punkt
Person - главная, Punkt - подчиненная

Необходимо, чтобы в пределах одного и того же значения кода главной таблицы (Person.nIdPunkt) записи подчиненной таблицы отображались в определенном порядке.

В твоей постановке задачи несколько ошибок

1. Если главный индекс подчиненной таблицы начинаяется с STR(nIdPunkt)+..., то связь надо организовывать также по символьной строке, но ни в коем случае не по числовому значению. Т.е. должно быть

SET RELATION TO STR(Person.nIdPunkt) INTO Punkt

2. Если связь имеет вид один-ко-многим, и обе таблицы одновременно отображаются в одном GRID, то необходима дополнительная команда

SET SKIP TO Punkt

для обеспечения этой связи.

3. Если тебе необходимо упорядочить записи подчиненной таблицы вне зависимости от значения кода главной, то необходимо изменить саму связь. Т.е. поменять местами главную и подчиненную таблицу. В противном случае ничего не получится. Действия примерно такие:

select Person 
SET ORDER TO nIdPunkt
select Punkt
INDEX ON RTRIM(cFam)+' '+RTRIM(cFName)+' '+RTRIM(cSName) TAG SortOrd
SET RELATION TO nIdPunkt INTO Person

Хотя, как указал Владимир СА, проще сделать Local View или прямую выборку через Select-SQL
15 сен 05, 14:32    [1880838]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Komissar
Member

Откуда:
Сообщений: 132
Лисонька
...умные господа фоксисты опять изголяются по поводу моего умственного развития и моей профнепригодности...

Забыла поставить кавычки? :)
15 сен 05, 14:37    [1880865]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Лисонька
Member

Откуда:
Сообщений: 294
Владимир СА
И вообще перейти от прямых таблиц к Local View или запросам. И использовать SELECTы типа

ВладимирМ
проще сделать Local View или прямую выборку через Select-SQL

Благодарю.
Да, значит все-таки запрос. Я думала про это, но не стала развивать эту тему, т.к. посчитала делать выборку не рациональным. У меня форма с гридом, под ним Optiongroup. Пользователь выбирает нужную Optionи и в гриде меняется ордер. Я посчитала, что, если записей будет под 100 тыс., выборка займет немалое время.
А почему RTRIM в индексе нельзя использовать - это фатально?
15 сен 05, 14:38    [1880875]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Лисонька
Member

Откуда:
Сообщений: 294
Komissar
Лисонька
...умные господа фоксисты опять изголяются по поводу моего умственного развития и моей профнепригодности...

Забыла поставить кавычки? :)

Скорее правильнее было бы написать "высокого о себе мнения господа фоксисты"
15 сен 05, 14:41    [1880901]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Владимир СА
Member

Откуда:
Сообщений: 7882
Лисонька
... У меня форма с гридом, под ним Optiongroup. Пользователь выбирает нужную Optionи и в гриде меняется ордер...

Я понимаю, что Optiongroup сделано для отображения порядка сортировки. Если это так, то лучше использовать в Header-ах колонок Grid-а свойство Picture и отображать соответствующие картинки, типа как на на приложенном файле.

К сообщению приложен файл. Размер - 0Kb
15 сен 05, 15:09    [1881078]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Komissar
Member

Откуда:
Сообщений: 132
Лисонька
..."высокого о себе мнения господа фоксисты"

Те, которые "они" - на самом деле вовсе не фоксисты! Прост студенты-переучки с тяжелым детством!
Настоящие фоксисты - удивительно доброжелательные и потрясающе скромные в самооценке люди!

Владимир СА правильно предлагает тебе насчет Local View и Header'ов...
1. Нет на свете пользователя, которому было бы под силу пролистать в гриде 100 тыс. записей и осмыслить увиденное!
2. Удобнее - больше свободного места!
15 сен 05, 15:36    [1881260]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Лисонька
Member

Откуда:
Сообщений: 294
Владимир СА
лучше использовать в Header-ах колонок Grid-а свойство Picture и отображать соответствующие картинки, типа как на на приложенном файле.

Уложу детей - попробую. А вот на счет приложенного файла - это сам пикчер или все-таки отдельный файл, потому что "приложенного" для скачивания как раз не наблюдаю?
15 сен 05, 15:56    [1881375]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Crispy
Member

Откуда:
Сообщений: 523
2 Лисонька :

Вообще-то я имел в виду для таблицы Person после
SET RELATION TO STR(Person.nIdPunkt) INTO Punkt 
(как верно уточнил насчет типа связи в пункте 1 ВладимирМ.)
создать такой индекс:
INDEX ON Punkt.cPunkt TO SortPunkt COMPACT
в составной индекс его из-за этой связи включать не имеет смысла.
Тогда главная таблица и сортируется по полю связанной. В принципе так все работает, хотя иногда, конечно, выборки делать проще. А всяческие TRIM-функции в индексах лучше вообще не использовать по той причине, что будет неразбериха в сортировке, например:
Иванов Иосиф Абрамович :) из-за этого будет стоять ниже, чем
Иванова Марья Ивановна.

(не совсем кстати понял, что за кавычки в выражении индекса? там видимо между ними должны стоять пробелы? - чтобы сортировка вышла правильной)

Успехов!
15 сен 05, 16:16    [1881477]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Crispy
Member

Откуда:
Сообщений: 523
Кстати, с TRIM-ами еще и похуже случаи бывают
15 сен 05, 16:19    [1881491]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Лисонька
Member

Откуда:
Сообщений: 294
Показала форму моей мадам шефу в двух вариантах: с Optiongroupe и с кликом на Headere. Ей все же понравилось первое, а я думаю, что второй вариант лучше, нагляднее (после клика весь отсортированный Column выделяется другим цветом).
Теперь такой вопрос: что рациональнее - каждый раз делать новый запрос с нужной сортировкой SELECT ... FROM ... ORDER BY... или сделать запрос один раз, расставить индексы (INDEX ON ... TAG tag1 OF idxX, INDEX ON ... TAG tag2 OF idxX ADDITIVE), а потом выбирать нужный?
Благодарю
18 сен 05, 15:03    [1888050]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Владимир СА
Member

Откуда:
Сообщений: 7882
Лисонька
...Теперь такой вопрос: что рациональнее - каждый раз делать новый запрос с нужной сортировкой SELECT ... FROM ... ORDER BY... или сделать запрос один раз, расставить индексы (INDEX ON ... TAG tag1 OF idxX, INDEX ON ... TAG tag2 OF idxX ADDITIVE), а потом выбирать нужный?...

Первый вариант ответа неплох при многопользовательской среде. Но я лично пока использую второй вариант. Но всегда имеет место кнопка на форме переопределить данные (в многопользовательской среде). Но это лично мой выбор.
18 сен 05, 15:25    [1888072]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Лисонька
Теперь такой вопрос: что рациональнее - каждый раз делать новый запрос с нужной сортировкой SELECT ... FROM ... ORDER BY... или сделать запрос один раз, расставить индексы (INDEX ON ... TAG tag1 OF idxX, INDEX ON ... TAG tag2 OF idxX ADDITIVE), а потом выбирать нужный?
Благодарю

Зависит от конкретной ситуации. Определяющим здесь является скорость. Что будет выполняться быстрее: Новая выборка с новым ORDER BY или создание индекса?

Правда, это только в том случае, если данные этой выборки не предполагается редактировать. Только просмотр. Если еще нужно редактирование, тогда лучше сразу построить ВСЕ индексы.
18 сен 05, 20:08    [1888264]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Лисонька
Member

Откуда:
Сообщений: 294
ВладимирМ
Правда, это только в том случае, если данные этой выборки не предполагается редактировать. Только просмотр. Если еще нужно редактирование, тогда лучше сразу построить ВСЕ индексы.

Нет, выборка в гриде служит в данной форме только для просмотра. А что, разве выполнение команды SET ORDER TO ... для готовых индексов занимает так же много времени в большой таблице, как и SELECT ... ORDER BY?
18 сен 05, 20:47    [1888302]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Komissar
Member

Откуда:
Сообщений: 132
Лисонька
Нет, выборка в гриде служит в данной форме только для просмотра.

Извините за настойчивость - неужели стоИт задача просмотра 100 тыс. записей?

Лисонька
А что, разве выполнение команды SET ORDER TO ... для готовых индексов занимает так же много времени в большой таблице, как и SELECT ... ORDER BY?

Конечно нет! С чего ВЫ взяли? Почему такой вопрос?
19 сен 05, 02:30    [1888534]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Лисонька
А что, разве выполнение команды SET ORDER TO ... для готовых индексов занимает так же много времени в большой таблице, как и SELECT ... ORDER BY?

Нет, конечно. Сравнение идет между Select-SQL и INDEX ON. Сам процесс индксирования относительно медленный. А переключение между уже созданными индексами происходит практически мгновенно.

Но сам факт создания и сопровождения временных индексов требует некоторой дополнительной работы и осторожности. Динамический Select-SQL с изменяемым ORDER BY в этом смысле гораздо проще в реализации.
19 сен 05, 16:44    [1891128]     Ответить | Цитировать Сообщить модератору
 Re: Не могу установить алфавитный порядок  [new]
Лисонька
Member

Откуда:
Сообщений: 294
Komissar
Конечно нет! С чего ВЫ взяли? Почему такой вопрос?

Это я ответила ВладимируМ. А 100 тыс. записей через грид - ну, преувеличила, но тысяч 50 точно. А с простым просмотром через грид не я себя заморочила - моя шеф хочет, чтобы эта программа в точности копировала старую на FPD (давно стертую и забытую всеми) и напоминала еще какую-то, накатанную на Access и служащую для нее эталоном.
19 сен 05, 22:41    [1892159]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить