Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как можно ускорить работы программы? / 25 сообщений из 50, страница 1 из 2
24.05.2006, 16:26
    #33749128
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Мне из одну очень большую таблицу (t1) надо получить 3 разные таблицу
Получанные таблицы по такому принципу должно упрядочоватся. Эти цифры показываеть nомер записи (recno()).
1-я таблица:
1
301
601
901
1201

2
302
602
902
1202

3
303
603
903
1203
....

2-я таблица:
101
401
701
1001
1301

102
402
702
1002
1302

3
403
703
1003
1303
....

3-я таблица:
201
501
801
1101
1401

202
502
802
1102
1402

203
503
803
1103
1403
...
Использую такой код(cap.prg). Но очень долго идеть обработка. Подскажите пожалуста, как можно ускорить работы этого программы?
...
Рейтинг: 0 / 0
24.05.2006, 16:36
    #33749175
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE CURSOR test (ID i)

FOR i =  1  TO  1000 
INSERT INTO test (id) VALUES (i)
endfor

SELECT * FROM test WHERE MOD(id -  1 , 300 ) =  0 
SELECT * FROM test WHERE MOD(id -  2 , 300 ) =  0 
SELECT * FROM test WHERE MOD(id -  3 , 300 ) =  0 
...
Рейтинг: 0 / 0
24.05.2006, 16:49
    #33749226
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
На примере одной таблицы.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
* Создаю структуру таблицы
SELECT BigTable
COPY STRUCTURE TO Tab1

* Наполнение таблицы
FOR m.lnI= 1  TO  300 
	* Выборка во временную таблицу очередной порции данных
	SELECT Recno(), * ;
	FROM BigTable ;
	INTO CURSOR curTab ;
	WHERE MOD(Recno(), 300 )=m.lnI ;
	ORDER BY  1 

	* Копирование данных из очередной выборки в итоговую таблицу
	select Tab1
	APPEND FROM (DBF("curTab"))
ENDFOR

Остальные формируются и заполняются аналогично. Надо только менять начальное и конечное значение m.lnI в цикле

BigTable - это твоя исходная таблица
...
Рейтинг: 0 / 0
24.05.2006, 16:50
    #33749232
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Да очень быстро работаеть, но результат не так как нужен
У Вас (1-я таблица)
1
30
601
901
1201
1501
1801
2101
2401
2701
3001
3301
3601
4201
Надо:
1
301
601
901
1201
2
302
602
902
1202
3
303
603
903
1203
...
Рейтинг: 0 / 0
24.05.2006, 16:55
    #33749250
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
fuad11Да очень быстро работаеть, но результат не так как нужен


Это кому адресовано.
...
Рейтинг: 0 / 0
24.05.2006, 17:00
    #33749268
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Если это мне и для первой таблицы надо брать записи с номером не более 1500, то добавь это условие в WHERE

Код: plaintext
1.
2.
SELECT ...
WHERE MOD(Recno(), 300 )=m.lnI AND Recno()<= 1500  ...
...
Рейтинг: 0 / 0
25.05.2006, 07:40
    #33750118
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Предедущий пост я адресовал к PaulWist.
ВладимирМ, если добавить
WHERE MOD(Recno(),300)=m.lnI AND Recno()<=1500
1-я таблица закончивается в recno()=1499.
Если в исходным таблице у меня 1000000 записей, тогда как будеть осталные часть 1-й таблицы?
После 1499

(299
599
899
1199
1499)


таблица так должна продолжатся:

300
600
900
1200
1500

301
601
901
1201
1501

.....
...
Рейтинг: 0 / 0
25.05.2006, 09:14
    #33750233
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Ну ты тестовый код запускал? Где там 1-30, там сразу 1-301.
...
Рейтинг: 0 / 0
25.05.2006, 09:41
    #33750312
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
PaulWist, я не понял Вас.

Где у Вас 1-30:

CREATE CURSOR test (ID i)

FOR i = 1 TO 1000
INSERT INTO test (id) VALUES (i)
endfor

