Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проверка условия / 18 сообщений из 18, страница 1 из 1
20.06.2013, 15:21
    #38304963
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
в таблицу 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 Сергеев

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

Пытаюсь так: подправьте меня, не работает корректно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
20.06.2013, 15:48
    #38305009
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Есть кто живой?
...
Рейтинг: 0 / 0
20.06.2013, 15:56
    #38305025
P-032
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Про уникальные индексы прочитай.
...
Рейтинг: 0 / 0
20.06.2013, 15:58
    #38305027
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
P-032, можете дать ссылку на литературу? или какой-нибудь похожий пример.
...
Рейтинг: 0 / 0
20.06.2013, 16:01
    #38305035
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Погодите, уникальные это ведь потом нельзя туда добавить другую запись с таким же значением, а в моем случае может быть одно и тоже значение, но другие поля чтобы у записей отличались..

Можно как-то оптимизировать мой код? чтобы просматривал всю таблицу?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
20.06.2013, 16:43
    #38305113
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Пишу такой код, но ошибка выходит несоответствие типов

Код: sql
1.
2.
3.
4.
5.
6.
7.
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
...
Рейтинг: 0 / 0
20.06.2013, 16:53
    #38305130
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
никто не знает что ли
...
Рейтинг: 0 / 0
20.06.2013, 17:06
    #38305151
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Зеленый90,

А что, собственно, мы должны знать?
Ты пишешь какой-то хитрый код, переливая записи из курсора в таблицу с загадочным условием "пересечений по дате", а в приведенном примере никаких пересечений нет.
Наверное, не я один не понимаю, раз никто тебе посоветовать не может.
...
Рейтинг: 0 / 0
20.06.2013, 17:33
    #38305209
12345зайчик
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
чтобы лис не ругался

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

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


а уж как там чего реализовать - это без меня,
у меня травы мало, - я злой зайка.
...
Рейтинг: 0 / 0
20.06.2013, 17:42
    #38305223
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
IgorNG, как это нету пересечений?
в таблице даты 17 и 19, а в курсоре 18.. пересечение имеется ввиду не математически или как-то еще, а просто в таблице если есть дата которая больше той что в курсоре и если поля поля prodavec_name разные, то выводить окно с сообщением
...
Рейтинг: 0 / 0
20.06.2013, 20:47
    #38305406
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Зеленый90 , вы точно ничего не попутали (хотя вас вроде уже спрашивали об этом)?

Вы сами можете себе внятно объяснить, ЧТО вы делаете?
Код: sql
1.
2.
3.
4.
5.
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

Уточнить?
Код: sql
1.
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) ) нужно просто вписать в селект.
...
Рейтинг: 0 / 0
20.06.2013, 21:12
    #38305416
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
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 к покупателю Петров.

Видно же что дата в курсоре попадает в интервал дат в таблице и покупатель пришел к другому продавцу.
...
Рейтинг: 0 / 0
21.06.2013, 01:09
    #38305557
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Блин... Вы хоть поняли, о чём я с вами беседую-то? Что мне ваши потребности "найти даты, проверить продавцов"...
Я вам толкую про то, что вы сами не понимаете, что в условиях писали и пишете.
Вы уперлись в некую логическую конструкцию, которую придумали - и долбите её, не пытаясь осмыслить, что же происходит с данными.
У вас ведь не две возможности (выдать окно предупреждения/добавить все данные из курсора), у вас их больше...
У вас ведь на этих данных нет понятия "промежуток времени", как бы вы не пытались доказать обратное...
...
Рейтинг: 0 / 0
21.06.2013, 09:07
    #38305680
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Мне тут подсказали один код, хотелось бы понять и разобрать его.

Код: sql
1.
2.
3.
4.
5.
6.
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
...
Рейтинг: 0 / 0
23.06.2013, 22:52
    #38307627
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
Если я правильно понимаю, то смысл задачи сводится к следующему

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

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

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

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
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
...
Рейтинг: 0 / 0
23.06.2013, 23:37
    #38307655
Зеленый90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка условия
ВладимирМ, Задача вообще такая: Есть покупатели и продавцы. В курсоре cursor1 содержатся записи всегда только об одном покупателе, которого выбирают. Там может быть 2,3 или даже 10 записей с разными датами, но продавец у этого покупателя всегда в курсоре один и тот же. Допустим мы 3 записи о покупателе занесли в таблицу konec. Это записи с датами: 15,18,19 июня 2013 года. В эти дни он купил у какого-то продавца какие-то товары. Допустим теперь что этот покупатель пришел 16 июня к продавцу Сидорову и купил что-то, а потом 23 июня пришел опять к Сидорову. Пользователь в программе выбирает записи, которые покупатель ходил к продавцу Сидорову и в курсоре оказываются 2 записи 16 и 23 июня. Так вот при попытке их записать в таблицу konec должно выдаваться сообщение что нельзя делать этого.

Условие проверки такое: При попытке записать такие данные проверять, есть ли хоть одна указанная дата в курсоре попадает в промежуток дат, уже имеющихся в таблице для этого же покупателя, то не давать доступ для записи. А если даты в курсоре не попадают в промежуток, то можно записывать.
...
Рейтинг: 0 / 0
24.06.2013, 10:56
    #38307933
Проверка условия
Зеленый90Условие проверки такое: При попытке записать такие данные проверять, есть ли хоть одна указанная дата в курсоре попадает в промежуток дат, уже имеющихся в таблице для этого же покупателя, то не давать доступ для записи. А если даты в курсоре не попадают в промежуток, то можно записывать.

Это надо?
Код: sql
1.
select * from cursor1 where cursor1.data_pokupki > (Select max(konec.data_pokupki) from konec where konec.name = cursor1.name)
...
Рейтинг: 0 / 0
24.06.2013, 11:02
    #38307940
Проверка условия
Станислав С...кийЗеленый90Условие проверки такое: При попытке записать такие данные проверять, есть ли хоть одна указанная дата в курсоре попадает в промежуток дат, уже имеющихся в таблице для этого же покупателя, то не давать доступ для записи. А если даты в курсоре не попадают в промежуток, то можно записывать.

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



А дальше сравнивать количество записей в исходном курсоре и в полученной выборке. Если количество записей не совпадает, то не давать сохранять...
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проверка условия / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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