powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как ускорить работы с работой с DBF по сети
25 сообщений из 65, страница 2 из 3
Как ускорить работы с работой с DBF по сети
    #39038040
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Про Excl я знаю, я обычно такие процедуры делаю на открытии и приобновлении программы все закрывают программу и главный компьютер запускает программу, далее запускаются другие и у них этот код уже естественно выполнятся не будет... Просто установку программу я часто делаю удалённо или приезжаю на место, а так чтобы в реальном времени доступа у меня нет к базе.
А про REPLACE с использованием FOR, то получается мало где менять, обычно у меня всего стоит условие. Элементарно даже проверка блокировки

Код: sql
1.
2.
	Replace blok With 0 For blok=mkodid In &mNameZ
	Replace blok With mkodid For kod=mkod And blok=0 In &mNameZ



Первая строчка стимает блок со всех записей данного оператора
Вторая строчка ставит блок на текущую запись, НО если она уже не заблокирована другим оператором...

Получается что мне стоит вернутся к UPDATE ? Так как без FOR я REPLACE использовать никак не могу
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038042
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESDima T, Да забыл написать как я переделал под Alias разные таблицы:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	mDataJ=Ctod(.lDataJ.Caption)
	mD1=Left(Dtoc(mDataJ),10)
	NameDate='-'+Right(mD1,2)+'.'+Right(Left(mD1,5),2)+'.'+Left(mD1,2)
	NaimTable=gcDPS+'\'+'Zakaz'+NameDate+'.Dbf'
	mNameZ='Zakaz_'+Right(mD1,2)+'_'+Right(Left(mD1,5),2)+'_'+Left(mD1,2)
	If File(NaimTable)=.F.
		Create_Zakaz(NaimTable)
	Endif
	If Used(mNameZ)=.F.
		Use &NaimTable In 0 Alias &mNameZ Shared
	Endif


Еще хуже сделал. Зачем? Чтобы враг сломал мозг читая твои исходники? :)
Я тебе предлагал алиас чтобы уйти от постоянных макроподстановок, а ты их только больше сделал.
Раз уж у тебя куча файлов Zakaz_*.dbf и все нужны, то сделай так чтобы имя файла совпадало с алиасом, т.е.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	mNameZ='Zakaz_'+Right(mD1,2)+'_'+Right(Left(mD1,5),2)+'_'+Left(mD1,2)
	NaimTable=addbs(gcDPS)+mNameZ+'.Dbf'
	If !File(NaimTable)
		Create_Zakaz(NaimTable)
	Endif
	If !Used(mNameZ)
		Use (NaimTable) In 0 Shared
	Endif


addbs() добавляет \ если его нет
! (not) равносильно =.F.

макроподстановками (&) не злоупотребляй, в большинстве случаев достаточно указать имя переменной в скобках, так быстрее работает.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038052
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESПолучается что мне стоит вернутся к UPDATE ? Так как без FOR я REPLACE использовать никак не могу
Лучше вернуться к UPDATE, т.к. по скорости одинаково, но без побочных эффектов.

PS Думаю тебе не помешает книжку какую-нибудь почитать для систематизации твоих знаний. Рекомендую эту
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038053
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Так мне очень помог алиас, я ведь раньше каждый раз определял имя таблицы, а теперь только один раз при открытии формы и при смене даты. У меня код сократился благодаря этому. А макроподстановку сейчас попробую убрать, не думал что она кушает много памяти
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038057
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAngelOKESПолучается что мне стоит вернутся к UPDATE ? Так как без FOR я REPLACE использовать никак не могу
Лучше вернуться к UPDATE, т.к. по скорости одинаково, но без побочных эффектов.

PS Думаю тебе не помешает книжку какую-нибудь почитать для систематизации твоих знаний. Рекомендую эту

Ладно понял, больше не надоедаю
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038061
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESмакроподстановку сейчас попробую убрать, не думал что она кушает много памяти
Она не память кушает, он заставляет перекомпилировать строку кода. Отсюда задержки. Небольшие, но если код часто выполняется, то ощутимые.
Т.е. код
Код: sql
1.
2.
mNameZ='Zakaz_123'
use &mNameZ


сначала превращается в
Код: sql
1.
use Zakaz_123


затем компилируется, а только после этого выполняется.

это компилируется во время компиляции программы, а во время работы сразу выполняется
Код: sql
1.
use (mNameZ)
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038071
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Код: sql
1.
use (mNameZ)

