Сортировка browse

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Может кто подскажет....

Нужна сортировка брауза по заголовку каждой колонки, по алфавиту (ascending - descending), PROP:ORDER не подходит(слишком медленно),
а SORT'ом сортируется только текущая page и конечно при скроллинге отображается полная "каша". Ключа по некоторым колонкам нет, т.к. подсматриваются из справочников по уникальному полю.
Так что подскажите как отсортировать весь view без ключей и без PROP:ORDER,
если есть такая возможность.

Подозреваю, что можно подсортировывать SORT'ом по ходу скроллинга, но сам как не пробовал, коряво получается, может есть еще какой способ?:spy:

Пользую C5.5F ШВС
Гость

Сообщение Гость »

Для начала укажи версию и шаблоны Клары
Написал: Виктор(10)
Гость

Сообщение Гость »

Привет !!!
Попробуй этот шаблон - может подойдет.
Это мой первый опыт, так что просьба сильно не пинать.
Идею взял из Clarion Magazin.
Ограничение - метод загрузки долженбыть File.

Удачи
Евгений Григоров

(Добавление)

Спасибо большое за шаблон
Но... есть одно но, я пользую ШВС, а там в отличие от АВС ни классов сортировки, ни Fileloaded брауза, так что если есть опыть решения такой проблемы в Legacy подскажи(хотя бы код), там уж сам разберусь.

Дмитрий Гудков

Привет Дмитрий !

На самом деле в коде этого шаблоне нет никаких классов.
Есть одна рутина ShowImage и несколько Embed вставок в разные части тела программы.
Соответствие Embed в ABC и Legacy - придется тебе самому покопаться. Тут я не советчик, к сожалению.

Удачи
Евгений Григоров

На самом деле проблема немного в другом, ты в своем шаблоне также используешь SORT для очереди, т.е. сортируется только текущая PAGE которая и находиться в очереди на данный момент, а загонять в
очередь ~150.000 записей (то есть эмулировать типа Fileloaded для АВС)
да еще если приложение пашет под терминалами ~40 пользователей одновременно, это по моему очень неразумно, а брауз такой большой нужен, без него никак (должны быть отображены все записи по базе), то есть нужно, что нибудь типа подсортировки по мере скроллинга(на ScrollUp, ScrollPage и т.д.).
Нет на этот счет никаких мыслей???

Дмитрий Гудков

Дык, для определения следующей записи все равно надо хотя бы один раз прочитать всю базу. Откуда мы знаем, где находится следующая запись? А дальше реализация может только выбрать один из вариантов:

- дополнительный ключ (в том числе динамический индекс).
- сортировка View в памяти
- выгребание ключевых полей в Queue и создание инвертированных списков
- изначальное ведение дополнительных инвертированных списков для быстрого просмотра - поиска (база "поле-значениеполя-ключзаписи")

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

Здравствуйте, Юрий.

Я тут писал в форум:
"Нужна сортировка брауза по заголовку каждой колонки, по алфавиту (ascending - descending), PROP:ORDER не подходит(слишком медленно), а SORT'ом сортируется только текущая page и конечно при скроллинге отображается полная "каша". Ключа по некоторым колонкам нет, т.к. подсматриваются из справочников по уникальному полю.
Так что подскажите как отсортировать весь view без ключей и без PROP:ORDER,
если есть такая возможность."
Т.е. получается, что в самой базе, нет значений для сортировки, а есть лишь уникальные числовые значения для Lookup'a из справочников, так что ключи строить вроде как не из чего.
А VIEW как я знаю можно либо по ключу, либо PROP:ORDER'ом сортировать PROP:ORDER не подходит - медленно), может по подробней обЪяснишь или примерчик на мыло кинешь<gudkov_net@mail.ru>, а то я после DOS'a на C5.5 перехожу и приложение пытаюсь перевести, а тут хоть и не глобальная проблемка, но возникла.

Дмитрий Гудков

Понятно. Нет, так не получится. Надо вместо сортировки по связанному полю устроить сначала выбор из связанного справочника, а внутри него просматривать данные. Например, если есть накладные по разным фирмам, надо сначала из справочника выбрать фирму, а потом...

У меня, к сожалению, с примерами туговато, да и работаю уже с 6.1, но народ, наверное, накидает.

---------------------------------------
C уважением,
Юрий Философов

