Форум » [x]Harbour » Сортировка по алфавиту ??? » Ответить

Сортировка по алфавиту ???

Andrey: Всем привет. Постановка задачи такая: Есть справочник-улиц (street.dbf) типа: Kstreet - Street 1 - Махалина ул. 2 - Федорова ул. ..... 990 - Алтуфьевское шоссе ..... В основной базе "списка адресов" (допустим dogovor.dbf) записывается код улицы Kstreet. При выборке из базы (использую условный индекс) выводиться нужный мне список. Задаю сортировку по коду улицы (Kstreet). Получаю отсортированный список не по алфавиту улиц. А как решить вопрос с сортировкой по алфавиту базы (таблицы) "списка адресов" ? Чтобы список показывался по алфавиту ???

Ответов - 57, стр: 1 2 3 All

AlexMyr: Andrey пишет: Задаю сортировку по коду улицы (Kstreet). Получаю отсортированный список не по алфавиту улиц. Индекс ведь по коду, а не по наименованию

Andrey: AlexMyr пишет: Индекс ведь по коду, а не по наименованию Вот именно. А коды не совпадают с (алфавитом) улиц. Пытался делать справочники улиц заранее, но по всем городам не смог. Для печати приходиться делать отдельную базу и выводить туда наименование улиц. Сортировка тогда правильная. Может кто решил данную проблему ? Поделитесь идеей....

Pasha: В dogovor сделать relation на street по kstreet И создать временный индекс по street->Street


Andrey: Pasha пишет: В dogovor сделать relation на street по kstreet Это уже есть давно.... Pasha пишет: И создать временный индекс по street->Street Это тоже есть.... Я про бд-улиц (use street ; index on UPPER(street) to.... ), этот индекс у меня постоянный. Как базу dogovor.dbf индексировать ? Условие сортировки какое ставить ?

AlexMyr: И я о том же, нужен отдельный индекс по street и при выводе на екран переключаться на этот индекс.

AlexMyr: Ага, список выводится из базы dogovor, где есть только kstreet, а из базы street берутся только наименования через relation, правильно понял?

Pasha: Andrey пишет: Это тоже есть.... Я про бд-улиц (use street ; index on UPPER(street) to.... ), этот индекс у меня постоянный. Как базу dogovor.dbf индексировать ? Условие сортировки какое ставить ? В street должен быть управляющий индекс по kstreet, это для того, чтобы работал set relation. А в dogovor сделать индекс по выражению street->Street Но надо иметь в виду, что этот индекс будет работать, только когда включен set relation, иначе его использовать нельзя

Andrey: AlexMyr пишет: И я о том же, нужен отдельный индекс по street и при выводе на екран переключаться на этот индекс. Я не понимаю как переключаться ? Использую условную индексацию: INDEX ON &cIndexTo TAG "ONE" TO (имя врем.индекса) ; EVAL SAY_PROCENT() ; EVERY nKolRecords / 10 WHILE &cFilterTo ADDITIVE cIndexTo := "STR(KCITY)+STR(KSTREET)+UPPER(PADL(ALLTRIM(НОМЕР_ДОМА),5))+STR(НОМЕР_ПОДЪЕЗДА)" cFilterTo := "Kcity=350.AND.!DELETED()" И дальше переключаю на этот индекс.

Andrey: Pasha пишет: В street должен быть управляющий индекс по kstreet, это для того, чтобы работал set relation. Да это уже есть у меня. А в dogovor сделать индекс по выражению street->Street Не совсем понял.... Но надо иметь в виду, что этот индекс будет работать, только когда включен set relation, иначе его использовать нельзя Да это уже есть у меня....

Pasha: Andrey пишет: cIndexTo := "STR(KCITY)+STR(KSTREET)+UPPER(PADL(ALLTRIM(НОМЕР_ДОМА),5))+STR(НОМЕР_ПОДЪЕЗДА)" Вместо KSTREET поставить STREET->STREET и сделать set relation, как я написал

AlexMyr: Andrey Подумал и сделал бы так, основная база street, дочерняя dogovor, дальше основной индекс street и вывод списка street->street, dogovor->field1,dogovor->filedn

Pasha: или не заморачиваться с релэйшн, а написать функцию func StreetName if dogovor->KStreet != street->KStreet street->(dbSeek(dogovor->KStreet)) endif Return street->Street и использовать выражение "STR(KCITY)+StreetName()+UPPER(PADL(ALLTRIM(НОМЕР_ДОМА),5))+STR(НОМЕР_ПОДЪЕЗДА)"

Andrey: AlexMyr, Pasha - СПАСИБО БОЛЬШОЕ !!! Буду пробовать...

Pasha: AlexMyr пишет: Andrey Подумал и сделал бы так, основная база street, дочерняя dogovor, дальше основной индекс street и вывод списка street->street, dogovor->field1,dogovor->filedn Я часто использую такой прием, в комбинации с переопределением навигационных блоков кода. Но, боюсь, это будет слишком нетривиально, навигационные блоки у меня немаленькие.

petr707: Цитата: Задаю сортировку по коду улицы (Kstreet). Получаю отсортированный список не по алфавиту улиц. Иногда в этом случае можно получить и сортировку по алфавиту Если есть возможность применения собственных кодов улиц для связки со справочником, то можно содержать ключи, задающие алфавитную сортировку наименований улиц, число которых конечно (явно ограничено). То есть значение ключа - это некий хэш от названия. Ключа длиной 10 символов достаточно для обеспечения нужной сортировки и уникальности ключа.

Vlad04: Андрей, ты же любитель условной индексации. А с ней просто получается. Создаем временный индекс В базе перед созданием индекса должно быть установлена связь бызы договоров с улицами по коду улиц. Dbsetorder(0) go top IndexTo := "street->STREET+UPPER(PADL(ALLTRIM(НОМЕР_ДОМА),5))+STR(НОМЕР_ПОДЪЕЗДА)" cFilterTo := "Kcity=350.AND.!DELETED()" ORDSETFOCUS( "ONE" ) Паша, выше все написал. Попробовал, все строится как надо.

Andrey: Vlad04 пишет: Паша, выше все написал. Попробовал, все строится как надо. Спасибо. Я тоже уже попробовал. Все классно получается. Чуть-чуть медленей показывается список. А так все здорово.

Andrey: А как получить "УСЛОВИЕ ОТБОРА" - FOR из индекса ? Использую условную индексацию: SELECT MYDBF INDEX ON &cIndexTo TAG "ONE" TO (имя врем.индекса) ; EVAL SAY_PROCENT() ; EVERY nKolRecords / 10 FOR &cFilterTo ADDITIVE cIndexTo := "STR(KCITY)+STR(KSTREET)+UPPER(PADL(ALLTRIM(НОМЕР_ДОМА),5))+STR(НОМЕР_ПОДЪЕЗДА)" cFilterTo := "Kcity=350.AND.!DELETED()" ....... код программы ....... SELECT MYDBF cIndexTo := DBORDERINFO(DBOI_EXPRESSION) ? cIndexTo cFilterTo := ???? Мне нужно получить значение cFilterTo

Andrey: Нашел.... DBORDERINFO(DBOI_CONDITION) ! А как для случая - WHILE ? INDEX ON &cIndexTo TAG "ONE" TO (имя врем.индекса) ; EVAL SAY_PROCENT() ; EVERY nKolRecords / 10 WHILE &cFilterTo ADDITIVE Мне нужно получить значение cFilterTo

Петр: Предложение WHILE не сохраняется в индексном файле



полная версия страницы