Гм.
У меня и в голове не укладывается как можно этого не знать - ведь это азы.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038072
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Блин тогда не получиться...
Получается как я могу определить переоткрывать мне новый файл или использовать существующий?
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038082
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESDima T,
Блин тогда не получиться...
Получается как я могу определить переоткрывать мне новый файл или использовать существующий?
Что не получится? Ты бы хоть ссылку давал к какому посту камент.

Если к этому 18079244 то получится, т.к. алиас автоматом создается такой же как имя таблицы, т.е. имя файла без расширения. Но если имя файла содержит недопустимые символы (точки, начинается с цифры и т.д.) то алиас генерится фоксом.

проверить просто
Код: sql
1.
2.
3.
4.
use С:\BASE\Saldo.dbf 
? alias() && будет Saldo
use С:\BASE\11.dbf 
? alias() & будет неизвестно что



А если ты точно знаешь алиас, то проверить открыт он или нет элементарно
Код: sql
1.
2.
3.
lcMyAlias = 'Zakaz_123'
if used(lcMyAlias)
...
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038087
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Как мне уйти от этой макроподстановки? - &mNameZ

Код: sql
1.
2.
3.
		If Used(mNameZ)=.F.
			Use (NaimTable) In 0 Alias &mNameZ Shared
		Endif
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038093
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Указывать переменную в скобках т.е. вместо &mNameZ писать (mNameZ)
Код: sql
1.
Use (NaimTable) In 0 Alias (mNameZ) Shared
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038107
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TУказывать переменную в скобках т.е. вместо &mNameZ писать (mNameZ)
Код: sql
1.
Use (NaimTable) In 0 Alias (mNameZ) Shared



Работает!!!! :)
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038110
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Вот теперь так выглядит процедуры Init у формы:

Код: sql
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.
FormMax(Thisform,550,793,800)
nW=Iif(Sysmetric(1)=800,1,(Sysmetric(21)-7)/793)
mD1=Left(Dtoc(mDataO),10)
NameDate='-'+Right(mD1,2)+'.'+Right(Left(mD1,5),2)+'.'+Left(mD1,2)
mNameZ='Zakaz_'+Right(mD1,2)+'_'+Right(Left(mD1,5),2)+'_'+Left(mD1,2)
NaimTable=gcDPS+'\'+'Zakaz'+NameDate+'.Dbf'
With Thisform
	.lDataJ.Caption=Dtoc(mDataO)
	.tDis1.RowSource = .Null.
	.tDis1.RowSource='Select Naim, mid From DisUser Into Cursor qDis1Z2'
	.tDis2.RowSource = .Null.
	.tDis2.RowSource='Select Naim, mid From DisUser Into Cursor qDis2Z2'
	.tZakB.RowSource=.Null.
	Select Naim, kod, telefon, karta From zak Into Cursor qZakB
	.tZakB.RowSource='qZakB'
	.tVod.RowSource = .Null.
	Select fio, kod From anketa Where priz3=.F. Into Cursor qVod
	.tVod.RowSource='qVod'
	.tVod.ColumnWidths = Allt(Str(.tVod.Width))+" ,0"
	With .grid1
		.RecordSource = .Null.
		If Used(mNameZ)=.F.
			Use (NaimTable) In 0 Alias (mNameZ) Shared
		Endif
		Select q1.Nomer, q1.datazak, Iif(Isnull(poz),'',Allt(Str(poz))) As poz, tip, statz, adres1, otkaz, SSms, ;
			karta, schet, kodzakb, q1.kodd, q1.kodd2, protkaz, kodv, blok, sz1, sz2, sz3, sp1, sp2, sp3, ;
			k1, k2, k3, q1.kod, q1.Tel From (mNameZ) q1 Left Join anketa q2 On q1.kodv=q2.kod Order By q1.Nomer Into Cursor qZakaz Readwrite
		Locate For kod=mkodz
		.RecordSource = 'qZakaz'
		.FontSize=7*nW
		.ColumnCount=6
		.RowHeight=20*nW
		.HeaderHeight=20*nW
		.Column3.FontSize=8*nW
		.Column6.FontSize=11*nW
		.Column2.FontSize=8
		.Column2.FontName="Times New Roman"
		.Column3.FontName="Times New Roman"
		.Column6.FontSize=11*nW
		.Column1.Width=25*nW
		.Column2.Width=50*nW
		.Column3.Width=30*nW
		.Column4.Width=15*nW
		.Column5.Width=15*nW
		.Column6.Width=430*nW
		.Column6.Text1.Format = Replicate('X',100)
		bb="iif(otkaz=.t.,RGB(128,128,128),Iif(tip=.t. and statz=.f.,RGB(255,100,100),Iif(tip=.t. and statz=.t.,RGB(0,200,0),"
		bb=bb+"Iif(tip=.f. and statz=.f.,RGB(0,255,255),RGB(255,255,215)))))"
		.SetAll("DynamicBackColor",bb,"Column")
		.Column1.Header1.Caption = '№'
		.Column2.Header1.Caption = 'Время'
		.Column3.Header1.Caption = 'Поз'
		.Column4.Header1.Caption = 'Б/Н'
		.Column5.Header1.Caption = 'V'
		.Column6.Header1.Caption = 'Адрес1'
	Endwith
	Replace blok With mkodid For kod=qZakaz.kod And blok=0 In (mNameZ)
	.tDis1.Value = qZakaz.kodd
	.tDis2.Value = qZakaz.kodd2
	.tZakB.Value = qZakaz.kodzakb
	.tKarta.Value = Allt(qZakaz.karta)
	.tSchet.Value = Allt(qZakaz.schet)
	.tVod.Value = qZakaz.kodv
	.tVod.Enabled = Iif(qZakaz.statz=.T. And qZakaz.otkaz=.F.,.F.,.T.)
	.tk1.Value=qZakaz.k1
	.tk2.Value=qZakaz.k2
	.tk3.Value=qZakaz.k3
	.tsz1.Value=qZakaz.sz1
	.tsz2.Value=qZakaz.sz2
	.tsz3.Value=qZakaz.sz3
	.tsp1.Value=qZakaz.sp1
	.tsp2.Value=qZakaz.sp2
	.tsp3.Value=qZakaz.sp3
	.tNomerT.Value=qZakaz.Tel
