Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Locate for!!! / 10 сообщений из 10, страница 1 из 1
06.07.2004, 17:28
    #32591976
Alex Is
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
У меня проблема!! Если использовать Locate for!!! то цикл валиться!!
Вот пример куска кода!! В этом куске я сравниваю номера записей в полях типа(numeric) обоих таблиц! И потом все совпавшие запихиваю в один курсор а несовпавшие в другой соответственно!
Если использовать locate for то на skipe внетреннего цикла выскакивает ошибка "End of file encountered"!!! Если же закоментить locate for то все работает!!!
Почему??

Большое спасибо!

.........................

create cursor Sootvetstvie;
(nom_dela_Arch c(10), nom_delo_Kniga c(10))

create cursor NeSootvetstvie;
(nom_dela_Arch c(10), nom_delo_Kniga c(10))

local max_zapArch

select archive

max_zapArch = reccount()
go top
for kn_arch = 1 to max_zapArch

select archive
X = str(nom_dela, 8)

select kniga
max_zapKniga = reccount()
go top
for kn_arch1 = 1 to max_zapKniga

nom_deloChar = str(nom_delo, 14)
Y = substr(nom_deloChar, 7, 8)

locate for X = Y
if found()

kniga.date_fromArch
select Sootvetstvie
insert into Sootvetstvie(nom_dela_Arch , nom_delo_Kniga);
values(X , Y)
else
select NeSootvetstvie
insert into NeSootvetstvie(nom_dela_Arch , nom_delo_Kniga);
values(X , Y)
endif

select kniga
skip
endfor

select archive
skip
endfor

..............................................
...
Рейтинг: 0 / 0
06.07.2004, 18:02
    #32592055
vitali_z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
Код: plaintext
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.
create cursor Sootvetstvie;
(nom_dela_Arch c( 10 ), nom_delo_Kniga c( 10 ))

create cursor NeSootvetstvie;
(nom_dela_Arch c( 10 ), nom_delo_Kniga c( 10 ))

local max_zapArch

select archive
SCAN
	X = str(nom_dela,  8 )

	select kniga
	SCAN
		nom_deloChar = str(nom_delo,  14 )
		Y = substr(nom_deloChar,  7 ,  8 )

		locate for substr(nom_deloChar,  7 ,  8 ) = X
		if found()
			kniga.date_fromArch 
			select Sootvetstvie
			insert into Sootvetstvie(nom_dela_Arch , nom_delo_Kniga);
			values(X , Y)
		else
			select NeSootvetstvie
			insert into NeSootvetstvie(nom_dela_Arch , nom_delo_Kniga);
			values(X , Y)
		endif
	ENDSCAN
ENDSCAN

Не проверял, но думаю так будет чуть красивее.
...
Рейтинг: 0 / 0
06.07.2004, 18:45
    #32592163
