powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как ускорить работы с работой с DBF по сети
65 сообщений из 65, показаны все 3 страниц
Как ускорить работы с работой с DBF по сети
    #39037464
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть большой приложение, в котором работают одновременно до 10 пользователей. Это что-то типа "псевдосетевой" версии. Быстро работает только на том компьютере на котором эти DBF расположены, на остальным компах раз в 10 наверное медленней работает.
Таблиц в принципе много, но рабочая таблица всего одна и она динамически создаётся каждый день новая, то бишь на каждый день своя DBF, количество записей не более 1000, сама по себе запись не большая.

Вот из процедуры создания можно увидеть структуру:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Procedure Create_Zakaz
Parameters NaimTable
Create Table &NaimTable ([kod] [int], [DataZak] [Datetime], [Nomer] [int], [KodV] [int], [tip] [logical], ;
	[Adres1] [varchar](100), [statZ] [logical], [kodD] [int], [kodzakb] [int], [schet] [varchar](35), ;
	[Tel] [varchar](11), [karta] [varchar](6), [kodD2] [int], [otkaz] [logical], [PrOtkaz] [varchar](50), ;
	[blok] [int], [sz1] [Numeric](7), [sz2] [Numeric](7), [sz3] [Numeric](7), [sp1] [Numeric](6), ;
	[sp2] [Numeric](6), [sp3] [Numeric](6), [k1] [Numeric](7,2), [k2] [Numeric](7,2), [k3] [Numeric](7,2), ;
	[SSMS] [logical])
Use
Endproc



Сама программа представляет из себя форма, на ней Grid, в котором всё крутится в реальном времени со своими программными блокировками. Куда копать и что делать не знаю.
P.S. Программе уже лет 5 наверное или около тога и пользователи в принципе уже привыкли к тормозам, но думаю может быть знатоки смогут помочь мне в ускорении работы приложения, если что отвечу на все вопросы, но весь код программы выкладывать это конечно очень много...
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037481
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тормозит что? Перемещение по гриду?

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

Во время перемещения есть обращения к другим таблицам? Как именно прописано?

Тормозит всё и перемещение и изменение
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037492
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Событие AfterRowColChange

Код: 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.
Lparameters nColIndex
nW=Iif(Sysmetric(1)=800,1,(Sysmetric(21)-7)/793)
**********************************************************************************
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'
	mkod=qZakaz.kod
	Update &NaimTable Set BLOK=0 Where BLOK=mkodid
	Update &NaimTable Set BLOK=mkodid Where kod=mkod And BLOK=0
	.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
	.tDis1.Value = qZakaz.kodd
	.tDis2.Value = qZakaz.kodd2
	.tZakB.Value = qZakaz.kodzakb
	.tKarta.Value = Allt(qZakaz.karta)
	.tSchet.Value = Allt(qZakaz.schet)
	.tNomerT.Value = qZakaz.Tel
	.tVod.Value = qZakaz.kodv
	.tVod.Enabled = Iif(qZakaz.statz=.T. And qZakaz.otkaz=.F.,.F.,.T.)
	.cK.Enabled = .T.
	.cSMS.Enabled = Iif(qZakaz.SSms=.T.,.F.,.T.)
	.cSMS.Caption = Iif(qZakaz.SSms=.T.,'Уже отправили','Отправить SMS клиенту')
	mDatNtN=mDataJ-Iif(Dow(mDataJ)=1,8,Dow(mDataJ))+2    && Начало недели
	Select balans From saldo Where kodv=qZakaz.kodv And datann=mDatNtN Into Cursor TestB
	If Reccount('TestB')>0
		If balans<0
			Thisform.tVod.BackColor = Rgb(255,0,0)
		Else
			Thisform.tVod.BackColor = Rgb(0,255,0)
		Endif
	Endif
*	Select qZakaz
*	Locate For kod=mkod
*	If Found()
*	Endif
Endwith
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037496
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё большая процедура на LostFocus 6 колонки Grida из поля Text:

Код: 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.
mDataJ=Ctod(Thisform.lDataJ.Caption)
mD1=Left(Dtoc(mDataJ),10)
NameDate='-'+Right(mD1,2)+'.'+Right(Left(mD1,5),2)+'.'+Left(mD1,2)
NaimTable=gcDPS+'\'+'Zakaz'+NameDate+'.Dbf'
mAdresK=Allt(This.Value)
Store '' To mNomerK
**********************************************************************************
If qZakaz.statz=.F. And qZakaz.otkaz=.F.
	mkod=kod
	Select Adres1, BLOK From &NaimTable Where kod=mkod Into Cursor qZakazProv
	If mAdresK==Allt(qZakazProv.Adres1)
	Else
		If qZakazProv.BLOK<>0 And qZakazProv.BLOK<>mkodid
			Messagebox('Данный заказ заблокирован диспетчером - '+Allt(Str(qZakazProv.BLOK)),32,'Оповещение')
			Update qZakaz Set Adres1=qZakazProv.Adres1 Where kod=mkod
		Else
			Update &NaimTable Set Adres1=mAdresK, kodd2=mkodid Where kod=mkod And BLOK=mkodid
			If Len(mAdresK)>=10
				Do While Len(mAdresK)>0
					If Len(mNomerK)=0
						If Inlist(Left(mAdresK,1),'7','9')
							mNomerK=Left(mAdresK,1)
						Endif
						If Left(mAdresK,1)='8'
							mNomerK='7'
						Endif
					Else
						If Inlist(Left(mAdresK,1),'0','1','2','3','4','5','6','7','8','9')
							mNomerK=mNomerK+Left(mAdresK,1)
						Else
							If Len(mNomerK)<7
								mNomerK=''
							Endif
						Endif
					Endif
					mAdresK=Right(mAdresK,Len(mAdresK)-1)
				Enddo
				If Len(mNomerK)=11
					mNomerK=Right(mNomerK,10)
				Endif
				If Len(mNomerK)=10
					Update qZakaz Set Tel=mNomerK Where kod=mkod
					Thisform.tNomerT.Value=mNomerK
					Update &NaimTable Set Tel=mNomerK, kodd2=mkodid Where kod=mkod And BLOK=mkodid
					mOpredel = ReadFileIni(gcDPL+"\Raion.ini","Admin","Opredel")
					If Isnull(mOpredel)
						WriteFileIni(gcDPL+"\Raion.ini","Admin","Opredel","0")
						mOpredel=ReadFileIni(gcDPL+"\Raion.ini","Admin","Opredel")
					Endif
					If mOpredel="1"
						Select qZakaz
						Locate For kod=mkod
						Thisform.cOpredel.Click
					Endif
				Endif
			Else
				If Len(Thisform.tNomerT.Value)<>0
					answer=Messagebox('Стереть номер телефона, привязанный к заказу ???',36,'Вопрос')
					If answer=6
						Update qZakaz Set Tel='' Where kod=mkod
						Update &NaimTable Set Tel='', kodd2=mkodid Where kod=mkod And BLOK=mkodid
						Thisform.tNomerT.Value=''
						mNomerK=''
					Endif
				Endif
			Endif
		Endif
		Sele qZakaz
		Locate For kod=mkod
	Endif
Endif
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037500
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сомневаешься что конкретно выполняется в твоем коде, то можешь профилирофщиком посмотреть:
настраиваешь исходники на рабочую базу, запускаешь свою форму, затем меню Tools-Debugger там меню Tools-Coverage Logging задаешь файл куда лог писать.
Затем возвращаешься на форму и делаешь действия на которых тормозит.
Переключаешься в дебагер и отжимаешь кнопку писания лога на тулбаре (или просто все закрой)
Дальше смотришь лог, первая цифра сколько времени выполнялась строка кода, дальше где эта строка, последняя цифра уровень вложенности.

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

Это зачем:
Код: sql
1.
2.
	NaimTable=gcDPS+'\'+'Zakaz'+NameDate+'.Dbf'
	Update &NaimTable ...