Endwith



А так выглядит главная процедура обновления данных на форме:

Код: sql
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.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
With Thisform
	mDataJ=Ctod(.lDataJ.Caption)
	mD1=Left(Dtoc(mDataJ),10)
	NameDate='-'+Right(mD1,2)+'.'+Right(Left(mD1,5),2)+'.'+Left(mD1,2)
	NaimTable=gcDPS+'\'+'Zakaz'+NameDate+'.Dbf'
	mNameZ='Zakaz_'+Right(mD1,2)+'_'+Right(Left(mD1,5),2)+'_'+Left(mD1,2)
	If File(NaimTable)=.F.
		Create_Zakaz(NaimTable)
	Endif
	nW=Iif(Sysmetric(1)=800,1,(Sysmetric(21)-7)/793)
	mPoisk=Allt(.tPoisk.Value)
	mFilTip=Iif(.cFilterTip.Value=1,.T.,.F.)
	mFilSt=Iif(.cFilterStat.Value=1,.T.,.F.)
	mFilOtk=Iif(.cFilOtk.Value=1,.T.,.F.)
	mFilBOtk=Iif(.cFilBOtk.Value=1,.T.,.F.)
	mFilVod=Iif(.cFilVod.Value=1,.T.,.F.)
	mFilKar=Iif(.cFilKar.Value=1,.T.,.F.)
	With .grid1
		.RecordSource = .Null.
		If Used(mNameZ)=.F.
			Use (NaimTable) In 0 Alias (mNameZ) Shared
		Endif
		Select q1.Nomer, q1.DATAZAK, Iif(Isnull(poz),'',Allt(Str(poz))) As poz, tip, statz, adres1, otkaz, SSms, ;
			karta, schet, kodzakb, q1.kodd, q1.kodd2, protkaz, kodv, BLOK, sz1, sz2, sz3, sp1, sp2, sp3, ;
			k1, k2, k3, q1.kod, q1.Tel From (mNameZ) q1 Left Join anketa q2 On q1.kodv=q2.kod ;
			Order By q1.Nomer Into Cursor qZakaz Readwrite
		If mFilTip=.T.                                                                             && Фильтр только безнал
			Select * From qZakaz Where tip=mFilTip Into Cursor qZakaz Readwrite
		Endif
		If mFilSt=.T.                                                                              && Фильтр только открытые
			Select * From qZakaz Where statz=.F. Into Cursor qZakaz Readwrite
		Endif
		If Len(mPoisk)<>0 And Len(mPoisk)<>11                                                      && если поле фильтра заполнено и длина не равна 11
			If Inlist(Left(mPoisk,1),'0','1','2','3','4','5','6','7','8','9')                        && если поиск числовой
				If Len(mPoisk)<6
					Select * From qZakaz Where ;
						kodv In (Select kod From anketa Where Allt(Str(poz))==mPoisk) ;                    && посик по позывному
					Or Allt(Str(Nomer))==mPoisk ;                                                        && или по номеру заказа
					Into Cursor qZakaz Readwrite
				Else
					Select * From qZakaz Where Like('*'+Upper(mPoisk)+'*',Upper(adres1)) ;               && поиск по вхождению в поле заказа (короткий номер)
					Into Cursor qZakaz Readwrite
				Endif
			Else
				Select * From qZakaz Where ;
					kodv In (Select kod From anketa Where Like('*'+Upper(mPoisk)+'*',Upper(fio))) ;      && поиск по фамилии водителя
				Or Like('*'+Upper(mPoisk)+'*',Upper(adres1)) ;                                         && поиск по вхождению в поле заказа
				Or kodzakb In (Select kod From Zak Where Like('*'+Upper(mPoisk)+'*',Upper(Naim))) ;    && поиск по наименованию заказчика
				Into Cursor qZakaz Readwrite
			Endif
		Else
			If Len(mPoisk)=11                                                                        && если фильтр равен 11 символам
				Select * From qZakaz Where Like('*'+mPoisk+'*',adres1) Into Cursor qZakaz Readwrite
			Endif
		Endif
		If mFilOtk=.T. Or mFilBOtk=.T.
			If mFilOtk=.T.
				Select * From qZakaz Where otkaz=.T. Into Cursor qZakaz Readwrite                      && Фильтр только отказные
			Else
				Select * From qZakaz Where otkaz=.F. Into Cursor qZakaz Readwrite                      && Фильтр без отказных
			Endif
		Endif
		If mFilVod=.T.                                                                             && Фильтр без водитетлей
			Select * From qZakaz Where kodv=0 Into Cursor qZakaz Readwrite
		Endif
		If mFilKar=.T.                                                                             && Фильтр только по карте
			Select * From qZakaz Where Len(Allt(karta))<>0 Into Cursor qZakaz Readwrite
		Endif
		.RecordSource = 'qZakaz'
		.FontSize=7*nW
		.RowHeight=20*nW
		.ColumnCount=6
		.HeaderHeight=20*nW
		.Column3.FontSize=9*nW
		.Column2.FontSize=8
		.Column2.FontName="Times New Roman"
		.Column3.FontName="Times New Roman"
		.Column6.FontSize=11*nW
		.Column1.Width=25*nW
		.Column2.Width=50*nW
		.Column3.Width=30*nW
		.Column4.Width=15*nW
		.Column5.Width=15*nW
		.Column6.Width=430*nW
		.Column6.Text1.Format = Replicate('X',100)
		bb="iif(otkaz=.t.,RGB(128,128,128),Iif(tip=.t. and statz=.f.,RGB(255,100,100),Iif(tip=.t. and statz=.t.,RGB(0,200,0),"
		bb=bb+"Iif(tip=.f. and statz=.f.,RGB(0,255,255),RGB(255,255,215)))))"
		.SetAll("DynamicBackColor",bb,"Column")
		.Column1.Header1.Caption = '№'
		.Column2.Header1.Caption = 'Время'
		.Column3.Header1.Caption = 'Поз'
		.Column4.Header1.Caption = 'Б/Н'
		.Column5.Header1.Caption = 'V'
		.Column6.Header1.Caption = 'Допольнительная информация'
	Endwith
	Replace BLOK With mkodid For kod=qZakaz.kod And BLOK=0 In (mNameZ)
	.tDis1.Value = qZakaz.kodd
	.tDis2.Value = qZakaz.kodd2
	.tZakB.Value = qZakaz.kodzakb
	.tKarta.Value = Allt(qZakaz.karta)
	.tSchet.Value = Allt(qZakaz.schet)
	.tVod.Value = qZakaz.kodv
	.tVod.Enabled = Iif(qZakaz.statz=.T. And qZakaz.otkaz=.F.,.F.,.T.)
	.cK.Enabled = .F.
	.tk1.Value=qZakaz.k1
	.tk2.Value=qZakaz.k2
	.tk3.Value=qZakaz.k3
	.tsz1.Value=qZakaz.sz1
	.tsz2.Value=qZakaz.sz2
	.tsz3.Value=qZakaz.sz3
	.tsp1.Value=qZakaz.sp1
	.tsp2.Value=qZakaz.sp2
	.tsp3.Value=qZakaz.sp3
	.tNomerT.Value=qZakaz.Tel
	.grid1.Column6.Text1.SetFocus
