| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| Val 
 
 
 Joined: 21 Jan 2004
 Posts: 19
 Location: Ц.В.Ю.
 Occupation: Бухгалтер программист
 Interests: Москва
 
 | 
			
				|  Posted: 13 Nov 2005 20:24    Post subject: Специалистам по FileEval-помогите пожалуйста |   |  
				| 
 |  
				| //программа должна проверять наличие записей в номенклатурнике с //файлом в с:\temp\mlabel.dbf и добавлять отсутствующие
 //сейчас она их добавляет все (включая уже существующие)
 
 
 
  	  | Code: |  	  | Private cPath cPath:="c:\temp\"
 if !file(cPath+"Mlabel.dbf")
 sayandwait("ЌҐ  ©¤Ґ д ©« Ї® ЇгвЁ "+cPath +" !")
 else
 NetUse("NewMlabal",cPath+"Mlabel.dbf")
 NewMlabal->(dbsetindex(cPath+"Mlabel.cdx"))
 NewMlabal->(OrdSetFocus("tag_MLABEL"))
 Mlabel->(OrdSetFocus("Mlabel"))
 NewMLabal->(DbGotop())
 Do While NewMlabal->(!eof())
 Mlabel->(DbGotop())
 if Mlabel->(DbSeek(upper(NewMlabal->(grup+nnum))))
 else
 
 mlabel->(RecLOCK())
 mlabel->(addrec())
 
 mlabel->grup:=NewMlabal->grup
 mlabel->nnum:=NewMlabal->nnum
 
 mlabel->(f_dbunlock())
 endif
 NewMlabal->(DBskip())
 enddo
 | 
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| nordk 
 
 
 Joined: 27 Jun 2005
 Posts: 1000
 Location: Горбунов Константин
 Occupation: БЭСТ-Партнер
 Interests: СПб
 
 | 
			
				|  Posted: 14 Nov 2005 09:52    Post subject: Re: Специалистам по FileEval-помогите пожалуйста |   |  
				| 
 |  
				|  	  | Val wrote: |  	  | //программа должна проверять наличие записей в номенклатурнике с //файлом в с:\temp\mlabel.dbf и добавлять отсутствующие
 //сейчас она их добавляет все (включая уже существующие)
 
 
 
  	  | Code: |  	  | Do While NewMlabal->(!eof()) Mlabel->(DbGotop())
 if Mlabel->(DbSeek(upper(NewMlabal->(grup+nnum))))
 else
 
 mlabel->(RecLOCK())
 mlabel->(addrec())
 
 mlabel->grup:=NewMlabal->grup
 mlabel->nnum:=NewMlabal->nnum
 
 mlabel->(f_dbunlock())
 endif
 NewMlabal->(DBskip())
 enddo
 | 
 | 
 
 
  	  | Code: |  	  | Do While NewMlabal->(!eof()) if !Mlabel->(DbSeek(upper(NewMlabal->(grup+nnum)))
 mlabel->(addrec())
 mlabel->grup:=NewMlabal->grup
 mlabel->nnum:=NewMlabal->nnum
 mlabel->(f_dbunlock())
 endif
 NewMlabal->(DBskip())
 enddo
 mlabel->( DBCOMMIT() )
 
 | 
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Val 
 
 
 Joined: 21 Jan 2004
 Posts: 19
 Location: Ц.В.Ю.
 Occupation: Бухгалтер программист
 Interests: Москва
 
 | 
			
				|  Posted: 15 Nov 2005 01:08    Post subject: изменение не помогло |   |  
				| 
 |  
				| //изменение не помогло 
 //полный текст
 
 Private cPath
 cPath:="c:\temp\"
 if !file(cPath+"Mlabel.dbf")
 sayandwait("¥  ©¤¥ ä ©« ¯® ¯ã⨠"+cPath +" !")
 else
 NetUse("NewMlabal",cPath+"Mlabel.dbf")
 NewMlabal->(dbsetindex(cPath+"Mlabel.cdx"))
 NewMlabal->(OrdSetFocus("tag_MLABEL"))
 Mlabel->(OrdSetFocus("Mlabel"))
 NewMLabal->(DbGotop())
 Do While NewMlabal->(!eof())
 if !Mlabel->(DbSeek(upper(NewMlabal->(grup+nnum))))
 mlabel->(addrec())
 mlabel->grup:=NewMlabal->grup
 mlabel->nnum:=NewMlabal->nnum
 mlabel->(f_dbunlock())
 endif
 NewMlabal->(DBskip())
 enddo
 mlabel->( DBCOMMIT() )
 endif
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| dmitry 
 
  
 Joined: 03 Jan 2002
 Posts: 33
 Location: Орлов Д.В.
 Occupation: Элипс-Опт
 Interests: Москва
 
 | 
			
				|  Posted: 15 Nov 2005 02:40    Post subject: Re: Специалистам по FileEval-помогите пожалуйста |   |  
				| 
 |  
				|  	  | nordk wrote: |  	  |  	  | Code: |  	  | Do While NewMlabal->(!eof()) if !Mlabel->(DbSeek(upper(NewMlabal->(grup+nnum)))
 mlabel->(addrec())
 mlabel->grup:=NewMlabal->grup
 mlabel->nnum:=NewMlabal->nnum
 mlabel->(f_dbunlock())
 endif
 NewMlabal->(DBskip())
 enddo
 mlabel->( DBCOMMIT() )
 
 | 
 | 
 Не работает. Константин, а Вы код проверяли перед тем как постить его сюда?
 Не хватает команды Mlabel->(dbgotop()) после строки Do While NewMlabal->(!eof()), ведь дальше будет поиск, а указатель сам не умеет возвращаться на первую логическую запись.
 Но при этом наблюдается странная вещь. Если использовать Mlabel->(dbgotop()), то указатель падает за пределы наших записей в Mlabel. Почему?
 Да и DbSeek почему-то не работает. И все это на демобаз
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| nordk 
 
 
 Joined: 27 Jun 2005
 Posts: 1000
 Location: Горбунов Константин
 Occupation: БЭСТ-Партнер
 Interests: СПб
 
 | 
			
				|  Posted: 15 Nov 2005 08:43    Post subject: |   |  
				| 
 |  
				| Давайте по порядку 1. Речь идет про HFileEval или про FileEval ?
 2. никаких GOTOP() не надо - мы через DBSEEK ищем и вообще работаем с разными алиасами
 Честно скажу текст не проверял но для HfileEval все написано точно.
 Работать должно без проблем (нужно только в отладчике убедиться что там где вы используете задачу алиас mlabel существует)
 В FileEval работать не должно в принципе
 через := в поле не положить
 надо делать MLABEL->( FIELDPUT(FIELDPOS("GRUP"),NewMlabal->GRUP) )
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| dmitry 
 
  
 Joined: 03 Jan 2002
 Posts: 33
 Location: Орлов Д.В.
 Occupation: Элипс-Опт
 Interests: Москва
 
 | 
			
				|  Posted: 16 Nov 2005 00:56    Post subject: |   |  
				| 
 |  
				|  	  | nordk wrote: |  	  | Давайте по порядку 1. Речь идет про HFileEval или про FileEval ?
 | 
 Все равно. Это слишком простая ситуация, которая должна работать и там и там. Но не работает.
 
  	  | nordk wrote: |  	  | 2. никаких GOTOP() не надо - мы через DBSEEK ищем и вообще работаем с разными алиасами | 
 Из NewMlabal мы берем выражение поиска, а ищем в Mlabel. Если я искал и нашел, значит указатель стоит уже не на первой логической записи файла, по которому осуществляется поиск. Он разве сам вернется? Нет. Поэтому я применяю DbGoTop(), чтобы гарантировано начинать поиск с начала.
 
  	  | nordk wrote: |  	  | Честно скажу текст не проверял но для HfileEval все написано точно.
 Работать должно без проблем (нужно только в отладчике убедиться что там где вы используете задачу алиас mlabel существует)
 | 
 А зря. Если бы Вы проверили, мы бы могли быстрее решить проблему.
 
  	  | nordk wrote: |  	  | В FileEval работать не должно в принципе
 
 | 
 Кто Вам это сказал?
 
  	  | nordk wrote: |  	  | через := в поле не положить
 надо делать MLABEL->( FIELDPUT(FIELDPOS("GRUP"),NewMlabal->GRUP) )
 | 
 Разве xHarbour не поддерживает стандартную нотацию Клиппера? Откуда такая информация? Мы наверное пользуемся разными источниками, потому что мои говорят, что
 
  	  | Quote: |  	  | • Syntax
 <VariableId> := <Expression>
 • Description
 This operator assigns the value of <Expression> (which can be of any data type) to the variable <VariableId> (which can be of any storage class). The expression <Expression> is evaluated and assigned to <VariableId>.
 
 | 
 
 Last edited by dmitry on 16 Nov 2005 01:07; edited 1 time in total
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Val 
 
 
 Joined: 21 Jan 2004
 Posts: 19
 Location: Ц.В.Ю.
 Occupation: Бухгалтер программист
 Interests: Москва
 
 | 
			
				|  Posted: 16 Nov 2005 00:57    Post subject: ну вот, теперь я уже окончательно запутался |   |  
				| 
 |  
				|   Private cPath
 cPath:="c:\temp\"
 if !file(cPath+"Mlabel.dbf")
 sayandwait("ЌҐ  ©¤Ґ д ©« Ї® ЇгвЁ "+cPath +" !")
 else
 NetUse("NewMlabal",cPath+"Mlabel.dbf")
 NewMlabal->(dbsetindex(cPath+"Mlabel.cdx"))
 NewMlabal->(OrdSetFocus("MLABEL"))
 Mlabel->(OrdSetFocus("Mlabel"))
 NewMLabal->(DbGotop())
 Do While NewMlabal->(!eof())
 //    Mlabel->(dbgotop())
 if !Mlabel->(DbSeek(upper(NewMlabal->(grup+nnum))))
 mlabel->(addrec())
 MLABEL->( FIELDPUT(FIELDPOS("GRUP"),NewMlabal->GRUP) )
 MLABEL->( FIELDPUT(FIELDPOS("nnum"),NewMlabal->nnum) )
 // mlabel->grup:=NewMlabal->grup
 //                     mlabel->nnum:=NewMlabal->nnum
 mlabel->(f_dbunlock())
 endif
 NewMlabal->(DBskip())
 enddo
 endif
 mlabel->( DBCOMMIT() )
 
 Компиляция в HFileEval прошла без ошибок, подключил файл в товары в номенклатурник. Результат такой же как и в FileEval (записи в номенклатурник попадают все)
 Подскажите плиз что я делаю не правиль
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Яков 
 
  
 Joined: 04 Mar 2002
 Posts: 618
 Location: Яков
 Occupation: Экстремальная терапия бизнеса
 Interests: Владивосток
 
 | 
			
				|  Posted: 16 Nov 2005 07:24    Post subject: |   |  
				| 
 |  
				| Делаю на фоксе что-то похожее со справочником партнеров через буфер. ТАК:
 
  	  | Code: |  	  | SET DELETED on copy file H:\BEST2005\pal_2005\partner.DBF to  D:\BESTBUH4\PAL_2005\part.DBF
 USE D:\BESTBUH4\PAL_2005\part.DBF in 2
 USE D:\BESTBUH4\PAL_2005\partner.DBF in 1
 
 SELECT 1
 SCAN
 SELECT 2
 LOCATE FOR  (part.code=partner.code)
 DO WHILE FOUND()
 delete
 CONTINUE
 ENDDO
 select 1
 ENDSCAN
 close database
 USE D:\BESTBUH4\PAL_2005\part.DBF
 pack
 close database
 quit
 | 
 Затем получившийся буфер после обработки добавляю appendom
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| nordk 
 
 
 Joined: 27 Jun 2005
 Posts: 1000
 Location: Горбунов Константин
 Occupation: БЭСТ-Партнер
 Interests: СПб
 
 | 
			
				|  Posted: 16 Nov 2005 09:24    Post subject: |   |  
				| 
 |  
				|  	  | dmitry wrote: |  	  |  	  | nordk wrote: |  	  | Давайте по порядку 1. Речь идет про HFileEval или про FileEval ?
 | 
 Все равно. Это слишком простая ситуация, которая должна работать и там и там. Но не работает.
 | 
 
 Дело не в ситуации. FileEval это очень притянутая за уши досовская платформа. И она не может работать просто. Поэтому написание и там и там абсолютное разное по способам решения и в мелочах.
 И еще FileEval имеет свойство прекращать работу на середине если что-то ему не нравится и говорить Вам что все выполнено и Вам нужно в рукопашную искать точку проблемы, а Вы на ровном месте начинаете делать выводы что все не работает на абсолютно правильном алгоритме, а всего-то где-то синтаксис не тот и все.
 Поэтому я и говорю везде переход на харбор это ОЧЕНЬ ВАЖНО
 
 
 
  	  | Quote: |  	  | 2. никаких GOTOP() не надо - мы через DBSEEK ищем и вообще работаем с разными алиасами Из NewMlabal мы берем выражение поиска, а ищем в Mlabel. Если я искал и нашел, значит указатель стоит уже не на первой логической записи файла, по которому осуществляется поиск. Он разве сам вернется? Нет. Поэтому я применяю DbGoTop(), чтобы гарантировано начинать поиск с начала.
 
 | 
 Извините но здесь Вы не понимаете функцию DBSEEK()
 Она всегда ищет сначала и всегда встает на первую найденную - не надо думать что она начинает искать с места нахождения курсора.
 Так что Ваше гарантированно - масло масленное
 
 
  	  | Quote: |  	  | Честно скажу текст не проверял но для HfileEval все написано точно.
 Работать должно без проблем (нужно только в отладчике убедиться что там где вы используете задачу алиас mlabel существует)
 А зря. Если бы Вы проверили, мы бы могли быстрее решить проблему.
 
 | 
 Ну вобщем-то у меня тоже есть еще и другие обязанности. Здесь я
 помогаю по мере возможности. Стараюсь чаще как могу и написал
 так из двух соображений
 1.Научить пользоваться инструментом и не зависить от своевременности консультации впредь в таких вопросах
 2.Совместный диалог посмотрите и скажите что не получилось в данный момент быстрее. Вопросов много задают и вопросы есть очень сложные, которые надо в текстах долго выискивать - всем надо помочь
 
 
  	  | Quote: |  	  | В FileEval работать не должно в принципе
 
 Кто Вам это сказал?
 
 | 
 Мой многолетний опыт применения этого FileEval - целый модуль на нем написан тексты приличных размеров отладить это наверно что-то значит ?
 
 
  	  | Quote: |  	  | через := в поле не положить
 надо делать MLABEL->( FIELDPUT(FIELDPOS("GRUP"),NewMlabal->GRUP) )
 Разве xHarbour не поддерживает стандартную нотацию Клиппера? Откуда такая информация? Мы наверное пользуемся разными источниками, потому что мои говорят, что
 
 | 
 Еще раз повторяю или перечитайте выше в харборе работает а в FileEval нет - потому что он не харбор.
 КОгда задаете вопрос очень важно на чем делаете FileEval или HFileEval - разница огромн
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| nordk 
 
 
 Joined: 27 Jun 2005
 Posts: 1000
 Location: Горбунов Константин
 Occupation: БЭСТ-Партнер
 Interests: СПб
 
 | 
			
				|  Posted: 16 Nov 2005 09:41    Post subject: |   |  
				| 
 |  
				| Для Val Извините за задержку - вчера целый день были важные переговоры.
 Отлично сделали.
 Теперь в заголовок программы давайте добавим ALTD() и откомпилируем с отладчиком.
 Дальше давайте пойдем отладчиком по строкам нажимая на кнопку F8
 и по движению периодически заглядывайте в таблицы mlabel и NewMlabal
 Вы все увидите как на ладони. Если что будет непонятно - сразу напишите.
 и еще уберите плз
 NewMlabal->(dbsetindex(cPath+"Mlabel.cdx"))
 в отладчике вы увидите что он и так уже с индексом открывает таблицу
 Здесь для харбора лучше не так
 DbSeek(upper(NewMlabal->(grup+nnum)))
 а DBSEEK(UPPER(NewMlabal->GRUP+NewMlabal->NNUM)) правильнее просто но и та строка вполне возможно отрабатывает корректно и
 попробуем изменить
 NetUse("NewMlabal",cPath+"Mlabel.dbf",,.F.)
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| nordk 
 
 
 Joined: 27 Jun 2005
 Posts: 1000
 Location: Горбунов Константин
 Occupation: БЭСТ-Партнер
 Interests: СПб
 
 | 
			
				|  Posted: 16 Nov 2005 09:47    Post subject: |   |  
				| 
 |  
				| Для Якова 
 Каждый волен писать на чем угодно, но здесь мы учимся пользоваться харбором и я считаю это правильнее потому что
 это встроенный механизм и буферы ему не нужны.
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Яков 
 
  
 Joined: 04 Mar 2002
 Posts: 618
 Location: Яков
 Occupation: Экстремальная терапия бизнеса
 Interests: Владивосток
 
 | 
			
				|  Posted: 16 Nov 2005 11:19    Post subject: |   |  
				| 
 |  
				|  	  | nordk wrote: |  	  | Каждый волен писать на чем угодно, но здесь мы учимся пользоваться харбором и я считаю это правильнее потому что это встроенный механизм и буферы ему не нужны.
 | 
 Да я не против.
 Просто на данном примере я предложил немного другой алгоритм,
 который можно реализовать на любом инструменте,
 который как мне кажется будет работать быстрее.
 А инструмент конечной реализации каждый выбирает сам.
 И буферы тут ни при чем.
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| shura_k 
 
 
 Joined: 10 Oct 2003
 Posts: 342
 Location: Александр
 Occupation: Специалист
 Interests: Калининград
 
 | 
			
				|  Posted: 16 Nov 2005 11:40    Post subject: |   |  
				| 
 |  
				| Работает на 100%   
  	  | Quote: |  	  | Private cAlias,aStru
 
 if type('aPars')!='A'
 exit()
 endif
 
 if len(aPars)==0
 exit()
 endif
 
 cAlias:=SELECT()
 
 //Save
 if aPars[1]==1
 dbSelectArea("mlabel")
 dbpush()
 mlabel->(ordsetfocus("MLABEL"))
 mlabel->(dbGoTop())
 aStru:=DBSTRUCT()
 if !FILE("exchange\copynnum.dbf")
 dbCreate("exchange\copynnum.dbf", aStru)
 endif
 dbCreate( "exchange\nnum.dbf", aStru)
 NETUSE("nnum","exchange\nnum",,.F.)
 NETUSE("copy","exchange\copynnum",,.F.)
 copy->(ordcreate("exchange\copynnum","copynnum","UPPER(GRUP+NNUM+NAME+STR(CENA)+STR(OCENA1)+STR(OCENA2)+STR(OCENA3)+STR(OCENA4)+STR(VCENA1)+STR(VCENA2)+STR(VCENA3)+STR(VCENA4))"))
 nnum->(ordcreate("exchange\nnum","nnum","UPPER(GRUP+NNUM)"))
 While(mlabel->(!EOF()))
 IF !copy->(DBSEEK(mlabel->(UPPER(GRUP+NNUM+NAME+STR(CENA)+STR(OCENA1)+STR(OCENA2)+STR(OCENA3)+STR(OCENA4)+STR(VCENA1)+STR(VCENA2)+STR(VCENA3)+STR(VCENA4)))))
 nnum->(AddRec())
 nnum->(Gather(mlabel->(Scatter())))
 nnum->(DbUnLock())
 endif
 mlabel->(dbSkip())
 EndDo
 
 mlabel->(dbGoTop())
 While(mlabel->(!EOF()))
 IF !copy->(DBSEEK(mlabel->(UPPER(grup+nnum))))
 copy->(AddRec())
 else
 copy->(RecLock())
 endif
 copy->(Gather(mlabel->(Scatter())))
 copy->(DbUnLock())
 mlabel->(dbSkip())
 EndDo
 
 copy->(dbCloseArea())
 nnum->(dbCloseArea())
 dbpop()
 
 endif
 
 // Load
 if aPars[1]==2
 
 if !FILE("exchange\nnum.dbf")
 return
 endif
 
 dbSelectArea("mlabel")
 dbpush()
 mlabel->(ordsetfocus("MLABEL"))
 mlabel->(dbGoTop())
 NETUSE("nnum","exchange\nnum",,.F.)
 nnum->(ordcreate("exchange\nnum","nnum","UPPER(GRUP+NNUM)"))
 nnum->(dbGoTop())
 While(nnum->(!EOF()))
 IF !mlabel->(DBSEEK(nnum->(UPPER(grup+nnum))))
 mlabel->(AddRec())
 else
 mlabel->(RecLock())
 endif
 mlabel->(Gather(nnum->(Scatter())))
 mlabel->(DbUnLock())
 nnum->(dbSkip())
 EndDo
 
 nnum->(dbCloseArea())
 dbpop()
 endif
 
 dbSelectArea(cAlias)
 
 | 
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| nordk 
 
 
 Joined: 27 Jun 2005
 Posts: 1000
 Location: Горбунов Константин
 Occupation: БЭСТ-Партнер
 Interests: СПб
 
 | 
			
				|  Posted: 16 Nov 2005 14:03    Post subject: |   |  
				| 
 |  
				|  	  | ЯКОВ wrote: |  	  | Просто на данном примере я предложил немного другой алгоритм, который можно реализовать на любом инструменте,
 который как мне кажется будет работать быстрее.
 А инструмент конечной реализации каждый выбирает сам.
 
 | 
 
 Поиска быстрее чем по индексу нет. Полагаю Ваше мнение ошибочным
 Хотя в плане поиска фокс самый быстрый язык и возможно тут есть правда - но в харборе извините не согласен. Это лично мое мнение
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Олег Смирнов 
 
 
 Joined: 06 Sep 2004
 Posts: 821
 Location: Олег Смирнов
 Occupation: Раут (поганист-сисадмин)
 Interests: Новосибирск
 
 | 
			
				|  Posted: 16 Nov 2005 18:24    Post subject: |   |  
				| 
 |  
				|  	  | ЯКОВ wrote: |  	  | 
  	  | Code: |  	  | ...
 USE D:\BESTBUH4\PAL_2005\part.DBF ORDER CODE in 2
 ...
 SEEK UPPER(partner.code)
 | 
 
 | 
 В таком виде будет работать быстрее. Locate - вполне дебильная функция для поиска чего-то, что не учавствует ни в каком индексе. Тупо ищет полным перебором с самого начала файл
 _________________
 С уважением, Олег Р. Смирн
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		|  |