А потом по коду фирмы и ключ для можно сделать для сортировки и отсортировать, такой вариант уже есть выбираю из POPUP справочник для сортировки и do selectsort на GainFocus, работать то работно юзверям не нравиться до поросячего визгу за этими справочниками лазить.
Пробовал такой вариант:
"if glo:title=1;SORT(Queue:Browse,BRW2::all:title).
if glo:seria=1;SORT(Queue:Browse,BRW2::all:seria).
и т.д.
При клике на хидер колонки, соотв. переменная принимает значение, остальные обнуляются Т.е. сортировка при скроллинге происходит по последнему клику на хидер.
Только как бы это все организовать, криво получается, последняя запись PAGE при скроллинге дублируется, хотя вроде очередь чищу."
И в таком духе....
Может будут мысли на этот счет.
А то Цигуро мне тут отписал что лучше PROP:ORDER ничего нету.

Дмитрий Гудков

По суммарным затратам быстрее результат не получишь. Просто потому, что PROP:ORDER не делает ничего лишнего, а то, что делает, делает достаточно эффективно. Быстрей будет только сиквел за счет кэширования таблиц.

WBR, Nick Tsigouro. MailTo:Nick@arsis.ru

Может тогда подскажете, как оживить после PROP:ORDER локатор и popup меню.
С локатором то понятно, т.к. сортировка не по ключу, не знает чего искать, а вот почему popup помирает не пойму.

Дмитрий Гудков

(Добавление)
Нужна сортировка брауза по заголовку каждой колонки, по алфавиту (ascending - descending), PROP:ORDER не подходит(слишком медленно), ...
Интересно, а как ты хочешь? Ключа (предварительно сделанной сортировки) у тебя нет. Значит остается только сортировка в рантайм. А это время и загрузка сетки (если это не SQL), потому что все записи для этого нужно прокачать на клиента.
Так что подскажите как отсортировать весь view без ключей и без PROP:ORDER, если есть такая возможность.
Лучше чем PROP:ORDER - никак. Думай над постановкой задачи. Каждый вопорос имеет свою цену. Дурацкие вопросы (отстртировать по чему угодно) обычно стоят дорого.

WBR, Nick Tsigouro

Ну на клиента ничего прокачивать не надо, все пашет под терминалами, так что все вариться на сервере, у клиента только экраны, так что сортировка в рантайм в данном случае ничего страшного не представляет(был бы сервер помощнее).
Лучше чем PROP:ORDER - никак. Думай над постановкой задачи. Каждый вопорос имеет свою цену. Дурацкие вопросы (отстртировать по чему угодно) обычно стоят дорого.
Интересно, как долго будут сортироваться по PROP:ORDER - 150.000 записей, неужто это неразрешимая проблема? Можно ведь наверное при обновлении PAGE сортировать эту очередь в рантайме, в соответствии с каким то условием:
if glo:title=1;SORT(Queue:Browse,BRW2::all:title).
if glo:seria=1;SORT(Queue:Browse,BRW2::all:seria).
и т.д.
При клике на хидер колонки, соотв. переменная принимает значение, остальные
обнуляются Т.е. сортировка при скроллинге происходит по последнему клику на хидер.
Только как бы это все организовать, криво получается, последняя запись PAGE при скроллинге дублируется, хотя вроде очередь чищу.

Заранее прошу прощения за возможно "дурацкий вопрос" :)

Дмитрий Гудков
Ну на клиента ничего прокачивать не надо, все пашет под терминалами, так что все вариться на сервере, у клиента только экраны, так что сортировка в рантайм в данном случае ничего страшного не представляет(был бы сервер помощнее).
Ну значит будет загружен канал к диску и память. Драйвер View для того, чтобы сделать сортировку должен закачать в свой внутренний буфер всю выборку. Потом он ее отсортирует, и только потом начнет отдавать по Next/Previous. По любому эта операция стоит дорого. Если есть подходящий ключ, то никакой сортировки не будет. Будет просто индексно-последовательная выборка одной страницы. Быстро и просто.
Интересно, как долго будут сортироваться по PROP:ORDER - 150.000 записей, ...
Сделай тест и попробуй. Получишь самый точный ответ.
Т.е. сортировка при скроллинге происходит по последнему клику на хидер.
Все таки, в чем проблема? во времени сортировки, или в том, чтобы начать нужную сортировку по клику.
Только как бы это все организовать, криво получается, последняя запись PAGE при скроллинге дублируется, хотя вроде очередь чищу.
Проверь, что используется уникальный ключ. Если нет, добавь в сортировку (prop:Order) поля до уникальности. Обычно добавляют Id записи.

