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