Alex Is
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
Спасибо за ответ!! Конечно красота сильная штука..., но ещё если бы и работало!!! В курсор несоответствующих записей в одно из полей записывается одна и та же запись из таблицы!!(Есть догадки почему так происходит...но я толком не проверил так как записей в каждой из таблиц более 80000!!! Скорее всего это происходит из-за того что цепляется одна из записей в одной таблице и проверяется со всеми записями в другой и все это сваливается вкурсор!! Меня так не устраивает!!
т.е получается так:
0001 1022
0001 1023
0001 5889
0002 2555
0002 7878 и.т.д!!!

Народ ПОМОГИТЕ!!!
...
Рейтинг: 0 / 0
06.07.2004, 19:38
    #32592233
vitali_z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
Sorry, внутренний scan лишний и y определять нужно только в случае нахождения соответствующей записи,
но результат может быть только курсор, в котором одно из полей пустое (или не полностью дана задача).
...
Рейтинг: 0 / 0
06.07.2004, 19:39
    #32592235
Sjfx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
цикл валится, а не "валиться"
таблиц - обеих, а не обоих.

Что неправильно:
1. X и Y получаешь из строго определённых записей таблиц, во время "пробежки" указателя
(по команде locate for) уже полученные X и Y не меняются, остаются соответствующими начальным записям.
2. После неуспешного locate указатель позиционируется на EOF , поэтому следующий skip однозначно даст ошибку.

А чой-то, цифры из одной таблицы сравниваются с восемью последними из другой ??
Неясно - сравниваешь в записях таблиц с одинаковым номеном? Если так, то:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE CURSOR ...
CREATE CURSOR ...
SELECT archive
SCAN
	GO RECNO('archive') IN kniga
	INSERT INTO (IIF(nom_dela% 10 ** 8  = kniga.nom_dela,'sootv','nesootv')) ;
		VALUES ( str(nom_dela% 10 ** 8 , 8 ) ,  str(kniga.nom_dela, 8 ) )
ENDSCAN 
...
Рейтинг: 0 / 0
06.07.2004, 19:41
    #32592238
vl2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
в обоих варианта "скачет" указатель записи во втором переборе
(в алиасе kniga):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SCAN  
X = str(nom_dela,  8 )
select kniga   && выбрал алиас kniga
SCAN
nom_deloChar = str(nom_delo,  14 )  && запомнил значения для поиска
Y = substr(nom_deloChar,  7 ,  8 )
locate for substr(nom_deloChar,  7 ,  8 ) = X  && и в этом же алиасе начал искать
********
ENDSCAN
ENDSCAN
Или не нужен второй Скан, вместо него делать Locate в алиасе kniga.
Или два Скана, но без Locate, а просто сравнение строк.
...
Рейтинг: 0 / 0
06.07.2004, 19:52
    #32592263
vl2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create cursor Sootvetstvie;
(nom_dela_Arch c( 10 ), nom_delo_Kniga c( 10 ))
create cursor NeSootvetstvie;
(nom_dela_Arch c( 10 ), nom_delo_Kniga c( 10 ))
local max_zapArch
select archive
SCAN
X = str(nom_dela,  8 )
select kniga
Y=''
locate for substr( str(nom_delo,  14 ),  7 ,  8 ) = X
if found()
kniga.date_fromArch && здесь должен измениться Y
select Sootvetstvie
insert into Sootvetstvie(nom_dela_Arch , nom_delo_Kniga);
values(X , Y)
else
select NeSootvetstvie
insert into NeSootvetstvie(nom_dela_Arch , nom_delo_Kniga);
values(X , Y)
endif
select archive
ENDSCAN
...
Рейтинг: 0 / 0
06.07.2004, 20:05
    #32592277
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
Может я торможу? Тяжелый день получился... Но, неужели нельзя без циклов?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT ALL ;
     STR(Arc.Nom_Dela, 8 ) AS Nom_Dela_Arch, ;
     SUBSTR(STR(Kng.Nom_Delo, 14 ), 7 , 8 ) AS Nom_Delo_Kniga ;
  FROM Archive AS Arc, Kniga AS Kng INTO CURSOR Sootvetstvie ;
  WHERE STR(Arc.Nom_Dela, 8 )=SUBSTR(STR(Kng.Nom_Delo, 14 ), 7 , 8 )

SELECT ALL ;
     STR(Arc.Nom_Dela, 8 ) AS Nom_Dela_Arch, ;
     SUBSTR(STR(Kng.Nom_Delo,  14 ), 7 , 8 ) AS Nom_Delo_Kniga ;
  FROM Archive AS Arc, Kniga AS Kng INTO CURSOR NeSootvetstvie ;
  WHERE STR(Arc.Nom_Dela, 8 )#SUBSTR(STR(Kng.Nom_Delo, 14 ), 7 , 8 )
И не описано предназначение
Код: plaintext
kniga.date_fromArch
...
Рейтинг: 0 / 0
06.07.2004, 22:02
    #32592338
vl2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
>Redrik
конечно можно и SELECTOM.
А что бы все было в одном месте + учесть записи, которые есть в K, но нет в S и есть в S, но нет в K тогда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create cursor s;
    (nom c( 10 ), delo c( 10 ))

INSERT INTO s VALUES ('1','1')
INSERT INTO s VALUES ('2','2')
INSERT INTO s VALUES ('4','3')

create cursor k;
    (nom c( 10 ), delo c( 10 ))
    
INSERT INTO k VALUES ('1','1')
INSERT INTO k VALUES ('5','2')
INSERT INTO k VALUES ('3','3')

SELECT NVL(s.nom,'нет в S   ') AS Nom_s, NVL(k.nom,'нет в K   ') AS nom_k;
           FROM s AS s ;
           FULL JOIN k AS k ON k.nom = s.nom ; 
           INTO CURSOR tmp 

BROW
CLOSE TABLES ALL 
...
Рейтинг: 0 / 0
07.07.2004, 00:09
    #32592406
Alex Is
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate for!!!
Всем БОЛЬШОЕ СПАСИБО!!! ВСЕ ТЕПЕРЬ РАБОТАЕТ!!
Sjfxцикл валится, а не "валиться"
таблиц - обеих, а не обоих.
просто опечатки!
...спасибо за урок русского языка!! :))
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Locate for!!! / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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