:: Visual Foxpro, Foxpro for DOS
BETWEEN с текстовыми границами диапазона
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Здравствуйте.
Имеется две таблицы
CREATE CURSOR M001(icd10 C(7))
FOR i=0 TO 9
INSERT INTO m001 (icd10) VALUES ('B46.'+ALLTRIM(STR(i)))
INSERT INTO m001 (icd10) VALUES ('B47.'+ALLTRIM(STR(i)))
INSERT INTO m001 (icd10) VALUES ('B48.'+ALLTRIM(STR(i)))
NEXT

и вторая таблица
CREATE CURSOR test (grds C(140))
INSERT INTO test (grds) values('B46.0-B46.9')
Нужно выбрать из m001 записи, соответствующие диапазону из таблицы test
Делаю:
SELECT test
GO 1
klp=ALLTRIM(test.grds)
CLEAR
?klp
ss1=klp
ds1=SUBSTR(ss1,1,AT('-',ss1,1)-1)
ss1=SUBSTR(ss1,AT('-',ss1,1)+1)
ds2=ALLTRIM(ss1)
?ds1
?ds2
SELECT * FROM m001 WHERE BETWEEN(RTRIM(icd10), ds1, ds2)
Не срабатывает. Отбирает записи, и соответствующие, и не соответствующие указанному диапазону.
Вто же время при явном задании нижней и верхней границ запрос срабатывает правильно.
ds1='B46.0'
ds2='B46.9'
?ds1
?ds2
SELECT * FROM m001 WHERE BETWEEN(RTRIM(icd10), ds1, ds2)
Что я пропускаю?


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: BETWEEN с текстовыми границами диапазона
danton1973

Сообщений: 143
Откуда: Пермь
Дата регистрации: 10.08.2020
1. Зачем RTRIM(icd10)?
2. ALINES(laDS,m.klp,1,"-") в laDS[1] и laDS[2] будут граничные значения 'B46.0' и 'B46.9' соответственно.
CREATE CURSOR M001(icd10 C(7))
FOR i=0 TO 9
INSERT INTO m001 (icd10) VALUES ('B46.'+ALLTRIM(STR(i)))
INSERT INTO m001 (icd10) VALUES ('B47.'+ALLTRIM(STR(i)))
INSERT INTO m001 (icd10) VALUES ('B48.'+ALLTRIM(STR(i)))
NEXT
CREATE CURSOR test (grds C(140))
INSERT INTO test (grds) values('B46.0-B46.9')
SELECT test
klp=alines(laTest,test.grds,1,"-")
SELECT * FROM m001 WHERE BETWEEN(icd10, laTest[1], laTest[2])
отработало правильно
Ratings: 0 negative/0 positive
Re: BETWEEN с текстовыми границами диапазона
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Не срабатывает и Вашим методом.
Кстати, когда я в первый раз запустил тестовый пример из моего поста, вроде все отработало правильно.
Но при дальнейшем тестировании уже перестал работать.

В принципе неважно, каким методом определять граничные значения.
Between не срабатывает при программном вычислении граничных значений и срабатывает при явном их задании.
Пробовал менять установки типа SET ANSI и подобное.
Пробовал с RTRIM, ALLTRIM и без них.
Пробовал макроподстановки, заключение переменных, как в одинарные, так и двойные кавычки типа
musl='BETWEEN(ALLTRIM(icd10),"'+ds1+'","'+ds2+'")'
?musl
SELECT icd10 FROM m001 WHERE &musl
Ничего не помогает

Перезагрузка компьютера не помогает.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: BETWEEN с текстовыми границами диапазона
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Кстати, VFP9 SP2


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: BETWEEN с текстовыми границами диапазона
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
При запуске Вашего метода в отдельной программе срабатывает нормально.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: BETWEEN с текстовыми границами диапазона
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
См. Set exact

Слишком много у тебя лишнего в коде.
При alines во втором элементе в конце есть пробелы.
И в полях у тебя тоже.

Юзай set exact
И вероятно в исходной таблице лучше поля типа varchar.
Ratings: 0 negative/0 positive
Re: BETWEEN с текстовыми границами диапазона
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Тысячу извинений за беспокойство.
Проблема была связана с наличием символов кириллицы в исходном файле.
Но все равно странно, что between отбирал записи, не входящие в заданный диапазон, даже если они в кириллице.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: BETWEEN с текстовыми границами диапазона
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Taran
Слишком много у тебя лишнего в коде.
Спасибо. Пробовал и exact on/off.
Много лишнего, как раз, чтобы пробелов не было, и быть уверенным, что данные из исходной таблицы отбираются верно.
Много экспериментировал, пока не догадался выполнить проверку на кириллицу.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 FaustGreen  (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика