powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проверка условия
18 сообщений из 18, страница 1 из 1
Проверка условия
    #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
Проверка условия
    #38305009
Зеленый90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть кто живой?
...
Рейтинг: 0 / 0
Проверка условия
    #38305025
P-032
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про уникальные индексы прочитай.
...
Рейтинг: 0 / 0
Проверка условия
    #38305027
Зеленый90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P-032, можете дать ссылку на литературу? или какой-нибудь похожий пример.
...
Рейтинг: 0 / 0
Проверка условия
    #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
Проверка условия
    #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
Проверка условия
    #38305130
Зеленый90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
никто не знает что ли
...
Рейтинг: 0 / 0
Проверка условия
    #38305151
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зеленый90,

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

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

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


а уж как там чего реализовать - это без меня,
у меня травы мало, - я злой зайка.
...
Рейтинг: 0 / 0
Проверка условия
    #38305223
Зеленый90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IgorNG, как это нету пересечений?
в таблице даты 17 и 19, а в курсоре 18.. пересечение имеется ввиду не математически или как-то еще, а просто в таблице если есть дата которая больше той что в курсоре и если поля поля prodavec_name разные, то выводить окно с сообщением
...
Рейтинг: 0 / 0
Проверка условия
    #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
Проверка условия
    #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
Проверка условия
    #38305557
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин... Вы хоть поняли, о чём я с вами беседую-то? Что мне ваши потребности "найти даты, проверить продавцов"...
Я вам толкую про то, что вы сами не понимаете, что в условиях писали и пишете.
Вы уперлись в некую логическую конструкцию, которую придумали - и долбите её, не пытаясь осмыслить, что же происходит с данными.
У вас ведь не две возможности (выдать окно предупреждения/добавить все данные из курсора), у вас их больше...
У вас ведь на этих данных нет понятия "промежуток времени", как бы вы не пытались доказать обратное...
...
Рейтинг: 0 / 0
Проверка условия
    #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
Проверка условия
    #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
Проверка условия
    #38307655
Зеленый90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, Задача вообще такая: Есть покупатели и продавцы. В курсоре cursor1 содержатся записи всегда только об одном покупателе, которого выбирают. Там может быть 2,3 или даже 10 записей с разными датами, но продавец у этого покупателя всегда в курсоре один и тот же. Допустим мы 3 записи о покупателе занесли в таблицу konec. Это записи с датами: 15,18,19 июня 2013 года. В эти дни он купил у какого-то продавца какие-то товары. Допустим теперь что этот покупатель пришел 16 июня к продавцу Сидорову и купил что-то, а потом 23 июня пришел опять к Сидорову. Пользователь в программе выбирает записи, которые покупатель ходил к продавцу Сидорову и в курсоре оказываются 2 записи 16 и 23 июня. Так вот при попытке их записать в таблицу konec должно выдаваться сообщение что нельзя делать этого.

Условие проверки такое: При попытке записать такие данные проверять, есть ли хоть одна указанная дата в курсоре попадает в промежуток дат, уже имеющихся в таблице для этого же покупателя, то не давать доступ для записи. А если даты в курсоре не попадают в промежуток, то можно записывать.
...
Рейтинг: 0 / 0
Проверка условия
    #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
Проверка условия
    #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
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проверка условия
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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