Либо aheads либо SETKEY()
А зачем Вам диалог - аHeads гораздо мощнее на мой взгляд
Мне он как-то изначально показался слишком громоздким. Предусловия, постусловия.... Я даже и не вспомнил про него... Куда свой код "впихнуть" после ввода. Как-то не очень удобно...
Кроме того, кажется, если aheads указан, то пользователь может ввести новую запись (или можно F4 "отключить", сейчас даже и не помню)
Подождите Вы как-то смешиваете все.
Если наряд задания и ПСН это одно.
Если производственные заказы и ПСН это другое.
Для создания ПСН Вам по сути нужен механизм разузлования, по которому Вы собственно и сможете программно создавать свою ПСН.
Я правильно понимаю - Вас интересует функция, которая сделает разузлование ?
В случае наряд-задание - разузлование уже сделано причем пооперационное. И мы берем оттуда.
В случае производственных заказов - просто делается разузлование по заказу и формируется ПСН.
Наверное, именно она интересует. Даже не знаю.
Скорее даже интересует создание_собственного/изменение_существующего механизма разузлования.
Дак все правильно !!!!
Записей и не должно прибавиться - она уже есть !!!!
Программа открыла документ на редактирование.
Обнаружила что запись такая есть.
Никаких изменений нет - делать ничего не надо.
А вот если Вы измените содержимое - посмотрите
А вот и нет!!!
Во-первых. Перед повторным запуском поменяйте содержимое. Результат будет тотже самый!!!
Во-вторых. Даже если и так, почему нет "сообщения" об ошибке в oErr, возвращаемым методом Run? Тем более, что было бы "по здравому" смыслу его выдавать! Например, с сообщением, что такой номер уже есть....
Есть еще один .
2 nordik: Только, пожалуйста не торопитесь отвечать на этот. Я просто много вопросов задал, не хотелось бы, чтобы хоть один пропал зря.
Описание:
При формировании ПСН из наряд-заданий в строках ПСН с изделиями есть поле NZ_ID. Если удалить такой документ, то в НЗ количество сданых изделий уменьшается.
А вот по какому принципу определяется принадлежность ПСН к производственным заказам я не понял. Но если удалить такой документ, то в производственных заказах количество сданой продукции также уменьшиться.
Суть проблемы:
Очень хотчется сделать свою табличку вместо НЗ. Сейчас формирование ПСН своей спецфункцией идет нормально (переписан реестр НЗ) и их удаление тоже. Но вот как быть, если будет введена новая таблица (меню называется "Запущенная продукция"/"продукция к производству")???!!! После удалени ПСН в таблице ведь изменений не буедт!!! Кроме того, будет еще 1но поле, требующее изменений. Можно было бы выкрутиться, например, закрыв "Оприходование ПФ-ГП" в журнале учета движений. Или просто поставить плагин на "перед удалением". НО!!!
НО это очень не нравиться!!!! Мягко говоря. Хотелось бы более "гарантированное" и изящное решение.
Вариант оставить НЗ (nz.dbf и остальные) не нравиться. Т.к. будет еще поле "статус" у "продукции к производству".
Очень понравилось использовать классы разработчиков. Очень и очень удобно, не хотелось бы придумывать велосипед, может есть что-то что может помочь?
itman пишет:
Итак, по порядку.
Доступ следует ограничить для запуска, в случае использования терминального подключения и расположения библиотеки в общедоступной папке client\bin.
У нас не терминальный режим, но этот тоже интересует. (чтобы "лишних" меню не было у др пользователей)
Цитата
По поводу того, что класть утилиту в одну папку на одной станции - в данном случае запуск функций РАЗОВЫЙ, совсем не за чем делать запуск кому-то, кроме администратора, для других случаев следует править код.
У нас просто уже появилась новая менюшка. С ней 3 человека работает. С 3х разных клиентских машин, поэтому для нас это актуально.
Цитата
По поводу поддержания "свежести" библиотек разработчика:
ПРАВИЛО - размещать свои проекты в папке - \BEST5_34\Server\DATA\Pro\userlibs\
В этом случае, при запуске клиента библиотека ляжет в папку Client\Bin\userlibs
В этом случае не надо обновлять клиентов, все будет происходить автоматом, bdll rc файлы автоматом копируются и загружаются в память при запуске клиента Б5.
При использовании такой схемы следует откорректировать путь в userbdll.txt, который размещается в корневой папке базы данных.
По-моему, вообще, проще всего ставить Бэст в ДЕмо-режиме на отдельной машине, а все плагины и длл уже в рабочую базу подбрасывать, как я и делаю.
itman пишет:
Если библиотека будет лежать на сервере, следует предусмотреть функцию, ограничивающую доступ.
Доступ к чему? К dll'ке или нововведенным функциям-менюшкам?
По поводу ограничений для вновь введенных меню разработчики обещали дать возможность ставить ограничения на доступ через менеджера пользователей.
А вот по поводу того, чтобы класть эту длл в папку клиент на сервере не совсем понятно каким образом она к остальным попадет.
Я, кстати собирался об этом спросить. Дело в том, что для того, чтобы написанная dll работала у всех надо на каждой клиентской машине её ставить. Ну, это еще пол беды. Один раз такое сделать можно. А вот что делать если эту дллку обновили? Каждый раз после внесения изменений придется по новой всем таскать эту длл... Это не очень-то удобно, даже в случае полного доступа по сети к папке bin всех клиентских машин.
У меня в initList параметр aHeads (массив описания области ввода) опущен. Setkey на 13 не стоит и не хочется. Каждый раз по нажатию Enter InitList прекращает свою работу.
Может быть можно "повесить" на Enter (13) что-инбудь такое, чтобы работала ф-я ввода (Dialog) и не "вылетал" initlist? Я пытался повесить "пустое" дествие:
SETKEY(13,{||sIdPartner:=sIdPartner,1}) или SETKEY(13,{||.T.,1}) InitList не прекращает работу. Однако пи вызове Dialog, enter естественно "не срабатывает".
Просто постоянно "мыкаться" с SavetSetkey из-за одной клавиши не хочется.
nordk пишет:
На одной из тем форума было подробное описание функции Dialog. Но второй параметр нагляден и по хелпу.
Странно как-то. Хелп смотрел, такой вариант:
DIALOG("Введите скидку:","9999",0) пробовал, он почему-то "не пошёл"(введенные данные были как симв строка), сейчас все работает так как надо...
Функция WDoc() не работает в проектах, написанных в дизайнере приложений. Бест при подключении дллки с этой ф-ии выдает ошибку что нет такой.
Использовал её также как и в примере:
oDoc:NumDoc:=MDoc->(WDoc('NumDoc',UPPER(pSclad+pVid+pType+oDoc:CodeDoc))). В плагинах, написанных в XBA редакторе работает.
Может быть нужно длл подгрузить какую-нибудь. Если да, то какую???
Если нет, то хотелось бы узнать есть ли аналог или принцип её работы, чтобы полностью повторить её работу.
И самый главный : "обходит" ли данная функция возможность одновременного получения одного и того же номера?
nordk пишет:
Саак а можно попросить контрольный пример небольшой в котором это не работает ?
Давайте сделаем простенькую функцию,которую я смогу у себя откомпилировать и посмотреть ?. Обещаю детально разобраться и попросить исправить в КБ, если это будет ошибкой , либо прокомментирую: что не так делаете...
Без примера сложновато понимать.
По предыдущим Вашим сообщениям я так понял, что создавать документы в принципе у Вас получилось, не получается какой-то конкретный момент...
Разумеется можно!!!
Контрольный пример для демо-базы (хозрасчетная). Плагин подключается в журнале учета движения. В виде движения Оприходование ПФ-ГП.
Вот код:
Код
OprixodINDEMO()
STATIC PROCEDURE OprixodINDEMO()
LOCAL oDoc,oDocs,oErr
DbPush()
oDocs := ScladDocs():New()
oDocs:Hidden := 2
oDocs:Task := "MF"
oDoc := ScladDoc():New()
oDoc:CodeOper := "0002" // Код типовой операции
oDoc:Vid := "1" // Направление движения --- приход
oDoc:Type := "?" // Код вида движения:
oDoc:TypeEx := "0602" // оприходование полуфабрикатов в производстве
oDoc:Sclad := "Гот.пр" // Склад
oDoc:CodeDoc := "001" // Вид документа
oDoc:NumDoc:="000195"
oDoc:AGENTCODE:="100001"
oDoc:AddRow("00014","0000000000001","Ш.01",,10,/*cEd1*/,/*nR*/,/*cNNOPERM*/,/*aAuto*/,/*aSerNo*/,;
"00014","0000000000001","Ш.01")
oDocs:AddDoc(oDoc)
oErr:=oDocs:Run()
altd()
DbPop()
return
После компиляции и подключения
1. Включаем режим отладки, точкой останова будет строка с DbPop(). Запустите плагин и посмотрите что будет в массиве oErr. Документ создается.
2. Потом запустите плагин второй раз и посмотрите содержимое oErr.
документ с номером 000195 второй раз не создался, ОДНАКО oErr ПУСТ!!! Записей в БД не прибавилось!!! Значит была ошибка, которая из описания метода RUN должна быть в oErr.
В справочнике по Б-4 параметров у DIALOG всего лишь 3 штуки, да и те, кажется не описаны.
На старом форуме есть примеры с использованием DIALOG.
Очень бы хотелось DILAOGOM запросить у пользователя целое число (только не в виде текстовой строки - так совсем не интересно), т.е. формат ввода - целое число.
Сейчас при попытках запроса:
Dialog('Необходимо указать количество изделий ','',55,'Готовых изделий',,,'gr+/b*,n/w')
В любом случае можно вводить дробные десятичные. Даже если вместо 55 поставить переменную целую.
Саак Шахламджян пишет:
Т.е. при вводе документа с ошибочным номером метод RUN класса ScladDocs не возвращает никаких ошибок.
начните с определения понятия ошибочный номер.
Это равносильно требовать контроль скажем вид движения - вы загнали туда цифру, которой нет в moves.
И что с того ? Может Вам так надо.
Если уж вы занимаетесь программированием, то будьте любезны писать контроль за своими действиями.
Программа позволяет иметь одинаковые номера накладных.
Поскольку уникальность записи по составному индексному ключу.
Похоже, Вы не поняли. Запись как раз и не создается. Раз запись не создается, значит есть какая-то ошибка. Раз есть ошибка она должна выводиться методом RUN в массив, но она не выводиться. ВОПРОС ПОЧЕМУ?
При попытке записать документ с уже существующим рег. номером (свойство NumDoc) ничего не происходит. Ни сообщений об ошибке ни создания нового документа, ни даже корректировка уже существующего. Т.е. при вводе документа с ошибочным номером метод RUN класса ScladDocs не возвращает никаких ошибок.
Из описания метода RUN:
"Метод RUN() возвращает массив, каждый элемент которого описывает результат попытки сохранения документа:
{lResult,::NNoper,::Sclad,::Vid,::Type,::TypeEx,::Date,::CodeDoc,::NumDoc, nRecNo}"
Я сделал такую запись:
oErr:=oDocs:Run().
oErr при неверном номере пуст. При удачной записи документа действительно в oErr попадает информация как сказано в описании. Но вот когда "ничего" не происходит, там пусто.... (У объектов документ и коллекция документов также в соотв полях никаких ошибок нет!!!)
Получается сообщений об ошибках нет, а запись не происходит...
Догадка о том, что нужно указать cPrd_Grup, cPrd_NNUM, cPrd_Bom подтвердилась.
Документ оприход новой продукции сформировался УСПЕШНО!!!!!!!!
Вот. Теперь, наверное самое интересное, хотелось бы еще понять что же я делаю...
Волнует свойство oDoc:TypeEx := "0602". За что отвечает свойство TypeEx, где посмотреть каким оно еще бывает?
Я не просто из любоптсва спаршиваю. Дело в том, что у нас полностью измененный план счетов и другие проводки...
Поэтому попутно 2й . Верно ли то, что все манипуляции при создании такого документа не затрагивают проводки? (Т.е. они берутся из настроек и плана счетов)
Если поставить свойство oDoc:TypeEx := "0602", то ошибки с алиас нет. Проблема, как это ни странно возникала из-за этого свойства.... Хотя и при др. обстоят тоже...
Теперь возник др вопрос. Каксающийся метода ScladDoc:AddRow.
Дело в том, что при оприходовании продукции, должна быть указана выпускаемая продукция и продукция прихода. Но если записать так:
oDoc:AddRow("00014","0000000000001","Ш.01",,10)
То получим сообщение об ошибке:
"Не выбрана аналитика"
А в самой программе увидим, что указан только продукт прихода.
Вопрос как методом AddRow() указать продукцию выпуска??? (или как по-другому её указать?)
nordk пишет:
А Вы пробовали только из товаров или из производства ?
А если открыть требуемый алиас ?
Пробовал из производства только(плагин подключал, если Вы об этом).
АЛИАС ОТКРЫТ!!!!!!!!!!!!!!!!!!!!!!!!(таблица с этим алиасом...)
Это-то самое странное. Перед той строкой на которой получаю ошибку АЛИАС ОТКРЫТ!!!!!
P.S. Я готов "с нуля" все это написать!!! Только бы хотя бы "примерно" знать чего откуда и куда записывается. Просто очень очень нужно!!!
До сего момента можно было "интуитивно" понять что происходило в таблицах при той или иной операции. Но здесь, кажется слишком много действий!!!
Как только задаю свойство oDocs:Task := "MF" получаю эту самую ошибку нет Алиаса MF_RPT....
Т.е. вид движения оприход гот. продукции или полуфабрикатов сделать не получается ВООБЩЕ НИКАК!!!!!!!!!! ОСТАЛЬНОЕ со свойством oDocs:Task := "03" все ровно...
Александр Титов пишет:
Возьмите пример из хелпа, и вызовите его из реестра накладных например, вечером Константин подключится и поможет.
Пример из хелпа работает нормально!!! Файл ScladObj.prg вообще не нужно подключать, оказывется!!! Буду "тыкаться" с документами движения в "MF"
Главное, во-время понять....
Саак Шахламджян пишет:
Пытаюсь сделать хотя бы один документ прихода.
Подключаю файл ScladObj.prg.
Предупреждения компилятора при компиляции:
Цитата
Добрый день!
Не надо ничего подключать, все уже подключено.
Откуда Вы вызываете программу?
откуда я её только ни вызывал. Делал отдельную серую форму и новое меню Б-5. И из НЗ. И из журнала документов-учета движения учета производства. Этот самый алиас "MF_RPT" по-началу существует, но вот как раз на этой строке эта ошибка и выдается....
А откуда надо вызывать? К стати, в ходе моих "тыканий пальцем в небо" стал еще писать, что "Справочник операций пуст"+ по-прежнему алиас не существует... все на той же строке.
Может ли кто-нибудь дать исходный код 100% работающего плагина на демо базе с указанием где его подключать!!!??? Очень бы хотелось, чтобы это было либо оприходование ПФ-ГП готовой продукции, либо ПФ-ГП полуфабрикатов!!! (Я так понял они только отличаются свойством ScladDoc:CodeOper).
Алексей Новиков пишет:
'm->' - это допустимое сокращение от 'memvar->'. То есть, 'm->' указывает компилятору, что следующий идентификатор является переменной.
Это . Это значит, что проблема не в том, что не существует алиас "m"...
Все равно неясно почему выходит ошибка с несуществующим алиасом... Кто-нибудь может подсказать какую таблицу открыть/создать и с каим алиасом?
Интересно, а что это за таблица "m"? Я так понимаю запись вида m->B6_PRO_PATH воспринимается как обращение к полю B6_PRO_PATH таблицы "m"? Такого алиаса конечно же у меня нет.... Или запись "m->" - это "лишний мусор"?
Именно на этой строке сообщение об ошибке и получаю....!!!
Скомпилировать кое-как удалось. #include "ScladObj.prg"
перенес в конец файла. Добавил CREATE при объявлении классов. Добавил <"Имя класса">: перед описанием методов.
Теперь при исполнении получаю следующую ошибку:
Операция MF_RPT
Описание: Алиас не существует.
"Под отладчиком" нашел происходит на:
RunBlueForm(.T.,cBlock,m->B6_PRO_PATH,m->LBL_GUID ,IF(LISSELFMACHINESRV,'.T.','.F.'), B6_EXE_PATH, ;
m->B6_DBF_PATH, m->B6_TMP_PATH, m->B6_USER_IDENT, '',B6_ROLE_GUID,cIdSubsystemActiveForm, ;
::Task, cIdSubsystemActiveForm, cIDStartNodeActiveForm)
В методе Run. А где какой алиас и что еще посмотреть честно говоря не знаю. Смущает одно название ф-ии RunBlueForm...
nordk пишет:
У меня по примеру все работает прекрасно.
Давайте Ваш код и будем смотреть что Вы делаете не так.
Пожалуйста:
Код
#include "ScladObj.prg"
Oprixod()
PROCEDURE Oprixod()
Local oDocs
Local oDoc
oDocs := ScladDocs():New()
oDocs:Hidden := 3
oDocs:Task := "MF"
oDoc := ScladDoc:New()
oDoc:CodeOper := "0001" // Код типовой операции
oDoc:Vid := "1" // Направление движения --- приход
oDoc:Type := "?" // Код вида движения:
oDoc:Type := "0602" // оприходование полуфабрикатов в производстве
oDoc:Sclad := "Гот.пр" // Склад
oDoc:CodeDoc := "001" // Вид документа
oDoc:Part_type := '1' // Тип контрагента --- партнер
oDoc:Part_CODE := "000002"// Код контрагента
oDoc:AddRow("00005","0000000001080","Дуб",,10) // Добавляются строки
oDoc:AddRow("00005","0000000001081","Дуб",,10)
// 3) Указываем, что по этому объекту нужно создать новый документ
oDocs:AddDoc(oDoc) // Указываем, что по этому объекту создается новый документ
// 4) Выполняем:
oDocs:Run()
return
oDoc := ScladDoc:New() можно поправить на oDoc := ScladDoc():New() как я понимаю...
Скомпилировать удалось, я правда все-таки кое-что по-своему написал...
#include "ScladObj.prg" перенес в самый конец кода. и ошибка unreachable код пропала. там где объявления классов добавил CREATE, методам добавил <"имя класса">:...
З. Ы. Предлагаю перейти в другую тему. Я отдельную создал.
Если подключить этот файл в дизайнере приложений, думаю ошибок много меньше будет. На первый взгляд неясно почему компилятор так реагирует на классы. Описание объявлений классов, к стати есть и в справочнике. С классами компилятор работает при подключении 2х файлов
"hbclass.ch" и "BO_Const.ch", думаю все дело в них.
В том виде в котором есть ScladObj.prg не работает.
Пытался его изменить по подобию того как "сам объявлял классы" (методом тыка нашел приемлемый для коплятора синтаксис), ожднако тоже по каким-то неясным пока причинам компиляция не пошла....