2012-11-29 64 views
3

我有一個索引全局(XWES.ETI),我想用它來爲下一個表提取下標。 XWES.ETI全局有一個下標(一個序列號),並且有兩個數據我想用作緩存sql存儲映射(^ ZIDETRP)中定義的實際全局下標。我的類編譯沒有錯誤,但不會加載並在%AcquireLock中發生錯誤,因爲我創建的變量(edt)未定義。我知道這段代碼很接近,但我似乎無法發現這個問題。建議任何人?該類如下:在緩存中使用IDLocaltion屬性sql存儲映射

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> 
} 
+0

這只是一個例子還是這是你的實際情況?爲什麼不使用片段訪問來設置基於當前下標的字段?我認爲你讓事情比他們需要的更復雜,你所做的事情可以通過簡單的片段訪問來完成。爲什麼你需要訪問^ ZIDETRAP呢?如果您的實際情況比這更復雜,您可以聯繫InterSystems支持並要求提供兩個全局存儲示例。 – mcbainpc

+0

這是一個實際情況。 XWES.ETI全球只是ZIDETRAP全球的一個索引。我使用它來獲取我需要的兩個下標。所有我將作爲這個類的屬性的數據都在ZIDETRAP全局中。我不太清楚你想如何簡化它。你能寫出你認爲能在這裏工作嗎?謝謝 –

+0

啊......從你的回覆中你可以看到還有其他一些需要從^ ZIDETRAP訪問的屬性。這意味着問題比您提供的示例更多(它只包含對您的^ XWES.ETI「索引」全局屬性的引用)。我認爲這是一個經典的雙全球場景。讓我們知道如果psr的解決方案不起作用。 – mcbainpc

回答

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> 
}