Endwith
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038122
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда хочешь много кода показать - прячь под спойлер (пункт spoiler в "дополнит.")
AngelOKESDima T, Вот теперь так выглядит процедуры Init у формы:
Init()
Код: sql
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.
FormMax(Thisform,550,793,800)
nW=Iif(Sysmetric(1)=800,1,(Sysmetric(21)-7)/793)
mD1=Left(Dtoc(mDataO),10)
NameDate='-'+Right(mD1,2)+'.'+Right(Left(mD1,5),2)+'.'+Left(mD1,2)
mNameZ='Zakaz_'+Right(mD1,2)+'_'+Right(Left(mD1,5),2)+'_'+Left(mD1,2)
NaimTable=gcDPS+'\'+'Zakaz'+NameDate+'.Dbf'
With Thisform
	.lDataJ.Caption=Dtoc(mDataO)
	.tDis1.RowSource = .Null.
	.tDis1.RowSource='Select Naim, mid From DisUser Into Cursor qDis1Z2'
	.tDis2.RowSource = .Null.
	.tDis2.RowSource='Select Naim, mid From DisUser Into Cursor qDis2Z2'
	.tZakB.RowSource=.Null.
	Select Naim, kod, telefon, karta From zak Into Cursor qZakB
	.tZakB.RowSource='qZakB'
	.tVod.RowSource = .Null.
	Select fio, kod From anketa Where priz3=.F. Into Cursor qVod
	.tVod.RowSource='qVod'
	.tVod.ColumnWidths = Allt(Str(.tVod.Width))+" ,0"
	With .grid1
		.RecordSource = .Null.
		If Used(mNameZ)=.F.
			Use (NaimTable) In 0 Alias (mNameZ) Shared
		Endif
		Select q1.Nomer, q1.datazak, Iif(Isnull(poz),'',Allt(Str(poz))) As poz, tip, statz, adres1, otkaz, SSms, ;
			karta, schet, kodzakb, q1.kodd, q1.kodd2, protkaz, kodv, blok, sz1, sz2, sz3, sp1, sp2, sp3, ;
			k1, k2, k3, q1.kod, q1.Tel From (mNameZ) q1 Left Join anketa q2 On q1.kodv=q2.kod Order By q1.Nomer Into Cursor qZakaz Readwrite
		Locate For kod=mkodz
		.RecordSource = 'qZakaz'
		.FontSize=7*nW
		.ColumnCount=6
		.RowHeight=20*nW
		.HeaderHeight=20*nW
		.Column3.FontSize=8*nW
		.Column6.FontSize=11*nW
		.Column2.FontSize=8
		.Column2.FontName="Times New Roman"
		.Column3.FontName="Times New Roman"
		.Column6.FontSize=11*nW
		.Column1.Width=25*nW
		.Column2.Width=50*nW
		.Column3.Width=30*nW
		.Column4.Width=15*nW
		.Column5.Width=15*nW
		.Column6.Width=430*nW
		.Column6.Text1.Format = Replicate('X',100)
		bb="iif(otkaz=.t.,RGB(128,128,128),Iif(tip=.t. and statz=.f.,RGB(255,100,100),Iif(tip=.t. and statz=.t.,RGB(0,200,0),"
		bb=bb+"Iif(tip=.f. and statz=.f.,RGB(0,255,255),RGB(255,255,215)))))"
		.SetAll("DynamicBackColor",bb,"Column")
		.Column1.Header1.Caption = '№'
		.Column2.Header1.Caption = 'Время'
		.Column3.Header1.Caption = 'Поз'
		.Column4.Header1.Caption = 'Б/Н'
		.Column5.Header1.Caption = 'V'
		.Column6.Header1.Caption = 'Адрес1'
	Endwith
	Replace blok With mkodid For kod=qZakaz.kod And blok=0 In (mNameZ)
	.tDis1.Value = qZakaz.kodd
	.tDis2.Value = qZakaz.kodd2
	.tZakB.Value = qZakaz.kodzakb
	.tKarta.Value = Allt(qZakaz.karta)
	.tSchet.Value = Allt(qZakaz.schet)
	.tVod.Value = qZakaz.kodv
	.tVod.Enabled = Iif(qZakaz.statz=.T. And qZakaz.otkaz=.F.,.F.,.T.)
	.tk1.Value=qZakaz.k1
	.tk2.Value=qZakaz.k2
	.tk3.Value=qZakaz.k3
	.tsz1.Value=qZakaz.sz1
	.tsz2.Value=qZakaz.sz2
	.tsz3.Value=qZakaz.sz3
	.tsp1.Value=qZakaz.sp1
	.tsp2.Value=qZakaz.sp2
	.tsp3.Value=qZakaz.sp3
	.tNomerT.Value=qZakaz.Tel
