Программное создание материалов

Автор danver, 23.01.19, 07:04:28

« предыдущая - следующая »

0 Пользователей и 1 гость просматривают эту тему.

danver

Добавляю программно тип "Материал по КД" к сборкам в Лоцмане с помощью метода InsertObject.
Если справочник Материалов и Сортаментов отцепить от Лоцмана, материал создаётся, но, само собой, атрибутов из справочника у него нету.
Если справочник прицепить, то при попытке использования метода InsertObject появляется ошибка, что материала с таким обозначением в справочнике нет, даже если он есть. Даже если он есть уже в базе Лоцмана, и требуется создать экземпляр связи.

Подскажите, как правильно создавать в Лоцмане материалы из справочника МиС?

Chipollino

Если у типа есть связь со справочником, то создавать объект надо по GUID из этого справочника. Например
0;Material:VC76FFF942391486795C31FB0D310440D;Sortament:V6A25FA24F2024846A417965BB2EC510D^SortamentEx:V4168A28D39C04C9E8C82007CB9E5922B

danver

ЦитироватьЕсли у типа есть связь со справочником, то создавать объект надо по GUID из этого справочника. Например
0;Material:VC76FFF942391486795C31FB0D310440D;Sortament:V6A25FA24F2024846A417965BB2EC510D^SortamentEx:V4168A28D39C0


Какому методу АПИ Лоцмана эту строку скармливать надо?

Chipollino

По идее любому, кто просит на вход stProduct. Вместо читабельного названия используем GUID из справочника.

Я вместо InsertObject использую NewObject и UpLink, так как с этой командой изначально были какие-то проблемы.

NewObject в случае, если объект уже существует вернёт IdVersion первой версии. Далее через GetInfoAboutVersion (inMode = 15) получаем stProduct, stType и stVersion и связываем через UpLink.
Одно но, если связь уже есть, то будет создана ещё одна, поэтому через GetLinks надо будет проверять существование связи, чтобы не появлялись дубли связей.

danver

ЦитироватьВместо читабельного названия используем GUID из справочника


А как этот GUID быстро и правильно получить, имея только обозначение материала с сортаментом или без?

Chipollino

Я с API справочника не работал и конкретных примеров не подскажу, но правильно было бы прикрутить к инструменту из которого в лоцман будут загружаться данных.
Если речь идёт о разовом добавлении материалов по каким-то старым данным об изделиях из экселя или чего-то подобного, то проще их отдельно добавить в лоцман и дальше существующие добавлять в структуру.

В этом случае надо проверить их существование в базе (набитое руками всегда содержит ошибки и не важно, кто добавлял и сколько раз проверяли люди). Мне это проще делать выборками в самой базе на SQL. Например вот так
USE [ИмяБазыСправочникаМиС]
SELECT distinct SE.[NAME] as Name, '0;Material:' + M.[OBJECTID] + ';Sortament:' + S.[OBJECTID] + '^SortamentEx:' + SE.[OBJECTID] as GUID
  FROM [dbo].[SORTAMENTEX] as SE
  JOIN [dbo].[SORTAMENTMATERIAL] as SM ON SE.[SORTAMENTMATERIAL] = SM.[BOLD_ID]
  JOIN [dbo].[SORTAMENT] as S ON SM.[SORTAMENT] = S.[BOLD_ID]
  JOIN [dbo].[MATERIAL] as M ON SM.[MATERIAL] = M.[BOLD_ID]

Для материалов будет чуть проще, так только в таблице Materials выборку сделать.
USE [ИмяБазыСправочникаМиС]
SELECT M.[NAME] + ' ' + G.[NAME] as Name, '0;Material:' + M.[OBJECTID] as GUID
  FROM [dbo].[MATERIAL] M
  JOIN [dbo].[GOST_PROXY] GP ON M.[GOST_MAT] = GP.[BOLD_ID]
  JOIN [dbo].[GOST] G ON GP.GOST = G.[BOLD_ID]


danver

Спасибо, очень помогли!
Теперь тот же вопрос по Полиному. Там как этот уид находить?

Chipollino