Используй алиасы, т.е. при открытии
Код: sql
1.
2.
sele 0
use (gcDPS+'\'+'Zakaz'+NameDate+'.Dbf') alias Zakaz


а в коде
Код: sql
1.
Update Zakaz ...


и тебе точно надо всю таблицу апдейтить или достаточно текущую строку? Если текущую, то изучай REPLACE
Если надо всю - проверь что есть индекс по полю BLOK

Тут может быть тормоз
Код: sql
1.
	Select balans From saldo Where kodv=qZakaz.kodv And datann=mDatNtN Into Cursor TestB


Размеры таблицы saldo какой? Если от 100 строк то тоже индексы надо делать.

В целом как-то коряво все спроектировано. Не надо столько сложных действий в AfterRowColChange() пихать.

Это выкинь
Код: sql
1.
2.
Select qZakaz
Locate For kod=mkod


сделай индекс и используй IndexSeek()
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037578
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Dima T]AngelOKESСобытие AfterRowColChange
...
Ты уверен что весь этот код надо выполнять при каждом переходе на другую клетку?

Это зачем:
Код: sql
1.
2.
	NaimTable=gcDPS+'\'+'Zakaz'+NameDate+'.Dbf'
	Update &NaimTable ...


Используй алиасы, т.е. при открытии
Код: sql
1.
2.
sele 0
use (gcDPS+'\'+'Zakaz'+NameDate+'.Dbf') alias Zakaz



Не удобно переключать с одной таблицы на другую
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037581
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что я не так делаю?

Код: sql
1.
2.
3.
		If Used(NaimTable2)=.F.
			Use &NaimTable In 0 Shared Alias Zakaz
		Endif



Программа не может найти этот алиас...
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037585
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо
Код: sql
1.
If !Used('Zakaz')



Если в процессе работы постоянно открываются разные таблицы ZakazXXXX то оставь как было. На производительность это не сильно влияет.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037601
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TС индексами разбирайся. Запросы посмотри как отрабатывают. SYS(3054) показывает какие индексы используются в запросе.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39037988
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
не хотелось бы использовать индексы, хотя таблица saldo содержит свыше 1000 записей
и самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее
пробовал делать центром любой другой компьютер, то тогда ускорялся именно он, может я что-то не использую в коде или наоброт использую то что именно по сети тормозит?
А на счёт индексов я всё таки думаю, что тормозили бы все, если бы была проблема только в индексах.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038001
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESи самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее
Предоставь возможность доступа Dima T к main компьютеру и хотя бы одному клиентскому и будет тебе счастье
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038005
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESи самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее
Предоставь возможность доступа Dima T к main компьютеру и хотя бы одному клиентскому и будет тебе счастье
И думаю было бы уместно /но вовсе не обязательно/ после помощи Dima T его поблагодарить и рассказать
в назидание другим про "грабли"
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038011
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESDima T,
не хотелось бы использовать индексы, хотя таблица saldo содержит свыше 1000 записей
Оптимизатор запросов работает только с помощью индексов.
Вот один из твоих тормозов
Код: sql
1.
Select balans From saldo Where kodv=qZakaz.kodv And datann=mDatNtN Into Cursor TestB


Без индексов каждый раз происходит полный скан таблицы, т.е. даже если тебе нужна только одна строка - читается (качается по сети) вся таблица, затем выбирается нужная запись. При наличии индекса - из индекса выбираются координаты нужных записей и читаются только эти записи.
попробуй создать индекс
Код: sql
1.
2.
sele saldo
index on kodv tag kodv


и посмотри как будет работать.

В идеале надо такой индекс
Код: sql
1.
index on str(kodv,9) + ttoc(datann, 1) tag kd


дальше так
Код: sql
1.
2.
3.
4.
5.
6.
7.
If IndexSeek(str(qZakaz.kodv,9) + ttoc(mDatNtN, 1), .T., 'saldo', 'kd')
	If saldo.balans<0
		Thisform.tVod.BackColor = Rgb(255,0,0)
	Else
		Thisform.tVod.BackColor = Rgb(0,255,0)
	Endif
Endif



Боятся индексов не надо. Надо просто разобраться как ими пользоваться и как обслуживать (плановая переиндексация, контроль снятия задачи пользователем и т.д.).
AngelOKESи самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее
пробовал делать центром любой другой компьютер, то тогда ускорялся именно он, может я что-то не использую в коде или наоброт использую то что именно по сети тормозит?
А на счёт индексов я всё таки думаю, что тормозили бы все, если бы была проблема только в индексах.
Это особенность работы виндовса:
Если файл открывает один пользователь, то файл кэшируется на его стороне. Тормозить не будет даже по сети. Чтение идет даже не с диска, а из кэша своего виндовса.
Когда файл открывает второй (третий и т.д.) пользователь - включается контроль блокировок и скорость чтения резко падает. По сети 100 МБит скорость чтения от силы 10-20. Можешь глянуть размер saldo.dbf и прикинуть сколько времени надо на его чтение. Скорость ~1 Мбайт в секунду.
Если файл расположен на том же компе - работает чуть быстрее, но опять же не со скоростью чтения с винта, а 3-5 Мбайт в секунду.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038013
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012AngelOKESи самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее
Предоставь возможность доступа Dima T к main компьютеру и хотя бы одному клиентскому и будет тебе счастье
И думаю было бы уместно /но вовсе не обязательно/ после помощи Dima T его поблагодарить и рассказать
в назидание другим про "грабли"

Поблагодарить я всегда рад, я благодарю и Dima T и вас я тоже благодарю!!! Но вот даже если я дам доступ по сети, что можно будет увидеть, я не против показать код и объяснить всю логику работы программы или есть какие-то инструменты которые помогут удалённо разобраться в ситуации?
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038015
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKES или есть какие-то инструменты которые помогут удалённо разобраться в ситуации?К примеру https://www.teamviewer.com/ru/
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038016
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Можно ли создавать индекс вот так:

Код: sql
1.
2.
3.
4.
5.
6.
	Use Saldo.Dbf In 3 Excl
	If Empty(Tagno("kd","saldo"))
		Select Saldo
		Delete Tag All
		Index On Str(kodv,9) + Ttoc(datann, 1) Tag kd
	Endif
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038018
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта конструкцию можно немного соптимизировать даже без индексов
Код: sql
1.
2.
3.
4.
	Select balans From saldo Where kodv=qZakaz.kodv And datann=mDatNtN Into Cursor TestB
	If Reccount('TestB')>0
		If balans<0
...


так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
llFound = saldo.kodv=qZakaz.kodv And saldo.datann=mDatNtN
if !llFound
   sele saldo
   locate for saldo.kodv=qZakaz.kodv And saldo.datann=mDatNtN
   llFound = found()
endif
if llFound
	If saldo.balans<0
   ...


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

Код: 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.
Lparameters nColIndex
**********************************************************************************
With Thisform
	mDataJ=Ctod(.lDataJ.Caption)
	mkod=qZakaz.kod
	Replace blok With 0 For blok=mkodid In &mNameZ
	Replace blok With mkodid For kod=mkod And blok=0 In &mNameZ
	.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
	.tDis1.Value = qZakaz.kodd
	.tDis2.Value = qZakaz.kodd2
	.tZakB.Value = qZakaz.kodzakb
	.tKarta.Value = Allt(qZakaz.karta)
	.tSchet.Value = Allt(qZakaz.schet)
	.tNomerT.Value = qZakaz.Tel
	.tVod.Value = qZakaz.kodv
	.tVod.Enabled = Iif(qZakaz.statz=.T. And qZakaz.otkaz=.F.,.F.,.T.)
	If qZakaz.kodv<>0
		.cK.Enabled = .T.
		mDatNtN=mDataJ-Iif(Dow(mDataJ)=1,8,Dow(mDataJ))+2    && &#205;&#224;&#247;&#224;&#235;&#238; &#237;&#229;&#228;&#229;&#235;&#232;
		If Indexseek(Str(qZakaz.kodv,9) + Ttoc(mDatNtN, 1), .T., 'saldo', 'kd')
			Thisform.tVod.BackColor = Iif(saldo.balans<0,Rgb(255,0,0),Rgb(0,255,0))
		Endif
	Endif
Endwith
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038021
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima 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
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038025
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESя не против показать код и объяснить всю логику работы программы или есть какие-то инструменты которые помогут удалённо разобраться в ситуации?
Типа поработайте за меня а я скажу спасибо? Не, братец, тут форум чтобы помочь разобраться и дальше самому свою работу делать.
Если хочешь чтоб за тебя поработали - есть форум "работа", там за вознаграждение покопаются в твоих исходниках.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038028
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAngelOKESя не против показать код и объяснить всю логику работы программы или есть какие-то инструменты которые помогут удалённо разобраться в ситуации?
Типа поработайте за меня а я скажу спасибо? Не, братец, тут форум чтобы помочь разобраться и дальше самому свою работу делать.
Если хочешь чтоб за тебя поработали - есть форум "работа", там за вознаграждение покопаются в твоих исходниках.

Это я Владимиру написал, да и так конечно я сам понимаю, что я сам должен разобраться во всём...
Сейчас во всем коде меняю UPDATE на Replace, надеюсь это ускорит работу программы :)
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038032
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESDima T, Можно ли создавать индекс вот так:

Лучше так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if used('saldo')
   sele saldo && перейти к уже открытому 
else
   sele 0 && 0 любая свободная рабочая область
endif
Use Saldo Excl 
Delete Tag All && удалить все индексы
Index On Str(kodv,9) + Ttoc(datann, 1) Tag kd
Index On ... && и т.д. создать все остальные индексы если надо
Use Saldo Shared


т.к. Use ... Excl невозможно сделать если кто-то уже открыл таблицу как Shared, то этот код надо выполнять в то время когда никто не работает. Например ночью из планировщика. Ежедневное пересоздание нужно потому что в процессе изменения данных индексы вырождаются и эффективность их использования снижается.
И предусмотреть возможность запустить принудительно руками в рабочее время, на случай если какой-то сбой железа произойдет и индексы попортятся.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39038035
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESСейчас во всем коде меняю UPDATE на Replace, надеюсь это ускорит работу программы :)
ускорит, если Replace текущей записи. Если Replace for ..., то UPDATE предпочтительнее, т.к. есть ньюансы с блокировками.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с 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
Как ускорить работы с работой с DBF по сети
    #39059010
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Он мне выбирает предыдущее значение, ничего не понимаю, как так-то...
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059017
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из DBF предыдущее?

Посмотри, может буферизация включена
Код: sql
1.
? CURSORGETPROP('Buffering', mNameZ)


