Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
в таблицу konec выводятся данные из курсора cursor1. в курсоре такие поля data_pokupki (дата),name,id,nomer,prodavec_name. Как сделать условие такое: если в таблице konec есть уже хотя бы одна такая запись, у которой поле data_pokupki (дата) пересекается со значением в курсоре, то выводить окно "Нельзя!"

Опишу на примере: В таблице konec есть к примеру записи
17.06.2013 Иванов 1 8866 Воронин
19.06.2013 Иванов 1 8866 Воронин

В курсоре допустим имеем:
18.06.2013 Иванов 1 8866 Сергеев
20.06.2013 Иванов 1 8866 Сергеев

Чтобы если есть такое пересечение, то вывести окно с сообщением об ошибке

Пытаюсь так: подправьте меня, не работает корректно
SELECT konec  
  IF cursor1.name=konec.name AND cursor1.id=konec.id AND cursor1.prodavec_name=konec.prodavec_name  
  	IF data_pokupki>=cursor1.data_pokupki AND prodavec_name<>cursor1.prodavec_name  
  		MESSAGEBOX("Нельзя!")  
  	ELSE   
  	  INSERT INTO konec(id,prodavec_name,data_pokupki,name) SELECT id,prodavec_name,data_pokupki,name FROM cursor1  
  	ENDIF   
  ELSE   
  	INSERT INTO konec(id,prodavec_name,data_pokupki,name) SELECT id,prodavec_name,data_pokupki,name FROM cursor1  
  ENDIF
20 июн 13, 15:21    [14460610]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
Есть кто живой?
20 июн 13, 15:48    [14460807]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
P-032
Member

Откуда:
Сообщений: 11
Про уникальные индексы прочитай.
20 июн 13, 15:56    [14460868]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
P-032, можете дать ссылку на литературу? или какой-нибудь похожий пример.
20 июн 13, 15:58    [14460879]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
Погодите, уникальные это ведь потом нельзя туда добавить другую запись с таким же значением, а в моем случае может быть одно и тоже значение, но другие поля чтобы у записей отличались..

Можно как-то оптимизировать мой код? чтобы просматривал всю таблицу?
SELECT konec  
  IF cursor1.name=konec.name AND cursor1.id=konec.id AND cursor1.prodavec_name=konec.prodavec_name  
  	IF data_pokupki>=cursor1.data_pokupki AND prodavec_name<>cursor1.prodavec_name  
  		MESSAGEBOX("Нельзя!")  
  	ELSE   
  	  INSERT INTO konec(id,prodavec_name,data_pokupki,name) SELECT id,prodavec_name,data_pokupki,name FROM cursor1  
  	ENDIF   
  ELSE   
  	INSERT INTO konec(id,prodavec_name,data_pokupki,name) SELECT id,prodavec_name,data_pokupki,name FROM cursor1  
  ENDIF
20 июн 13, 16:01    [14460909]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
Пишу такой код, но ошибка выходит несоответствие типов

SELECT konec  
INDEX on data_pokupki TO data_list
IF SEEK(data_pokupki ,'konec ')>=cursor1.data_pokupki 
messagebox("ошибка")
else
INSERT INTO konec(id,prodavec_name,data_pokupki,name) SELECT id,prodavec_name,data_pokupki,name FROM cursor1  
endif
20 июн 13, 16:43    [14461202]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
никто не знает что ли
20 июн 13, 16:53    [14461253]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
IgorNG
Member

Откуда: Москва
Сообщений: 956
Зеленый90,

А что, собственно, мы должны знать?
Ты пишешь какой-то хитрый код, переливая записи из курсора в таблицу с загадочным условием "пересечений по дате", а в приведенном примере никаких пересечений нет.
Наверное, не я один не понимаю, раз никто тебе посоветовать не может.
20 июн 13, 17:06    [14461311]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
12345зайчик
Guest
чтобы лис не ругался

вот этот бред:
IF SEEK(data_pokupki ,'konec ')>=cursor1.data_pokupki

нужно написать так:
IF SEEK(cursor1.data_pokupki,'konec ')


а уж как там чего реализовать - это без меня,
у меня травы мало, - я злой зайка.
20 июн 13, 17:33    [14461498]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
IgorNG, как это нету пересечений?
в таблице даты 17 и 19, а в курсоре 18.. пересечение имеется ввиду не математически или как-то еще, а просто в таблице если есть дата которая больше той что в курсоре и если поля поля prodavec_name разные, то выводить окно с сообщением
20 июн 13, 17:42    [14461530]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Зеленый90, вы точно ничего не попутали (хотя вас вроде уже спрашивали об этом)?

