|
|
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Исходная задача: рассчитать количество записей таблицы, у которых в поле символьного типа значение попадает в заданный диапазон. Особенность в том, что из-за символьного типа, например, пункт "85.3" > пункта "85.20". Пример: мне надо посчитать количество записей для диапазона пунктов: 1) от п. "85.2" по "85.16.4" => BETWEEN(x,'85.2','85.16.4') 2) от п. "85.3" по "85.20.2" => BETWEEN(x,'85.3','85.20.2') Примеры ошибок: в первый диапазон не попадает x="85.3", во второй не попадает x="85.8". Уровень вложенности тройной, т.е. максимально длинным может быть пункт "99.99.99" Как правильно производить подсчёт? Может уже есть готовая функция/алгоритм?(у меня поиск по форуму не работает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 09:59 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
напиши функцию преобразования в число. Если максимум '99.99.99', то она должна такое давать: "85.2" => 852000 "85.20.2" => 852020 а числа сравнивай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 10:27 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Dima T"85.2" => 852000 чуть ошибся, надо так "85.2" => 850200 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 10:28 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Число можно так получить: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 10:34 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
УУУ! Как всё сложно! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 12:42 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
MiklSУУУ! Как всё сложно! УУУ! Как все неправильно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 13:14 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
И что не работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 13:34 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
ЗЫ! Сам только что проверил на курсоре - всё отлично работает!!!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 13:41 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
MiklSЗЫ! Сам только что проверил на курсоре - всё отлично работает!!!!!!! Отлично от того как надо. По постановке задачи 85.2 < 85.16 А у тебя что получается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 13:51 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Просто нужно вставить ALLTRIM() для переменных и Pole1. И всё. У меня в курсоре данные в виде 99.99.99. А ты пишешь 85.16!! lnVar2=VAL(PADR( ALLTRIM( STRTRAN(lnVar2, ".", ""), 6, "0"))) Ну и далее по тексту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 14:30 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
MiklSУ меня в курсоре данные в виде 99.99.99. А ты пишешь 85.16!! Хорош тормозить :) Это вложенная нумерация (Раздел.Пункт.Подпункт) три целых числа через точку записанных в строку. Вот и надо сравнивать сначала номера разделов, если разделы равны пунктов и т.д. например BETWEEN(x,'85.2','85.16.4') означает в разделе 85 от пункта 2 по пункт 16 подпункт 2 Чтобы сравнивать как строки надо не точки убирать, а нули правильно добавлять: "85.2" => "85.02.00", если точки убрать "850200" а у тебя "852000" т.е. у тебя "85.2" равно "85.20" Alex SithИсходная задача: Пример: мне надо посчитать количество записей для диапазона пунктов: 1) от п. "85.2" по "85.16.4" => BETWEEN(x,'85.2','85.16.4') 2) от п. "85.3" по "85.20.2" => BETWEEN(x,'85.3','85.20.2') Примеры ошибок: в первый диапазон не попадает x="85.3", во второй не попадает x="85.8". ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 14:50 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Ну если так "85.2" => "85.02.00" тогда ой! Может не правильно понял!!! Тогда так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 15:34 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
MiklS... Код: plaintext Что я и сделал изначально. только GETWORDNUM() нет в 6-ке, потому и пользую самодельный GetParam() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 15:47 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Dima T MiklS... Код: plaintext Что я и сделал изначально. только GETWORDNUM() нет в 6-ке, потому и пользую самодельный GetParam() Вместо него есть WordNum из Foxtools.fll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 15:49 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Вот так получается вроде правильно *lnVar1="85.3" *lnVar2="85.20.2" LPARAMETERS lnVar1, lnVar2 lnPar1=PADL(GETWORDNUM(lnVar1, 1, "."), 2, "0") lnPar2=PADL(GETWORDNUM(lnVar1, 2, "."), 2, "0") lnPar3=PADL(GETWORDNUM(lnVar1, 3, "."), 2, "0") lnVar1=VAL(lnPar1+lnPar2+lnPar3) lnPar1=PADL(GETWORDNUM(lnVar2, 1, "."), 2, "0") lnPar2=PADL(GETWORDNUM(lnVar2, 2, "."), 2, "0") lnPar3=PADL(GETWORDNUM(lnVar2, 3, "."), 2, "0") lnVar2=VAL(lnPar1+lnPar2+lnPar3) CALCULATE CNT() FOR BETWEEN(VAL(PADR(STRTRAN(Table.Pole, ".", ""), 6, "0")), lnVar2, lnVar1) TO nCol ? nCol ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 15:57 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
MiklSВот так получается вроде правильно ... Не-а. С Table.Pole то же самое проделать надо что и с lnVar1, lnVar2 (кстати префикс lc тут уместней) и почему у тебя в BETWEEN() lnVar2, lnVar1 а не наоборот? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 16:13 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Забыл переставить, просто скопировал.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 16:17 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Для справки: В VFP6 была введена функция ALINES(), при помощи которой можно выделить отдельные "слова". Правда, в VFP6 придется заменять символы-разделители на Chr(13) Код: plaintext 1. 2. 3. 4. 5. 6. Если, тем не менее, необходимо разбирать строку по символьно через поиск по AT(), то для упрощения анализа следует добавить в начало и конец анализируемой строки символ-разделитель. Код: plaintext 1. 2. 3. 4. 5. 6. Если разделителем выступает именно точка, то можно выделить фрагменты при помощи функций JustExt() и JustStem() Хотя, разумеется, через GetWordNum() задача решается проще. Только, зачем же в число переводить? Ведь вы вместе и так получили корректную строку для сравнения. Т.е. трансформировали строку вида "85.16.4" в строку "851604". А строку вида "85.2" в строку "850200". Последний шаг - первод в число - лишний. Все прекрасно будет работать и для символьных строк, поскольку они приведены в сопоставимый формат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 16:57 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Только, зачем же в число переводить? Ведь вы вместе и так получили корректную строку для сравнения. Для понимания. Читабельности кода. Если реальный смысл строки - три целых числа записанных последовательно, так с числами и надо продолжать работать, я так думаю. За исключением случаев когда нужна максимальная производительность. Изначально я предлагал вариант сориентированный на числа. Потом появился компромис с MiklS :) Классические операции сравнения для строк это равно/неравно, а сравнение строк на больше/меньше - не частая операция с реальными строками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 17:11 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Dima T ВладимирМ Только, зачем же в число переводить? Ведь вы вместе и так получили корректную строку для сравнения. Для понимания. Читабельности кода. Если реальный смысл строки - три целых числа записанных последовательно, так с числами и надо продолжать работать, я так думаю. За исключением случаев когда нужна максимальная производительность. Изначально я предлагал вариант сориентированный на числа. Потом появился компромис с MiklS :) Классические операции сравнения для строк это равно/неравно, а сравнение строк на больше/меньше - не частая операция с реальными строками. Сам я единожды встречался с такой структурой хранения кода. Решения были разные для разных СУБД. В Фоксе пришлось оставить как есть, а для выборок ввести дополнительное поле, обновляемое по триггеру. Смысл поля в том, что в нем хранится значение уже расшарашенное по маске "XXX.XX.XX". При смене маски (которая лежит в отдельной настройке), поле пересчитывалось из исходных данных (в стиле "85.2.4"). Выборки при этом ходят достаточно быстро. В Postgre я запихал маску в массив, пошаманил с сортировками, а для пользователя преобразую в текст. Так, как удобнее в данном случае (маскированно/или нет). Но! Чтобы это более или менее шевелилось, пришлось написать свою функцинешку на сях в обоих случаях. А на сях реализуется со сложностью O(1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 19:21 |
|
||
|
Алгоритм для символьного типа
|
|||
|---|---|---|---|
|
#18+
Kruchinin Pahan[quot Dima T]Сам я единожды встречался с такой структурой хранения кода. Решения были разные для разных СУБД. В Фоксе пришлось оставить как есть, а для выборок ввести дополнительное поле, обновляемое по триггеру. Смысл поля в том, что в нем хранится значение уже расшарашенное по маске "XXX.XX.XX". При смене маски (которая лежит в отдельной настройке), поле пересчитывалось из исходных данных (в стиле "85.2.4"). Выборки при этом ходят достаточно быстро. В Postgre я запихал маску в массив, пошаманил с сортировками, а для пользователя преобразую в текст. Так, как удобнее в данном случае (маскированно/или нет). Но! Чтобы это более или менее шевелилось, пришлось написать свою функцинешку на сях в обоих случаях. А на сях реализуется со сложностью O(1). Если задача критична к производительности (например объем данных очень большой) то предпочитаю хранить только удобную для программной обработки форму, а при выводе на клиенте преобразовывать в удобный пользователю вид. Так на сервер получается минимальная нагрузка и минимальный объем данных хранится. Как правило у клиента свободного процессорного времени больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2008, 21:04 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=168&tid=1588095]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 218ms |
| total: | 347ms |

| 0 / 0 |
