Перетащите мышкой из "команд" (рис.3) в нужное место на панели инструментов
Последние темы на форумах VOGBIT
03.10.2023 17:24:43
Здравствуйте!
Перетащите мышкой из "команд" (рис.3) в нужное место на панели инструментов |
|
|
|
19.10.2024 18:13:54
Здравствуйте! Пишу плагин. Есть вопросы по чтению и записи данных. К примеру, как получить список всех элементов номенклатуры (деталей), чтобы потом затолкать его в LookupEdit?
Изменено: |
|
|
|
19.10.2024 21:35:12
Здравствуйте!
|
|||
|
|
20.10.2024 14:41:09
С этим вопросом разобрался, спасибо)
|
|
|
|
06.03.2025 12:04:16
Подскажите пожалуйста, как добавлять заказ в разделе "Производственные заказы"?
Ну и соответственно назначать состав и технологию этому заказу. Хотелось бы автоматизировать то что сейчас делается руками, а именно: я создаю номенклатуру каждый раз новую (т.к. все заказы у нас разные), потом заказ, туда складываю эту номенклатуру и на каждую деталь назначаю операции из папки "Технология". Создавать папки и номенклатуры программно мы вобщем-то научились, а вот как заказ оформлять информации не нашли. |
|
|
|
07.03.2025 17:01:16
Здравствуйте,
Распишу по объектам в БД VOGBIT, что нужно по минимуму для такой задачи создавать в базе. Коллеги подскажут, если нужно, по коду, по тем моментам, которые, возможно, не ясны.
Для начала должна быть сама номенклатура (деталей, изделий), которую будем добавлять в производственный заказ. Если дальше цель стоит создать задания для производства по списку этой номенклатуры, то нужно для неё создать и заполнить техпроцесс. По минимуму для создания заданий нужны операции в техпроцессе и для операций должно быть указано место выполнения (участок) и Тшт. В принципе, по минимуму, этого достаточно. Разберем по шагам. Деталь – номенклатурная позиция. Техпроцесс детали – коллекция компонентов, у которой Owner = номенклатура «Деталь». Тип связи коллекции нужно поставить LT_ManProcess (здесь и далее везде пишу для используемых типов связей, параметров, статусов их идентификаторы). Обозначение коллекции ставьте любое, какое хотите. Статус ставьте тоже любой какой нравится, только НЕ ST_Invalid. Любой другой. Например, ST_Designing. Дальше добавляем в техпроцесс операции. Операция сама – это номенклатурная позиция. Находим нужную в справочнике и добавляем её, как компонент в коллекцию LT_ManProcess (техпроцесс детали). Тип связи компонента ставим LT_Operation. Количество и единицу измерения не заполняем для этого компонента, оставляем пустыми. Дальше нужно для операции задать место выполнения и трудоемкость. Место выполнения (участок), в принципе, у Вас может быть настроено в самом VOGBIT по умолчанию для «операции» в справочнике «Номенклатура». Тогда в техпроцессе уже указывать в явном виде его не нужно, при формировании заданий «подхватится» настроенный по умолчанию участок. Чтобы указать в явном виде для операции место выполнения в техпроцессе, находим в справочнике «Подразделения» нужный производственный участок и добавляем его к компоненту LT_Operation (операции) в коллекции LT_ManProcess (в техпроцессе), как связанный объект с типом связи LT_Place. Если вы используете пооперационное нормирование, то чтобы потом создались задания для производства, нужно ещё добавть хоть какую-нибудь «Трудоемкость» к операции. Для этого добавьте параметр T_OPR_HOUR (float) к компоненту LT_Operation (операции) в коллекции LT_ManProcess (в техпроцессе), значение = Тшт в часах. Всё, по минимуму – достаточно. Т.е. создаете номенклатуру деталей. К каждой детали коллекцию LT_ManProcess (техпроцесс), в неё добавляете нужные компоненты LT_Operation (операции), к каждому такому компоненту добавляете связанный объект LT_Place (подразделение, участок), и параметр T_OPR_HOUR (трудоемкость). На этом то, что вставлять в «заказ» у нас есть. Переходим к созданию и заполнению «Производственного заказа». Создаёте номенклатурную позицию – «Заказ». Обозначение и наименование – по Вашему усмотрению. Для этой номенклатурной позиции создаёте коллекцию компонентов LT_MAN_CHART (тех. карта заказа). Обозначение коллекции ставьте любое, какое нравится, статус ставьте ST_InWork (с любым другим её не будет видно в окне «Производственные заказы»). В эту коллекцию LT_MAN_CHART добавляете из номенклатуры созданные нами ранее «Детали», как компоненты. Тип связи при этом можете использовать, в принципе, почти какой хотите, тут нет особых ограничений, но стандартно используется LT_Product (изделие). В некоторых случаях - LT_Part (деталь), LT_Assemble_Unit (сборочная единица). Обязательно поставьте для компонентов в коллекции LT_MAN_CHART (позиций в карте заказа) количество и единицы измерения (в подавляющем большинстве случаев ставится «шт»). В принципе, вроде, всё. Таким образом у Вас получится заказ, тех. карта заказа, в ней детали с указанием количества, у деталей техпроцессы с операциями. Для того, чтобы «запустить в производство» по самому минимуму достаточно. А дальше уже можно этот «скелет» наращивать «мясом» по мере надобности, в зависимости от задачи.
P.S. В заключении вставлю свои 5 копеек… Для пользователей, у которых «каждый новый заказ – это новая номенклатура», но при этом само производство довольно простое, в современных версиях VOGBIT есть некоторое количество штатных, встроенных функций, которые довольно сильно зачастую облегчают жизнь простым пользователям, без необходимости прибегать к программированию. Например:
Вот эти вещи есть в VOGBIT (в последних версиях) уже готовые, "из коробки". |
|
|
|
10.03.2025 14:55:27
Доброго времени суток. Набросал код, три основных вопроса:
1. Правильные ли объекты я использую 2. Правильно ли добавляю компонент в коллекцию 3. В какой папке должна создаваться номенклатура заказа, которая будет потом видна во вкладке 'Производственные заказы' //-------------------------------------------- var mainID = 157194; // ID папки 'Основная' var ordersID = 555555; // ID папки 'Заказы' var tokarkaID = 666666; // ID номенклатуры 'Токарка' // Создаем папку заказчика Folder newFolder = ExtApp.Application.General.Folders(mainID).AddNew(); newFolder.Name.Value = "Роскосмос"; newFolder.ParentID.Value = ordersID; newFolder.Save(); // Создаем номенклатуру в этой папке var nmk = ExtApp.Application.General.Nomenclature(newFolder.ID.AsLongInt, CatalogOptions.None).AddNew(); nmk.Notation.Value = "DRAW.001.01"; nmk.Name.Value = "Фланец"; nmk.Save(); // Дальше не знаю, на ощупь писал ComponentCollection collection = new ComponentCollection(); collection.LinkTypeNotation.Value = "LT_ManProcess"; collection.StatusNotation.Value = "ST_Designing"; collection.Notation.Value = "Техпроцесс"; Components component = new Components(); component.OwnerID.DefaultValue = collection.ID.AsLongInt; // Компонент в коллекцию так добавляется? component.LinkTypeNotation.DefaultValue = "LT_Operation"; component.Params["T_OPR_HOUR "].Value = 1; component.SourceNomenclatureID.DefaultValue = tokarkaID; // Создаём номенклатуру заказа // Дальше ключевой вопрос - где создавать номенклатуру? var zkz = ExtApp.Application.General.Nomenclature(КАКОЙ ID СЮДА ПИСАТЬ?, CatalogOptions.None).AddNew(); //--------------------------------------------
Изменено: |
|
|
|
10.03.2025 16:47:45
Коллекция. На входе номенклатура для которой создаётся ТП:
Компонент. На входе Id ТП и Id номенклатуры операции (в вашем случае tokarkaID):
|
|||||||||
|
|
11.03.2025 12:43:21
Не может почему-то присвоить ID, из-за чего так может быть?
void ExampleButtonActionExecute(object sender, ActionExecuteEventArgs e) { // ID 157337 - LT_ManProcess // ID 157141 - LT_Operation // ID 157138 - LT_MAN_CHART // ID 157720 - LT_Part // // ID 157205 - ST_Designing // ID 157206 - ST_InWork // // ID 157325 - T_OPR_HOUR // ID 159751 - VGB_Quantity long nmkID = 227610; // ID нашей детали 'Фланец' long oprID = 203301; // ID операции 'Токарная' long manID = CreateManProcess(nmkID, 157337, 157205); long comID = AddComponent(manID, oprID, 157141); AddObjectParameter(comID, 157325, 1); var zkz = ExtApp.Application.General.Nomenclature(-1, CatalogOptions.None).AddNew(); zkz.Notation.Value = "1863 Роскосмос - Фланец"; // Наименование заказа var zkz_manID = CreateManProcess(zkz.ID.AsLongInt, 157138, 157206); var zkz_comID = AddComponent(zkz_manID, nmkID, 157720); AddObjectParameter(zkz_comID, 159751, 1); } long CreateManProcess(long nmkId, long linkID, long statusID) { var cc = ExtApp.Application.General.ComponentCollections(nmkId).AddNew(); try { cc.Notation.Value = "Техпроцесс"; cc.LinkTypeID.Value = linkID; cc.StatusID.Value = statusID; cc.Save(); } finally { cc.Cancel(); } return cc.ID.AsLongInt; } long AddComponent(long collectionId, long compNmkId, long linkID) { var comp = ExtApp.Application.General.Components(collectionId).AddNew(); try { comp.NomenclatureID.Value = compNmkId; comp.LinkTypeID.Value = linkID; comp.Save(); } finally { comp.Cancel(); } return comp.ID.AsLongInt; } ObjectParameter AddObjectParameter(long objectId, long parameterID, object parameterValue) { var objParam = ExtApp.Application.General.ObjectParameters(objectId).AddNew(); try { objParam.ParameterID.Value = parameterID; objParam.ParameterValue.Value = parameterValue; objParam.Save(); } finally { objParam.Cancel(); } return objParam; }
Изменено: |
|
|
|
11.03.2025 16:20:45
|
|||
|
|
12.03.2025 12:32:35
Всех благодарю! У меня получилось создать заказ.
Хотелось бы ещё подсказку как удалить созданный мною заказ, т.к. при отладке плагина буду туда-сюда создавать один и тот же тестовый заказ и удалять его. И у меня нарисовалась проблемка, я прогнал тот же код что выше (заказ который создал - удалил перед этим вручную), только вместо статуса ST_InWork поставил ST_MAN_3, в надежде что таким образом сразу создадутся задания, но по итогу номенклатура уплыла в неизвестном направлении. Я решил найти её циклом и нашёл, но удалить не вышло. В Point_1 и Point_2 заходит, в Point_3 нет. foreach(var nmk in ExtApp.Application.General.Nomenclature(-1, CatalogOptions.None)) { if(!nmk.Notation.IsNull) { if((string)nmk.Notation.Value == "1863 Роскосмос - Фланец") { System.Windows.Forms.MessageBox.Show("Point_1"); foreach (var com in ExtApp.Application.General.ComponentCollections(nmk.ID.AsLongInt)) { System.Windows.Forms.MessageBox.Show("Point_2"); // foreach (var prm in ExtApp.Application.General.Parameters(com.ID.AsLongInt, CatalogOptions.None)) // не заходит в цикл // foreach (var prm in ExtApp.Application.General.Components(com.ID.AsLongInt, CatalogOptions.None)) // не заходит в цикл // foreach (var prm in ExtApp.Application.General.LinkedObjects(com.ID.AsLongInt)) // не заходит в цикл // foreach (var prm in ExtApp.Application.General.ObjectParameters(com.ID.AsLongInt)) // не заходит в цикл // foreach (var prm in ExtApp.Application.General.ComponentCollections(com.ID.AsLongInt)) // ссылка на объект не указывает на экземпляр объекта // com.Count == 27 foreach (var prm in ExtApp.Application.General.ObjectParameters(com.ID.AsLongInt)) { System.Windows.Forms.MessageBox.Show("Point_3"); } com.Delete(); // Коллекция компонентов либо не существует, либо содержит компоненты. } nmk.Delete(); break; } } }
Изменено: |
|
|
|
12.03.2025 16:27:15
Думаю, что заходит и выходит т.к. набор данных пустой.
|
|||||||||||||
|
|
12.03.2025 16:36:38
Не вижу смысла писать в таком случае свои "удалялки". Потеря времени. Проще и быстрее штатными функциями все поудалять в данном конкретном случае. Не так много насоздавали.
В сообщении #67 я Вам расписал кто как с кем связан в плане объектов в БД при создании. Удалять, как в любой базе данных, нужно "с конца". Вы создали номенклатурную позицию (Заказ), к ней коллекцию компонентов (Карта заказа), в эту коллекцию добавили компоненты (Детали в карту заказа). Номенклатура не удалится, пока у неё есть коллекции, коллекция не удалится пока в ней есть компоненты. Соответственно, чтобы штатными средствами всё удалить: 1. Идем в общий справочник "Коллекции компонентов", находим там коллекцию - созданную Вами тех. карту (обычным поиском или авто-фильтром - по имени, по типу связи, как удобнее). 2. Открываем для этой коллекции зависимое окно "Компоненты". Всё там выделяем и удаляем. 3. Удаляем саму коллекцию (1). 4. Идем в общий справочник "Номенклатура", там (поиском, авто-фильтром, по обозначению или наименованию) находим созданную Вами номенклатуру "заказ". И удаляем её. Всё. Готово. По-моему проще руками так сделать в данном конкретном случае, чем "удалялки" писать. Кстати, "Папка", куда складывать номенклатурную позицию "заказ" и коллекцию "карта заказа", что Вы спрашивали в сообщении #68 - они как раз и нужны, чтобы в случае задачи а-ля п. (1) и (4) искать не поиском по всему справочнику то, что вы насоздавали, а оно сразу лежало в конкретной папке и там вы его сразу и нашли при необходимости. Без папки поиском тоже найдётся. Но когда изначально известно, где лежит - проще. Есть ещё админская утилита "Очистки заказов". Можно после п.(1), как альтернативный вариант вместо п. (2) и (3), встать в справочнике на нужную коллекцию (карту заказа, которую Вы создали) и в меню нажать "Настройка" - "Очистка заказов". Эта штука удаляет все из коллекции и саму коллекцию. Но более актуальна она, когда кроме деталей (компонентов) там ещё много чего есть (партии, назначенные ТП и т.д.). Чтобы руками всё это не удалять. В Вашем текущем случае - и руками, в принципе, не долго. Но можно и утилиту "Очистка заказов" задействовать. Готовая "удалялка" для "карт заказов".
![]()
|
|||||
|
|
||||