Использование атрибута IDLocaltion в карте хранилища кеша sql

У меня есть глобальный индекс (XWES.ETI), который я хочу использовать для извлечения индексов для другой таблицы. Глобальный XWES.ETI имеет один нижний индекс (порядковый номер) и две части данных, которые я хочу использовать в качестве нижних индексов для фактического глобального, определенного в карте хранилища кэша sql (^ ZIDETRP). Мой класс компилируется без ошибок, но не загружается и получает ошибку в %AcquireLock, потому что одна из моих созданных переменных (edt) не определена. Я знаю, что этот код близок, но я просто не могу определить проблему. Предложения кто-нибудь? Класс выглядит следующим образом:

Class System.ErrTest Extends (%Persistent, %XML.Adaptor) [ StorageStrategy = Legacy ] 
{

Property ErrID As %Library.Integer;

Property ErrDt As %Library.Date;

Property ErrNum As %Library.Integer;

Property EDat As %Library.String;

///  Index iMaster on ErrID [IDKey,Unique]; 
Index iMaster On ErrID [ IdKey, Unique ];

<Storage name="Legacy"> 
  <ExtentSize>100000</ExtentSize> 
  <IdLocation>^XWES.ETI</IdLocation> 
  <SequenceNumber>6</SequenceNumber> 
<SQLMap name="Map1"> 
  <Data name="EDat"> 
   <Delimiter>$c(0)</Delimiter> 
   <Node>1</Node> 
   <Piece>1</Piece> 
  </Data> 
  <Data name="ErrDt"> 
   <RetrievalCode> Set {*}=edt</RetrievalCode> 
  </Data> 
  <Data name="ErrNum"> 
   <RetrievalCode> Set {*}=enum</RetrievalCode> 
   </Data> 
 <Global>^ZIDETRAP</Global> 
 <RowReference>^ZIDETRAP(edt,enum)</RowReference> 
 <Subscript name="1"> 
   <AccessType>Other</AccessType> 
   <Accessvar name="1"> 
     <Code> S edt=$p(^XWES.ETI({L1}),"^",1)</Code> 
     <Variable>edt</Variable> 
   </Accessvar> 
   <Accessvar name="2"> 
     <Code> S enum=$p(^XWES.ETI({L1}),"^",2)</Code> 
     <Variable>enum</Variable> 
   </Accessvar> 
   <Expression>{ErrID}</Expression> 
   <NextCode> s {L1}=$Order(^XWES.ETI({L1}))</NextCode> 
 </Subscript> 
<Type>data</Type> 
</SQLMap> 
<StreamLocation>^WSandlin.System.ErrTestS</StreamLocation> 
<Type>%CacheSQLStorage</Type> 
</Storage> 
}

person Fred Altman    schedule 29.11.2012    source источник
comment
Это просто пример или это ваша реальная ситуация? Почему бы просто не использовать частичный доступ для установки этих полей на основе текущего индекса? Я думаю, вы делаете вещи более сложными, чем они должны быть, все, что вы делаете, можно сделать проще с прямым доступом к фрагментам. Зачем вообще нужен доступ к ^ZIDETRAP? Вы можете связаться со службой поддержки InterSystems и запросить пример с двумя глобальными хранилищами, если ваша реальная ситуация более сложна, чем эта.   -  person mcbainpc    schedule 29.11.2012
comment
Это реальная ситуация. Глобальный XWES.ETI — это просто индекс глобального ZIDETRAP. Я использую его, чтобы получить два индекса, которые мне нужны. Все данные, которые я буду иметь в качестве свойств этого класса, находятся в глобальном ZIDETRAP. Я не совсем уверен, как вы хотели бы, чтобы я упростил это. Можете ли вы написать, что, по вашему мнению, будет работать здесь? Спасибо   -  person Fred Altman    schedule 30.11.2012
comment
А... судя по вашему ответу, вы говорите, что есть и другие свойства, к которым нужно получить доступ из ^ZIDETRAP. Это означает, что проблема заключается не только в приведенном вами примере (который содержит только ссылки на свойства в вашем глобальном индексе ^XWES.ETI). Я думаю, что это классический сценарий Two Global. Сообщите нам, если решение psr не работает.   -  person mcbainpc    schedule 01.12.2012


Ответы (1)


Я не пробовал это с данными, но проблема %AquireLock исчезла, поскольку это сопоставление доступно только для чтения. Это своего рода хак, но он может сработать или помочь, и это слишком долго для комментария.

{

Property ErrID As %Library.Integer;

Property ErrDt As %Library.Date;

Property ErrNum As %Library.Integer;

Property EDat As %Library.String;

///  Index iMaster on ErrID [IDKey,Unique]; 
Index iMaster On (ErrID, ErrDt, ErrNum) [ IdKey, Unique ];

<Storage name="Legacy">
<ExtentSize>100000</ExtentSize>
<IdLocation>^XWES.ETI</IdLocation>
<SequenceNumber>6</SequenceNumber>
<SQLMap name="Map1">
<Data name="EDat">
<Delimiter>$c(0)</Delimiter>
<Node>1</Node>
<Piece>1</Piece>
</Data>
<Global>^ZIDETRAP</Global>
<RowIdSpec name="1">
<Expression>{ErrID}</Expression>
<Field>ErrID</Field>
</RowIdSpec>
<RowIdSpec name="2">
<Expression>$P(^XWES.ETI({ErrID}),"^",1)</Expression>
<Field>ErrDt</Field>
</RowIdSpec>
<RowIdSpec name="3">
<Expression>$P(^XWES.ETI({ErrID}),"^",2)</Expression>
<Field>ErrNum</Field>
</RowIdSpec>
<Subscript name="1">
<Expression>{ErrID}</Expression>
<NextCode>s {L1}=$Order(^XWES.ETI({L1}))</NextCode>
</Subscript>
<Subscript name="2">
<AccessType>Other</AccessType>
<DataAccess>$p(^XWES.ETI({L1}),"^",1)</DataAccess>
<Expression>{ErrDt}</Expression>
<NextCode>S {L2}=""</NextCode>
<StopExpression>1</StopExpression>
</Subscript>
<Subscript name="3">
<AccessType>Other</AccessType>
<DataAccess>$p(^XWES.ETI({L1}),"^",1)</DataAccess>
<Expression>{ErrNum}</Expression>
<NextCode>S {L3}=""</NextCode>
<StopExpression>1</StopExpression>
</Subscript>
<Type>data</Type>
</SQLMap>
<StreamLocation>^WSandlin.System.ErrTestS</StreamLocation>
<Type>%CacheSQLStorage</Type>
</Storage>
}
person psr    schedule 29.11.2012