Что выдает? Надо 1
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059019
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKES, Вывожу сообщение:

Код: sql
1.
Messagebox(Allt(Str(qZakaz.row_num)),32,'')



и сразу видно, что он использует предыдущий код, может тупо сделать +1, но тут уверенности куда пойдёт пользовать вниз, вверх тлт просто ткнёт мышкой
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059025
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Так и есть:

1 – Row and table buffering is off. (Default)
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059030
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
У меня в начале программы стоит:

Код: sql
1.
Set Multilocks On



Если честно не помню откуда я это взял, может это как-то влияет?

сейчас напишу все ключи

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set Date German
Set Century On
Set Hours To 24
Set Decimals To 2
Set Bell Off
Set Autosave On
Set Exclusive Off
Set Deleted On
Set Multilocks On
Set Point To '.'
Set Fdow To 2
Set Fweek To 3
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059032
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESAngelOKES, Вывожу сообщение:

Код: sql
1.
Messagebox(Allt(Str(qZakaz.row_num)),32,'')



и сразу видно, что он использует предыдущий код, может тупо сделать +1, но тут уверенности куда пойдёт пользовать вниз, вверх тлт просто ткнёт мышкой
Это значит ты еще не ушел с предыдущей строки, когда код отрабатывает. Выводишь откуда? Где поставил Messagebox() ?