Endwith



Если работает - значит нормально.
Если хочешь тормоза потестить - возьми копию реальной базы, запусти две копии своей проги, или еще проще запусти вторую копию фокса и открой там те таблицы, которые участвуют в работе
Код: sql
1.
2.
3.
4.
set excl off
use Zakaz_123 in 0
use Saldo in 0
...


так виндовс перейдет в тормозной режим
затем переключайся в свою прогу и пробуй работать.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038159
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Нет такой вариант не прокатит, 2 копии программы на одном компьютере работают отлично, а вот если на двух компах по сети, то картина такая же будет наверное, надо будет подумать как можно сейчас это реализовать... можно конечно скинуть обновление операторам и они в реальном времени проверят, но как-то это не красиво... Ладно сейчас что-нибудь придумаю... А дальше там уже будем дальше думать что ещё можно сделать существенного для прироста скорости на клиентах
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038175
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESа вот если на двух компах по сети
Сделай виртуалку, поставь туда винду и положи туда базу. Сетевые интерфейсы у виртуалок достаточно тормозные. Будет почти как по сети, не намного быстрее.

AngelOKESА дальше там уже будем дальше думать что ещё можно сделать существенного для прироста скорости на клиентах
Кардинальное решение без переписывания проги: переход на терминал. На главный комп (где база) все заходят терминалом, запускают прогу и работают. Так получится что на одном компе запустили несколько копий проги. По сети ни одна копия ничего передавать не будет.

