• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Получение единицы измерения из идентификатора

Автор oracle, 06.09.10, 12:11:40

« назад - далее »

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

oracle

Не могу сообразить. Получаю привязанные объекты методом GetLinkedObjects. Метод возвращает поля среди которых
_MIN_QUANTITY - количество
_ID_UNIT - идентификатор единицы измерения, в которой задавали значение количества.
Как из идентификатора получить название единицы измерения?

Prog2

Если имеется доступ к справочнику единиц измерения (в примере БД Measurement), то можно через хранимую процедуру (по грубому, не "причёсывал"):
CREATE PROCEDURE [dbo].[GetMeasureByID]
@parSt nvarchar(255)
AS
select t1.Name, t2.Name, t2.Designation, t3.Name, t3.Designation, t3.FromBasicFactor, t3.ObjectID
from (Measurement.dbo.MNature t1 JOIN Measurement.dbo.BasicUnit t2 ON t1.BasicUnit=t2.BOLD_ID)
JOIN Measurement.dbo.DerivedUnit t3 ON t1.BasicUnit=t3.BasicUnit
where t3.ObjectID=@parSt
UNION
select '1', t2.Name, t2.Designation, t2.Name, t2.Designation, 1.0, t2.ObjectID
from (Measurement.dbo.MNature t1 JOIN Measurement.dbo.BasicUnit t2 ON t1.BasicUnit=t2.BOLD_ID)
where t2.ObjectID=@parSt
GO

Параметр "@parSt" - это передаваемый _ID_UNIT.
В результирующем наборе второй столбец "Designation" содержит то, что Вам нужно.

oracle

Спасибо за ответ. Он мне еще принесет пользу. И как алтернативный вариант тоже можно использовать.
Но в моем случае можно сделать так:
Методом GetLinkedObjects получаю поля, среди которых
_ID_LINK - уникальный идентификатор экземпляра связи
По этому идентификатору можно получить дополнительную информацию об экземпляре связи методом GetInfoAboutLink режим вывода 1.
И тут уже все необходимые для меня поля:
_UNIT - название единицы измерения, в которой отображается значение количества
_MEASURE - название сущности, которую измерило количество

Chaa

Посмотрите функции GetMeasureListForLink и GetMUnitList.

oracle

У меня Лоцман 8.5 и в своем описании API метод GetMeasureListForLink не нашел.
Метод GetMUnitList возвращает все возможные единицы измерения для измеряемой сущности. На входе должен быть идентификатор измеряемой сущности.
Метод GetLinkedObjects НЕ возвращает идентификатор измерямой сущности.
Можно получить этот идентификатор с помощью метода GetInfoAboutLink и потом с помощью метода GetMUnitList узнать все возможные единицы измерения. Насколько я понимаю, конечно

Chaa

Если нет необходимости изменять единицу измерения, то список их из метода GetMeasureListForLink вам и не нужен.
Кстати обратите внимание на примечание в справке:
[_ID_UNIT] string - идентификатор единицы измерения, в которой задавали значение количества. Важно: Значения полей [_MIN_QUANTITY] и [_MAX_QUANTITY] возвращаются в базовой единице измерения.
То есть чтобы показать их правильно, вам надо знать базовую единицу измерения, а не ту, которая _ID_UNIT.
Описание метода из справки. У меня работает в 8.5 SP2.
Variant GetMeasureListForLink(
BSTR stParentType,        // тип - родитель
BSTR stChildType,         // тип , стоящий ниже по иерархии по связи stLinkType
BSTR stLinkType,          // тип связи
Variant * inReturnCode,      // код возврата
Variant * stErrorMessage,    // сообщение об ошибке
);

Параметры
stParentType  [in] Тип  - родитель.
stChildType  [in] Тип, стоящий ниже по иерархии по связи stLinkType.
stLinkType  [in] Тип связи между объектами.
inReturnCode  [out] Код возврата. Если  0, то метод отработал без ошибок.
stErrorMessage  [out] Сообщение об ошибке. Инициализировано только в случае если inReturnCode <> 0.

Возвращаемое значение
Возвращает список идентификаторов сущностей.
Возвращает набор данных с полями:
[_ID_MEASURE] string - уникальный идентификатор сущности;
[_NAME] string - отображаемое имя сущности.
[_DEFAULT] int - признак сущности по умолчанию(1-умолчательная\0-обычная).

Требования к версии ЛОЦМАН.
ЛОЦМАН : PLM  6.0 или более поздние

oracle

Да вы правы, что нужно обращать внимание на примечание. Параметры _MIN_QUANTITY и _MAX_QUANTITY сами переводятся к базовой единице измерения. Т.е. если в Лоцмане записано 200 мм, то _MIN_QUANTITY будет равным 0,02
Но опять же тут поможет метод GetInfoAboutLink, который вернет реальные данные. И поле _MIN_QUANTITY у этого метода уже будет равным 200, поле _UNIT будет равным мм.
Спасибо за описание метода GetMeasureListForLink

Sergey

14.09.10, 08:49:31 #7 Последнее редактирование: 14.09.10, 09:09:45 от Sergey
Можно так.

#include "stdafx.h"
#import "MeasurementServer.tlb" raw_interfaces_only

int _tmain(int argc, _TCHAR* argv[])
{
   ::CoInitialize(NULL);
   ::CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,
      RPC_C_IMP_LEVEL_DELEGATE, NULL, 0, NULL);

   IClassFactory* pCF(NULL);
   CLSID clsid;
   MeasurementServer::IMeasurementServer* MU(NULL);
   HRESULT hr=::CLSIDFromString(OLESTR("MeasurementServer.CoMeasurementServer"),&clsid);
   hr = CoGetClassObject(clsid,CLSCTX_REMOTE_SERVER,NULL,IID_IClassFactory,(void **)&pCF);
   IID IDD_IBOSimpleProvider = __uuidof(MeasurementServer::IMeasurementServer);
   hr = pCF->CreateInstance( NULL,IDD_IBOSimpleProvider, (void**) &MU);

   if (hr == S_OK)
   {
      CComBSTR sID = "V16F0ACEB123048408CFC1292992D9C44"; //Идентификатор единицы измерения
      MeasurementServer::IMNature* pMNat;
      MU->get_MNature(sID,&pMNat);

      if(pMNat != NULL)
      {
         MeasurementServer::IMUnit* pUnit;
         pMNat->get_BasicUnit(&pUnit);
         if(pUnit != NULL)
         {
            CComBSTR sValue(_T(""));
            pUnit->get_Designation(&sValue);
            AfxMessageBox((CString)sValue);
         }
      }
   }
   ::CoUninitialize();
}