Автор Тема: Алгоритм для символьного типа. FoxPro 2.6  (Прочитано 2133 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Sith666

  • Коллежский регистратор
  • *
  • Сообщений: 1
  • Репутация: 0
Исходная задача:
рассчитать количество записей таблицы, у которых в поле символьного типа значение попадает в заданный диапазон.

Особенность в том, что из-за символьного типа, например, пункт "85.3" > пункта "85.20".
Пример: мне надо посчитать количество записей для диапазона пунктов:
1) от п. "85.2" по "85.16.4" =>
Код: (visualfoxpro) [Выделить]
COUNT FOR BETWEEN(TABLE.field,'85.2','85.16.4')
2) от п. "85.3" по "85.20.2" =>
Код: (visualfoxpro) [Выделить]
COUNT FOR BETWEEN(TABLE.field,'85.3','85.20.2')

Примеры ошибок: в первый диапазон не попадает TABLE.field="85.3", во второй не попадает TABLE.field="85.8".

Уровень вложенности тройной, т.е. максимально длинным может быть пункт "99.99.99"

Как правильно производить подсчёт? Может уже есть готовая функция/алгоритм?

Оффлайн Talgat

  • Коллежский регистратор
  • *
  • Сообщений: 2
  • Репутация: 0
Re: Алгоритм для символьного типа. FoxPro 2.6
« Ответ #1 : јРав 06, 2008, 11:38:03 am »

CLOSE ALL
CLEAR ALL
CLEAR

SET ANSI OFF
SET LIBRARY TO FPath

m.nWords = 0
STORE 0 TO m.n1, m.n2, m.n3, i

SELECT 0
USE T1 && < field F1 C(8) >
SELECT F1, SPACE(8) AS F2 FROM T1 INTO TABLE Temp;
   WHERE f1 <> " "
USE IN T1

SELECT Temp
SCAN
   m.nWords = Words(f1, ".")
   IF m.nWords > 0
      DO CASE
         CASE m.nWords = 1
            m.n1 = VAL(WordNum(f1, 1, "."))
            m.n2 = 0
            m.n3 = 0
         CASE m.nWords = 2
            m.n1 = VAL(WordNum(f1, 1, "."))
            m.n2 = VAL(WordNum(f1, 2, "."))
            m.n3 = 0
         CASE m.nWords = 3
            m.n1 = VAL(WordNum(f1, 1, "."))
            m.n2 = VAL(WordNum(f1, 2, "."))
            m.n3 = VAL(WordNum(f1, 3, "."))
         OTHERWISE
            m.n1 = 0
            m.n2 = 0
            m.n3 = 0
      ENDCASE
      REPLACE f2 WITH TRANSFORM(m.n1, "@L 99") + "." +;
         TRANSFORM(n2, "@L 99") + "." +;
         TRANSFORM(n3, "@L 99")
   ENDIF
ENDSCAN

m.c1 = "85.03"                                  только здесь один нюанс, значения критерии поиска обязательно должны быть примерно такого формата, т.е. вместо 83.3 -> 83.03, а если имели введу 30, тогда 83.30
m.c2 = "85.20.02"

SELECT * FROM Temp INTO TABLE t3 WHERE f2;
   BETWEEN m.c1 AND m.c2 ORDER BY F2
BROWSE

SET LIBRARY TO

RETURN


Результаты:

Record#  F1       F2     
      1  85.3     85.03.00
      2  85.8     85.08.00
      3  85.9     85.09.00
      4  85.20.2  85.20.02