Ну и промежуточный вариант: переход на гигабитную сетку. Гигабитное оборудование не дорогое. Скорее всего у большинства пользователей сетевухи гигабитные, останется только свич заменить.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038197
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, По поводу гигабитки это конечно я сам думаю что будет круто, но вот компы там старые и слабые и карточки почти везде 100 Мбит, свич само собой тоже менять надо. но как вариант предложу директору, попробую обосновать это ускорением программы...
Ладно думаю через несколько дней смогу закончить тест, сейчас ещё пока переписываю, но даже то что мне не нужно каждый раз узнать имя таблицы мне дало значительное уменьшение кода, так как он у меня наверное раз 100 прописан в разных процедурах, коих у меня безмерное количество на форме....
Я вот подумал может быть стоит привязать объекты на форме к курсору, даст ли это прирост или можно не курсору, а прямо к выбранной таблице? Я сейчас напомню про какие элементы я говорю:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
	.tDis1.Value = qZakaz.kodd
	.tDis2.Value = qZakaz.kodd2
	.tZakB.Value = qZakaz.kodzakb
	.tKarta.Value = Allt(qZakaz.karta)
	.tSchet.Value = Allt(qZakaz.schet)
	.tVod.Value = qZakaz.kodv
	.tVod.Enabled = Iif(qZakaz.statz=.T. And qZakaz.otkaz=.F.,.F.,.T.)
	.cK.Enabled = .F.
	.tk1.Value=qZakaz.k1
	.tk2.Value=qZakaz.k2
	.tk3.Value=qZakaz.k3
	.tsz1.Value=qZakaz.sz1
	.tsz2.Value=qZakaz.sz2
	.tsz3.Value=qZakaz.sz3
	.tsp1.Value=qZakaz.sp1
	.tsp2.Value=qZakaz.sp2
	.tsp3.Value=qZakaz.sp3
	.tNomerT.Value=qZakaz.Tel






Ну и может быть и столбцы Grida тоже привязать:


Код: sql
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.
			.RecordSource = 'qZakaz'
		.FontSize=7*nW
		.RowHeight=20*nW
		.ColumnCount=6
		.HeaderHeight=20*nW
		.Column3.FontSize=9*nW
		.Column2.FontSize=8
		.Column2.FontName="Times New Roman"
		.Column3.FontName="Times New Roman"
		.Column6.FontSize=11*nW
		.Column1.Width=25*nW
		.Column2.Width=50*nW
		.Column3.Width=30*nW
		.Column4.Width=15*nW
		.Column5.Width=15*nW
		.Column6.Width=430*nW
		.Column6.Text1.Format = Replicate('X',100)
		bb="iif(otkaz=.t.,RGB(128,128,128),Iif(tip=.t. and statz=.f.,RGB(255,100,100),Iif(tip=.t. and statz=.t.,RGB(0,200,0),"
		bb=bb+"Iif(tip=.f. and statz=.f.,RGB(0,255,255),RGB(255,255,215)))))"
		.SetAll("DynamicBackColor",bb,"Column")
		.Column1.Header1.Caption = '№'
		.Column2.Header1.Caption = 'Время'
		.Column3.Header1.Caption = 'Поз'
		.Column4.Header1.Caption = 'Б/Н'
		.Column5.Header1.Caption = 'V'
		.Column6.Header1.Caption = 'Допольнительная информация'




