powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить вхождение
12 сообщений из 12, страница 1 из 1
Как проверить вхождение
    #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
Как проверить вхождение
    #38768612
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст.Не знаю как понятнее объяснитьДля начала объясните, вхождение какого диапазона в какой вы проверяете.
...
Рейтинг: 0 / 0
Как проверить вхождение
    #38768615
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст.Не знаю как понятнее объяснить...
Типа сами догадайтесь - вы же тут телепаты
Основная проблема именно в том что ты не можешь четко сформулировать задачу, но пытаешься ее решать. Прежде чем писать код - надо четко сформулировать задачу, которую он должен решать.

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

1000-2000
3000-7000

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

допустимо ввести 2500-7500 ? или 2100-2900?
...
Рейтинг: 0 / 0
Как проверить вхождение
    #38768636
неа... ибо уже идет пересечение
...
Рейтинг: 0 / 0
Как проверить вхождение
    #38768637
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей П.Ст.неа... ибо уже идет пересечение
2100-2900 тоже нельзя? Этот диапазон не пересекается с существующими.
...
Рейтинг: 0 / 0
Как проверить вхождение
    #38768640
ой все... туплю.. дадада... его можно.
...
Рейтинг: 0 / 0
Как проверить вхождение
    #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
Как проверить вхождение
    #38768644
Ммм... спаааасибо, пойду осиливать.
...
Рейтинг: 0 / 0
Как проверить вхождение
    #38768647
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще учти что на большой таблице этот код будет сильно тормозить, т.к. LOCATE будет сканировать всю таблицу при отсутствии пересечений.
Пока сделай с LOCATE и начинай думать как ускорить :)
...
Рейтинг: 0 / 0
Как проверить вхождение
    #38768657
а там шибко больших не будет... чистицо будет все ))
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как проверить вхождение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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