Остатки по складам при партионном учете
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2  :| |:
-> Программирование в БЭСТ-4

#16:  Author: nordkLocation: Горбунов Константин PostPosted: 13 Sep 2007 17:46
    —
Плешивцев Евгений wrote:
Более того, фрагмент моей программы (в самом конце):
Quote:
UsDataBase->(dbCloseArea())


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


А вот это непонят

#17:  Author: nordkLocation: Горбунов Константин PostPosted: 13 Sep 2007 18:26
    —
Еще пару комментариев. Думаю это Вам не лишнее будет
Поскольку таблица временная - то ее можно открывать монопольно
и тогда DBUNLOCK() можно не делать.
При больших объемах данных быстрее работает DBEVAL()
чем цикл с перебором. (Труднее отлажива

#18:  Author: nordkLocation: Горбунов Константин PostPosted: 13 Sep 2007 18:32
    —
Преобразую

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))                 ;
                            }) )

#19:  Author: nordkLocation: Горбунов Константин PostPosted: 13 Sep 2007 18:35
    —
Но еще раз повторюсь - сделай по MDOCM будет надежнее и ничуть
не дольше (на глаз незаметно)

#20:  Author: Плешивцев ЕвгенийLocation: Плешивцев Евгений PostPosted: 14 Sep 2007 07:58
    —
Титов Александр wrote:
Эту проблему мы решили, поддержим Scope в DbPush.

добрый день, немного не понятно. dbPush() остается? Он будет дополнительно расширен и модифицирован?

#21:  Author: Плешивцев ЕвгенийLocation: Плешивцев Евгений PostPosted: 14 Sep 2007 08:03
    —
nordk wrote:
Но еще раз повторюсь - сделай по MDOCM будет надежнее и ничуть
не дольше (на глаз незаметно)

Костя, тут такое дело, согласен я с тобой. Но мещански (потребительски) считаю что если с движением порядок, то Компания БЭСТ позаботилась о корректности MKART->KolTek. Если же с движением проблемы / сбои то тут хоть через MDOCM, все равно мусор надо вычищать а картотеку по [F10] пересчитывать.

#22:  Author: nordkLocation: Горбунов Константин PostPosted: 14 Sep 2007 10:54
    —
Да DBPUSH() будет работать - это я оказывается владею
старыми инструкциями.
Что касается MDOCM, -то если делаете аналог по F10 - то он
работает по MDOCM. И это не вина разработчика.
Любое хранилище данных страдает подобными проблемами.
Просто если бы еще в программе было очень жесткое ожидание
блокировок даже, то никто бы не был застрахован от ошибки
связанной при работе на кривом индексе. Т.е. при работе в
сетевом режиме от этой проблемы на 100% застраховаться от пользовательских проблем нельзя, поэтому и написана задача пересчета остатков в картотеке, отсюда и моя рекомендация.
Вы же не хотите чтобы у Вас спрашивали почему у нас вчера
остаток правильно считался а сегодня он перестал считаться.
В итоге Вашей задаче перестанут доверя

#23:  Author: Плешивцев ЕвгенийLocation: Плешивцев Евгений PostPosted: 14 Sep 2007 11:47
    —
вот оптимизированный код, с учетом замечаний Константина. Так же учтены вопросы закрытия БД:
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



-> Программирование в БЭСТ-4


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2  :| |:
Page 2 of 2

Powered by phpBB © 2001, 2005 phpBB Group