Даст ли это ускорение или не стоит даже думать?
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038301
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESДаст ли это ускорение или не стоит даже думать?
Ускорения не будет, будет чуть меньше кода.

Главные тормоза от SELECT/UPDATE по сети. Это надо лечить, а на остальное не заморачивайся.

По хорошему надо внимательно изучить код выполняющийся часто (AterRowColChange(), методы контролов грида) и оптимизировать этот код. Перед тем как что-то посчитать проверять а не посчитано ли оно ранее. Например AterRowColChange() срабатывает даже если ты перемещаешься в пределах одной записи, т.е. при переходе вправо/влево, думаю вполне реально при переходе на запись выполнить для нее расчет один раз, запомнить результаты и пользоваться ими пока курсор ходит в пределах записи. При переходе по контролам ничего не делать если ничего не вводили. В общем расчеты должны происходить только тогда когда они необходимы.

Насоздавай свойств форме для хранения промежуточных расчетов и не бойся что из-за них будут тормоза. Один лишний SELECT по сети намного дольше чем чтение/изменение сотни свойств формы.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038340
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Я вот что ещё думаю, может быть стоит ли как-то отказаться от курсора и работать напрямую с таблицей. А то у меня получается какая логика:
1) Нахожу нужный файл ZakazXXXXXX
2) Открываю его в рабочей области mZakazXXXXXX
3) Делаю запрос:
Код: sql
1.
2.
3.
4.
Select q1.Nomer, q1.DATAZAK, Iif(Isnull(poz),'',Allt(Str(poz))) As poz, tip, statz, adres1, otkaz, SSms, ;
karta, schet, kodzakb, q1.kodd, q1.kodd2, protkaz, kodv, BLOK, sz1, sz2, sz3, sp1, sp2, sp3, ;
k1, k2, k3, q1.kod, q1.Tel From (mNameZ) q1 Left Join anketa q2 On q1.kodv=q2.kod ;
Order By q1.Nomer Into Cursor qZakaz Readwrite


4) Делаю необходимые фильтры (а их у меня может быть очень много, но здесь и далее я работаю уже с курсором "qZakaz"
5) При обновлении данных я делаю изменения как в этом курсоре, так и в оригинальной таблице.
Код: sql
1.
2.
3.
		
Update qZakaz Set Tel=mNomerK Where kod=mkod                                     && Курсор
Update (mNameZ) Set Tel=mNomerK, kodd2=mkodid Where kod=mkod And BLOK=mkodid     && Оригинал


Может стоит подумать как здесь можно оптимизировать или всё таки не стоит копать в этом направлении?
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038361
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От курсора не стоит отказываться, т.к. это и есть оптимизация, без него будет медленнее, т.к. каждый раз по сети будешь лезть в таблицу.
Операции с курсором выполняются быстро т.к. он находится в кэше фокса (даже не виндовса).

оптимизировать можно это индексом по kod или BLOK или kod+BLOK (в этом случае при сравнении должен совпадать синтаксис индекса с указываемым во Where, иначе оптимизатор индекс не задействует)
Код: sql
1.
Update (mNameZ) Set Tel=mNomerK, kodd2=mkodid Where kod=mkod And BLOK=mkodid
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39058375
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Столнулся с такой проблемой, что даже с условием нужных программных блокировок записей происходи видоизменение записи несколькими диспетчерами и конечный результат не так очивиден...
Приведу пример, логика программы у меня такая (просто напомню на всякий случай)
1) Есть таблица Zakaz-XX-XX-XX
2) Делаю перезаписываемый курсов на основе этой таблице
3) Далее на клиенте отображаю данный курсор, при изменении данных я меняю их как физически в самой таблице, так и в курсоре на локалке.

Что у нас получается, при нахождение Диспетчера №1 в записи №1 он ставит на неё блок и на момент занесения изменений никто не может изменить этй запись!!! Далее Диспетчер №1 переходит на запись №2, а Диспетчер №2 переходит на запись №1, запись уже разблокирована Диспетчером №1 и ставиться блок Диспетчера №2, тут как бы всё ровно, НО Диспетчер №2 не видит тех изменений, которые сделал Диспетчер №1 и делает какие-то свои действия, которые не противоречат алгоритму программы и тех.задания, блокировка держиться только при нахождении в текущей записи и незалокированной другим диспетчером. В это же время Диспетчер №1 хочет сделать какой-то отчет по заказу №1, но данные уже конечно используются, те, которые внёс Диспетчер №2 и вводит его в заблуждение. Какждый раз запрашивать данные это будут тормоза...

