| 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 | 
		 | 
	
	
		  | 
	
	
		 |