for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

BETWEEN с текстовыми границами диапазона
Baga
Автор

Сообщений: 524
Откуда: г. Махачкала
Дата: 29.12.20 22:34:06
Здравствуйте.
Имеется две таблицы
  
  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

Сообщений: 40
Откуда: Пермь
Дата: 30.12.20 07:25:44
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
Автор

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

В принципе неважно, каким методом определять граничные значения.
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
Автор

Сообщений: 524
Откуда: г. Махачкала
Дата: 30.12.20 08:12:41
Кстати, VFP9 SP2


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

Re: BETWEEN с текстовыми границами диапазона
Baga
Автор

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


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

Re: BETWEEN с текстовыми границами диапазона
Taran

Сообщений: 11533
Откуда: Красноярск
Дата: 30.12.20 08:41:08
См. Set exact

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

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

Re: BETWEEN с текстовыми границами диапазона
Baga
Автор

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


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

Re: BETWEEN с текстовыми границами диапазона
Baga
Автор

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


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



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

On-line: 5 Simple777  (Гостей: 4)


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