Я не могу придумать алгоритм реального обновления данных... У меня есть только частичное решение, когда Диспетчер №1 пытается изменить текст заказа, то при изменение я делаю запрос на блокировку и если она заблокирована другим диспетчером, то выдаю сообщение и обновляю текст заказа на тот, который сейчас стоит у заблокировавшего диспетчера... Но каждый раз запрашивать данные о записи это всегда тормоза, может быть есть более изящное решение?
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39058518
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-хорошему надо делать так: встал на строку - заблокировал, уходя со строки блокировка остается если были изменения , если не было - освобождается. По окончании как понимаю происходит какое-то сохранение набранного, после этого сохранения блокировки снимаются.

Глубоко не вникал в твою логику. У тебя вопрос был про ускорить. Если не так понимаю - распиши поподробнее свой механизм блокировок.

Если не путаю встроенный механизм блокировок (rlock()/unlock) у тебя не используется, а есть какое-то поле BLOK куда ты пишешь что запись заблокирована. В любом случае надо делать так написал выше.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39058559
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKES) Делаю перезаписываемый курсов на основе этой таблице
3) Далее на клиенте отображаю данный курсор, при изменении данных я меняю их как физически в самой таблице, так и в курсоре на локалке.
...
Я не могу придумать алгоритм реального обновления данных... У меня есть только частичное решение, когда Диспетчер №1 пытается изменить текст заказа, то при изменение я делаю запрос на блокировку и если она заблокирована другим диспетчером, то выдаю сообщение и обновляю текст заказа на тот, который сейчас стоит у заблокировавшего диспетчера... Но каждый раз запрашивать данные о записи это всегда тормоза, может быть есть более изящное решение?
Кажется понял о чем речь. Тебе строку надо перечитать. Это не должно тормозить. Используй recno()

Изначально делаешь курсор так
Код: sql
1.
select recno() as row_num, field1, field2 ... from mytable into mycursor



Обновление текущей строки курсора в BeforeRowColChange()
Код: sql
1.
2.
go (mycursor.row_num) in mytable 
repl in mycursor field1 with mytable.field1, field2 with mytable.field2 ...


и в обратную сторону можно также
Код: sql
1.
2.
go (mycursor.row_num) in mytable 
repl in mytable field1 with mycursor.field1, field2 with mycursor.field2 ...



Можно заменить курсор на курсор-адаптер. Тогда курсор-адаптер будет этим заниматься .RecordRefresh()
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39058992
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, не получается без макроподстановки:

Код: sql
1.
2.
3.
Go (qZakaz.row_num) In (mNameZ)
Repl In qZakaz Adres1 With &mNameZ..Adres1, kodv With &mNameZ..kodv
Thisform.Grid1.Refresh



И данные всё равно обновляются после выхода из записи или просто мне надо как-то обновить Grid ещё, но его обновление также не помогает, хотелось бы чтобы при входе в запись уже менялось его значение на реальное.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39058995
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESDima T, не получается без макроподстановки:

Код: sql
1.
2.
3.
Go (qZakaz.row_num) In (mNameZ)
Repl In qZakaz Adres1 With &mNameZ..Adres1, kodv With &mNameZ..kodv
Thisform.Grid1.Refresh


Можно так
Код: sql
1.
2.
3.
4.
5.
sele (mNameZ)
Go (qZakaz.row_num)
lcAdres1 = Adres1
lcKodv = kodv
Repl In qZakaz Adres1 With lcAdres1, kodv With lcKodv



AngelOKESИ данные всё равно обновляются после выхода из записи или просто мне надо как-то обновить Grid ещё, но его обновление также не помогает, хотелось бы чтобы при входе в запись уже менялось его значение на реальное.
Ты откуда этот код вызываешь? Из BeforeRowColChange() ?

1. Убедись что запись в курсор происходит. Добавь после repl для отладки
Код: sql
1.
wait qZakaz.Adres1 + qZakaz.Kodv window nowait noclear


2. Refresh() каждый раз не лучшее решение, попробуй писать сразу объекты грида, т.е. вместо repl
Код: sql
1.
2.
3.
4.
5.
sele (mNameZ)
Go (qZakaz.row_num)
Thisform.Grid1.Column1.Text1.value = Adres1
Thisform.Grid1.Column2.Text1.value = kodv
sele qZakaz


Не поможет - попробуй repl добавить.

Grid иногда очень непонятно себя ведет, поэтому если не поможет - делай простенькую формочку с эмитацией твоей проблемы, выкладывай сюда, будем искать выход на реальном примере.
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 2 из 3
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как ускорить работы с работой с DBF по сети
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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