Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить вхождение / 12 сообщений из 12, страница 1 из 1
07.10.2014, 02:05
    #38768584
Как проверить вхождение
Есть форма, на ней два эдита, куда пользователь вводит начало диапазона и конец (mdiapin1,mdiapin2)
Нажимаем кнопку сохранить, в ней код...проверяем вхождение диапазона и если прошло то устанавливаем zflag=.t. и собссна релизим форму и дальше идет запись введенного диапазона в базу.

LOCATE FOR (thisform.mdiapin1.Value >= txpacks.diapin1 AND thisform.mdiapin1.Value <= txpacks.diapin2) OR (thisform.mdiapin2.Value >= txpacks.diapin1 AND thisform.mdiapin2.Value <= txpacks.diapin2)
IF FOUND()
lcMessage = "Введенный диапазон имеет пересечение"
MESSAGEBOX(lcMessage,0+48,'Ошибка')
zflag=.f.
SET FILTER TO &gcOldFilter
ELSE
zflag=.t.
SET FILTER TO &gcOldFilter
thisform.Release
ENDIF

Ну проблема в том что если ввести mdiapin1 меньше самого минимального значения в базе, а mdiapin2 больше самого максимального, то проверка пройдет...хотя получается, что этот диапазон будет накладываться на существующий и перекрывать его. Мучал и between, но суть та же.
Не знаю как понятнее объяснить...может подскажете как правильно организовать такую проверку и разрешить дальнейшую запись по zflag=.t.
...
Рейтинг: 0 / 0
07.10.2014, 06:42
    #38768612
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить вхождение
Сергей П.Ст.Не знаю как понятнее объяснитьДля начала объясните, вхождение какого диапазона в какой вы проверяете.
...
Рейтинг: 0 / 0
07.10.2014, 06:52
    #38768615
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить вхождение
Сергей П.Ст.Не знаю как понятнее объяснить...
Типа сами догадайтесь - вы же тут телепаты
Основная проблема именно в том что ты не можешь четко сформулировать задачу, но пытаешься ее решать. Прежде чем писать код - надо четко сформулировать задачу, которую он должен решать.

Как понимаю тебе надо проверить что введенный диапазон в пределах имеющегося в таблице, тогда надо вычислять минимум и максимум таблицы, а затем с ними сравнивать введенные значения.
...
Рейтинг: 0 / 0
07.10.2014, 07:47
    #38768629
Как проверить вхождение
Наоборот... мне надо не дать пользователю ввести диапазон который уже имеется.
Допустим кто-то уже ввел серии

1000-2000
3000-7000

Пользователь при попытке ввести диапазон 900-1500 должон получить отлуп. Это работает кодом который написал.. .но если пользователь попытается ввести диапазон 700-8000 то этот код не сработает.
...
Рейтинг: 0 / 0
07.10.2014, 07:51
    #38768632
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить вхождение
Допустим есть:
1000-2000
3000-7000
8000-9000

допустимо ввести 2500-7500 ? или 2100-2900?
...
Рейтинг: 0 / 0
07.10.2014, 08:03
    #38768636
Как проверить вхождение
неа... ибо уже идет пересечение
...
Рейтинг: 0 / 0
07.10.2014, 08:08
    #38768637
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить вхождение
Сергей П.Ст.неа... ибо уже идет пересечение
2100-2900 тоже нельзя? Этот диапазон не пересекается с существующими.
...
Рейтинг: 0 / 0
07.10.2014, 08:14
    #38768640
Как проверить вхождение
ой все... туплю.. дадада... его можно.
...
Рейтинг: 0 / 0
07.10.2014, 08:18
    #38768643
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить вхождение
Ты проверяешь что добавляемый диапазон не попадает в существующие. Надо добавить проверку что существующие не попадают в добавляемый. Так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create Cursor diap (nMin i, nMax i)
insert into diap values (1000, 2000)
insert into diap values (3000, 7000)
insert into diap values (8000, 9000)

? CheckDiap(900, 1500)
? CheckDiap(700, 7500)
? CheckDiap(2100, 2900)
return

func CheckDiap
lpara tnMin, tnMax
sele diap
locate for between(tnMin, diap.nMin, diap.nMax); && tnMin внутри существующего диапазона
			 or between(tnMax, diap.nMin, diap.nMax); && tnMax внутри существующего диапазона
			 or between(diap.nMin, tnMin, tnMax) && внутри добавляемого диапазона есть существующий
return !found()
...
Рейтинг: 0 / 0
07.10.2014, 08:22
    #38768644
Как проверить вхождение
Ммм... спаааасибо, пойду осиливать.
...
Рейтинг: 0 / 0
07.10.2014, 08:31
    #38768647
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить вхождение
Еще учти что на большой таблице этот код будет сильно тормозить, т.к. LOCATE будет сканировать всю таблицу при отсутствии пересечений.
Пока сделай с LOCATE и начинай думать как ускорить :)
...
Рейтинг: 0 / 0
07.10.2014, 08:49
    #38768657
Как проверить вхождение
а там шибко больших не будет... чистицо будет все ))
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить вхождение / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]