Главная
Новый форум
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Остатки по складам при партионном учете
Goto page Previous  1, 2
 
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4
View previous topic :: View next topic  
Author Message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 13 Sep 2007 17:46    Post subject: Reply with quote

Плешивцев Евгений wrote:
Более того, фрагмент моей программы (в самом конце):
Quote:
UsDataBase->(dbCloseArea())


наотрез не работает если не поставить эти операторные скобки.


А вот это непонят
Back to top
View user's profile Send private message Send e-mail
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 13 Sep 2007 18:26    Post subject: Reply with quote

Еще пару комментариев. Думаю это Вам не лишнее будет
Поскольку таблица временная - то ее можно открывать монопольно
и тогда DBUNLOCK() можно не делать.
При больших объемах данных быстрее работает DBEVAL()
чем цикл с перебором. (Труднее отлажива
Back to top
View user's profile Send private message Send e-mail
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 13 Sep 2007 18:32    Post subject: Reply with quote

Преобразую

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
View user's profile Send private message Send e-mail
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 13 Sep 2007 18:35    Post subject: Reply with quote

Но еще раз повторюсь - сделай по MDOCM будет надежнее и ничуть
не дольше (на глаз незаметно)
Back to top
View user's profile Send private message Send e-mail
Плешивцев Евгений



Joined: 03 Apr 2007
Posts: 95
Location: Плешивцев Евгений

Interests: Волгоград

PostPosted: 14 Sep 2007 07:58    Post subject: Reply with quote

Титов Александр wrote:
Эту проблему мы решили, поддержим Scope в DbPush.

добрый день, немного не понятно. dbPush() остается? Он будет дополнительно расширен и модифицирован?
Back to top
View user's profile Send private message
Плешивцев Евгений



Joined: 03 Apr 2007
Posts: 95
Location: Плешивцев Евгений

Interests: Волгоград

PostPosted: 14 Sep 2007 08:03    Post subject: Reply with quote

nordk wrote:
Но еще раз повторюсь - сделай по MDOCM будет надежнее и ничуть
не дольше (на глаз незаметно)

Костя, тут такое дело, согласен я с тобой. Но мещански (потребительски) считаю что если с движением порядок, то Компания БЭСТ позаботилась о корректности MKART->KolTek. Если же с движением проблемы / сбои то тут хоть через MDOCM, все равно мусор надо вычищать а картотеку по [F10] пересчитывать.
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 14 Sep 2007 10:54    Post subject: Reply with quote

Да DBPUSH() будет работать - это я оказывается владею
старыми инструкциями.
Что касается MDOCM, -то если делаете аналог по F10 - то он
работает по MDOCM. И это не вина разработчика.
Любое хранилище данных страдает подобными проблемами.
Просто если бы еще в программе было очень жесткое ожидание
блокировок даже, то никто бы не был застрахован от ошибки
связанной при работе на кривом индексе. Т.е. при работе в
сетевом режиме от этой проблемы на 100% застраховаться от пользовательских проблем нельзя, поэтому и написана задача пересчета остатков в картотеке, отсюда и моя рекомендация.
Вы же не хотите чтобы у Вас спрашивали почему у нас вчера
остаток правильно считался а сегодня он перестал считаться.
В итоге Вашей задаче перестанут доверя
Back to top
View user's profile Send private message Send e-mail
Плешивцев Евгений



Joined: 03 Apr 2007
Posts: 95
Location: Плешивцев Евгений

Interests: Волгоград

PostPosted: 14 Sep 2007 11:47    Post subject: Reply with quote

вот оптимизированный код, с учетом замечаний Константина. Так же учтены вопросы закрытия БД:
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
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4 All times are GMT + 4 Hours
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © phpBB Group

Rambler
Rambler's Top100 Рейтинг@Mail.ru