SELECT * FROM test WHERE MOD(id - 1,300) = 0
SELECT * FROM test WHERE MOD(id - 2,300) = 0
SELECT * FROM test WHERE MOD(id - 3,300) = 0
...
Рейтинг: 0 / 0
25.05.2006, 09:51
    #33750344
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Ты бы сначала задачу четко сформулировал, тогда бы и сам может ускорил бы.
Как я понимаю из исходных данных:
1. сортировать сначала по младшей цифре номера записи, а затем по всем остальным
2. выбирать записи у которых младшая цифра не равна нулю и старшие с шагом 30 начиная с 0, 10 и 20 соответственно.

Поправь если я не так понял.

select Recno() as Row, mod(Recno(), 10) as Low, int(Recno() / 10) as High, ... from bsname order by 2, 3 having Low != 0 and mod(High, 30) = 0
select Recno() as Row, mod(Recno(), 10) as Low, int(Recno() / 10) as High, ... from bsname order by 2, 3 having Low != 0 and mod(High, 30) = 10
select Recno() as Row, mod(Recno(), 10) as Low, int(Recno() / 10) as High, ... from bsname order by 2, 3 having Low != 0 and mod(High, 30) = 20
...
Рейтинг: 0 / 0
25.05.2006, 10:08
    #33750397
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Мне из одну очень большую таблицу надо получить 3 разные таблицу

В 1-м таблице :

1-я 5 запис должна начинать с 1 (шаг=300)
1
301
601
901
1201

2-я 5 запис должна начинать с 2 (шаг=300)
2
302
602
902
1202

3-я 5 запис должна начинать с 2 (шаг=300)

3
303
603
903
1203
.....



2-я таблица :

1-я 5 запис должна начинать с 101 (шаг=300)
101
401
701
1001
1301

2-я 5 запис должна начинать с 102 (шаг=300)
102
402
702
1002
1302

3-я 5 запис должна начинать с 103 (шаг=300)

103
403
703
1003
1303
.....


3-я таблица:
1-я 5 запис должна начинать с 201 (шаг=300)
201
501
801
1101
1401

.....
...
...
Рейтинг: 0 / 0
25.05.2006, 10:17
    #33750423
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Шаг 300 для всего номера строки или 30 для старших цифр.
Запускать то пробовал ? :)
...
Рейтинг: 0 / 0
25.05.2006, 10:32
    #33750467
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Шаг 300 для каждый 5 записей ,
1
301
601
901
1201
Это 1-й 5 запис.

2-я 5-ка:
2
302
602
902
1202

Тоесть , для 2-й 5-ку шаг тоже 300, но должно начинать с 2.
3-я 5-ка должно начинать с 3, шаг тоже 300
и т.д.
...
Рейтинг: 0 / 0
25.05.2006, 10:48
    #33750544
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
А по моему запросу что получилось? Разве не так?
А если тебе только по 5 первых записей надо. то
Код: plaintext
1.
select Recno() as Row, mod(Recno(),  10 ) as Low, int(Recno() /  10 ) as High, ... from test order by  2 ,  3  having Low !=  0  and mod(High,  30 ) =  0  and High <  150 

1
301
601
901
1201
2
302
602
902
1202
3
303
603
903
1203
4
304
604
904
1204
5
305
605
905
1205
6
306
606
906
1206
7
307
607
907
1207
8
308
608
908
1208
9
309
609
909
1209
...
Рейтинг: 0 / 0
25.05.2006, 10:59
    #33750591
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Мог бы и сам догадаться, что делать дальше. Если у тебя на каждом шаге ВСЕГДА отбирается только 5 записей, то и ставь соответствующее условие

SELECT TOP 5

Однако по твоему описанию, итоговая таблица будет содержать дубли. Ведь значение 301 будет взято на первом шаге и потом будет повторено, когда перейдем рубеж в 300 итераций. Но если очень надо, то делай вложенные циклы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
* Создаю структуру таблицы
SELECT BigTable
COPY STRUCTURE TO Tab1

* Наполнение таблицы
FOR m.lnJ= 1  TO Reccount("BigTable") STEP  300 
	FOR m.lnI= 1  TO  300 
		* Выборка во временную таблицу очередной порции данных
		SELECT TOP  5  ;
			Recno(), * ;
		FROM BigTable ;
		INTO CURSOR curTab ;
		WHERE MOD(Recno(), 300 )=m.lnI AND Recno()>= m.lnJ ;
		ORDER BY  1 

		* Копирование данных из очередной выборки в итоговую таблицу
		select Tab1
		APPEND FROM (DBF("curTab"))
	ENDFOR
ENDFOR

Правда, здесь предполагается, что количество записей в основной таблице кратно 300. Т.е. если в ней, например, всего 400 записей, то по 5 записей с шагом 300 никак не получится.
...
Рейтинг: 0 / 0
25.05.2006, 11:11
    #33750645
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
DimaT, то что надо если добавить .and High < 150
Только здесь как Вы показали в 1-м таблице получается только 45 записей
Последная 5-ка:
9
309
609
909
1209.
А остольные как выбрать , вот это незнаю.
...
Рейтинг: 0 / 0
25.05.2006, 11:34
    #33750740
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
fuad11А остольные как выбрать , вот это незнаю.

Какие остальные?
...
Рейтинг: 0 / 0
25.05.2006, 11:44
    #33750783
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Нет, повтора не должна быть.
Вот мой код каторый я использую
...
Рейтинг: 0 / 0
25.05.2006, 11:49
    #33750811
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
DimaT, последная 5-ка:
9
309
609
909
1209.
После это 5-ку таблица так должна продолжатся:
10
310
610
910
1210

11
311
611
911
1211
и т.д.

А остольные как выбрать , вот это незнаю.
...
Рейтинг: 0 / 0
25.05.2006, 12:12
    #33750924
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
fuad11Нет, повтора не должна быть.
Вот мой код каторый я использую

Какая повтора? Где повтора? Повтора полей исходной таблицы? Допиши имена полей в ", ... from" вместо "..." через запятую.

Запускай word и делай проверку синтаксиса своих постов перед их отправкой. А то мы с тобой на разных русских языках говорим.
...
Рейтинг: 0 / 0
25.05.2006, 12:51
    #33751096
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
fuad11...
После это 5-ку таблица так должна продолжатся:
10
310
610
910
1210
...

Если в конечной выборке должны быть все записи кроме 300, 600, 900, 1200 то:
Код: plaintext
select Recno() as Row, mod(Recno(),  300 ) as Low, int(Recno() /  300 ) as High from test order by  2 ,  3  having Low !=  0  and High <  5 

Очень интересно для чего такая выборка нужна
...
Рейтинг: 0 / 0
25.05.2006, 12:53
    #33751105
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Dima T, насчет повтора я не к Вам, это я Владимиру хотел сказать
...
Рейтинг: 0 / 0
25.05.2006, 13:12
    #33751173
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Это для отчета нужен .
Исходная таблица 1 и большая.
1
2
3

301
302
….

1000000

Просто я потом из 3 таблицу буду получать 1 таблица (для отчета)
Конечня таблица (или отчет) так должна выглядить:
1 101 201
301 401 501
601 701 801
901 1001 1101
1201 1301 1401
2 102 202
302 402 502
602 702 802
902 1002 1102
1202 1302 1402
……………………………….
……………………………….
...
Рейтинг: 0 / 0
25.05.2006, 15:47
    #33751888
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
select Recno() as Row, mod(Recno(), 10) as Low, int(Recno() / 10) as High from
t1 order by 2, 3 having Low != 0 and mod(High, 30) = 0 and High < 150

В этом коде как можно продолжит программы, чтобы остальные нужные записи тоже можно было получить?
10
310
910
610
1210
…..
Очень срочно нужен помогите, пожалуйста,
...
Рейтинг: 0 / 0
26.05.2006, 09:08
    #33753117
fuad11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как можно ускорить работы программы?
Вот создал такой код:
**********************
use ta
zap
for i=0 to 100
select Recno() as Row, mod(Recno(), 10) as Low, int(Recno() / 10) as High from t1 order by 2, 3 having Low != 0 and mod(High, 30) = i and High < 150;
into table ta1
clos data
use ta
appe from ta1
endf
**********************
*t1- исходная таблица.
1. Считает больше записи, НО , не получается считать 5-ку , начинающим
такие цифрами как 10,20,30,40,.....
2.Здесь считается и 5-ку , начинающи такие цифрами как 101,401,701,1001,1301,.....
201,501,801,1101,1401,….
Эти записи должно участвовать 2-м и 3-м таблице

Как можно решать и эти проблемы?


Дело в том что, мой 1-код (cap.prg) все правильно считает (все 3 таблицы),
олько очень долго работаеть
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / как можно ускорить работы программы? / 25 сообщений из 50, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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