Вы сами можете себе внятно объяснить, ЧТО вы делаете?
SELECT konec
IF cursor1.name=konec.name AND cursor1.id=konec.id AND cursor1.prodavec_name=konec.prodavec_name  
        IF data_pokupki>=cursor1.data_pokupki AND prodavec_name<>cursor1.prodavec_name  
            MESSAGEBOX("Нельзя!")  
        ELSE
Уточнить?
cursor1.prodavec_name=konec.prodavec_name AND konec.prodavec_name<>cursor1.prodavec_name
будет истинно только в одном случае - если у вас prodavec_name в таблице есть часть prodavec_name в курсоре, причем в таблице минимум на один символ короче, да ещё и SET EXACT должно быть OFF.

Насчёт "пересечений" и прочего... Если предположить, что курсор первоначально строится как выборка из этой таблицы, то и обратно в таблицу данные должны сливаться прямо, нечего там контролировать в момент слияния. Корректность данных в курсоре должна быть обеспечена в момент ввода/изменения в курсор... Ну и все же разберитесь со своим INSERT INTO - я сильно подозреваю, что условие на "пересечения" (вернее, на то, что cursor1.data_pokupki>max(konec.data_pokupki) ) нужно просто вписать в селект.
20 июн 13, 20:47    [14462257]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
AndreTM, В общем есть курсор cursor1, который формируется НЕ из таблицы konec. Этот курсор имеет поля: data_pokupki,name,prodavec_name,id,number. Таблица konec содержит поля:data_pokupki,name,prodavec_name,id,number.

Из курсора выводятся данные в таблицу konec. всегда содержится информация только об одном покупателе, только записей может быть несколько говорящих о том что он покупал в разные дни и разные товары. Нужно выполнить такую проверку при выводе данных в таблицу, а именно: Проверять есть ли в курсоре cursor1, дата меньшая, чем в таблице для этого же покупателя и содержит ли в курсоре в поле prodavec_name значение отличное от того что в таблице konec. Т.е. если в курсоре имеется записи, говорящие о том что покупатель пришел к другому продавцу в промежуток времени который попадает в те, даты, которые уже есть в таблице, то вывести окно, иначе копировать.

К примеру пусть в таблице имеем записи
17.06.2013 Иванов 1 8866 Сидоров поля:data_pokupki,name,id,number,prodavec_name соответственно
20.06.2013 Иванов 1 8866 Сидоров поля:data_pokupki,name,id,number,prodavec_name соответственно
получается что покупатель Иванов пришел 17 и 20 числа в покупателю Сидоров
а в курсоре имеем:
18.06.2013 Иванов 1 8866 Петров data_pokupki,name,id,number,prodavec_name соответственно
23.06.2013 Иванов 1 8866 Петров data_pokupki,name,id,number,prodavec_name соответственно
покупатель Иванов пришел 18 и 23 к покупателю Петров.

Видно же что дата в курсоре попадает в интервал дат в таблице и покупатель пришел к другому продавцу.
20 июн 13, 21:12    [14462313]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
AndreTM
Member

Откуда: Где-то в вологодских лесах...
Сообщений: 6901
Блин... Вы хоть поняли, о чём я с вами беседую-то? Что мне ваши потребности "найти даты, проверить продавцов"...
Я вам толкую про то, что вы сами не понимаете, что в условиях писали и пишете.
Вы уперлись в некую логическую конструкцию, которую придумали - и долбите её, не пытаясь осмыслить, что же происходит с данными.
У вас ведь не две возможности (выдать окно предупреждения/добавить все данные из курсора), у вас их больше...
У вас ведь на этих данных нет понятия "промежуток времени", как бы вы не пытались доказать обратное...
21 июн 13, 01:09    [14463001]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
Мне тут подсказали один код, хотелось бы понять и разобрать его.

select count(*) cnt1 into array arr1 from table2 t2;    
    inner join (select max(date1) date1, field1, field2, ... , fieldN from table1 group by Field1, ... , FieldN) t1 ;    
        on t2.date1<=t1.date1 and t1.field2=t2.field2 and .... and t1.fieldN=t2.fieldN    
    if arr1 <> 0    
        messagebox('Ошибка!',16)    
    endif
21 июн 13, 09:07    [14463402]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Если я правильно понимаю, то смысл задачи сводится к следующему

