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

Откуда:
Сообщений: 3
Доброго времени суток!
есть такие данные:
Street            House    Build	flat
московская 230 143
Московская 230 3 1
московская 230 1
московская 230 1
московская 230 1
московская 230 1
Московская 230 3 2
Московская 230 2
Московская 230 2
Московская 230 4 3
Московская 230 3
Московская 230 3
Московская 230 3
Московская 234 А1 3
Московская 234 3
Московская 234 3
Московская 234 3
Московская 234 3
Московская 234 3
Московская 234 3
Московская 234 А1 3
Московская 234 А2 3
Московская 234 3
Московская 234 3
Московская 234 3
Московская 234 3
Московская 234 3
московская 234 А2 3
и есть пустые корпуса. ЕСЛИ копус пустой, а перед ним кпус НЕ пусто и одинаковый адрес(улица, дом, квартира) то корпус равен предыдущему корпусу...такая вот фигня...
пробовал так:
Go top
Scan
If not empty(build)
Cbuild=build
Chouse=house
С flat=flat
Cstreet=street
Go (recno()+1)
If alltrim(house)==alltrim(chouse) and alltrim(flat)==alltrim(cflat) and len(alltrim(build))=0 and alltrim(street)==alltrim(cstreet)
Replace build with alltrim(cbuild)
Endif
endif
endscan


но каждый раз Go (recno()+1) нужно повышать
помогите пожалуйста сделать правильно.
18 фев 09, 16:49    [6835539]     Ответить | Цитировать Сообщить модератору
 Re: запрос-корпуса  [new]
Galyamov Rinat
Member

Откуда:
Сообщений: 658
Да, уж.

вместо Go (recno()+1) логичнее использовать skip, а так как идет тупой скан, то после всех проверок (перед строкой endscan) надо сделать skip-1

При этом надо самостоятельно проверять, что после skip мы не ушли за последнюю запись


Вот так мне кажется более логично. Здесь нет прыжков вперед-назад по таблице. Оно понятнее и быстрее отработает:

CPredbuild=''
Scan all

	Chouse=house
	Ñflat=flat
	Cstreet=street

	IF NOT EMPTY(CPredbuild) AND alltrim(house)==alltrim(chouse) and alltrim(flat)==alltrim(cflat) and EMPTY(build) AND alltrim(street)==alltrim(cstreet)
		Replace build with alltrim(CPredbuild)
	ELSE
		CPredbuild=build
	ENDIF

ENDSCAN
18 фев 09, 17:34    [6835849]     Ответить | Цитировать Сообщить модератору
 Re: запрос-корпуса  [new]
reware
Member

Откуда: Хабаровск
Сообщений: 585
Go top
do while !eof()

If not empty(build)
Cbuild=build
Chouse=alltrim(house)
Сflat=alltrim(flat)
Cstreet=alltrim(street)
else
If alltrim(house)==chouse and alltrim(flat)==cflat and alltrim(street)==cstreet
Replace build with alltrim(cbuild)
Endif
endif
skip
enddo
18 фев 09, 17:39    [6835890]     Ответить | Цитировать Сообщить модератору
 Re: запрос-корпуса  [new]
ВладимирМ
Member

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

USE MyTab in 0
USE MyTab in 0 AGAIN ALIAS MyTabFull

select MyTab
SCAN FOR empty(Build) AND Recno()>1
	* Переходим на предшествующую запись в копии таблицы
	GO (Recno("MyTab")-1) IN MyTabFull

	* Если запись в копии таблицы удовлетворяет нужным условиям
	* модифицируем содержимое
	IF 	empty(MyTabFull.Build) = .F. and ;
		alltrim(house) == alltrim(MyTabFull.house) and ;
		alltrim(flat) == alltrim(MyTabFull.flat) and ;
		alltrim(street) == alltrim(MyTabFull.street)

		REPLACE Build WITH MyTabFull.Build
	ENDIF
ENDSCAN
19 фев 09, 00:47    [6837034]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить