powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Skorost vipolnenie proqrammi
12 сообщений из 12, страница 1 из 1
Skorost vipolnenie proqrammi
    #32814699
sasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V baze neskolko tablitsa , v kajdom tablitse bolshe 500 000 zapisey.Proqramma ochen dolqo rabotaet.Chasto ispolzuyu 'set filt to' Skorost vipolnenie proqrammi ot etovo mojet zavisit? Kak to mojno po druqomu?
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32814719
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рой SQL-SELECT, представления локальные, индексы, и типа того
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32814959
sasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Posmotrite , kod pojalusta. Kak mojno optimizirovat etot kod chtobi skorost bilo bolshe?
sql-om vrode bi ispolzuval.
No, zdes napirmer kak sql ispolzuvat mesto set filt to neznayu:
SET FILT TO n=nn1
repl UD4 with val(zer) all
Ya sql moqu ispolzivat tolko dlya viborku, a kak tam 'repl' delat neznayu.
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32814965
sasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kod:
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32814973
sasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*case TUR=4
*****......
CLOS DATA
set talk off
sele 5
use UD_NOMRE
sele 4
use UD_FOND
sele 8
use dren
inde on n to i1
sele 9
ERASE A3.IDX
use tur_4u
inde on n to i2
say1=reccount()
go top
sele 3
ERASE i3.IDX
use dren_ud
inDE on n to i3
go top


sele 8
set filt to ud4=0.and.ud3=0
copy to dren4
use dren4
REPL ALL CEM_A WITH A1+A2+A3+A4+A5+A6
REPL ALL CEM_B WITH B1+B2+B3+B4+B5+B6
SELECT dren4.N,dren4.L,SUM(dren4.CEM_A),SUM(dren4.CEM_B),dren4.UD4 ;
FROM dren4 ;
GROUP BY dren4.N;
INTO TABLE TUR_4
USE TUR_4
SET FILTER TO SUM_CEM_A=0.or.SUM_CEM_B=0
copy to tur_4u
GO top
IF NOT EOF().AND. NOT BOF()
cMessageTitle = 'drenT'
nDialogType = 256
DO WHILE .t.
sele 9
if eof()
exit
endif
nn1=n
skip
sele 3
SET FILT TO n=nn1
repl UD4 with val(zer) all

SELE 4
GO TOP
loca for GEDISH=I


ENDD
SET FILT TO
CLOS DATA
use dren_ud
udan4=say1
cMessageText2=ALLTRIM(str(udan4))
cMessageText3 = ' BILET UDDU'
cMessageText4= cMessageText2+cMessageText3
nAnswer = MESSAGEBOX(cMessageText4, nDialogType, cMessageTitle)
use ud_fond
if ud_son=1
wait 'OYUN BASA CATDI'
EXIT
DO FORM1
ENDIF
loca for gedish=i
repl ud_say with udan4
FORM1.SHOW()
ENDI
FORM1.SHOW()
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32815067
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSET FILT TO n=nn1
repl UD4 with val(zer) all
нужен тег по полю n INDEX ON n TAG n
тогда
Код: plaintext
1.
2.
SET ORDER TO n
SEEK n=nn1
REPLACE ud4 WITH VAL(zer) WHILE n=nn1
ну и остальное примерно в этом же ключе

ЗЫ если zer - не поле, то присвой сначала VAL переменной и ее пользуй в REPLACE'е - иначе ф-ция каждый раз пересчитываеца
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32815692
sasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Komanda 'seek' tak toje rabotaet:
SEEK N=NN1 ?
yesli ya ne oshibayus, tak doljna bit: SEEK NN1
2. A Yesli po 2 pole nado iskat ,toqda kak, napirmer:

seek n=nn1.and.ud4=0

toje budet rabotat?
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32815778
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. SEEK ищет по индексу, а без индекса LOCATE.
2. SET FILT TO n=nn1 и repl UD4 with val(zer) all => REPLACE UD4 WITH VAL(zer) FOR n=nn1
3. REPL ALL CEM_A WITH A1+A2+A3+A4+A5+A6 и REPL ALL CEM_B WITH B1+B2+B3+B4+B5+B6 => REPLACE ALL CEM_A WITH A1+A2+A3+A4+A5+A6, CEM_B WITH B1+B2+B3+B4+B5+B6
4. SET FILTER TO SUM_CEM_A=0.or.SUM_CEM_B=0 и copy to tur_4u => COPY TO tur_4u FOR SUM_CEM_A=0.or.SUM_CEM_B=0
5. Ну и еще по мелочи глянь сам.
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32820017
sasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yeshyo ot chevo mojet zavisit skorost? Ya vsyo chto moq delal ,izmenil kod :
no, vseravno proqramma ochen dolqo rabotaet.


*case TUR=4
USE NERD
REPL ALL CEM_A WITH A1+A2+A3+A4+A5+A6, CEM_B WITH B1+B2+B3+B4+B5+B6
SELECT NERD.N,NERD.L,SUM(NERD.CEM_A),SUM(NERD.CEM_B),NERD.UD4 ;
FROM NERD ;
where nerd.ud4=0.and.nerd.ud3=0;
GROUP BY NERD.N;
INTO TABLE TUR_4
USE TUR_4
COPY TO tur_4u FOR SUM_CEM_A=0.or.SUM_CEM_B=0
use tur_4u
inde on n to i2
say1=reccount()
IF NOT EOF().AND. NOT BOF()
cMessageTitle = 'NERDT'
nDialogType = 256
CLOS DATA
set talk off
sele 5
use UD_NOMRE
sele 4
use UD_FOND
sele 8
use NERD
sele 9
use tur_4u
go top
sele 3
use NERD_ud
go top
DO WHILE .t.
sele 9
if eof()
exit
endif
nn1=n
skip
sele 3
go top
REPLACE UD4 WITH zer1 FOR n=nn1.and.ud4=0
loca for GEDISH=I
ENDD
SET FILT TO
CLOS DATA
use nerd_ud
count to udan4 for ud4=zer1
udan4=udan4/5

use ud_fond
loca for gedish=i
mebleg1=mebleg
Repl ud_say with udan4,cixan_n with zer1 &&,ud_son with say1
say1=0
if udan4>0
cMessageText2=ALLTRIM(str(udan4))
cMessageText3 = ' WWWWWWWWW:'
CMT1=STR(MEBLEG1)
cMessageText4= cMessageText2+cMessageText3+CMT1
else
cMessageText4='DDDDDD'
ENDI
nAnswer = MESSAGEBOX(cMessageText4, nDialogType, cMessageTitle)
FORM1.SHOW()
ENDI
FORM1.SHOW()
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32820215
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял твой код, то попробуй так:

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
IF USED('NERD') = .F.
	USE NERD IN  0 
ENDIF
SELECT NERD
SET ORDER TO  0 
* Медленная операция
REPLACE ALL CEM_A WITH A1+A2+A3+A4+A5+A6, ;
	CEM_B WITH B1+B2+B3+B4+B5+B6

* В таблице Nerd должен быть индекс по полю UD4 и индекс по полю UD3
* Вообще-то, исходя из дальнейшего кода ORDER BY - лишнее. 
* Только замедляет выборку. Но, возможно, это нужно в других местах
* Еще можно ускорить выборку сделав INTO CURSOR, но опять-таки, 
* возможно нужна именно таблица

SET TALK ON
SET TALK WINDOW

SELECT NERD.N, ;
	NERD.L, ;
	SUM(NERD.CEM_A) as SUM_CEM_A, ;
	SUM(NERD.CEM_B) as SUM_CEM_B, ;
	NERD.UD4 ;
FROM NERD ;
INTO TABLE TUR_4U ;
WHERE nerd.ud4= 0  AND nerd.ud3= 0  ;
GROUP BY NERD.N, ;
	NERD.L,	;
	NERD.UD4 ;
HAVING SUM(NERD.CEM_A) =  0  OR SUM(NERD.CEM_B) =  0  ;
ORDER BY NERD.N

SET TALK OFF

IF _Tally> 0 
	IF USED('UD_FOND') = .F.
		USE UD_FOND IN  0 
	ENDIF
	IF USED('NERD_ud') = .F.
		USE NERD_ud IN  0 
	ENDIF
	SELECT NERD_ud
	SET ORDER TO  0 

	SELECT TUR_4U
	SCAN NOOPTIMIZE
		SELECT NERD_ud
		REPLACE FOR N = TUR_4U.N AND UD4 =  0  ;
			UD4 WITH NERD_ud.ZER1
	ENDSCAN
	
	SELECT NERD_ud
	COUNT FOR NERD_ud.UD4 = NERD_ud.ZER1 TO udan4
	udan4 = m.udan4/ 5 
	
	SELECT UD_FOND
	SET ORDER TO  0 
	LOCATE FOR Gedish = m.i		&& откуда взялась переменная m.i ?
	mebleg1 = UD_FOND.mebleg
	REPLACE UD_Say WITH UD_FOND.Udan4, ;
		Cixan_N WITH UD_FOND.Zer1

	cMessageTitle = 'NERDT'
	nDialogType =  256 
	if m.udan4> 0 
		cMessageText2 = ALLTRIM(str(m.udan4)) 
		cMessageText3 = ' WWWWWWWWW:'
		CMT1 = STR(m.mebleg1)
		cMessageText4 = m.cMessageText2 + m.cMessageText3 + m.CMT1
	else
		cMessageText4 = 'DDDDDD'
	ENDI 
	nAnswer = MESSAGEBOX(m.cMessageText4, m.nDialogType, m.cMessageTitle)
	FORM1.SHOW()

ENDIF
FORM1.SHOW()
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32826702
sasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pomoqite pojalusta, a to u menya ochen malo vremya ostalas.Kod yeshyo raz menyal. no skoroost vsye taki malo (chut bolshe chem ranshe)
Vot seychas kod:
*case TUR=4 &&sonvar
set filt to
USE NERD
REPL ALL CEM_A WITH A1+A2+A3+A4+A5+A6, CEM_B WITH B1+B2+B3+B4+B5+B6
SELECT NERD.N,NERD.L,SUM(NERD.CEM_A),SUM(NERD.CEM_B),NERD.UD4_a,NERD.UD4_b,NERD.UD3 ;
FROM NERD ;
GROUP BY NERD.N;
INTO TABLE TUR_4
USE TUR_4
COPY TO tur_4ua FOR SUM_CEM_A=0.and.ud4_a=0
use tur_4ua
use tur_4
COPY TO tur_4ub FOR SUM_CEM_b=0.and.ud4_B=0
use tur_4ub
use tur_4ua
appe from tur_4ub
inde on n to i2
udan4=0
udan4=reccount()

IF NOT EOF().AND. NOT BOF()



CLOS DATA
set talk off
sele 4
use UD_FOND
sele 8
use NERD
sele 9
use tur_4ua
go top
DO WHILE .t.
sele 9
if eof()
exit
endif
nn1=n
s_a=sum_cem_a
s_b=sum_cem_b
skip
sele 8
go top
if s_a=0
REPLACE UD4_a WITH zer1 all FOR n=nn1.and.ud4_a=0
* UPDATE nerd SET ud4_a = zer1 where n=nn1.and.ud4_a=0

endi

if s_b=0
REPLACE UD4_b WITH zer1 all FOR n=nn1.and.ud4_b=0
* UPDATE nerd SET ud4_b = zer1 where n=nn1.and.ud4_b=0

endi




ENDD
SET FILT TO
CLOS DATA

use ud_fond
loca for gedish=i
mebleg1=mebleg
repl ud_say with udan4,cixan_n with zer1 &&,ud_son with say1
FORM1.SHOW()
ENDI
cMessageTitle = 'NERDT'
nDialogType = 256
if udan4>0
cMessageText2=ALLTRIM(str(udan4))
cMessageText3 = ' BILET UDDU ! UDUS MEBLEGI:'
CMT1=STR(MEBLEG1)
cMessageText4= cMessageText2+cMessageText3+CMT1
else
cMessageText4='UDUS YOXDUR'
ENDI
nAnswer = MESSAGEBOX(cMessageText4, nDialogType, cMessageTitle)

FORM1.SHOW()
...
Рейтинг: 0 / 0
Skorost vipolnenie proqrammi
    #32828040
sasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VOT ETOT KOD KAK MOJNO 'USKORIT'?
DO WHILE .t.
sele 9
if eof()
exit
endif
nn1=n
s_a=sum_cem_a
s_b=sum_cem_b
skip
sele 8
go top
if s_a=0
REPLACE UD4_a WITH zer1 all FOR n=nn1.and.ud4_a=0
* UPDATE nerd SET ud4_a = zer1 where n=nn1.and.ud4_a=0
endi
if s_b=0
REPLACE UD4_b WITH zer1 all FOR n=nn1.and.ud4_b=0
* UPDATE nerd SET ud4_b = zer1 where n=nn1.and.ud4_b=0
endi
ENDD
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Skorost vipolnenie proqrammi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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