BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
GenPro, GenPro
 
Здравствуйте!
У нас БЭСТ4+ 12.01 SP47.

Подскажите, пожалуйста. Возникла необходимость генерировать проводки по документам. Применяя функцию GenPro в разных вариантах, столкнулись со следующими трудностями:

1) При компиляции харбором для создания exe-шника вылезает ошибка о незнакомой функции GenPro, что понятно. Вопрос: можно ли ее как-то подцепить в компиляторе, через какую-то библиотеку может быть?

2) При попытке запустить плагин из bat файла строкой типа
bin\sclad /fe"Папка с БЭСТОм"\PRO\PLUGINS\EXTENSNS\sclad\gen_pr.prg /L000001
во-первых, требуется при включенной авторизации БЭСТа вводить логин и пароль. Вопрос: как можно ввести логин/пароль в пакетном режиме из bat файла?

А во-вторых после ввода логина/пароля плагин ошибок не выдает, как-то отрабатывает, но не генерирует никаких проводок в тестовом документе. Плагин следущий :
private s, BestBase
BestBase := loadpath()
DBOpenBase("Mcodop", BestBase + "SCLAD\" + "mcodop.dbf")
DBOpenBase("Mcodopa", BestBase + "SCLAD\" + "mcodopa.dbf")
DBOpenBase("Mdoc", BestBase + "SCLAD\" + "mdoc.dbf")
DBOpenBase("Mdocm", BestBase + "SCLAD\" + "mdocm.dbf")
DBOpenBase("Mlabel", BestBase + "SCLAD\" + "mlabel.dbf")
DBOpenBase("Spr_part", BestBase + "SCLAD\" + "spr_part.dbf")
DBOpenBase("Mcalc", BestBase + "SCLAD\" + "mcalc.dbf")
DBOpenBase("Mcalc1", BestBase + "SCLAD\" + "mcalc1.dbf")
s:= UPPER("00000827001000053")
GenPro(,,2,1,,,{s})

Что интересно, при запуске этого же плагина через Ctrl-F5 в товарах проводки в документе генерятся. Вопрос: почему через bat файл плагин не работает?

Спасибо!
 
Цитата
NotWar пишет:
во-первых, требуется при включенной авторизации БЭСТа вводить логин и пароль. : как можно ввести логин/пароль в пакетном режиме из bat файла?


Устанавливаете новый БЭСТ, подцепляете туда базу
Никаких логинов в этом БЭСТе не делайте (выключите авторизацию) и все получится, запукайте плагин из него

Цитата
NotWar пишет:
А во-вторых после ввода логина/пароля плагин ошибок не выдает, как-то отрабатывает, но не генерирует никаких проводок в тестовом документе. Плагин следущий :
private s, BestBase
BestBase := loadpath()
DBOpenBase("Mcodop", BestBase + "SCLAD\" + "mcodop.dbf")
DBOpenBase("Mcodopa", BestBase + "SCLAD\" + "mcodopa.dbf")
DBOpenBase("Mdoc", BestBase + "SCLAD\" + "mdoc.dbf")
DBOpenBase("Mdocm", BestBase + "SCLAD\" + "mdocm.dbf")
DBOpenBase("Mlabel", BestBase + "SCLAD\" + "mlabel.dbf")
DBOpenBase("Spr_part", BestBase + "SCLAD\" + "spr_part.dbf")
DBOpenBase("Mcalc", BestBase + "SCLAD\" + "mcalc.dbf")
DBOpenBase("Mcalc1", BestBase + "SCLAD\" + "mcalc1.dbf")
s:= UPPER("00000827001000053")
GenPro(,,2,1,,,{s})

Что интересно, при запуске этого же плагина через Ctrl-F5 в товарах проводки в документе генерятся.: почему через bat файл плагин не работает?


Функция предназначена для запука плагином из модуля товары.
В противном случае Вам необходимо обеспечить ее всем необходимым окружением алиасов и объявленных переменных
 
Цитата
nordk пишет:

Функция предназначена для запука плагином из модуля товары.

В противном случае Вам необходимо обеспечить ее всем необходимым окружением алиасов и объявленных переменных


Спасибо за ответ!

А есть опыт решения подобной проблемы - генерации проводок по документам внешней программой, на клиппере или харборе? Подскажите, пожалуйста!
 
У меня нет по двум причинам:
1.Уже очень давно Б4 не практикую и многое надо поднимать
2.Мы никогда не решали задачи проводок внешними программами.
3.Плагин который был написан примерно больше года назад для Б5 рассчитывает проводки для несколько тысяч документов за 5 минут. Штатная генерация отдыхает....
Нет необходимости запускать это внешней программой в планировщике - ночью удобнее, конечно, но 5 минут подождать это не тот аргумент чтобы убиваться над планировщиком
 
Цитата
nordk пишет:
3.Плагин который был написан примерно больше года назад для Б5 рассчитывает проводки для несколько тысяч документов за 5 минут. Штатная генерация отдыхает....


Запустили следующий простой hrb плагин из модуля Товары:

FUNC TION main()
Local aSet,asetkey, s
dbpush()
aSet:=SaveSet()
asetkey := SaveSetKey()
mdoc->(setscope())
mdoc->(dbgotop())

do while !mdoc->(eof())
if mdoc->vid = '2'
s:=UPPER(mdoc->SCLAD+mdoc->VID+mdoc->TYPE+mdoc->CODEDOC+mdoc->NUMDOC)
mdoc->(GenPro(,,2,1,,,{s}, .T.))
endif
mdoc->(dbskip(1))
enddo

RestSetKey(asetkey)
RestSet(aSet)
dbpop()
RETURN

Документов плагин пробегает пару тысяч, GenPro вызывается только на отгрузке (vid = '2'), и проводки должны генериться только при их отсутствии, а работает плагин почему-то вовсе не 5мин, а в несколько раз больше, причем на сервере. Что-то не так с кодом, очень неоптимальный?
 
Формулы проводок покажите.
В них есть старт .hrb ?
А кстати ? сколько записей в базе mdoc ?
Вы же все записи перебираете.
Делайте скоп по UPPER(vid+type)
И перебирайте только конкретно нужные документы без всяких IF
DBE VAL() также работает оптимальнее чем While do конструкция
И алиас не надо использовать текущий - откройте свой b5mdoc/
Не надо трогать штатный
 
Цитата
nordk пишет:
Формулы проводок покажите.
В них есть старт .hrb ?
А кстати ? сколько записей в базе mdoc ?
Вы же все записи перебираете.
Делайте скоп по UPPER(vid+type)
И перебирайте только конкретно нужные документы без всяких IF
DBE VAL() также работает оптимальнее чем While do конструкция
И алиас не надо использовать текущий - откройте свой b5mdoc/
Не надо трогать штатный


Поменяли код. Открыли свой алиас, сделали setscope, вместо do while использовали dbeval :

FUNC TION main()
Local aSet,asetkey, s
dbpush()
aSet:=SaveSet()
asetkey := SaveSetKey()
NETUSE("genmdoc",LOADPATH()+"\sclad\mdoc.dbf",,.F.)
genmdoc->(ordsetfocus("mdoc_o"))
genmdoc->(setscope('genmdoc->vid', UPPER("2")))
genmdoc->(dbgotop())
genmdoc->(dbe val({|| s:=UPPER(genmdoc->SCLAD+genmdoc->VID+genmdoc->TYPE+genmdoc->CODEDOC+genmdoc->NUMDOC), ;
GenPro(,,2,1,,,{s}, .T.) } ))

genmdoc->(setscope())
genmdoc->(dbclosearea())
RestSetKey(asetkey)
RestSet(aSet)
dbpop()
RETURN

Работать стал быстрее раза в три-четыре. nordk - спасибо большое! Строк всех в mdoc около 50000, делается за 8-10 мин.

Но почему-то проводки генерятся только в том складе, из которого запускается плагин по Ctrl-F5, хотя с индексом mdoc_o и setscope('genmdoc->vid', UPPER("2")) должны пробегатся по всем записям c vid=2, по всем складам.

Кроме того, почему то SaveSet() и RestSet(aSet) не работают: изменяется внешний шапки накладной и не видно окно проводок, если зайти в накладную сразу после окончания работы плагина. А если выйти из склада и зайти снова - вид восстанавливается и проводки видны.
Подскажите, пожалуйста, в чем причина этих двух неполадок?
 
Цитата
NotWar пишет:
Но почему-то проводки генерятся только в том складе, из которого запускается плагин по Ctrl-F5, хотя с индексом mdoc_o и setscope('genmdoc->vid', UPPER("2")) должны пробегатся по всем записям c vid=2, по всем складам.

На старом форуме я вроде исходник этой функции выкладывал.
Есть подозрение, что там внутри все равно используется mdoc
А когда вы в реестре на нем лежит скоп конкретного реестра.

Цитата
NotWar пишет:
Кроме того, почему то SaveSet() и RestSet(aSet) не работают: изменяется внешний шапки накладной и не видно окно проводок, если зайти в накладную сразу после окончания работы плагина.

Внутри накладной если вы это делаете, то там SaveSet() не поможет, потому что там три окна созданные средствами класса TBROWSE()
И SaveSet() если и работает то применительно к одному конкретному окну
Там надо окна заново обновлять, только прямо сейчас не подскажу как, возможно кто из программистов тут вместо меня подскажет оперативно, мне надо над кодом помедитировать
 
Цитата
nordk пишет:
На старом форуме я вроде исходник этой функции выкладывал.
Есть подозрение, что там внутри все равно используется mdoc
А когда вы в реестре на нем лежит скоп конкретного реестра.


Да, посмотрели исходник genpro, там прямое обращение к mdoc.
Поставили после SaveSetKey()в начале плагина mdoc->(setscope()) - помогло.
 
Цитата
NotWar пишет:
mdoc->(setscope())

только потом скоп обратно возвратить не забудьте
 
Цитата
nordk пишет:
Цитата
NotWar пишет:
mdoc->(setscope())


только потом скоп обратно возвратить не забудьте


Кабы знать точный скоп до этого. :happiness:
Хотя можно, конечно, выйти из Бэста и снова зайти... :funny:
 
Цитата
NotWar пишет:
Кабы знать точный скоп до этого.

в отладчике на индексы посмотрите
делов то
 
Цитата
nordk пишет:
Цитата
NotWar пишет:
Кабы знать точный скоп до этого.


в отладчике на индексы посмотрите

делов то


В отладчике индекс можно узнать, да. По ключевому выражению и по Index order можно догадаться, что это MDoc_D.
Только скоп не нашел как там посмотреть. Он же не по всему индексу может быть. Выкрутился, вставив строчку
sayandwait(scopemacro("mdoc_d"))
Изменено: NotWar - 16.11.2012 18:54:44
 
Цитата
NotWar пишет:
Цитата
nordk пишет:

Цитата
NotWar пишет:

mdoc->(setscope())




только потом скоп обратно возвратить не забудьте




Кабы знать точный скоп до этого. :happiness:

Хотя можно, конечно, выйти из Бэста и снова зайти... :funny:

Функция SetScope() возвращает предыдущий скоп.
Стандартный ход такой:
aScope:=SetScope() // снятие скопа (можно также сразу установить новый)
........
SetScope(aScope) //воcстановление
 
Цитата
NotWar пишет:
Только скоп не нашел как там посмотреть. Он же не по всему индексу может быть.


Сан Саныч правильно написал, я немного затупил
А насчет отладчика:
в закладке индексы вы видите какой индекс установлен в данный момент
И значения границ скопа top и bottom к каждому конкретному тегу.
Т.е. видно на какие теги какой скоп стоит в данный момент
 
Цитата
Александр Титов пишет:

Функция SetScope() возвращает предыдущий скоп.
Стандартный ход такой:

aScope:=SetScope() // снятие скопа (можно также сразу установить новый)

........

SetScope(aScope) //воcстановление


Спасибо!
Не знал про эту возможность.
 
Цитата
nordk пишет:
в закладке индексы вы видите какой индекс установлен в данный момент

И значения границ скопа top и bottom к каждому конкретному тегу.

Т.е. видно на какие теги какой скоп стоит в данный момент


В редакторе отладчика по Alt-Ins увидел скоп. :happiness:
Раньше я во время отладки выполнения плагина смотрел в WorkArea.

А, кстати, если в начале и конце плагина стоят dbpush() ... dbpop() , так ли уж важно какой скоп остается в плагине на mdoc?
Ведь после dbpop() и выхода из плагина предыдущее состояние восстановится.
Страницы: 1
Читают тему (гостей: 2)