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

Специалистам по FileEval-помогите пожалуйста
Goto page 1, 2  Next
 
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4
View previous topic :: View next topic  
Author Message
Val



Joined: 21 Jan 2004
Posts: 19
Location: Ц.В.Ю.
Occupation: Бухгалтер программист
Interests: Москва

PostPosted: 13 Nov 2005 20:24    Post subject: Специалистам по FileEval-помогите пожалуйста Reply with quote

//программа должна проверять наличие записей в номенклатурнике с
//файлом в с:\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
View user's profile Send private message
nordk



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

PostPosted: 14 Nov 2005 09:52    Post subject: Re: Специалистам по FileEval-помогите пожалуйста Reply with quote

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



Joined: 21 Jan 2004
Posts: 19
Location: Ц.В.Ю.
Occupation: Бухгалтер программист
Interests: Москва

PostPosted: 15 Nov 2005 01:08    Post subject: изменение не помогло Reply with quote

//изменение не помогло

//полный текст

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



Joined: 03 Jan 2002
Posts: 33
Location: Орлов Д.В.
Occupation: Элипс-Опт
Interests: Москва

PostPosted: 15 Nov 2005 02:40    Post subject: Re: Специалистам по FileEval-помогите пожалуйста Reply with quote

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



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

PostPosted: 15 Nov 2005 08:43    Post subject: Reply with quote

Давайте по порядку
1. Речь идет про HFileEval или про FileEval ?
2. никаких GOTOP() не надо - мы через DBSEEK ищем и вообще работаем с разными алиасами
Честно скажу текст не проверял но для HfileEval все написано точно.
Работать должно без проблем (нужно только в отладчике убедиться что там где вы используете задачу алиас mlabel существует)
В FileEval работать не должно в принципе
через := в поле не положить
надо делать MLABEL->( FIELDPUT(FIELDPOS("GRUP"),NewMlabal->GRUP) )
Back to top
View user's profile Send private message Send e-mail
dmitry



Joined: 03 Jan 2002
Posts: 33
Location: Орлов Д.В.
Occupation: Элипс-Опт
Interests: Москва

PostPosted: 16 Nov 2005 00:56    Post subject: Reply with quote

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
View user's profile Send private message Send e-mail Visit poster's website
Val



Joined: 21 Jan 2004
Posts: 19
Location: Ц.В.Ю.
Occupation: Бухгалтер программист
Interests: Москва

PostPosted: 16 Nov 2005 00:57    Post subject: ну вот, теперь я уже окончательно запутался Reply with quote


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
View user's profile Send private message
Яков



Joined: 04 Mar 2002
Posts: 618
Location: Яков
Occupation: Экстремальная терапия бизнеса
Interests: Владивосток

PostPosted: 16 Nov 2005 07:24    Post subject: Reply with quote

Делаю на фоксе что-то похожее со справочником партнеров через буфер.
ТАК:
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
View user's profile Send private message Send e-mail Visit poster's website
nordk



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

PostPosted: 16 Nov 2005 09:24    Post subject: Reply with quote

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



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

PostPosted: 16 Nov 2005 09:41    Post subject: Reply with quote

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



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

PostPosted: 16 Nov 2005 09:47    Post subject: Reply with quote

Для Якова

Каждый волен писать на чем угодно, но здесь мы учимся пользоваться харбором и я считаю это правильнее потому что
это встроенный механизм и буферы ему не нужны.
Back to top
View user's profile Send private message Send e-mail
Яков



Joined: 04 Mar 2002
Posts: 618
Location: Яков
Occupation: Экстремальная терапия бизнеса
Interests: Владивосток

PostPosted: 16 Nov 2005 11:19    Post subject: Reply with quote

nordk wrote:
Каждый волен писать на чем угодно, но здесь мы учимся пользоваться харбором и я считаю это правильнее потому что
это встроенный механизм и буферы ему не нужны.

Да я не против.
Просто на данном примере я предложил немного другой алгоритм,
который можно реализовать на любом инструменте,
который как мне кажется будет работать быстрее.
А инструмент конечной реализации каждый выбирает сам.
И буферы тут ни при чем.
Back to top
View user's profile Send private message Send e-mail Visit poster's website
shura_k



Joined: 10 Oct 2003
Posts: 342
Location: Александр
Occupation: Специалист
Interests: Калининград

PostPosted: 16 Nov 2005 11:40    Post subject: Reply with quote

Работает на 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
View user's profile Send private message
nordk



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

PostPosted: 16 Nov 2005 14:03    Post subject: Reply with quote

ЯКОВ wrote:
Просто на данном примере я предложил немного другой алгоритм,
который можно реализовать на любом инструменте,
который как мне кажется будет работать быстрее.
А инструмент конечной реализации каждый выбирает сам.


Поиска быстрее чем по индексу нет. Полагаю Ваше мнение ошибочным
Хотя в плане поиска фокс самый быстрый язык и возможно тут есть правда - но в харборе извините не согласен. Это лично мое мнение
Back to top
View user's profile Send private message Send e-mail
Олег Смирнов



Joined: 06 Sep 2004
Posts: 821
Location: Олег Смирнов
Occupation: Раут (поганист-сисадмин)
Interests: Новосибирск

PostPosted: 16 Nov 2005 18:24    Post subject: Reply with quote

ЯКОВ wrote:

Code:

...
USE D:\BESTBUH4\PAL_2005\part.DBF ORDER CODE in 2
...
   SEEK UPPER(partner.code)


В таком виде будет работать быстрее. Locate - вполне дебильная функция для поиска чего-то, что не учавствует ни в каком индексе. Тупо ищет полным перебором с самого начала файл
_________________
С уважением, Олег Р. Смирн
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 1, 2  Next
Page 1 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