WBR, Nick Tsigouro

Ты не замечаешь, что сам себе противоречишь!?
Тебе предлагают использовать VIEW с ORDER-ом - ты отвечаешь, что очень медленно и тут-же пишешь, что "... так что сортировка в рантайм в данном случае ничего страшного не представляет..."!
А ведь ORDER именно и занимается сортировкой в рантайме выборки для VIEW. Так что ты определись - можешь сортировать в рантайме или нет? Если можешь, то и используй VIEW+ORDER - и никаких проблем!
Если нет, то - увы! НИЧЕГО не получится!

Сам ПОДУМАЙ - когда в бровзе ты жмешь клавишу вниз, то надо выбрать из базы запись, которая соответствует правилу сортировки, "отталкиваясь" от предыдущей записи из очереди бровза. А что-бы выбрать такую запись, если нет подходящего ключа, НЕОБХОДИМО просмотреть ВСЕ записи просматриваемой таблицы! Ну, неужели это не понятно!? А если понятно - зачем задавать подобные вопросы?
Тем более, если я правильно понял, сортируемое поле находится не в просматриваемой таблице, а в связанной? В этом случае даже ключи не помогут - и остаются три варианта:
- VIEW+ORDER
- построение временного индекса
- закачка всей таблицы в очередь и бровз уже по этой очереди
В C61 скоро можно будет заменить последний вариант на MemFile.

А теперь смотрим:
-варианты 2 и 3 имеет смысл использовать ТОЛЬКО для статичных таблиц-справочников, которые не модифицируются или для таблиц, работа с которыми не требует их актуализации в реальном времени.
В противном случае - остается ТОЛЬКО первый вариант!
И ничего другого, увы, не придумаешь.

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru


(Добавление)
Может тогда подскажете, как оживить после PROP:ORDER локатор и popup меню.
С локатором то понятно, т.к. сортировка не по ключу, не знает чего искать, а вот почему popup помирает не пойму.
Как в ШВС сходу не скажу, надо разбираться, да и неплохо бы для начала диагноз поставить, почему не работает.
В ABC сортировка меняется просто. При инициализации задаешь все сортировки BRWn.AddSortOrder(...), BRWn.AppendOrder(...),
Потом, когда нужно делаешь BRWn.ResetSort(True) и переопределяешь его примерно так

Код: Выделить всё

BRW1.ResetSort PROCEDURE(BYTE Force)

ReturnValue          BYTE,AUTO

  CODE
  IF CHOICE(?CurrentTab) = 1
    RETURN SELF.SetSort(1,Force)
  ELSIF CHOICE(?CurrentTab) = 2
    RETURN SELF.SetSort(2,Force)
  ELSE
    RETURN SELF.SetSort(3,Force)
  END
  ReturnValue = PARENT.ResetSort(Force)
  RETURN ReturnValue
При этом еще и все фильтры, локаторы и проч. переключатся куда надо.

А вообще-то чтобы сильно не заморачиваться можно завести локальную переменную и записывать в нее номер нужной сортировки. Дальше по ее значениям делаем в шаблоне Conditional Behavior -ы и надо ее еще внести в списки Reset Fields. Должно работать в любых шаблонах.

WBR, Nick Tsigouro
Написал: ClaList(2)
Гость

Сообщение Гость »

Привет все
недавно была такая проблема вот что поучилось...
для С5.5 стандартные шаблоны ABC
в примере фильтр и сорт по всем колонкам в Browse

Удачи

Сергей Половинкин <s.polovinkin@vaz.ru> (ДИС)
Написал: ClaList(2)
Гость

Сообщение Гость »

Спасибо большое за шаблон.

Но нет ли чего нибудь подобного для Legacy, c ABC честно говоря не дружу,
переходить конечно надо наверное, да некогда все :D

Кстати есть небольшой баг с локатором, после сортировки (+) ищет только по заглавным буквам(такое ощкщение, что ставиться case sensitive), после сортировки по(-) к этой проблемке прибавляется еще то, что встает не на искомую запись, а на следующую после нее.

А так шаблон хороший, спасибо еще раз.

Дмитрий Гудков
Написал: ClaList(2)
Ответить