View previous topic :: View next topic |
Author |
Message |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 13 Sep 2007 17:46 Post subject: |
|
|
Плешивцев Евгений wrote: | Более того, фрагмент моей программы (в самом конце):
Quote: | UsDataBase->(dbCloseArea()) |
наотрез не работает если не поставить эти операторные скобки. |
А вот это непонят |
|
Back to top |
|
|
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 13 Sep 2007 18:26 Post subject: |
|
|
Еще пару комментариев. Думаю это Вам не лишнее будет
Поскольку таблица временная - то ее можно открывать монопольно
и тогда DBUNLOCK() можно не делать.
При больших объемах данных быстрее работает DBEVAL()
чем цикл с перебором. (Труднее отлажива |
|
Back to top |
|
|
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 13 Sep 2007 18:32 Post subject: |
|
|
Преобразую
Code: | mkart->(dbGoTop())
if mkart->(!Eof())
do while mkart->(!Eof())
aBuf[1]:= mkart->Sclad
aBuf[2]:= mkart->KolTek
UsDataBase->(AddRec())
UsDataBase->(Gather(aBuf))
UsDataBase->(dbUnLock())
mkart->(dbSkip())
enddo
endif |
Code: | mkart->( DBEVAL({|aBuf|aBuf:={mkart->SCLAD,mkart->KolTek},;
UsDataBase->( Addrec() ), ;
UsDataBase->(Gather(aBuf)) ;
}) ) |
|
|
Back to top |
|
|
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 13 Sep 2007 18:35 Post subject: |
|
|
Но еще раз повторюсь - сделай по MDOCM будет надежнее и ничуть
не дольше (на глаз незаметно) |
|
Back to top |
|
|
Плешивцев Евгений
Joined: 03 Apr 2007 Posts: 95 Location: Плешивцев Евгений
Interests: Волгоград
|
Posted: 14 Sep 2007 07:58 Post subject: |
|
|
Титов Александр wrote: | Эту проблему мы решили, поддержим Scope в DbPush. |
добрый день, немного не понятно. dbPush() остается? Он будет дополнительно расширен и модифицирован? |
|
Back to top |
|
|
Плешивцев Евгений
Joined: 03 Apr 2007 Posts: 95 Location: Плешивцев Евгений
Interests: Волгоград
|
Posted: 14 Sep 2007 08:03 Post subject: |
|
|
nordk wrote: | Но еще раз повторюсь - сделай по MDOCM будет надежнее и ничуть
не дольше (на глаз незаметно) |
Костя, тут такое дело, согласен я с тобой. Но мещански (потребительски) считаю что если с движением порядок, то Компания БЭСТ позаботилась о корректности MKART->KolTek. Если же с движением проблемы / сбои то тут хоть через MDOCM, все равно мусор надо вычищать а картотеку по [F10] пересчитывать. |
|
Back to top |
|
|
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 14 Sep 2007 10:54 Post subject: |
|
|
Да DBPUSH() будет работать - это я оказывается владею
старыми инструкциями.
Что касается MDOCM, -то если делаете аналог по F10 - то он
работает по MDOCM. И это не вина разработчика.
Любое хранилище данных страдает подобными проблемами.
Просто если бы еще в программе было очень жесткое ожидание
блокировок даже, то никто бы не был застрахован от ошибки
связанной при работе на кривом индексе. Т.е. при работе в
сетевом режиме от этой проблемы на 100% застраховаться от пользовательских проблем нельзя, поэтому и написана задача пересчета остатков в картотеке, отсюда и моя рекомендация.
Вы же не хотите чтобы у Вас спрашивали почему у нас вчера
остаток правильно считался а сегодня он перестал считаться.
В итоге Вашей задаче перестанут доверя |
|
Back to top |
|
|
Плешивцев Евгений
Joined: 03 Apr 2007 Posts: 95 Location: Плешивцев Евгений
Interests: Волгоград
|
Posted: 14 Sep 2007 11:47 Post subject: |
|
|
вот оптимизированный код, с учетом замечаний Константина. Так же учтены вопросы закрытия БД:
Code: | //-------------------------------------------------------
// Расчет и вывод на печать остатков по складам
// из номенклатурного справочника.
// Аналог [F10] в номенклатурном справочнике.
// свернуто по партиям
// вер. 1.1 от 12/09/07
// разработано для Б-4+ 12.01 harbour
// разработано для Кофе-тайм
// вызывается из номенклатурного справочника
// вер 1.1 - оптимизирован код
Function user_ostat_nomspr()
Local cGrup:=''
Local cNNum:=''
Local cSclad:=''
Local aStru:={}
Local aBuf:={'',0}
Local cDataBase:=''
Local aMsg:={}
Local cName:=''
Local nSum_Kol:=0
Local aSet:={}
Altd()
aSet=SaveSet()
cGrup:=mlabel->Grup
cNNum:=mlabel->NNum
cName:=Alltrim(Mlabel->Name)+'; '+alltrim(mlabel->Marka)+'; '+alltrim(mlabel->Razmer)
// таблица UsDataBase для группировки кол-ва по складам
aAdd(aStru,{"Sclad","C",6,0})
aAdd(aStru,{"Kol" ,"N",9,3})
cDataBase:=TEMPFILE(GlobalTmpPath,"dbf")
DBCreate(cDataBase,aStru)
Use &cDataBase Alias UsDataBase New EXCLUSIVE
// заполним таблицу UsDataBase
dbPush('mkart','mkart','Empty(mkart->partia)=.t.',;
{'Upper(Grup+NNum)', Upper(cGrup+cNNum)})
mkart->(DBEVAL({|| aBuf:={mkart->SCLAD,mkart->KolTek},;
UsDataBase->( Addrec() ),;
UsDataBase->(Gather(aBuf))}))
dbPop()
Sum UsDataBase->Kol to nSum_kol
// вывод на печать
aAdd(aMsg, 'Остатки товара: '+cName)
aAdd(aMsg, '----------------------')
aAdd(aMsg, '| Склад | Количество|')
aAdd(aMsg, '----------------------')
UsDataBase->(dbEval({|| aAdd(aMsg,'| '+UsDataBase->Sclad+' | '+str(UsDataBase->Kol,9,3)+' |')}))
aADD(aMsg, '----------------------')
aAdd(aMsg, '|Итого | '+str(nSum_Kol,9,3)+' |')
View(aMsg)
UsDataBase->(dbClosearea())
RESTSET(aSet)
return nil |
|
|
Back to top |
|
|
|