К нему так же должен быть API. Поищите в дистрибутиве папку SDK

Если про вариант с SQL, то при тестировании мдм в составе комплекса 2017 базы справочников с контентом были как и в предыдущих версиях отдельные, только интерфейс стал для нескольких справочников один.
Думаю, что и сейчас дела обстоят так же.

danver

ЦитироватьК нему так же должен быть API. Поищите в дистрибутиве папку SDK

Если про вариант с SQL,


Да попеределали они там всё. У Полинома своя база, имён таблиц даже близко нет похожих на МиС, АПИ тоже не так сразу разобраться получится. Вообщем, есть, чем заняться.

Chipollino

На сколько я помню по тестированию - там своя общая база и по каждому справочнику подключались родные базы. Учитывая, что заявлена переносимость от старых справочников в полином, сильно менять не должны были.

Попробуйте воспользоваться SQL profiler - сможете увидеть какие запросы и куда происходят при работе со справочником.

gloomkolomna

Цитата: Chipollino от 04.02.19, 08:31:44
Учитывая, что заявлена переносимость от старых справочников в полином, сильно менять не должны были.

Модель хранения данных совсем иная нежели в старых справочниках Комплекса. Переносимость - это старые данные перенесли в Полином. Так что проще немного затратить время и посмотреть АПИ и демо-примеры из СДК.

danver

Нашел, где в базе лежат материалы с сортаментами и их уид.

[POLYNOM].[CLASSIFICATIONITEM]
[POLYNOM].[PROPVALUESTRING]

Скармливал Лоцману строку вида:

SortamentEx:611fd193-3d72-424b-85ea-4945c785e994
0;SortamentEx:611fd193-3d72-424b-85ea-4945c785e994

пробовал просто обозначение материала передавать. Ошибка. Невозможно сформировать объект, материал отсутствует в справочнике. Уидов вида 0;Material:VC76FFF942391486795C31FB0D310440D;Sortament:V6A25FA24F2024846A417965BB как в предыдущем Лоцмане, в базе не обнаружил. В мануалах этот вопрос обойдён стороной, как несущественный.
Как должна выглядеть строка обозначения материалов при программном их создании в Лоцмане из Полинома?

Chipollino

Можно через функцию GetInfoAboutVersion( inMode = 16 ) получить GUID для уже созданного объекта и посмотреть его форму записи.

Либо внутри лоцмана, конечно если структура таблиц в новых версиях не поменялась

USE [Имя БД Лоцман:PLM]
SELECT DISTINCT stM.[type] as _TYPE, stM.[product] as _PRODUCT, stBOR.[stGUID] as _GUID, dsBO.[stNativeName] as _SERVER_NAME
  FROM [rvwVersions] stM
  JOIN [rlTypesAndBOServers] rlTBOS on stM.[IdType] = rlTBOS.[inIdType]
  JOIN [stObjectBORef] stObj ON stM.[idproduct] = stObj.[inIdMain]
  JOIN [stBOReferences] stBOR ON stObj.[inIdExternal] = stBOR.[inId]
  JOIN [dsBOServers] dsBO ON dsBO.[inId] = rlTBOS.[inIdServer]
ORDER BY _PRODUCT
 

danver

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

[POLYNOM].[PROPVALUESTRING]

В одном и том же поле, вперемешку обозначения, коды, кони, люди, всё в кучу.
Связь между элементами этой таблицы, судя по всему, вот тут:

[POLYNOM].[AS_ASSIGNEDCONCEPTPROP27]

Потому что идентификаторы из первой таблицы встречаются во второй. Но там вместо ссылок элементов друг на друга по идентификаторам, используется куча хэшей. Это, скорее всего, одна из причин, почему Полином такой тормозной. Он хэши вычисляет при каждом действии.

На вопрос с техподдержку, как правильно получать коды материалов вида "Material:VC76FFF942391486795..." для создания объектов в Лоцмане, отправляют к мануалам 2002 года.

Есть какие-нибудь идеи? Можете подсказать строки подключения к этому полиному, желательно на дельфи, и метод для получения кода?