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

#1: Специалистам по FileEval-помогите пожалуйста Author: ValLocation: Ц.В.Ю. PostPosted: 13 Nov 2005 20:24
    —
//программа должна проверять наличие записей в номенклатурнике с
//файлом в с:\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

#2: Re: Специалистам по FileEval-помогите пожалуйста Author: nordkLocation: Горбунов Константин PostPosted: 14 Nov 2005 09:52
    —
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() )

#3: изменение не помогло Author: ValLocation: Ц.В.Ю. PostPosted: 15 Nov 2005 01:08
    —
//изменение не помогло

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

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

#4: Re: Специалистам по FileEval-помогите пожалуйста Author: dmitryLocation: Орлов Д.В. PostPosted: 15 Nov 2005 02:40
    —
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 почему-то не работает. И все это на демобаз

#5:  Author: nordkLocation: Горбунов Константин PostPosted: 15 Nov 2005 08:43
    —
Давайте по порядку
1. Речь идет про HFileEval или про FileEval ?
2. никаких GOTOP() не надо - мы через DBSEEK ищем и вообще работаем с разными алиасами
Честно скажу текст не проверял но для HfileEval все написано точно.
Работать должно без проблем (нужно только в отладчике убедиться что там где вы используете задачу алиас mlabel существует)
В FileEval работать не должно в принципе
через := в поле не положить
надо делать MLABEL->( FIELDPUT(FIELDPOS("GRUP"),NewMlabal->GRUP) )

#6:  Author: dmitryLocation: Орлов Д.В. PostPosted: 16 Nov 2005 00:56
    —
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

#7: ну вот, теперь я уже окончательно запутался Author: ValLocation: Ц.В.Ю. PostPosted: 16 Nov 2005 00:57
    —

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 (записи в номенклатурник попадают все)
Подскажите плиз что я делаю не правиль

#8:  Author: ЯковLocation: Яков PostPosted: 16 Nov 2005 07:24
    —
Делаю на фоксе что-то похожее со справочником партнеров через буфер.
ТАК:
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

#9:  Author: nordkLocation: Горбунов Константин PostPosted: 16 Nov 2005 09:24
    —
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 - разница огромн

#10:  Author: nordkLocation: Горбунов Константин PostPosted: 16 Nov 2005 09:41
    —
Для 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.)

#11:  Author: nordkLocation: Горбунов Константин PostPosted: 16 Nov 2005 09:47
    —
Для Якова

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

#12:  Author: ЯковLocation: Яков PostPosted: 16 Nov 2005 11:19
    —
nordk wrote:
Каждый волен писать на чем угодно, но здесь мы учимся пользоваться харбором и я считаю это правильнее потому что
это встроенный механизм и буферы ему не нужны.

Да я не против.
Просто на данном примере я предложил немного другой алгоритм,
который можно реализовать на любом инструменте,
который как мне кажется будет работать быстрее.
А инструмент конечной реализации каждый выбирает сам.
И буферы тут ни при чем.

#13:  Author: shura_kLocation: Александр PostPosted: 16 Nov 2005 11:40
    —
Работает на 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)

#14:  Author: nordkLocation: Горбунов Константин PostPosted: 16 Nov 2005 14:03
    —
ЯКОВ wrote:
Просто на данном примере я предложил немного другой алгоритм,
который можно реализовать на любом инструменте,
который как мне кажется будет работать быстрее.
А инструмент конечной реализации каждый выбирает сам.


Поиска быстрее чем по индексу нет. Полагаю Ваше мнение ошибочным
Хотя в плане поиска фокс самый быстрый язык и возможно тут есть правда - но в харборе извините не согласен. Это лично мое мнение

#15:  Author: Олег СмирновLocation: Олег Смирнов PostPosted: 16 Nov 2005 18:24
    —
ЯКОВ wrote:

Code:

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


В таком виде будет работать быстрее. Locate - вполне дебильная функция для поиска чего-то, что не учавствует ни в каком индексе. Тупо ищет полным перебором с самого начала файл



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


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

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

Powered by phpBB © 2001, 2005 phpBB Group