powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Что использовать вместо RELATION?
5 сообщений из 5, страница 1 из 1
Что использовать вместо RELATION?
    #32603925
Pant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть задачи:
В одной DBF есть два поля t1.kod1 и t1.kod2. В зависимости от условия берется то или другое поле IIF(t1.kod1=s,t1.kod1,t1.kod2) и к нему по RELATION привязывается запись из другой таблицы t2.kod (один к одному).
Когда делаю так, и в грид засовываю t1 с записями из t2, то все бегает моментально.
Понадобилось все это с этими же условиями загнать в третью таблицу и потом в грид. Использую SCAN t1 сортированный по t1.kod1, SEEK t2.kod и по INSERT добавляю в t3.
Вопрос в том, что теперь это все работает раз в 10 медленнее.
Может быть я принципиально неправильно подхожу?
...
Рейтинг: 0 / 0
Что использовать вместо RELATION?
    #32610114
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для такого простого случая, для формирования временной таблицы надо использовать Select-SQL или Local View.

Но вообще-то, надо посмотреть на код формирования этой временной таблицы. Есть масса уловок позволяющих оптимизировать (читай "ускорить") выполннение.

Например, если SCAN выполняется по всей таблице, то желательно перед его выполнение сбросить главный индекс сканируемой таблицы:

select MyTab
SET ORDER TO 0
SCAN
...
ENDSCAN
...
Рейтинг: 0 / 0
Что использовать вместо RELATION?
    #32622943
Pant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE DOG FREE ()
SELECT  0 
USE t2.DBF SHARED 
SET ORDER TO kod
nn=ALLTRIM(t2.n1)+ALLTRIM(t2.n2)
SELECT  0 
USE t1.dbf SHARED
SET ORDER TO kod1
kk=t1.kod1
SCAN 
  IF kk<>t1.kod1
    kk=IIF(t1.kod1= 4466 ,t1.kod2,t1.kod1)
    SELECT t2
    IF SEEK(kk)
      nn=ALLTRIM(t2.n1)+ALLTRIM(t2.n2)
     ELSE
       STORE '' TO nn
    ENDIF
  ENDIF
  INSERT INTO DOG ()
  SELECT t1
ENDSCAN

А SELECT-SQL у меня еще медленнее работал, чем SCAN
...
Рейтинг: 0 / 0
Что использовать вместо RELATION?
    #32623480
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) В исходном варианте, когда ты связал таблицы по RELATION ты же не создавал никаких дополнительных таблиц. Отсюда и скорость отображения. Кроме того, в Grid (или BROWSE) закачиваются не сразу вся таблица, а только та часть, которая собственно отображается. Далее подкачка по необходимости

2) Можно использовать ту же связь по RELATION и для закачки информацию во временную таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE DOG FREE ()
SELECT  0 
	USE t2.DBF SHARED 
	SET ORDER TO kod
SELECT  0 
	USE t1.dbf SHARED
	SET ORDER TO  [b]0 [/b]
	SET RELATION TO IIF(t1.kod1= 4466 ,t1.kod2,t1.kod1) INTO t2
SCAN
	nn=ALLTRIM(t2.n1)+ALLTRIM(t2.n2)
	INSERT INTO DOG ()
ENDSCAN

Для оценки скорости, закомментируйте команду INSERT и посмотрите сколько времени уйдет на простое сканирование таблицы t1. Собственно, это и будет примерное время записи во временную таблицу
...
Рейтинг: 0 / 0
Что использовать вместо RELATION?
    #32623691
Pant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В этом варианте стало работать быстрей примерно на 1/5. А если Insert убрать, то работает быстрей примерно на столько же.
Базы огромные, и информация берется не с 2 баз, а из 6, так что любое убыстрение весьма ощутимо.
Спасибо, Владимир.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Что использовать вместо RELATION?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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