тупо +1 не надо. На крайний случай можно изврат с таймером сделать, но сначала без него надо попытаться порешать.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059035
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Вся процедура стоит конечно же в Grid на собитие BeforeRowColChange
Отрабатывает эта процедура когда пользователь перемещается по гриду вниз или вверх
Значение он действительно берёт из записи из которой выходит, а не заходит, проверил и вашим методом и своим
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059036
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESDima T,
У меня в начале программы стоит:
Это нормально, стандартные сеты. Туда пока не заглядывай.
Надо с этим разбираться 18183244 Похоже ты не ту строку меняешь, поэтому нужная не меняется.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059046
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже я затупил :)

BeforeRowColChange() срабатывает на старой записи перед уходом с нее.

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

BeforeRowColChange() срабатывает на старой записи перед уходом с нее.

Надо в AfterRowColChange() прописывать обновление курсора, а в BeforeRowColChange() сохранение результата в таблицу.

Я тоже так подумал, сейчас попробую!
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059066
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И добавь проверку чтобы по несколько раз не писать одно и тоже. Тормозов меньше будет
Добавь форме свойство nLastRow = 0
в коде так использовать
Код: sql
1.
2.
3.
4.
if ThisForm.nLastRow != qZakaz.row_num
   ThisForm.nLastRow = qZakaz.row_num
   ... обновляем qZakaz
endif
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059068
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Да всё работает, а проверка у меня на это событие уже было, получилось что-то вроде этого:

Код: 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.
Lparameters nColIndex
If mKodZap<>qZakaz.kod
	Sele (mNameZ)
	Go (qZakaz.row_num)
	lcAdres1 = Adres1
	lcKodv = kodv
	Repl In qZakaz Adres1 With lcAdres1, kodv With lcKodv
	mKodZap=qZakaz.kod
	mKodVZ=qZakaz.kodv
	With Thisform
		mDataJ=Ctod(.lDataJ.Caption)
		Update (mNameZ) Set blok=0 Where blok=mkodid
		Update (mNameZ) Set blok=mkodid Where kod=mKodZap And blok=0
		.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
		.tDis1.Value = qZakaz.kodd
		.tDis2.Value = qZakaz.kodd2
		.tZakB.Value = qZakaz.kodzakb
		.tKarta.Value = Allt(qZakaz.karta)
		.tSchet.Value = Allt(qZakaz.schet)
		.tNomerT.Value = qZakaz.Tel
		.cK.Enabled = .T.
		.tVod.BackColor = Iif(qZakaz.priz3=.F.,Rgb(225,255,255),Rgb(125,155,155))
		.tVod.Value=mKodVZ
		If mKodVZ<>0 And qZakaz.priz3=.F.
			mDatNtN=mDataJ-Iif(Dow(mDataJ)=1,8,Dow(mDataJ))+2 
			If Indexseek(Str(mKodVZ,5) + Dtoc(mDatNtN, 1), .T., 'saldo', 'kd')
				If saldo.balans<0
					.tVod.BackColor = Rgb(255,0,0)
				Else
					.tVod.BackColor = Rgb(0,255,0)
				Endif
			Endif
		Endif
	Endwith
Endif
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059076
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,
Пришлось всё таки вернуть:

Код: sql
1.
Thisform.Grid1.Column6.Text1.value = lcAdres1



Иначе при повторном входе значение меняется на старое, а с этой строчкой всё ровно, немного непонятно, но вроде работает!
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059081
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AngelOKESс этой строчкой всё ровно, немного непонятно, но вроде работает!
Объекты грида и данные из источника (курсора) хоть и синхронизируются, но не постоянно. Поэтому иногда возможна ситуация что данные в источнике изменились, а грид это не перерисовал. Для этого нужна эта строчка. Можно Refresh() но это более тяжелая операция, т.к. он сразу все видимые строки перерисовывает.
...
Рейтинг: 0 / 0
Как ускорить работы с работой с DBF по сети
    #39059084
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Спасибо! Будем тестировать систему
...
Рейтинг: 0 / 0
65 сообщений из 65, показаны все 3 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как ускорить работы с работой с DBF по сети
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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