1. У каждого продавца есть определенные период времени, когда он работал с неким покупателем. Скажем, продавец "Воронин" работал с покупателем "Иванов" в период с 17.06.2013 по 19.06.2013

2. Приходит некая "бумага", где сказано, что 18.06.2013 покупателя "Иванов" обслуживал продавец "Сидоров"

Но мы такую "бумагу" пропустить не должны, поскольку "знаем", что в период с 17.06.2013 по 19.06.2013 с покупателем "Иванов" работал продавец "Воронин"

Собственно, задача заключается в том, чтобы найти ближайшие записи с тем же самым покупателем и сравнить 3 найденных значения продавца.

Сконструировать общий запрос в синтаксисе Select-SQL можно. Но я сильно сомневаюсь, что он будет работать в FoxPro. Там придется писать несколько коррелированных запросов. Для FoxPro все можно решить значительно проще обычными "навигационными" командами. Примерно так

Local laBeforeName[1], laAfterName[1], llError
select cursor1
scan
	store '' to laBeforeName, laAfterName

	* Имя продавца на ближайшую меньшую дату
	select top 1 prodavec_name ;
	into array laBeforeName ;
	from konec ;
	where name = cursor1.name and data_pokupki < cursor1.data_pokupki ;
	order by data_pokupki desc

	* Имя продавца на ближайшую большую или равную дату
	select top 1 prodavec_name ;
	into array laAfterName ;
	from konec ;
	where name = cursor1.name and data_pokupki >= cursor1.data_pokupki ;
	order by data_pokupki

	* Сравниваем 3 найденных продавца
	if empty(laBeforeName[1]) = .F. ;
		and empty(laAfterName[1] ) = .F. ;
		and laBeforeName[1] == laAfterName[1] ;
		and laBeforeName[1] <> cursor1.prodavec_name
		
		llError = .T.
		exit
	endif
endscan

if m.llError = .T.
	MessageBox('Нельзя')
endif
23 июн 13, 22:52    [14471224]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Зеленый90
Member

Откуда:
Сообщений: 10
ВладимирМ, Задача вообще такая: Есть покупатели и продавцы. В курсоре cursor1 содержатся записи всегда только об одном покупателе, которого выбирают. Там может быть 2,3 или даже 10 записей с разными датами, но продавец у этого покупателя всегда в курсоре один и тот же. Допустим мы 3 записи о покупателе занесли в таблицу konec. Это записи с датами: 15,18,19 июня 2013 года. В эти дни он купил у какого-то продавца какие-то товары. Допустим теперь что этот покупатель пришел 16 июня к продавцу Сидорову и купил что-то, а потом 23 июня пришел опять к Сидорову. Пользователь в программе выбирает записи, которые покупатель ходил к продавцу Сидорову и в курсоре оказываются 2 записи 16 и 23 июня. Так вот при попытке их записать в таблицу konec должно выдаваться сообщение что нельзя делать этого.

Условие проверки такое: При попытке записать такие данные проверять, есть ли хоть одна указанная дата в курсоре попадает в промежуток дат, уже имеющихся в таблице для этого же покупателя, то не давать доступ для записи. А если даты в курсоре не попадают в промежуток, то можно записывать.
23 июн 13, 23:37    [14471335]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Станислав С...кий
Guest
Зеленый90
Условие проверки такое: При попытке записать такие данные проверять, есть ли хоть одна указанная дата в курсоре попадает в промежуток дат, уже имеющихся в таблице для этого же покупателя, то не давать доступ для записи. А если даты в курсоре не попадают в промежуток, то можно записывать.


Это надо?
select * from cursor1 where cursor1.data_pokupki > (Select max(konec.data_pokupki) from konec where konec.name = cursor1.name)
24 июн 13, 10:56    [14472509]     Ответить | Цитировать Сообщить модератору
 Re: Проверка условия  [new]
Станислав С...кий
Guest
Станислав С...кий
Зеленый90
Условие проверки такое: При попытке записать такие данные проверять, есть ли хоть одна указанная дата в курсоре попадает в промежуток дат, уже имеющихся в таблице для этого же покупателя, то не давать доступ для записи. А если даты в курсоре не попадают в промежуток, то можно записывать.


Это надо?
select * from cursor1 where cursor1.data_pokupki > (Select max(konec.data_pokupki) from konec where konec.name = cursor1.name)


А дальше сравнивать количество записей в исходном курсоре и в полученной выборке. Если количество записей не совпадает, то не давать сохранять...
24 июн 13, 11:02    [14472565]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить